aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-13 10:17:26 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-08 16:10:55 +0100
commitd7fe2868ab945374344de88047e45d8c03f1fb61 (patch)
treef7e30e2569c439b95608977038a14024ef311ac2 /src
parentdb601a92b57a41ecf0291ea477802e1291db4657 (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.cpp254
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();
}