fix(Scripts/Naxxramas): further modernise Anub'Rekhan (#24225)

Co-authored-by: sogladev <sogladev@gmail.com>
This commit is contained in:
Dan
2026-01-10 15:45:57 +01:00
committed by GitHub
parent 226591a02e
commit beae2ba6d6
2 changed files with 95 additions and 107 deletions

View File

@@ -37,141 +37,126 @@ enum Spells
{ {
SPELL_IMPALE = 28783, SPELL_IMPALE = 28783,
SPELL_LOCUST_SWARM = 28785, SPELL_LOCUST_SWARM = 28785,
SPELL_SUMMON_CORPSE_SCRABS_5 = 29105, SPELL_SUMMON_CORPSE_SCARABS_5 = 29105,
SPELL_SUMMON_CORPSE_SCRABS_10 = 28864, SPELL_SUMMON_CORPSE_SCARABS_10 = 28864,
SPELL_BERSERK = 26662 SPELL_BERSERK = 26662
}; };
enum Misc enum Misc
{ {
NPC_CORPSE_SCARAB = 16698, ACHIEV_TIMED_START_EVENT = 9891,
NPC_CRYPT_GUARD = 16573, EVENT_SPAWN_CRYPT_GUARDS_1 = 0,
EVENT_BERSERK = 1,
ACHIEV_TIMED_START_EVENT = 9891 EVENT_SPAWN_CRYPT_GUARDS_EXTRA = 2,
}; };
class boss_anubrekhan : public CreatureScript Position const cryptguardPositions[] = {
{ { 3299.732f, -3502.489f, 287.077f, 2.378f },
public: { 3299.086f, -3450.929f, 287.077f, 3.999f },
boss_anubrekhan() : CreatureScript("boss_anubrekhan") { } { 3331.217f, -3476.607f, 287.074f, 3.269f }
};
CreatureAI* GetAI(Creature* pCreature) const override struct boss_anubrekhan : public BossAI
{
boss_anubrekhan(Creature* creature) : BossAI(creature, BOSS_ANUB) { }
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) BossAI::Reset();
{ SummonCryptGuards();
sayGreet = false; }
}
void SummonCryptGuards() void JustSummoned(Creature* cr) override
{ {
if (Is25ManRaid()) if (me->IsInCombat())
{
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);
}
}
void Reset() override
{
BossAI::Reset();
SummonCryptGuards();
me->m_Events.KillAllEvents(false);
}
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 SummonedCreatureDies(Creature* cr, Unit*) override
{ {
cr->SetInCombatWithZone();
if (cr->GetEntry() == NPC_CRYPT_GUARD) if (cr->GetEntry() == NPC_CRYPT_GUARD)
{ cr->AI()->Talk(EMOTE_SPAWN, me);
cr->CastSpell(cr, SPELL_SUMMON_CORPSE_SCRABS_10, true, nullptr, nullptr, me->GetGUID());
cr->AI()->Talk(EMOTE_SCARAB);
}
} }
summons.Summon(cr);
}
void JustDied(Unit* killer) override void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
{
if (summon->GetEntry() == NPC_CRYPT_GUARD)
{ {
BossAI::JustDied(killer); summon->CastSpell(summon, SPELL_SUMMON_CORPSE_SCARABS_10, true, nullptr, nullptr, me->GetGUID());
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); summon->AI()->Talk(EMOTE_SCARAB);
} }
}
void KilledUnit(Unit* victim) override void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
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);
if (!summons.HasEntry(NPC_CRYPT_GUARD))
SummonCryptGuards();
if (!Is25ManRaid())
{ {
if (!victim->IsPlayer()) ScheduleUniqueTimedEvent(17500ms, [&] {
return; me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
}, EVENT_SPAWN_CRYPT_GUARDS_1);
Talk(SAY_SLAY);
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
} }
void JustEngagedWith(Unit* who) override ScheduleTimedEvent(15s, [&] {
DoCastRandomTarget(SPELL_IMPALE);
}, 20s);
ScheduleTimedEvent(70s, 2min, [&] {
Talk(EMOTE_LOCUST);
DoCastSelf(SPELL_LOCUST_SWARM);
scheduler.Schedule(3s, [this](TaskContext /*context*/) {
me->SummonCreature(NPC_CRYPT_GUARD, cryptguardPositions[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
});
}, 90s);
ScheduleEnrageTimer(SPELL_BERSERK, 10min);
}
void MoveInLineOfSight(Unit* who) override
{
if (!_sayGreet && who->IsPlayer())
{ {
BossAI::JustEngagedWith(who); Talk(SAY_GREET);
me->CallForHelp(30.0f); _sayGreet = true;
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);
} }
BossAI::MoveInLineOfSight(who);
}
void MoveInLineOfSight(Unit* who) override private:
{ bool _sayGreet{false};
if (!sayGreet && who->IsPlayer())
{
Talk(SAY_GREET);
sayGreet = true;
}
ScriptedAI::MoveInLineOfSight(who);
}
private:
bool sayGreet;
};
}; };
void AddSC_boss_anubrekhan() void AddSC_boss_anubrekhan()
{ {
new boss_anubrekhan(); RegisterNaxxramasCreatureAI(boss_anubrekhan);
} }

View File

@@ -146,6 +146,9 @@ enum NaxxramasGameObjectsDisplayId
enum NaxxramasCreatureId enum NaxxramasCreatureId
{ {
// Anub'Rekhan
NPC_CRYPT_GUARD = 16573,
// Patchwerk // Patchwerk
NPC_PATCHWERK = 16028, NPC_PATCHWERK = 16028,
NPC_PATCHWORK_GOLEM = 16017, NPC_PATCHWORK_GOLEM = 16017,