refactor(Scripts/HallOfLightning): modernize scripts (#23209)

This commit is contained in:
Grimdhex
2025-10-17 13:33:25 +02:00
committed by GitHub
parent 058f7acac6
commit 789c98fccb
6 changed files with 1039 additions and 1130 deletions
@@ -106,19 +106,9 @@ enum Yells
EMOTE_BERSEKER_STANCE = 8, EMOTE_BERSEKER_STANCE = 8,
}; };
class boss_bjarngrim : public CreatureScript struct boss_bjarngrim : public npc_escortAI
{ {
public: boss_bjarngrim(Creature* creature) : npc_escortAI(creature), summons(creature)
boss_bjarngrim() : CreatureScript("boss_bjarngrim") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<boss_bjarngrimAI>(creature);
}
struct boss_bjarngrimAI : public npc_escortAI
{
boss_bjarngrimAI(Creature* creature) : npc_escortAI(creature), summons(creature)
{ {
m_pInstance = creature->GetInstanceScript(); m_pInstance = creature->GetInstanceScript();
@@ -141,11 +131,6 @@ public:
Start(true, ObjectGuid::Empty, nullptr, false, true); Start(true, ObjectGuid::Empty, nullptr, false, true);
} }
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 m_uiStance;
void Reset() override void Reset() override
{ {
events.Reset(); events.Reset();
@@ -371,25 +356,17 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
private:
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 m_uiStance;
}; };
class npc_stormforged_lieutenant : public CreatureScript struct npc_stormforged_lieutenant : public ScriptedAI
{ {
public: npc_stormforged_lieutenant(Creature* creature) : ScriptedAI(creature) { }
npc_stormforged_lieutenant() : CreatureScript("npc_stormforged_lieutenant") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<npc_stormforged_lieutenantAI>(creature);
}
struct npc_stormforged_lieutenantAI : public ScriptedAI
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
ObjectGuid BjarngrimGUID;
void Reset() override void Reset() override
{ {
@@ -433,11 +410,14 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
private:
EventMap events;
ObjectGuid BjarngrimGUID;
}; };
void AddSC_boss_bjarngrim() void AddSC_boss_bjarngrim()
{ {
new boss_bjarngrim(); RegisterHallOfLightningCreatureAI(boss_bjarngrim);
new npc_stormforged_lieutenant(); RegisterHallOfLightningCreatureAI(npc_stormforged_lieutenant);
} }
@@ -68,28 +68,13 @@ enum IonarEvents
EVENT_RESTORE = 5, EVENT_RESTORE = 5,
}; };
class boss_ionar : public CreatureScript struct boss_ionar : public BossAI
{ {
public: boss_ionar(Creature* creature) : BossAI(creature, DATA_IONAR), summons(creature)
boss_ionar() : CreatureScript("boss_ionar") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<boss_ionarAI>(creature);
}
struct boss_ionarAI : public ScriptedAI
{
boss_ionarAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{ {
m_pInstance = creature->GetInstanceScript(); m_pInstance = creature->GetInstanceScript();
} }
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
void Reset() override void Reset() override
{ {
HealthCheck = 50; HealthCheck = 50;
@@ -223,24 +208,17 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
private:
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
}; };
class npc_spark_of_ionar : public CreatureScript struct npc_spark_of_ionar : public ScriptedAI
{ {
public: npc_spark_of_ionar(Creature* creature) : ScriptedAI(creature) { }
npc_spark_of_ionar() : CreatureScript("npc_spark_of_ionar") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<npc_spark_of_ionarAI>(creature);
}
struct npc_spark_of_ionarAI : public ScriptedAI
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { }
bool returning;
void MoveInLineOfSight(Unit*) override { } void MoveInLineOfSight(Unit*) override { }
void UpdateAI(uint32) override { } void UpdateAI(uint32) override { }
@@ -272,7 +250,9 @@ public:
me->DespawnOrUnsummon(1s); me->DespawnOrUnsummon(1s);
} }
} }
};
private:
bool returning;
}; };
// 52658, 59795 - Static Overload // 52658, 59795 - Static Overload
@@ -302,7 +282,7 @@ class spell_ionar_static_overload : public AuraScript
void AddSC_boss_ionar() void AddSC_boss_ionar()
{ {
new boss_ionar(); RegisterHallOfLightningCreatureAI(boss_ionar);
new npc_spark_of_ionar(); RegisterHallOfLightningCreatureAI(npc_spark_of_ionar);
RegisterSpellScript(spell_ionar_static_overload); RegisterSpellScript(spell_ionar_static_overload);
} }
@@ -60,32 +60,15 @@ enum LokenEvents
EVENT_AURA_REMOVE = 5 EVENT_AURA_REMOVE = 5
}; };
class boss_loken : public CreatureScript struct boss_loken : public BossAI
{ {
public: boss_loken(Creature* creature) : BossAI(creature, DATA_LOKEN)
boss_loken() : CreatureScript("boss_loken") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<boss_lokenAI>(creature);
}
struct boss_lokenAI : public ScriptedAI
{
boss_lokenAI(Creature* creature) : ScriptedAI(creature)
{ {
m_pInstance = creature->GetInstanceScript(); m_pInstance = creature->GetInstanceScript();
if (m_pInstance) if (m_pInstance)
isActive = m_pInstance->GetData(TYPE_LOKEN_INTRO); isActive = m_pInstance->GetData(TYPE_LOKEN_INTRO);
} }
InstanceScript* m_pInstance;
EventMap events;
bool isActive;
uint32 IntroTimer;
uint8 HealthCheck;
void MoveInLineOfSight(Unit*) override { } void MoveInLineOfSight(Unit*) override { }
void Reset() override void Reset() override
@@ -251,7 +234,13 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; private:
InstanceScript* m_pInstance;
EventMap events;
bool isActive;
uint32 IntroTimer;
uint8 HealthCheck;
}; };
class spell_loken_pulsing_shockwave : public SpellScript class spell_loken_pulsing_shockwave : public SpellScript
@@ -276,6 +265,6 @@ class spell_loken_pulsing_shockwave : public SpellScript
void AddSC_boss_loken() void AddSC_boss_loken()
{ {
new boss_loken(); RegisterHallOfLightningCreatureAI(boss_loken);
RegisterSpellScript(spell_loken_pulsing_shockwave); RegisterSpellScript(spell_loken_pulsing_shockwave);
} }
@@ -78,31 +78,13 @@ enum Yells
EMOTE_SHATTER = 6, EMOTE_SHATTER = 6,
}; };
class boss_volkhan : public CreatureScript struct boss_volkhan : public BossAI
{ {
public: boss_volkhan(Creature* creature) : BossAI(creature, DATA_VOLKHAN), summons(creature)
boss_volkhan() : CreatureScript("boss_volkhan") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<boss_volkhanAI>(creature);
}
struct boss_volkhanAI : public ScriptedAI
{
boss_volkhanAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{ {
m_pInstance = creature->GetInstanceScript(); m_pInstance = creature->GetInstanceScript();
} }
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
float x, y, z;
uint8 PointID;
uint8 ShatteredCount;
void Reset() override void Reset() override
{ {
x = y = z = PointID = ShatteredCount = 0; x = y = z = PointID = ShatteredCount = 0;
@@ -316,29 +298,24 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
private:
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
float x, y, z;
uint8 PointID;
uint8 ShatteredCount;
}; };
class npc_molten_golem : public CreatureScript struct npc_molten_golem : public ScriptedAI
{ {
public: npc_molten_golem(Creature* creature) : ScriptedAI(creature)
npc_molten_golem() : CreatureScript("npc_molten_golem") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<npc_molten_golemAI>(creature);
}
struct npc_molten_golemAI : public ScriptedAI
{
npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
{ {
m_pInstance = creature->GetInstanceScript(); m_pInstance = creature->GetInstanceScript();
} }
EventMap events;
InstanceScript* m_pInstance;
void Reset() override void Reset() override
{ {
events.Reset(); events.Reset();
@@ -374,7 +351,7 @@ public:
{ {
if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER) if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER)
{ {
if (Creature* volkhan = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(TYPE_VOLKHAN))) if (Creature* volkhan = m_pInstance->GetCreature(DATA_VOLKHAN))
volkhan->AI()->DoAction(ACTION_DESTROYED); volkhan->AI()->DoAction(ACTION_DESTROYED);
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_SHATTER_H : SPELL_SHATTER_N, true); me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_SHATTER_H : SPELL_SHATTER_N, true);
@@ -407,7 +384,9 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; private:
EventMap events;
InstanceScript* m_pInstance;
}; };
enum monumentSpells enum monumentSpells
@@ -443,19 +422,9 @@ enum monumentEvents
EVENT_UNFREEZE = 20, EVENT_UNFREEZE = 20,
}; };
class npc_hol_monument : public CreatureScript struct npc_hol_monument : public ScriptedAI
{ {
public: npc_hol_monument(Creature* creature) : ScriptedAI(creature)
npc_hol_monument() : CreatureScript("npc_hol_monument") {}
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfLightningAI<npc_hol_monumentAI>(creature);
}
struct npc_hol_monumentAI : public ScriptedAI
{
npc_hol_monumentAI(Creature* creature) : ScriptedAI(creature)
{ {
_attackGUID.Clear(); _attackGUID.Clear();
_isActive = urand(0, 1); _isActive = urand(0, 1);
@@ -463,14 +432,6 @@ public:
me->CastSpell(me, SPELL_FREEZE_ANIM, true); me->CastSpell(me, SPELL_FREEZE_ANIM, true);
} }
EventMap events;
bool _isActive;
ObjectGuid _attackGUID;
void Reset() override
{
}
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
{ {
if (_attackGUID) if (_attackGUID)
@@ -572,12 +533,16 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
};
private:
EventMap events;
bool _isActive;
ObjectGuid _attackGUID;
}; };
void AddSC_boss_volkhan() void AddSC_boss_volkhan()
{ {
new boss_volkhan(); RegisterHallOfLightningCreatureAI(boss_volkhan);
new npc_molten_golem(); RegisterHallOfLightningCreatureAI(npc_molten_golem);
new npc_hol_monument(); RegisterHallOfLightningCreatureAI(npc_hol_monument);
} }
@@ -24,6 +24,15 @@
#define HallsOfLightningScriptName "instance_halls_of_lightning" #define HallsOfLightningScriptName "instance_halls_of_lightning"
enum BossIds
{
DATA_BJARNGRIM = 0,
DATA_IONAR = 1,
DATA_LOKEN = 2,
DATA_VOLKHAN = 3,
MAX_ENCOUNTERS
};
enum HoLEvents enum HoLEvents
{ {
TYPE_BJARNGRIM = 0, TYPE_BJARNGRIM = 0,
@@ -60,4 +69,6 @@ inline AI* GetHallsOfLightningAI(T* obj)
return GetInstanceAI<AI>(obj, HallsOfLightningScriptName); return GetInstanceAI<AI>(obj, HallsOfLightningScriptName);
} }
#define RegisterHallOfLightningCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetHallsOfLightningAI)
#endif #endif
@@ -32,35 +32,19 @@ public:
struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript
{ {
instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { Initialize(); }; instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
uint32 m_auiEncounter[MAX_ENCOUNTER];
ObjectGuid m_uiGeneralBjarngrimGUID;
ObjectGuid m_uiIonarGUID;
ObjectGuid m_uiLokenGUID;
ObjectGuid m_uiVolkhanGUID;
ObjectGuid m_uiBjarngrimDoorGUID;
ObjectGuid m_uiVolkhanDoorGUID;
ObjectGuid m_uiIonarDoorGUID;
ObjectGuid m_uiLokenDoorGUID;
ObjectGuid m_uiLokenGlobeGUID;
bool volkhanAchievement;
bool bjarngrimAchievement;
void Initialize() override
{ {
SetHeaders(DataHeader); SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); SetBossNumber(MAX_ENCOUNTERS);
volkhanAchievement = false; volkhanAchievement = false;
bjarngrimAchievement = false; bjarngrimAchievement = false;
} };
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 && i != TYPE_LOKEN_INTRO) if (m_auiEncounter[i] == IN_PROGRESS && i != TYPE_LOKEN_INTRO)
@@ -195,22 +179,22 @@ public:
return m_auiEncounter[uiType]; return m_auiEncounter[uiType];
} }
ObjectGuid GetGuidData(uint32 uiData) const override private:
{ uint32 m_auiEncounter[MAX_ENCOUNTER];
switch (uiData)
{
case TYPE_BJARNGRIM:
return m_uiGeneralBjarngrimGUID;
case TYPE_VOLKHAN:
return m_uiVolkhanGUID;
case TYPE_IONAR:
return m_uiIonarGUID;
case TYPE_LOKEN:
return m_uiLokenGUID;
}
return ObjectGuid::Empty; ObjectGuid m_uiGeneralBjarngrimGUID;
} ObjectGuid m_uiIonarGUID;
ObjectGuid m_uiLokenGUID;
ObjectGuid m_uiVolkhanGUID;
ObjectGuid m_uiBjarngrimDoorGUID;
ObjectGuid m_uiVolkhanDoorGUID;
ObjectGuid m_uiIonarDoorGUID;
ObjectGuid m_uiLokenDoorGUID;
ObjectGuid m_uiLokenGlobeGUID;
bool volkhanAchievement;
bool bjarngrimAchievement;
}; };
}; };