refactor(Scripts/UtgardeKeep): Modernize Prince Keleseth script (#20806)

This commit is contained in:
Andrew
2024-12-02 08:17:16 -03:00
committed by GitHub
parent 0f1618faf5
commit 8c387fa2b8
3 changed files with 53 additions and 94 deletions

View File

@@ -51,30 +51,24 @@ enum eSpells
#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H) #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 struct npc_frost_tomb : public NullCreatureAI
{ {
npc_frost_tomb(Creature* c) : NullCreatureAI(c) npc_frost_tomb(Creature* c) : NullCreatureAI(c)
{ {
if (TempSummon* t = c->ToTempSummon()) if (WorldObject* summoner = GetSummoner())
if (Unit* s = t->GetSummonerUnit()) if (Unit* summonerUnit = summoner->ToUnit())
{ {
PrisonerGUID = s->GetGUID(); PrisonerGUID = summonerUnit->GetGUID();
if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic()) if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic())
{ {
const int32 dmg = 2000; 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 else
c->CastSpell(s, SPELL_FROST_TOMB_AURA, true); c->CastSpell(summonerUnit, SPELL_FROST_TOMB_AURA, true);
} }
} }
ObjectGuid PrisonerGUID; ObjectGuid PrisonerGUID;
void JustDied(Unit* killer) override 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) boss_keleseth(Creature* creature) : BossAI(creature, DATA_KELESETH) { }
{
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
void Reset() override
{
events.Reset();
if (pInstance)
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
}
void KilledUnit(Unit* victim) override void KilledUnit(Unit* victim) override
{ {
if (victim->IsPlayer()) if (victim->IsPlayer())
{
Talk(SAY_KILL); Talk(SAY_KILL);
}
} }
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
_JustDied();
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(DATA_KELESETH, DONE);
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
events.Reset(); _JustEngagedWith();
events.RescheduleEvent(EVENT_SPELL_SHADOWBOLT, 0ms);
events.RescheduleEvent(EVENT_FROST_TOMB, 28s);
events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 4s);
Talk(SAY_START_COMBAT); Talk(SAY_START_COMBAT);
DoZoneInCombat();
if (pInstance) ScheduleTimedEvent(1s, [&] {
pInstance->SetData(DATA_KELESETH, IN_PROGRESS); 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 void AttackStart(Unit* who) override
@@ -157,55 +150,6 @@ struct boss_keleseth : public ScriptedAI
UnitAI::AttackStartCaster(who, 12.0f); 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 enum eSkeletonEnum
@@ -260,7 +204,7 @@ struct npc_vrykul_skeleton : public ScriptedAI
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS) if (pInstance && pInstance->GetBossState(DATA_KELESETH) != IN_PROGRESS)
{ {
if (me->IsAlive()) if (me->IsAlive())
me->KillSelf(); me->KillSelf();

View File

@@ -44,6 +44,8 @@ public:
{ {
instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap) instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
{ {
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr); LoadObjectData(creatureData, nullptr);
} }
@@ -69,12 +71,26 @@ public:
bool IsEncounterInProgress() const override bool IsEncounterInProgress() const override
{ {
if (InstanceScript::IsEncounterInProgress())
return true;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true; if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false; 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 void OnPlayerEnter(Player* plr) override
{ {
if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH)) if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH))
@@ -160,11 +176,6 @@ public:
{ {
switch (type) switch (type)
{ {
case DATA_KELESETH:
m_auiEncounter[0] = data;
if (data == NOT_STARTED)
bRocksAchiev = true;
break;
case DATA_ON_THE_ROCKS_ACHIEV: case DATA_ON_THE_ROCKS_ACHIEV:
bRocksAchiev = false; bRocksAchiev = false;
break; break;

View File

@@ -22,6 +22,10 @@
#define UtgardeKeepScriptName "instance_utgarde_keep" #define UtgardeKeepScriptName "instance_utgarde_keep"
#define DataHeader "UK"
uint32 const EncounterCount = 3;
enum eData enum eData
{ {
DATA_KELESETH, DATA_KELESETH,