diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-13 10:17:26 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-08 16:10:55 +0100 |
commit | d7fe2868ab945374344de88047e45d8c03f1fb61 (patch) | |
tree | f7e30e2569c439b95608977038a14024ef311ac2 /src | |
parent | db601a92b57a41ecf0291ea477802e1291db4657 (diff) |
Scripts/Naxxramas: Update Anub'Rekhan to new model (#26377)
Co-authored-by: offl <offl@users.noreply.github.com>
(cherry picked from commit 128820372996d27afc008648bf6f75a5c10503e4)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp | 254 |
1 files changed, 121 insertions, 133 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 47d9ad5ea97..a90c17c5b47 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -74,171 +74,159 @@ enum Phases PHASE_SWARM }; -class boss_anubrekhan : public CreatureScript +struct boss_anubrekhan : public BossAI { -public: - boss_anubrekhan() : CreatureScript("boss_anubrekhan") { } + boss_anubrekhan(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) { } - CreatureAI* GetAI(Creature* creature) const override + void SummonGuards() { - return GetNaxxramasAI<boss_anubrekhanAI>(creature); + if (Is25ManRaid()) + me->SummonCreatureGroup(GROUP_INITIAL_25M); } - struct boss_anubrekhanAI : public BossAI + void InitializeAI() override { - boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) { } - - void SummonGuards() - { - if (Is25ManRaid()) - me->SummonCreatureGroup(GROUP_INITIAL_25M); - } - - void InitializeAI() override + if (!me->isDead() && instance->GetBossState(BOSS_ANUBREKHAN) != DONE) { - if (!me->isDead() && instance->GetBossState(BOSS_ANUBREKHAN) != DONE) - { - Reset(); - SummonGuards(); - } - } - - void Reset() override - { - _Reset(); - guardCorpses.clear(); - } - - void JustReachedHome() override - { - _JustReachedHome(); + Reset(); SummonGuards(); } + } - void JustSummoned(Creature* summon) override - { - BossAI::JustSummoned(summon); + void Reset() override + { + _Reset(); + guardCorpses.clear(); + } - if (me->IsInCombat()) - if (summon->GetEntry() == NPC_CRYPT_GUARD) - summon->AI()->Talk(EMOTE_SPAWN, me); - } + void JustReachedHome() override + { + _JustReachedHome(); + SummonGuards(); + } - void SummonedCreatureDies(Creature* summon, Unit* killer) override - { - BossAI::SummonedCreatureDies(summon, killer); + void JustSummoned(Creature* summon) override + { + BossAI::JustSummoned(summon); + if (me->IsInCombat()) if (summon->GetEntry() == NPC_CRYPT_GUARD) - guardCorpses.insert(summon->GetGUID()); - } + summon->AI()->Talk(EMOTE_SPAWN, me); + } - void SummonedCreatureDespawn(Creature* summon) override - { - BossAI::SummonedCreatureDespawn(summon); + void SummonedCreatureDies(Creature* summon, Unit* killer) override + { + BossAI::SummonedCreatureDies(summon, killer); - if (summon->GetEntry() == NPC_CRYPT_GUARD) - guardCorpses.erase(summon->GetGUID()); - } + if (summon->GetEntry() == NPC_CRYPT_GUARD) + guardCorpses.insert(summon->GetGUID()); + } - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCaster(me->GetGUID())); + void SummonedCreatureDespawn(Creature* summon) override + { + BossAI::SummonedCreatureDespawn(summon); - Talk(SAY_SLAY); - } + if (summon->GetEntry() == NPC_CRYPT_GUARD) + guardCorpses.erase(summon->GetGUID()); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, CastSpellExtraArgs(TRIGGERED_FULL_MASK) + .SetOriginalCaster(me->GetGUID())); - // start achievement timer (kill Maexna within 20 min) - instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMED_START_EVENT); - } + Talk(SAY_SLAY); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + + // start achievement timer (kill Maexna within 20 min) + instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMED_START_EVENT); + } - summons.DoZoneInCombat(); + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - events.SetPhase(PHASE_NORMAL); - events.ScheduleEvent(EVENT_IMPALE, randtime(Seconds(10), Seconds(20)), 0, PHASE_NORMAL); - events.ScheduleEvent(EVENT_SCARABS, randtime(Seconds(20), Seconds(30)), 0, PHASE_NORMAL); - events.ScheduleEvent(EVENT_LOCUST, Minutes(1)+randtime(Seconds(40), Seconds(60)), 0, PHASE_NORMAL); - events.ScheduleEvent(EVENT_BERSERK, 10min); + summons.DoZoneInCombat(); - if (!Is25ManRaid()) - events.ScheduleEvent(EVENT_SPAWN_GUARD, randtime(Seconds(15), Seconds(20))); - } + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_IMPALE, randtime(Seconds(10), Seconds(20)), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_SCARABS, randtime(Seconds(20), Seconds(30)), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_LOCUST, Minutes(1)+randtime(Seconds(40), Seconds(60)), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_BERSERK, 10min); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + if (!Is25ManRaid()) + events.ScheduleEvent(EVENT_SPAWN_GUARD, randtime(Seconds(15), Seconds(20))); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_IMPALE: - if (events.GetTimeUntilEvent(EVENT_LOCUST) < 5s) - break; // don't chain impale tank -> locust swarm - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_IMPALE); - else - EnterEvadeMode(); - - events.Repeat(randtime(Seconds(10), Seconds(20))); - break; - case EVENT_SCARABS: - if (!guardCorpses.empty()) + case EVENT_IMPALE: + if (events.GetTimeUntilEvent(EVENT_LOCUST) < 5s) + break; // don't chain impale tank -> locust swarm + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_IMPALE); + else + EnterEvadeMode(); + + events.Repeat(randtime(Seconds(10), Seconds(20))); + break; + case EVENT_SCARABS: + if (!guardCorpses.empty()) + { + if (Creature* creatureTarget = ObjectAccessor::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(guardCorpses))) { - if (Creature* creatureTarget = ObjectAccessor::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(guardCorpses))) - { - creatureTarget->CastSpell(creatureTarget, SPELL_SUMMON_CORPSE_SCARABS_MOB, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .SetOriginalCaster(me->GetGUID())); - creatureTarget->AI()->Talk(EMOTE_SCARAB); - creatureTarget->DespawnOrUnsummon(); - } + creatureTarget->CastSpell(creatureTarget, SPELL_SUMMON_CORPSE_SCARABS_MOB, CastSpellExtraArgs(TRIGGERED_FULL_MASK) + .SetOriginalCaster(me->GetGUID())); + creatureTarget->AI()->Talk(EMOTE_SCARAB); + creatureTarget->DespawnOrUnsummon(); } - events.Repeat(randtime(Seconds(40), Seconds(60))); - break; - case EVENT_LOCUST: - Talk(EMOTE_LOCUST); - events.SetPhase(PHASE_SWARM); - DoCast(me, SPELL_LOCUST_SWARM); - - events.ScheduleEvent(EVENT_SPAWN_GUARD, 3s); - events.ScheduleEvent(EVENT_LOCUST_ENDS, RAID_MODE(Seconds(19), Seconds(23))); - events.Repeat(Minutes(1)+Seconds(30)); - break; - case EVENT_LOCUST_ENDS: - events.SetPhase(PHASE_NORMAL); - events.ScheduleEvent(EVENT_IMPALE, randtime(Seconds(10), Seconds(20)), 0, PHASE_NORMAL); - events.ScheduleEvent(EVENT_SCARABS, randtime(Seconds(20), Seconds(30)), 0, PHASE_NORMAL); - break; - case EVENT_SPAWN_GUARD: - me->SummonCreatureGroup(GROUP_SINGLE_SPAWN); - break; - case EVENT_BERSERK: - DoCast(me, SPELL_BERSERK, true); - events.ScheduleEvent(EVENT_BERSERK, 10min); - break; - } + } + events.Repeat(randtime(Seconds(40), Seconds(60))); + break; + case EVENT_LOCUST: + Talk(EMOTE_LOCUST); + events.SetPhase(PHASE_SWARM); + DoCast(me, SPELL_LOCUST_SWARM); + + events.ScheduleEvent(EVENT_SPAWN_GUARD, 3s); + events.ScheduleEvent(EVENT_LOCUST_ENDS, RAID_MODE(Seconds(19), Seconds(23))); + events.Repeat(Minutes(1)+Seconds(30)); + break; + case EVENT_LOCUST_ENDS: + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_IMPALE, randtime(Seconds(10), Seconds(20)), 0, PHASE_NORMAL); + events.ScheduleEvent(EVENT_SCARABS, randtime(Seconds(20), Seconds(30)), 0, PHASE_NORMAL); + break; + case EVENT_SPAWN_GUARD: + me->SummonCreatureGroup(GROUP_SINGLE_SPAWN); + break; + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK, true); + events.ScheduleEvent(EVENT_BERSERK, 10min); + break; } - - if (events.IsInPhase(PHASE_NORMAL)) - DoMeleeAttackIfReady(); } - private: - GuidSet guardCorpses; - }; + if (events.IsInPhase(PHASE_NORMAL)) + DoMeleeAttackIfReady(); + } + private: + GuidSet guardCorpses; }; class at_anubrekhan_entrance : public OnlyOnceAreaTriggerScript @@ -261,7 +249,7 @@ class at_anubrekhan_entrance : public OnlyOnceAreaTriggerScript void AddSC_boss_anubrekhan() { - new boss_anubrekhan(); + RegisterNaxxramasCreatureAI(boss_anubrekhan); new at_anubrekhan_entrance(); } |