summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan <83884799+elthehablo@users.noreply.github.com>2026-01-10 15:45:57 +0100
committerGitHub <noreply@github.com>2026-01-10 11:45:57 -0300
commitbeae2ba6d6f7c09940ea14e508a88c21b4c81fb9 (patch)
tree85e3b68b4748a976f2bd7d4ac4c88fcefad0acd8
parent226591a02e3f9c4c18007776a3b31d20906ba7a3 (diff)
fix(Scripts/Naxxramas): further modernise Anub'Rekhan (#24225)HEADmaster
Co-authored-by: sogladev <sogladev@gmail.com>
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp187
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h3
2 files changed, 89 insertions, 101 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index a312ea1d71..18fe7a7725 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
@@ -37,141 +37,126 @@ enum Spells
{
SPELL_IMPALE = 28783,
SPELL_LOCUST_SWARM = 28785,
- SPELL_SUMMON_CORPSE_SCRABS_5 = 29105,
- SPELL_SUMMON_CORPSE_SCRABS_10 = 28864,
+ SPELL_SUMMON_CORPSE_SCARABS_5 = 29105,
+ SPELL_SUMMON_CORPSE_SCARABS_10 = 28864,
SPELL_BERSERK = 26662
};
enum Misc
{
- NPC_CORPSE_SCARAB = 16698,
- NPC_CRYPT_GUARD = 16573,
+ ACHIEV_TIMED_START_EVENT = 9891,
+ EVENT_SPAWN_CRYPT_GUARDS_1 = 0,
+ EVENT_BERSERK = 1,
+ EVENT_SPAWN_CRYPT_GUARDS_EXTRA = 2,
+};
- ACHIEV_TIMED_START_EVENT = 9891
+Position const cryptguardPositions[] = {
+ { 3299.732f, -3502.489f, 287.077f, 2.378f },
+ { 3299.086f, -3450.929f, 287.077f, 3.999f },
+ { 3331.217f, -3476.607f, 287.074f, 3.269f }
};
-class boss_anubrekhan : public CreatureScript
+struct boss_anubrekhan : public BossAI
{
-public:
- boss_anubrekhan() : CreatureScript("boss_anubrekhan") { }
+ boss_anubrekhan(Creature* creature) : BossAI(creature, BOSS_ANUB) { }
- CreatureAI* GetAI(Creature* pCreature) const override
+ void SummonCryptGuards()
{
- return GetNaxxramasAI<boss_anubrekhanAI>(pCreature);
+ if (Is25ManRaid())
+ {
+ me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ }
}
- struct boss_anubrekhanAI : public BossAI
+ void Reset() override
{
- boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB)
- {
- sayGreet = false;
- }
+ BossAI::Reset();
+ SummonCryptGuards();
+ }
- void SummonCryptGuards()
+ void JustSummoned(Creature* cr) override
+ {
+ if (me->IsInCombat())
{
- if (Is25ManRaid())
- {
- me->SummonCreature(NPC_CRYPT_GUARD, 3299.732f, -3502.489f, 287.077f, 2.378f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- me->SummonCreature(NPC_CRYPT_GUARD, 3299.086f, -3450.929f, 287.077f, 3.999f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- }
+ cr->SetInCombatWithZone();
+ if (cr->GetEntry() == NPC_CRYPT_GUARD)
+ cr->AI()->Talk(EMOTE_SPAWN, me);
}
+ summons.Summon(cr);
+ }
- void Reset() override
+ void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
+ {
+ if (summon->GetEntry() == NPC_CRYPT_GUARD)
{
- BossAI::Reset();
- SummonCryptGuards();
- me->m_Events.KillAllEvents(false);
+ summon->CastSpell(summon, SPELL_SUMMON_CORPSE_SCARABS_10, true, nullptr, nullptr, me->GetGUID());
+ summon->AI()->Talk(EMOTE_SCARAB);
}
+ }
- void JustSummoned(Creature* cr) override
- {
- if (me->IsInCombat())
- {
- cr->SetInCombatWithZone();
- if (cr->GetEntry() == NPC_CRYPT_GUARD)
- cr->AI()->Talk(EMOTE_SPAWN, me);
- }
- summons.Summon(cr);
- }
+ void JustDied(Unit* killer) override
+ {
+ BossAI::JustDied(killer);
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ }
- void SummonedCreatureDies(Creature* cr, Unit*) override
- {
- if (cr->GetEntry() == NPC_CRYPT_GUARD)
- {
- cr->CastSpell(cr, SPELL_SUMMON_CORPSE_SCRABS_10, true, nullptr, nullptr, me->GetGUID());
- cr->AI()->Talk(EMOTE_SCARAB);
- }
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (!victim->IsPlayer())
+ return;
+
+ Talk(SAY_SLAY);
+ victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_5, true, nullptr, nullptr, me->GetGUID());
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ me->CallForHelp(30.0f);
+ Talk(SAY_AGGRO);
- void JustDied(Unit* killer) override
+ if (!summons.HasEntry(NPC_CRYPT_GUARD))
+ SummonCryptGuards();
+ if (!Is25ManRaid())
{
- BossAI::JustDied(killer);
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ ScheduleUniqueTimedEvent(17500ms, [&] {
+ me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ }, EVENT_SPAWN_CRYPT_GUARDS_1);
}
- void KilledUnit(Unit* victim) override
- {
- if (!victim->IsPlayer())
- return;
+ ScheduleTimedEvent(15s, [&] {
+ DoCastRandomTarget(SPELL_IMPALE);
+ }, 20s);
- Talk(SAY_SLAY);
- victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
- instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
- }
+ ScheduleTimedEvent(70s, 2min, [&] {
+ Talk(EMOTE_LOCUST);
+ DoCastSelf(SPELL_LOCUST_SWARM);
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- me->CallForHelp(30.0f);
- Talk(SAY_AGGRO);
-
- if (!summons.HasEntry(NPC_CRYPT_GUARD))
- SummonCryptGuards();
- if (!Is25ManRaid())
- {
- me->m_Events.AddEventAtOffset([&]
- {
- me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- }, Milliseconds(urand(15000, 20000)));
- }
-
- ScheduleTimedEvent(15s, [&] {
- DoCastRandomTarget(SPELL_IMPALE);
- }, 20s);
-
- ScheduleTimedEvent(70s, 2min, [&] {
- Talk(EMOTE_LOCUST);
- DoCastSelf(SPELL_LOCUST_SWARM);
-
- me->m_Events.AddEventAtOffset([&]
- {
- me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- }, 3s);
-
- }, 90s);
-
- me->m_Events.AddEventAtOffset([&]
- {
- DoCastSelf(SPELL_BERSERK, true);
- }, 10min);
- }
+ scheduler.Schedule(3s, [this](TaskContext /*context*/) {
+ me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ });
+ }, 90s);
- void MoveInLineOfSight(Unit* who) override
+ ScheduleEnrageTimer(SPELL_BERSERK, 10min);
+ }
+
+ void MoveInLineOfSight(Unit* who) override
+ {
+ if (!_sayGreet && who->IsPlayer())
{
- if (!sayGreet && who->IsPlayer())
- {
- Talk(SAY_GREET);
- sayGreet = true;
- }
- ScriptedAI::MoveInLineOfSight(who);
+ Talk(SAY_GREET);
+ _sayGreet = true;
}
+ BossAI::MoveInLineOfSight(who);
+ }
- private:
- bool sayGreet;
- };
+private:
+ bool _sayGreet{false};
};
void AddSC_boss_anubrekhan()
{
- new boss_anubrekhan();
+ RegisterNaxxramasCreatureAI(boss_anubrekhan);
}
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index c28bc2ee4f..f94aeb501e 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -146,6 +146,9 @@ enum NaxxramasGameObjectsDisplayId
enum NaxxramasCreatureId
{
+ // Anub'Rekhan
+ NPC_CRYPT_GUARD = 16573,
+
// Patchwerk
NPC_PATCHWERK = 16028,
NPC_PATCHWORK_GOLEM = 16017,