diff options
author | Nyeriah <sarah.trysan@live.com> | 2015-01-10 03:41:05 -0200 |
---|---|---|
committer | Nyeriah <sarah.trysan@live.com> | 2015-01-10 03:41:05 -0200 |
commit | bd5c7cc637263f53108891def60959bd81e32854 (patch) | |
tree | 8326bd940acbe0702b1338c8acd05f7dd8424ec3 /src | |
parent | 6aac2bf2a70a3e099bc26bd087846e7f891ec3b0 (diff) |
Scripts/BlackfathomDepths: Convert bosses to EventMaps/BossAI and clean up instance script
(cherry picked from commit 1852d7d2f7b808efb1ec505ce1ca6867219f3588)
Diffstat (limited to 'src')
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; }; }; |