diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp | 146 |
1 files changed, 46 insertions, 100 deletions
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 728b164cc04..e4369f0348d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -93,15 +93,12 @@ enum Factions FACTION_COMBAT = 1868 }; -enum SetData +enum Actions { - SETDATA_DATA = 1, - SETDATA_RESET = 1, - SETDATA_CHANNELER_DIED = 2, - SETDATA_START_SPAWNING = 3, - SETDATA_STOP_SPAWNING = 4, - SETDATA_DESPAWN_ALL_SPAWNS = 5, - SETDATA_START_ATTACK_AKAMA = 6 + ACTION_CHANNELER_DIED = 1, + ACTION_START_SPAWNING = 2, + ACTION_STOP_SPAWNING = 3, + ACTION_DESPAWN_ALL_SPAWNS = 4, }; enum Events @@ -158,12 +155,11 @@ class boss_shade_of_akama : public CreatureScript public: boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { } - struct boss_shade_of_akamaAI : public ScriptedAI + struct boss_shade_of_akamaAI : public BossAI { - boss_shade_of_akamaAI(Creature* creature) : ScriptedAI(creature) + boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA) { Initialize(); - instance = creature->GetInstanceScript(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } @@ -177,6 +173,7 @@ public: void Reset() override { + _Reset(); if (!HasKilledAkamaAndReseting) { for (GuidList::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) @@ -185,7 +182,7 @@ public: for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) - Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS); + Spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS); events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 3000); events.ScheduleEvent(EVENT_RESET_ENCOUNTER, 5000); @@ -197,11 +194,6 @@ public: Initialize(); } - void JustDied(Unit* /*killer*/) override - { - instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE); - } - void EnterCombat(Unit* /*who*/) override { } void AttackStart(Unit* who) override @@ -216,9 +208,9 @@ public: ScriptedAI::AttackStart(who); } - void SetData(uint32 data, uint32 value) override + void DoAction(int32 actionId) override { - if (data == SETDATA_DATA && value == SETDATA_CHANNELER_DIED) + if (actionId == ACTION_CHANNELER_DIED) me->RemoveAuraFromStack(SPELL_SHADE_SOUL_CHANNEL_2); UpdateSpeed(); @@ -314,7 +306,7 @@ public: for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) - Spawner->AI()->SetData(SETDATA_DATA, SETDATA_START_SPAWNING); + Spawner->AI()->DoAction(ACTION_START_SPAWNING); break; } case EVENT_START_ATTACK_AKAMA: @@ -353,7 +345,7 @@ public: for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) - Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS); + Spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS); events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 10000); events.ScheduleEvent(EVENT_RESET_ENCOUNTER, 20000); @@ -378,7 +370,7 @@ public: for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) - Spawner->AI()->SetData(SETDATA_DATA, SETDATA_STOP_SPAWNING); + Spawner->AI()->DoAction(ACTION_STOP_SPAWNING); } } } @@ -390,8 +382,6 @@ public: public: bool HasKilledAkama; private: - InstanceScript* instance; - EventMap events; GuidList Channelers; GuidList Spawners; bool akamaReached; @@ -433,9 +423,11 @@ public: void Reset() override { me->setFaction(FACTION_FRIENDLY); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); DoCast(me, SPELL_STEALTH); Initialize(); + + if (instance->GetBossState(DATA_SHADE_OF_AKAMA) != DONE) + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } void JustDied(Unit* /*killer*/) override @@ -581,7 +573,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADE_OF_AKAMA))) - Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); + Shade->AI()->DoAction(ACTION_CHANNELER_DIED); } void EnterCombat(Unit* /*who*/) override { } @@ -603,7 +595,7 @@ public: else { me->InterruptSpell(CURRENT_CHANNELED_SPELL); - Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); + Shade->AI()->DoAction(ACTION_CHANNELER_DIED); } } events.ScheduleEvent(EVENT_CHANNEL, 2000); @@ -663,36 +655,33 @@ public: Summons.Summon(summon); } - void SetData(uint32 data, uint32 value) override + void DoAction(int32 actionId) override { - if (data == SETDATA_DATA) - { - doSpawning = true; + doSpawning = true; - switch (value) - { - case SETDATA_START_SPAWNING: - if (leftSide) - { - events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 100); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, urand(2000, 5000)); - } - else - { - events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 10000); - events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, urand(2000, 5000)); - } - break; - case SETDATA_STOP_SPAWNING: - doSpawning = false; - break; - case SETDATA_DESPAWN_ALL_SPAWNS: - doSpawning = false; - Summons.DespawnAll(); - break; - default: - break; - } + switch (actionId) + { + case ACTION_START_SPAWNING: + if (leftSide) + { + events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 100); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, urand(2000, 5000)); + } + else + { + events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 10000); + events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, urand(2000, 5000)); + } + break; + case ACTION_STOP_SPAWNING: + doSpawning = false; + break; + case ACTION_DESPAWN_ALL_SPAWNS: + doSpawning = false; + Summons.DespawnAll(); + break; + default: + break; } } @@ -778,23 +767,16 @@ public: } } - summonerGuid.Clear(); Initialize(); } void JustDied(Unit* /*killer*/) override { if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADE_OF_AKAMA))) - Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); + Shade->AI()->DoAction(ACTION_CHANNELER_DIED); me->DespawnOrUnsummon(5000); } - void IsSummonedBy(Unit* /*summoner*/) override - { - if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); - } - void EnterCombat(Unit* /*who*/) override { } void AttackStart(Unit* who) override @@ -824,7 +806,7 @@ public: else { me->InterruptSpell(CURRENT_CHANNELED_SPELL); - Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); + Shade->AI()->DoAction(ACTION_CHANNELER_DIED); switchToCombat = true; if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE))) AttackStart(target); @@ -855,7 +837,6 @@ public: private: InstanceScript* instance; EventMap events; - ObjectGuid summonerGuid; bool startedBanishing; bool switchToCombat; }; @@ -884,8 +865,6 @@ public: void Reset() override { - summonerGuid.Clear(); - if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -895,12 +874,6 @@ public: me->DespawnOrUnsummon(5000); } - void IsSummonedBy(Unit* /*summoner*/) override - { - if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); - } - void EnterCombat(Unit* /*who*/) override { events.ScheduleEvent(EVENT_HEROIC_STRIKE, 5000); @@ -947,7 +920,6 @@ public: private: InstanceScript* instance; EventMap events; - ObjectGuid summonerGuid; }; CreatureAI* GetAI(Creature* creature) const override @@ -974,8 +946,6 @@ public: void Reset() override { - summonerGuid.Clear(); - if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -985,12 +955,6 @@ public: me->DespawnOrUnsummon(5000); } - void IsSummonedBy(Unit* /*summoner*/) override - { - if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); - } - void EnterCombat(Unit* /*who*/) override { events.ScheduleEvent(EVENT_DEBILITATING_POISON, urand(500, 2000)); @@ -1027,7 +991,6 @@ public: private: InstanceScript* instance; EventMap events; - ObjectGuid summonerGuid; }; CreatureAI* GetAI(Creature* creature) const override @@ -1054,8 +1017,6 @@ public: void Reset() override { - summonerGuid.Clear(); - if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -1065,12 +1026,6 @@ public: me->DespawnOrUnsummon(5000); } - void IsSummonedBy(Unit* /*summoner*/) override - { - if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); - } - void EnterCombat(Unit* /*who*/) override { events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 18000); @@ -1107,7 +1062,6 @@ public: private: InstanceScript* instance; EventMap events; - ObjectGuid summonerGuid; }; CreatureAI* GetAI(Creature* creature) const override @@ -1137,7 +1091,6 @@ public: { spiritMend = false; chainHeal = false; - summonerGuid.Clear(); } void Reset() override @@ -1153,12 +1106,6 @@ public: me->DespawnOrUnsummon(5000); } - void IsSummonedBy(Unit* /*summoner*/) override - { - if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); - } - void EnterCombat(Unit* /*who*/) override { events.ScheduleEvent(EVENT_SPIRIT_HEAL, urand (5000, 6000)); @@ -1208,7 +1155,6 @@ public: private: InstanceScript* instance; EventMap events; - ObjectGuid summonerGuid; bool spiritMend; bool chainHeal; }; |