aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h3
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp32
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp61
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp90
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp101
5 files changed, 130 insertions, 157 deletions
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
index 4d65ec6e297..cb1cd3829b7 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
@@ -21,6 +21,8 @@
#define DataHeader "BFD"
+uint32 const EncounterCount = 3;
+
enum Data64
{
DATA_SHRINE1,
@@ -37,7 +39,6 @@ enum Data
{
TYPE_GELIHAST,
TYPE_KELRIS,
- TYPE_SHRINE,
TYPE_AKU_MAI,
DATA_FIRE,
DATA_EVENT
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
index cb5c40cadc4..99790e6d70b 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
@@ -28,7 +28,7 @@ enum Spells
enum Events
{
EVENT_POISON_CLOUD = 1,
- EVENT_FRENZIED_RAGE = 2
+ EVENT_FRENZIED_RAGE,
};
class boss_aku_mai : public CreatureScript
@@ -56,13 +56,17 @@ public:
void EnterCombat(Unit* /*who*/) override
{
- events.ScheduleEvent(EVENT_POISON_CLOUD, urand(5000, 9000));
_EnterCombat();
+ events.ScheduleEvent(EVENT_POISON_CLOUD, urand(5000, 9000));
}
- void JustDied(Unit* /*killer*/) override
+ void DamageTaken(Unit* /*atacker*/, uint32 &damage) override
{
- _JustDied();
+ if (!IsEnraged && me->HealthBelowPctDamaged(30, damage))
+ {
+ DoCast(me, SPELL_FRENZIED_RAGE);
+ IsEnraged = true;
+ }
}
void UpdateAI(uint32 diff) override
@@ -72,25 +76,15 @@ public:
events.Update(diff);
- if (!IsEnraged && HealthBelowPct(30))
- events.ScheduleEvent(EVENT_FRENZIED_RAGE, 100);
-
while (uint32 eventId = events.ExecuteEvent())
{
- switch (eventId)
+ if (eventId == EVENT_POISON_CLOUD)
{
- case EVENT_POISON_CLOUD:
- DoCastVictim(SPELL_POISON_CLOUD);
- events.ScheduleEvent(EVENT_POISON_CLOUD, urand(25000, 50000));
- break;
- case EVENT_FRENZIED_RAGE:
- DoCast(me, SPELL_FRENZIED_RAGE);
- IsEnraged = true;
- break;
- default:
- break;
+ DoCastVictim(SPELL_POISON_CLOUD);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, urand(25000, 50000));
}
}
+
DoMeleeAttackIfReady();
}
@@ -100,7 +94,7 @@ public:
CreatureAI* GetAI(Creature* creature) const override
{
- return new boss_aku_maiAI(creature);
+ return GetInstanceAI<boss_aku_maiAI>(creature);
}
};
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
index a432a5714e1..4e31bf8d64f 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
@@ -21,7 +21,12 @@
enum Spells
{
- SPELL_NET = 6533
+ SPELL_NET = 6533
+};
+
+enum Events
+{
+ EVENT_THROW_NET = 1
};
class boss_gelihast : public CreatureScript
@@ -29,42 +34,14 @@ class boss_gelihast : public CreatureScript
public:
boss_gelihast() : CreatureScript("boss_gelihast") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_gelihastAI>(creature);
- }
-
- struct boss_gelihastAI : public ScriptedAI
+ struct boss_gelihastAI : public BossAI
{
- boss_gelihastAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
-
- void Initialize()
- {
- netTimer = urand(2000, 4000);
- }
-
- uint32 netTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
- instance->SetData(TYPE_GELIHAST, NOT_STARTED);
- }
+ boss_gelihastAI(Creature* creature) : BossAI(creature, TYPE_GELIHAST) { }
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(TYPE_GELIHAST, IN_PROGRESS);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetData(TYPE_GELIHAST, DONE);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_THROW_NET, urand(2000, 4000));
}
void UpdateAI(uint32 diff) override
@@ -72,15 +49,25 @@ public:
if (!UpdateVictim())
return;
- if (netTimer < diff)
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCastVictim(SPELL_NET);
- netTimer = urand(4000, 7000);
- } else netTimer -= diff;
+ if (eventId == EVENT_THROW_NET)
+ {
+ DoCastVictim(SPELL_NET);
+ events.ScheduleEvent(EVENT_THROW_NET, urand(4000, 7000));
+ }
+ }
DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_gelihastAI>(creature);
+ }
};
void AddSC_boss_gelihast()
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
index 202c50014ff..4aed860b3be 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
@@ -21,12 +21,21 @@
enum Spells
{
- SPELL_MIND_BLAST = 15587,
- SPELL_SLEEP = 8399,
+ SPELL_MIND_BLAST = 15587,
+ SPELL_SLEEP = 8399,
+};
- SAY_AGGRO = 0,
- SAY_SLEEP = 1,
- SAY_DEATH = 2
+enum Texts
+{
+ SAY_AGGRO = 0,
+ SAY_SLEEP = 1,
+ SAY_DEATH = 2
+};
+
+enum Events
+{
+ EVENT_MIND_BLAST = 1,
+ EVENT_SLEEP
};
class boss_kelris : public CreatureScript
@@ -34,40 +43,16 @@ class boss_kelris : public CreatureScript
public:
boss_kelris() : CreatureScript("boss_kelris") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_kelrisAI>(creature);
- }
-
- struct boss_kelrisAI : public ScriptedAI
+ struct boss_kelrisAI : public BossAI
{
- boss_kelrisAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
-
- void Initialize()
- {
- mindBlastTimer = urand(2000, 5000);
- sleepTimer = urand(9000, 12000);
- }
-
- uint32 mindBlastTimer;
- uint32 sleepTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
- instance->SetData(TYPE_KELRIS, NOT_STARTED);
- }
+ boss_kelrisAI(Creature* creature) : BossAI(creature, TYPE_KELRIS) { }
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
Talk(SAY_AGGRO);
- instance->SetData(TYPE_KELRIS, IN_PROGRESS);
+ events.ScheduleEvent(EVENT_MIND_BLAST, urand(2000, 5000));
+ events.ScheduleEvent(EVENT_SLEEP, urand(9000, 12000));
}
void JustDied(Unit* /*killer*/) override
@@ -81,25 +66,40 @@ public:
if (!UpdateVictim())
return;
- if (mindBlastTimer < diff)
- {
- DoCastVictim(SPELL_MIND_BLAST);
- mindBlastTimer = urand(7000, 9000);
- } else mindBlastTimer -= diff;
+ events.Update(diff);
- if (sleepTimer < diff)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ switch (eventId)
{
- Talk(SAY_SLEEP);
- DoCast(target, SPELL_SLEEP);
+ case EVENT_MIND_BLAST:
+ DoCastVictim(SPELL_MIND_BLAST);
+ events.ScheduleEvent(EVENT_MIND_BLAST, urand(7000, 9000));
+ break;
+ case EVENT_SLEEP:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ {
+ Talk(SAY_SLEEP);
+ DoCast(target, SPELL_SLEEP);
+ }
+ events.ScheduleEvent(EVENT_SLEEP, urand(15000, 20000));
+ break;
+ default:
+ break;
}
- sleepTimer = urand(15000, 20000);
- } else sleepTimer -= diff;
+ }
DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_kelrisAI>(creature);
+ }
};
void AddSC_boss_kelris()
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
index f6fdd260c0f..77bb3421070 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
@@ -27,14 +27,6 @@ EndScriptData */
#include "InstanceScript.h"
#include "blackfathom_deeps.h"
-#define MAX_ENCOUNTER 4
-
-/* Encounter 0 = Gelihast
- Encounter 1 = Twilight Lord Kelris
- Encounter 2 = Shrine event
- Encounter 3 = Aku'Mai
- */
-
const Position LorgusPosition[4] =
{
{ -458.500610f, -38.343079f, -33.474445f, 0.0f },
@@ -67,25 +59,12 @@ public:
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- memset(&encounter, 0, sizeof(encounter));
+ SetBossNumber(EncounterCount);
countFires = 0;
deathTimes = 0;
}
- ObjectGuid twilightLordKelrisGUID;
- ObjectGuid shrine1GUID;
- ObjectGuid shrine2GUID;
- ObjectGuid shrine3GUID;
- ObjectGuid shrine4GUID;
- ObjectGuid shrineOfGelihastGUID;
- ObjectGuid altarOfTheDeepsGUID;
- ObjectGuid mainDoorGUID;
-
- uint8 encounter[MAX_ENCOUNTER];
- uint8 countFires;
- uint8 deathTimes;
-
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
@@ -117,16 +96,16 @@ public:
break;
case GO_SHRINE_OF_GELIHAST:
shrineOfGelihastGUID = go->GetGUID();
- if (encounter[0] != DONE)
+ if (GetBossState(TYPE_GELIHAST) != DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_ALTAR_OF_THE_DEEPS:
altarOfTheDeepsGUID = go->GetGUID();
- if (encounter[3] != DONE)
+ if (GetBossState(TYPE_AKU_MAI) != DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_AKU_MAI_DOOR:
- if (encounter[2] == DONE)
+ if (GetBossState(TYPE_AKU_MAI) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
mainDoorGUID = go->GetGUID();
break;
@@ -137,21 +116,6 @@ public:
{
switch (type)
{
- case TYPE_GELIHAST:
- encounter[0] = data;
- if (data == DONE)
- if (GameObject* go = instance->GetGameObject(shrineOfGelihastGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- break;
- case TYPE_AKU_MAI:
- encounter[3] = data;
- if (data == DONE)
- if (GameObject* go = instance->GetGameObject(altarOfTheDeepsGUID))
- {
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SummonCreature(NPC_MORRIDUNE, SpawnsLocation[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- }
- break;
case DATA_FIRE:
countFires = data;
switch (countFires)
@@ -159,10 +123,8 @@ public:
case 1:
if (GameObject* go = instance->GetGameObject(shrine1GUID))
{
- go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
+ for (uint8 i = 0; i < 4; ++i)
+ go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
}
break;
case 2:
@@ -187,10 +149,8 @@ public:
case 4:
if (GameObject* go = instance->GetGameObject(shrine1GUID))
{
- go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
- go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
+ for (uint8 i = 0; i < 4; ++i)
+ go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
}
break;
}
@@ -203,18 +163,37 @@ public:
}
}
- uint32 GetData(uint32 type) const override
+ bool SetBossState(uint32 type, EncounterState state) override
{
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
switch (type)
{
case TYPE_GELIHAST:
- return encounter[0];
- case TYPE_KELRIS:
- return encounter[1];
- case TYPE_SHRINE:
- return encounter[2];
+ if (state == DONE)
+ if (GameObject* go = instance->GetGameObject(shrineOfGelihastGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
case TYPE_AKU_MAI:
- return encounter[3];
+ if (state == DONE)
+ if (GameObject* go = instance->GetGameObject(altarOfTheDeepsGUID))
+ {
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SummonCreature(NPC_MORRIDUNE, SpawnsLocation[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ uint32 GetData(uint32 type) const override
+ {
+ switch (type)
+ {
case DATA_FIRE:
return countFires;
case DATA_EVENT:
@@ -246,6 +225,18 @@ public:
return ObjectGuid::Empty;
}
+
+ private:
+ ObjectGuid twilightLordKelrisGUID;
+ ObjectGuid shrine1GUID;
+ ObjectGuid shrine2GUID;
+ ObjectGuid shrine3GUID;
+ ObjectGuid shrine4GUID;
+ ObjectGuid shrineOfGelihastGUID;
+ ObjectGuid altarOfTheDeepsGUID;
+ ObjectGuid mainDoorGUID;
+ uint8 countFires;
+ uint8 deathTimes;
};
};