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)
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();

View File

@@ -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;

View File

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