From 8c387fa2b8b4d1dac8902a3b3dc33bf24210fbb6 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 2 Dec 2024 08:17:16 -0300 Subject: [PATCH] refactor(Scripts/UtgardeKeep): Modernize Prince Keleseth script (#20806) --- .../UtgardeKeep/UtgardeKeep/boss_keleseth.cpp | 122 +++++------------- .../UtgardeKeep/instance_utgarde_keep.cpp | 21 ++- .../UtgardeKeep/UtgardeKeep/utgarde_keep.h | 4 + 3 files changed, 53 insertions(+), 94 deletions(-) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index b51d5c4c9..a3d0626fa 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -51,30 +51,24 @@ enum eSpells #define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H) -enum eEvents -{ - EVENT_SPELL_SHADOWBOLT = 1, - EVENT_FROST_TOMB, - EVENT_SUMMON_SKELETONS, -}; - struct npc_frost_tomb : public NullCreatureAI { npc_frost_tomb(Creature* c) : NullCreatureAI(c) { - if (TempSummon* t = c->ToTempSummon()) - if (Unit* s = t->GetSummonerUnit()) + if (WorldObject* summoner = GetSummoner()) + if (Unit* summonerUnit = summoner->ToUnit()) { - PrisonerGUID = s->GetGUID(); + PrisonerGUID = summonerUnit->GetGUID(); if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic()) { const int32 dmg = 2000; - c->CastCustomSpell(s, SPELL_FROST_TOMB_AURA, nullptr, &dmg, nullptr, true); + c->CastCustomSpell(summonerUnit, SPELL_FROST_TOMB_AURA, nullptr, &dmg, nullptr, true); } else - c->CastSpell(s, SPELL_FROST_TOMB_AURA, true); + c->CastSpell(summonerUnit, SPELL_FROST_TOMB_AURA, true); } } + ObjectGuid PrisonerGUID; void JustDied(Unit* killer) override @@ -104,50 +98,49 @@ struct npc_frost_tomb : public NullCreatureAI } }; -struct boss_keleseth : public ScriptedAI +struct boss_keleseth : public BossAI { - boss_keleseth(Creature* c) : ScriptedAI(c) - { - pInstance = c->GetInstanceScript(); - } - - InstanceScript* pInstance; - EventMap events; - - void Reset() override - { - events.Reset(); - if (pInstance) - pInstance->SetData(DATA_KELESETH, NOT_STARTED); - } + boss_keleseth(Creature* creature) : BossAI(creature, DATA_KELESETH) { } void KilledUnit(Unit* victim) override { if (victim->IsPlayer()) - { Talk(SAY_KILL); - } } void JustDied(Unit* /*killer*/) override { + _JustDied(); Talk(SAY_DEATH); - if (pInstance) - pInstance->SetData(DATA_KELESETH, DONE); } void JustEngagedWith(Unit* /*who*/) override { - events.Reset(); - events.RescheduleEvent(EVENT_SPELL_SHADOWBOLT, 0ms); - events.RescheduleEvent(EVENT_FROST_TOMB, 28s); - events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 4s); - + _JustEngagedWith(); Talk(SAY_START_COMBAT); - DoZoneInCombat(); - if (pInstance) - pInstance->SetData(DATA_KELESETH, IN_PROGRESS); + ScheduleTimedEvent(1s, [&] { + DoCastVictim(SPELL_SHADOWBOLT); + }, 4s, 5s); + + ScheduleTimedEvent(28s, [&] { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_FROST_TOMB_AURA)) + { + Talk(SAY_FROST_TOMB_EMOTE, target); + Talk(SAY_FROST_TOMB); + DoCast(target, SPELL_FROST_TOMB); + } + }, 15s); + + me->m_Events.AddEventAtOffset([this]() { + Talk(SAY_SUMMON_SKELETONS); + for (uint8 i = 0; i < 5; ++i) + { + float dist = rand_norm() * 4 + 3.0f; + float angle = rand_norm() * 2 * M_PI; + me->SummonCreature(NPC_SKELETON, 156.2f + cos(angle) * dist, 259.1f + std::sin(angle) * dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + } + }, 4s); } void AttackStart(Unit* who) override @@ -157,55 +150,6 @@ struct boss_keleseth : public ScriptedAI UnitAI::AttackStartCaster(who, 12.0f); } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case 0: - break; - case EVENT_SPELL_SHADOWBOLT: - me->CastSpell(me->GetVictim(), SPELL_SHADOWBOLT, false); - events.Repeat(4s, 5s); - break; - case EVENT_FROST_TOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true)) - if (!target->HasAura(SPELL_FROST_TOMB_AURA)) - { - Talk(SAY_FROST_TOMB_EMOTE, target); - Talk(SAY_FROST_TOMB); - me->CastSpell(target, SPELL_FROST_TOMB, false); - events.Repeat(15s); - break; - } - events.Repeat(1s); - break; - case EVENT_SUMMON_SKELETONS: - Talk(SAY_SUMMON_SKELETONS); - for (uint8 i = 0; i < 5; ++i) - { - float dist = rand_norm() * 4 + 3.0f; - float angle = rand_norm() * 2 * M_PI; - if (Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f + cos(angle) * dist, 259.1f + std::sin(angle) * dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) - if (Unit* target = c->SelectNearestTarget(250.0f)) - { - c->AddThreat(target, 5.0f); - DoZoneInCombat(c); - } - } - break; - } - - DoMeleeAttackIfReady(); - } }; enum eSkeletonEnum @@ -260,7 +204,7 @@ struct npc_vrykul_skeleton : public ScriptedAI void UpdateAI(uint32 diff) override { - if (pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS) + if (pInstance && pInstance->GetBossState(DATA_KELESETH) != IN_PROGRESS) { if (me->IsAlive()) me->KillSelf(); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp index 475fa0c2e..6425e7360 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp @@ -44,6 +44,8 @@ public: { instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); LoadObjectData(creatureData, nullptr); } @@ -69,12 +71,26 @@ public: bool IsEncounterInProgress() const override { + if (InstanceScript::IsEncounterInProgress()) + return true; + for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) if (m_auiEncounter[i] == IN_PROGRESS) return true; return false; } + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + if (type == DATA_KELESETH && state == NOT_STARTED) + bRocksAchiev = true; + + return true; + } + void OnPlayerEnter(Player* plr) override { if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH)) @@ -160,11 +176,6 @@ public: { switch (type) { - case DATA_KELESETH: - m_auiEncounter[0] = data; - if (data == NOT_STARTED) - bRocksAchiev = true; - break; case DATA_ON_THE_ROCKS_ACHIEV: bRocksAchiev = false; break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h index a2da84257..9ba762751 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h @@ -22,6 +22,10 @@ #define UtgardeKeepScriptName "instance_utgarde_keep" +#define DataHeader "UK" + +uint32 const EncounterCount = 3; + enum eData { DATA_KELESETH,