refactor(Scripts/Ulduar): Update Ulduar to use boss states and other modernizations (#24714)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Andrew
2026-02-15 08:57:57 -03:00
committed by GitHub
parent b348455d53
commit a05a43cee1
18 changed files with 9986 additions and 11504 deletions
@@ -0,0 +1,2 @@
-- Remove unused ScriptName from Pure Saronite Deposit
UPDATE `gameobject_template` SET `ScriptName` = '' WHERE `entry` = 195036;
@@ -260,14 +260,9 @@ private:
Unit* _caster; Unit* _caster;
}; };
class boss_algalon_the_observer : public CreatureScript struct boss_algalon_the_observer : public ScriptedAI
{ {
public: boss_algalon_the_observer(Creature* creature) : ScriptedAI(creature), summons(me)
boss_algalon_the_observer() : CreatureScript("boss_algalon_the_observer") {}
struct boss_algalon_the_observerAI : public ScriptedAI
{
boss_algalon_the_observerAI(Creature* creature) : ScriptedAI(creature), summons(me)
{ {
_fedOnTears = true; _fedOnTears = true;
_firstPull = true; _firstPull = true;
@@ -369,7 +364,7 @@ public:
} }
if (m_pInstance) if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, FAIL); m_pInstance->SetData(BOSS_ALGALON, FAIL);
ScriptedAI::EnterEvadeMode(why); ScriptedAI::EnterEvadeMode(why);
} }
@@ -390,13 +385,13 @@ public:
_phaseTwo = false; _phaseTwo = false;
_heraldOfTheTitans = true; _heraldOfTheTitans = true;
if (m_pInstance->GetData(TYPE_ALGALON) == FAIL) if (m_pInstance->GetBossState(BOSS_ALGALON) == FAIL)
{ {
_firstPull = false; _firstPull = false;
} }
if (m_pInstance) if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); m_pInstance->SetData(BOSS_ALGALON, NOT_STARTED);
} }
void KilledUnit(Unit* victim) override void KilledUnit(Unit* victim) override
@@ -451,7 +446,7 @@ public:
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->InterruptNonMeleeSpells(false); me->InterruptNonMeleeSpells(false);
if (m_pInstance) if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED); m_pInstance->SetData(BOSS_ALGALON, NOT_STARTED);
break; break;
case ACTION_INIT_ALGALON: case ACTION_INIT_ALGALON:
_firstPull = false; _firstPull = false;
@@ -661,11 +656,11 @@ public:
case EVENT_INTRO_FINISH: case EVENT_INTRO_FINISH:
events.Reset(); events.Reset();
me->SetImmuneToPC(false); me->SetImmuneToPC(false);
if (Creature* brann = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_BRANN_BRONZBEARD_ALG))) if (Creature* brann = m_pInstance->GetCreature(DATA_BRANN_BRONZEBEARD_ALG))
brann->AI()->DoAction(ACTION_FINISH_INTRO); brann->AI()->DoAction(ACTION_FINISH_INTRO);
break; break;
case EVENT_START_COMBAT: case EVENT_START_COMBAT:
m_pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); m_pInstance->SetData(BOSS_ALGALON, IN_PROGRESS);
Talk(SAY_ALGALON_AGGRO); Talk(SAY_ALGALON_AGGRO);
break; break;
case EVENT_REMOVE_UNNATTACKABLE: case EVENT_REMOVE_UNNATTACKABLE:
@@ -742,7 +737,7 @@ public:
case EVENT_OUTRO_START: case EVENT_OUTRO_START:
if (m_pInstance) if (m_pInstance)
{ {
m_pInstance->SetData(TYPE_ALGALON, DONE); m_pInstance->SetData(BOSS_ALGALON, DONE);
m_pInstance->SetData(DATA_ALGALON_DEFEATED, 1); m_pInstance->SetData(DATA_ALGALON_DEFEATED, 1);
} }
break; break;
@@ -824,20 +819,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct npc_brann_bronzebeard_algalon : public CreatureAI
{ {
return GetUlduarAI<boss_algalon_the_observerAI>(creature); npc_brann_bronzebeard_algalon(Creature* creature) : CreatureAI(creature)
}
};
class npc_brann_bronzebeard_algalon : public CreatureScript
{
public:
npc_brann_bronzebeard_algalon() : CreatureScript("npc_brann_bronzebeard_algalon") { }
struct npc_brann_bronzebeard_algalonAI : public CreatureAI
{
npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature)
{ {
} }
@@ -908,7 +892,7 @@ public:
me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]); me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
break; break;
case EVENT_SUMMON_ALGALON: case EVENT_SUMMON_ALGALON:
if (me->GetInstanceScript() && !me->GetInstanceScript()->GetGuidData(TYPE_ALGALON)) if (me->GetInstanceScript() && !me->GetInstanceScript()->GetCreature(BOSS_ALGALON))
if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos)) if (Creature* algalon = me->GetMap()->SummonCreature(NPC_ALGALON, AlgalonSummonPos))
algalon->AI()->DoAction(ACTION_START_INTRO); algalon->AI()->DoAction(ACTION_START_INTRO);
break; break;
@@ -922,20 +906,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct npc_collapsing_star : public NullCreatureAI
{ {
return GetUlduarAI<npc_brann_bronzebeard_algalonAI>(creature); npc_collapsing_star(Creature* creature) : NullCreatureAI(creature)
}
};
class npc_collapsing_star : public CreatureScript
{
public:
npc_collapsing_star() : CreatureScript("npc_collapsing_star") { }
struct npc_collapsing_starAI : public NullCreatureAI
{
npc_collapsing_starAI(Creature* creature) : NullCreatureAI(creature)
{ {
creature->GetMotionMaster()->MoveRandom(25.0f); creature->GetMotionMaster()->MoveRandom(25.0f);
creature->CastSpell(creature, SPELL_COLLAPSE, true); creature->CastSpell(creature, SPELL_COLLAPSE, true);
@@ -958,20 +931,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct npc_living_constellation : public ScriptedAI
{ {
return GetUlduarAI<npc_collapsing_starAI>(creature); npc_living_constellation(Creature* creature) : ScriptedAI(creature)
}
};
class npc_living_constellation : public CreatureScript
{
public:
npc_living_constellation() : CreatureScript("npc_living_constellation") { }
struct npc_living_constellationAI : public ScriptedAI
{
npc_living_constellationAI(Creature* creature) : ScriptedAI(creature)
{ {
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
} }
@@ -1050,20 +1012,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct npc_algalon_worm_hole : public NullCreatureAI
{ {
return GetUlduarAI<npc_living_constellationAI>(creature); npc_algalon_worm_hole(Creature* creature) : NullCreatureAI(creature)
}
};
class npc_algalon_worm_hole : public CreatureScript
{
public:
npc_algalon_worm_hole() : CreatureScript("npc_algalon_worm_hole") { }
struct npc_algalon_worm_holeAI : public NullCreatureAI
{
npc_algalon_worm_holeAI(Creature* creature) : NullCreatureAI(creature)
{ {
creature->CastSpell(creature, SPELL_WORM_HOLE_TRIGGER, true); creature->CastSpell(creature, SPELL_WORM_HOLE_TRIGGER, true);
creature->CastSpell(creature, SPELL_SUMMON_VOID_ZONE_VISUAL, true); creature->CastSpell(creature, SPELL_SUMMON_VOID_ZONE_VISUAL, true);
@@ -1098,12 +1049,6 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_algalon_worm_holeAI>(creature);
}
};
class go_celestial_planetarium_access : public GameObjectScript class go_celestial_planetarium_access : public GameObjectScript
{ {
public: public:
@@ -1153,10 +1098,10 @@ public:
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
{ {
instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); instance->SetData(DATA_ALGALON_SUMMON_STATE, 1);
if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_DOODAD_UL_SIGILDOOR_01))) if (GameObject* sigil = instance->GetGameObject(DATA_SIGILDOOR_01))
sigil->SetGoState(GO_STATE_ACTIVE); sigil->SetGoState(GO_STATE_ACTIVE);
if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_DOODAD_UL_SIGILDOOR_02))) if (GameObject* sigil = instance->GetGameObject(DATA_SIGILDOOR_02))
sigil->SetGoState(GO_STATE_ACTIVE); sigil->SetGoState(GO_STATE_ACTIVE);
if (Map* map = player->GetMap()) if (Map* map = player->GetMap())
@@ -1394,11 +1339,11 @@ public:
void AddSC_boss_algalon_the_observer() void AddSC_boss_algalon_the_observer()
{ {
// NPCs // NPCs
new boss_algalon_the_observer(); RegisterUlduarCreatureAI(boss_algalon_the_observer);
new npc_brann_bronzebeard_algalon(); RegisterUlduarCreatureAI(npc_brann_bronzebeard_algalon);
new npc_collapsing_star(); RegisterUlduarCreatureAI(npc_collapsing_star);
new npc_living_constellation(); RegisterUlduarCreatureAI(npc_living_constellation);
new npc_algalon_worm_hole(); RegisterUlduarCreatureAI(npc_algalon_worm_hole);
// GOs // GOs
new go_celestial_planetarium_access(); new go_celestial_planetarium_access();
@@ -128,11 +128,7 @@ bool IsEncounterComplete(InstanceScript* pInstance, Creature* me)
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
ObjectGuid guid = pInstance->GetGuidData(DATA_STEELBREAKER + i); if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!guid)
return false;
if (Creature* boss = (ObjectAccessor::GetCreature(*me, guid)))
{ {
if (boss->IsAlive()) if (boss->IsAlive())
return false; return false;
@@ -151,41 +147,27 @@ void RespawnAssemblyOfIron(InstanceScript* pInstance, Creature* me)
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
ObjectGuid guid = pInstance->GetGuidData(DATA_STEELBREAKER + i); if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!guid)
return;
if (Creature* boss = (ObjectAccessor::GetCreature((*me), guid)))
if (!boss->IsAlive()) if (!boss->IsAlive())
boss->Respawn(); boss->Respawn();
} }
return; return;
} }
void RestoreAssemblyHealth(ObjectGuid guid1, ObjectGuid guid2, Creature* me) void RestoreAssemblyHealth(uint32 dataId1, uint32 dataId2, InstanceScript* pInstance)
{ {
if (Creature* cr = ObjectAccessor::GetCreature(*me, guid1)) if (Creature* cr = pInstance->GetCreature(dataId1))
if (cr->IsAlive()) if (cr->IsAlive())
cr->SetHealth(cr->GetMaxHealth()); cr->SetHealth(cr->GetMaxHealth());
if (Creature* cr2 = ObjectAccessor::GetCreature(*me, guid2)) if (Creature* cr2 = pInstance->GetCreature(dataId2))
if (cr2->IsAlive()) if (cr2->IsAlive())
cr2->SetHealth(cr2->GetMaxHealth()); cr2->SetHealth(cr2->GetMaxHealth());
} }
class boss_steelbreaker : public CreatureScript struct boss_steelbreaker : public ScriptedAI
{ {
public: boss_steelbreaker(Creature* c) : ScriptedAI(c)
boss_steelbreaker() : CreatureScript("boss_steelbreaker") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_steelbreakerAI>(pCreature);
}
struct boss_steelbreakerAI : public ScriptedAI
{
boss_steelbreakerAI(Creature* c) : ScriptedAI(c)
{ {
pInstance = c->GetInstanceScript(); pInstance = c->GetInstanceScript();
} }
@@ -202,7 +184,7 @@ public:
_phase = 0; _phase = 0;
events.Reset(); events.Reset();
if (pInstance) if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
} }
void JustReachedHome() override void JustReachedHome() override
@@ -214,7 +196,7 @@ public:
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
{ {
if (pInstance) if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); pInstance->SetBossState(BOSS_ASSEMBLY, IN_PROGRESS);
me->setActive(true); me->setActive(true);
me->SetInCombatWithZone(); me->SetInCombatWithZone();
@@ -225,7 +207,7 @@ public:
if (!pInstance) if (!pInstance)
return; return;
if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_STEELBREAKER + urand(0, 2)))) if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + urand(0, 2)))
{ {
switch (boss->GetEntry()) switch (boss->GetEntry())
{ {
@@ -242,7 +224,7 @@ public:
} }
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_STEELBREAKER + i))) if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!boss->IsInCombat()) if (!boss->IsInCombat())
boss->AI()->AttackStart(who); boss->AI()->AttackStart(who);
} }
@@ -276,13 +258,13 @@ public:
if (IsEncounterComplete(pInstance, me)) if (IsEncounterComplete(pInstance, me))
{ {
pInstance->SetData(TYPE_ASSEMBLY, DONE); pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit me->CastSpell(me, 65195, true); // credit
Talk(SAY_STEELBREAKER_ENCOUNTER_DEFEATED); Talk(SAY_STEELBREAKER_ENCOUNTER_DEFEATED);
} }
else else
{ {
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_BRUNDIR), pInstance->GetGuidData(DATA_MOLGEIM), me); RestoreAssemblyHealth(DATA_BRUNDIR, DATA_MOLGEIM, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true); me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_STEELBREAKER_DEATH); Talk(SAY_STEELBREAKER_DEATH);
} }
@@ -346,7 +328,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class CastRunesEvent : public BasicEvent class CastRunesEvent : public BasicEvent
{ {
@@ -364,19 +345,9 @@ private:
Creature& _owner; Creature& _owner;
}; };
class boss_runemaster_molgeim : public CreatureScript struct boss_runemaster_molgeim : public ScriptedAI
{ {
public: boss_runemaster_molgeim(Creature* c) : ScriptedAI(c), summons(me)
boss_runemaster_molgeim() : CreatureScript("boss_runemaster_molgeim") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_runemaster_molgeimAI>(pCreature);
}
struct boss_runemaster_molgeimAI : public ScriptedAI
{
boss_runemaster_molgeimAI(Creature* c) : ScriptedAI(c), summons(me)
{ {
pInstance = c->GetInstanceScript(); pInstance = c->GetInstanceScript();
} }
@@ -396,7 +367,7 @@ public:
summons.DespawnAll(); summons.DespawnAll();
if (pInstance) if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
me->m_Events.AddEventAtOffset(new CastRunesEvent(*me), 8s); me->m_Events.AddEventAtOffset(new CastRunesEvent(*me), 8s);
} }
@@ -419,7 +390,7 @@ public:
return; return;
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_STEELBREAKER + i))) if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!boss->IsInCombat()) if (!boss->IsInCombat())
boss->AI()->AttackStart(who); boss->AI()->AttackStart(who);
} }
@@ -454,13 +425,13 @@ public:
if (IsEncounterComplete(pInstance, me)) if (IsEncounterComplete(pInstance, me))
{ {
pInstance->SetData(TYPE_ASSEMBLY, DONE); pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit me->CastSpell(me, 65195, true); // credit
Talk(SAY_MOLGEIM_ENCOUNTER_DEFEATED); Talk(SAY_MOLGEIM_ENCOUNTER_DEFEATED);
} }
else else
{ {
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_STEELBREAKER), pInstance->GetGuidData(DATA_BRUNDIR), me); RestoreAssemblyHealth(DATA_STEELBREAKER, DATA_BRUNDIR, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true); me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_MOLGEIM_DEATH); Talk(SAY_MOLGEIM_DEATH);
} }
@@ -527,21 +498,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class npc_assembly_lightning : public CreatureScript struct npc_assembly_lightning : public ScriptedAI
{ {
public: npc_assembly_lightning(Creature* c) : ScriptedAI(c)
npc_assembly_lightning() : CreatureScript("npc_assembly_lightning") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_assembly_lightningAI>(pCreature);
}
struct npc_assembly_lightningAI : public ScriptedAI
{
npc_assembly_lightningAI(Creature* c) : ScriptedAI(c)
{ {
_boomed = false; _boomed = false;
} }
@@ -572,21 +532,10 @@ public:
} }
} }
}; };
};
class boss_stormcaller_brundir : public CreatureScript struct boss_stormcaller_brundir : public ScriptedAI
{ {
public: boss_stormcaller_brundir(Creature* c) : ScriptedAI(c)
boss_stormcaller_brundir() : CreatureScript("boss_stormcaller_brundir") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_stormcaller_brundirAI>(pCreature);
}
struct boss_stormcaller_brundirAI : public ScriptedAI
{
boss_stormcaller_brundirAI(Creature* c) : ScriptedAI(c)
{ {
pInstance = c->GetInstanceScript(); pInstance = c->GetInstanceScript();
} }
@@ -615,7 +564,7 @@ public:
me->SetRegeneratingHealth(true); me->SetRegeneratingHealth(true);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
if (pInstance) if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
} }
void JustReachedHome() override void JustReachedHome() override
@@ -636,7 +585,7 @@ public:
return; return;
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
if (Creature* boss = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_STEELBREAKER + i))) if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!boss->IsInCombat()) if (!boss->IsInCombat())
boss->AI()->AttackStart(who); boss->AI()->AttackStart(who);
} }
@@ -672,13 +621,13 @@ public:
me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), 427.5, me->GetOrientation()); me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), 427.5, me->GetOrientation());
if (IsEncounterComplete(pInstance, me)) if (IsEncounterComplete(pInstance, me))
{ {
pInstance->SetData(TYPE_ASSEMBLY, DONE); pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit me->CastSpell(me, 65195, true); // credit
Talk(SAY_BRUNDIR_ENCOUNTER_DEFEATED); Talk(SAY_BRUNDIR_ENCOUNTER_DEFEATED);
} }
else else
{ {
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_STEELBREAKER), pInstance->GetGuidData(DATA_MOLGEIM), me); RestoreAssemblyHealth(DATA_STEELBREAKER, DATA_MOLGEIM, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true); me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_BRUNDIR_DEATH); Talk(SAY_BRUNDIR_DEATH);
} }
@@ -822,7 +771,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class spell_shield_of_runes_aura : public AuraScript class spell_shield_of_runes_aura : public AuraScript
{ {
@@ -853,7 +801,7 @@ class spell_assembly_meltdown : public SpellScript
void HandleInstaKill(SpellEffIndex /*effIndex*/) void HandleInstaKill(SpellEffIndex /*effIndex*/)
{ {
if (InstanceScript* instance = GetCaster()->GetInstanceScript()) if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_STEELBREAKER))) if (Creature* Steelbreaker = instance->GetCreature(DATA_STEELBREAKER))
Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE); Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE);
} }
@@ -921,7 +869,7 @@ public:
return false; return false;
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(DATA_BRUNDIR))) if (Creature* cr = instance->GetCreature(DATA_BRUNDIR))
return cr->AI()->GetData(DATA_BRUNDIR); return cr->AI()->GetData(DATA_BRUNDIR);
return false; return false;
@@ -930,10 +878,10 @@ public:
void AddSC_boss_assembly_of_iron() void AddSC_boss_assembly_of_iron()
{ {
new boss_steelbreaker(); RegisterUlduarCreatureAI(boss_steelbreaker);
new boss_runemaster_molgeim(); RegisterUlduarCreatureAI(boss_runemaster_molgeim);
new boss_stormcaller_brundir(); RegisterUlduarCreatureAI(boss_stormcaller_brundir);
new npc_assembly_lightning(); RegisterUlduarCreatureAI(npc_assembly_lightning);
RegisterSpellScript(spell_shield_of_runes_aura); RegisterSpellScript(spell_shield_of_runes_aura);
RegisterSpellScript(spell_assembly_meltdown); RegisterSpellScript(spell_assembly_meltdown);
@@ -97,7 +97,7 @@ enum Misc
struct boss_auriaya : public BossAI struct boss_auriaya : public BossAI
{ {
boss_auriaya(Creature* creature) : BossAI(creature, TYPE_AURIAYA) { } boss_auriaya(Creature* creature) : BossAI(creature, BOSS_AURIAYA) { }
bool _feralDied{false}; bool _feralDied{false};
bool _nineLives{false}; bool _nineLives{false};
@@ -230,8 +230,8 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
{ {
if (me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_AURIAYA))) if (Creature* cr = instance->GetCreature(BOSS_AURIAYA))
cr->SetInCombatWithZone(); cr->SetInCombatWithZone();
events.ScheduleEvent(EVENT_SAVAGE_POUNCE, 5s); events.ScheduleEvent(EVENT_SAVAGE_POUNCE, 5s);
@@ -241,7 +241,7 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI
void Reset() override void Reset() override
{ {
events.Reset(); events.Reset();
me->CastSpell(me, SPELL_STRENGTH_OF_THE_PACK, true); DoCastSelf(SPELL_STRENGTH_OF_THE_PACK, true);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -303,8 +303,8 @@ struct npc_auriaya_feral_defender : public ScriptedAI
void JustDied(Unit*) override void JustDied(Unit*) override
{ {
if (me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_AURIAYA))) if (Creature* cr = instance->GetCreature(BOSS_AURIAYA))
cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH); cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH);
if (_feralEssenceStack) if (_feralEssenceStack)
@@ -357,11 +357,11 @@ struct npc_auriaya_feral_defender : public ScriptedAI
DoResetThreatList(); DoResetThreatList();
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
me->CastSpell(me->GetVictim(), SPELL_FERAL_RUSH, true); DoCastVictim(SPELL_FERAL_RUSH, true);
events.Repeat(6s); events.Repeat(6s);
break; break;
case EVENT_FERAL_POUNCE: case EVENT_FERAL_POUNCE:
me->CastSpell(me->GetVictim(), SPELL_FERAL_POUNCE, false); DoCastVictim(SPELL_FERAL_POUNCE);
events.Repeat(6s); events.Repeat(6s);
break; break;
} }
@@ -394,8 +394,8 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_AURIAYA))) if (Creature* auriaya = instance->GetCreature(BOSS_AURIAYA))
return cr->AI()->GetData(DATA_CRAZY_CAT); return auriaya->AI()->GetData(DATA_CRAZY_CAT);
return false; return false;
} }
@@ -410,7 +410,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_AURIAYA))) if (Creature* cr = instance->GetCreature(BOSS_AURIAYA))
return cr->AI()->GetData(DATA_NINE_LIVES); return cr->AI()->GetData(DATA_NINE_LIVES);
return false; return false;
@@ -193,28 +193,14 @@ enum Misc
const Position homePos = {322.39f, -14.5f, 409.8f, 3.14f}; const Position homePos = {322.39f, -14.5f, 409.8f, 3.14f};
class boss_flame_leviathan : public CreatureScript struct boss_flame_leviathan : public BossAI
{ {
public: boss_flame_leviathan(Creature* pCreature) : BossAI(pCreature, BOSS_LEVIATHAN), vehicle(me->GetVehicleKit())
boss_flame_leviathan() : CreatureScript("boss_flame_leviathan") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_flame_leviathanAI>(pCreature);
}
struct boss_flame_leviathanAI : public ScriptedAI
{
boss_flame_leviathanAI(Creature* pCreature) : ScriptedAI(pCreature), vehicle(me->GetVehicleKit()), summons(me)
{
m_pInstance = pCreature->GetInstanceScript();
assert(vehicle); assert(vehicle);
} }
InstanceScript* m_pInstance;
Vehicle* vehicle; Vehicle* vehicle;
EventMap events;
SummonList summons;
uint32 _startTimer; uint32 _startTimer;
uint32 _speakTimer; uint32 _speakTimer;
@@ -234,9 +220,9 @@ public:
// Original // Original
void JustReachedHome() override void JustReachedHome() override
{ {
_JustReachedHome();
// For achievement // For achievement
if (m_pInstance) instance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0);
m_pInstance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0);
me->setActive(false); me->setActive(false);
} }
@@ -256,9 +242,9 @@ public:
void AttackStart(Unit* who) override void AttackStart(Unit* who) override
{ {
if (Unit* veh = who->GetVehicleBase()) if (Unit* veh = who->GetVehicleBase())
ScriptedAI::AttackStart(veh); BossAI::AttackStart(veh);
else else
ScriptedAI::AttackStart(who); BossAI::AttackStart(who);
} }
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
@@ -270,8 +256,7 @@ public:
me->SetHomePosition(homePos); me->SetHomePosition(homePos);
TurnHealStations(false); TurnHealStations(false);
ActivateTowers(); ActivateTowers();
if (m_pInstance) instance->SetBossState(BOSS_LEVIATHAN, SPECIAL);
m_pInstance->SetData(TYPE_LEVIATHAN, SPECIAL);
BindPlayers(); BindPlayers();
me->SetInCombatWithZone(); me->SetInCombatWithZone();
@@ -284,14 +269,14 @@ public:
void InitializeAI() override void InitializeAI() override
{ {
if (m_pInstance && m_pInstance->GetData(TYPE_LEVIATHAN) == SPECIAL) if (instance->GetBossState(BOSS_LEVIATHAN) == SPECIAL)
{ {
me->SetHomePosition(homePos); me->SetHomePosition(homePos);
me->UpdatePosition(homePos); me->UpdatePosition(homePos);
me->StopMovingOnCurrentPos(); me->StopMovingOnCurrentPos();
} }
ScriptedAI::InitializeAI(); BossAI::InitializeAI();
} }
void Reset() override void Reset() override
@@ -310,20 +295,17 @@ public:
_towersCount = 0; _towersCount = 0;
_destroyedTurretCount = 0; _destroyedTurretCount = 0;
if (m_pInstance) if (instance->GetBossState(BOSS_LEVIATHAN) != SPECIAL)
{ {
if (m_pInstance->GetData(TYPE_LEVIATHAN) != SPECIAL) instance->SetBossState(BOSS_LEVIATHAN, NOT_STARTED);
{
m_pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
} }
else else
{ {
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
m_pInstance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_LEVIATHAN); instance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_LEVIATHAN);
_startTimer = 0; _startTimer = 0;
} }
}
TurnGates(false, false); TurnGates(false, false);
TurnHealStations(true); TurnHealStations(true);
@@ -498,14 +480,13 @@ public:
} }
} }
}; };
};
void boss_flame_leviathan::boss_flame_leviathanAI::BindPlayers() void boss_flame_leviathan::BindPlayers()
{ {
me->GetMap()->ToInstanceMap()->PermBindAllPlayers(); me->GetMap()->ToInstanceMap()->PermBindAllPlayers();
} }
void boss_flame_leviathan::boss_flame_leviathanAI::RadioSay(uint8 textid) void boss_flame_leviathan::RadioSay(uint8 textid)
{ {
if (Creature* r = me->SummonCreature(NPC_BRANN_RADIO, me->GetPositionX() - 150, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 5000)) if (Creature* r = me->SummonCreature(NPC_BRANN_RADIO, me->GetPositionX() - 150, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 5000))
{ {
@@ -513,13 +494,13 @@ void boss_flame_leviathan::boss_flame_leviathanAI::RadioSay(uint8 textid)
} }
} }
void boss_flame_leviathan::boss_flame_leviathanAI::ActivateTowers() void boss_flame_leviathan::ActivateTowers()
{ {
_towersCount = 0; _towersCount = 0;
me->ResetLootMode(); me->ResetLootMode();
for (uint32 i = EVENT_TOWER_OF_LIFE_DESTROYED; i <= EVENT_TOWER_OF_FLAMES_DESTROYED; ++i) for (uint32 i = EVENT_TOWER_OF_LIFE_DESTROYED; i <= EVENT_TOWER_OF_FLAMES_DESTROYED; ++i)
{ {
if (m_pInstance->GetData(i)) if (instance->GetData(i))
{ {
++_towersCount; ++_towersCount;
@@ -547,35 +528,35 @@ void boss_flame_leviathan::boss_flame_leviathanAI::ActivateTowers()
} }
} }
void boss_flame_leviathan::boss_flame_leviathanAI::TurnGates(bool _start, bool _death) void boss_flame_leviathan::TurnGates(bool _start, bool _death)
{ {
if (!m_pInstance) if (!instance)
return; return;
if (_start) if (_start)
{ {
// first one is ALWAYS turned on, unless leviathan is beaten // first one is ALWAYS turned on, unless leviathan is beaten
GameObject* go = nullptr; GameObject* go = nullptr;
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_LIGHTNING_WALL2)))) if ((go = instance->GetGameObject(DATA_LIGHTNING_WALL2)))
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
if (m_pInstance->GetData(TYPE_LEVIATHAN) == NOT_STARTED) if (instance->GetBossState(BOSS_LEVIATHAN) == NOT_STARTED)
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_LEVIATHAN_DOORS)))) if ((go = instance->GetGameObject(DATA_LEVIATHAN_DOORS)))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
} }
else else
{ {
GameObject* go = nullptr; GameObject* go = nullptr;
if (_death) if (_death)
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_LIGHTNING_WALL1)))) if ((go = instance->GetGameObject(DATA_LIGHTNING_WALL1)))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_LIGHTNING_WALL2)))) if ((go = instance->GetGameObject(DATA_LIGHTNING_WALL2)))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_LEVIATHAN_DOORS)))) if ((go = instance->GetGameObject(DATA_LEVIATHAN_DOORS)))
{ {
if (m_pInstance->GetData(TYPE_LEVIATHAN) == SPECIAL || m_pInstance->GetData(TYPE_LEVIATHAN) == DONE) if (instance->GetBossState(BOSS_LEVIATHAN) == SPECIAL || instance->GetBossState(BOSS_LEVIATHAN) == DONE)
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
else else
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
@@ -583,29 +564,29 @@ void boss_flame_leviathan::boss_flame_leviathanAI::TurnGates(bool _start, bool _
} }
} }
void boss_flame_leviathan::boss_flame_leviathanAI::TurnHealStations(bool _apply) void boss_flame_leviathan::TurnHealStations(bool _apply)
{ {
if (!m_pInstance) if (!instance)
return; return;
GameObject* go = nullptr; GameObject* go = nullptr;
if (_apply) if (_apply)
{ {
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION1)))) if ((go = instance->GetGameObject(DATA_REPAIR_STATION1)))
go->SetLootState(GO_READY); go->SetLootState(GO_READY);
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION2)))) if ((go = instance->GetGameObject(DATA_REPAIR_STATION2)))
go->SetLootState(GO_READY); go->SetLootState(GO_READY);
} }
else else
{ {
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION1)))) if ((go = instance->GetGameObject(DATA_REPAIR_STATION1)))
go->SetLootState(GO_ACTIVATED); go->SetLootState(GO_ACTIVATED);
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION2)))) if ((go = instance->GetGameObject(DATA_REPAIR_STATION2)))
go->SetLootState(GO_ACTIVATED); go->SetLootState(GO_ACTIVATED);
} }
} }
void boss_flame_leviathan::boss_flame_leviathanAI::ScheduleEvents() void boss_flame_leviathan::ScheduleEvents()
{ {
events.RescheduleEvent(EVENT_MISSILE, 5s); events.RescheduleEvent(EVENT_MISSILE, 5s);
events.RescheduleEvent(EVENT_VENT, 20s); events.RescheduleEvent(EVENT_VENT, 20s);
@@ -617,7 +598,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::ScheduleEvents()
events.RescheduleEvent(EVENT_PURSUE, 0ms); events.RescheduleEvent(EVENT_PURSUE, 0ms);
} }
void boss_flame_leviathan::boss_flame_leviathanAI::SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) void boss_flame_leviathan::SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo)
{ {
if (spellInfo->Id == SPELL_SYSTEMS_SHUTDOWN) if (spellInfo->Id == SPELL_SYSTEMS_SHUTDOWN)
{ {
@@ -634,17 +615,14 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SpellHit(Unit* /*caster*/, S
me->InterruptNonMeleeSpells(false); me->InterruptNonMeleeSpells(false);
} }
void boss_flame_leviathan::boss_flame_leviathanAI::JustDied(Unit*) void boss_flame_leviathan::JustDied(Unit*)
{ {
// Despawn Lashers, do before summons clear // Despawn Lashers, do before summons clear
summons.DoAction(ACTION_DESPAWN_ADDS); summons.DoAction(ACTION_DESPAWN_ADDS);
summons.DespawnAll(); summons.DespawnAll();
if (m_pInstance) instance->SetBossState(BOSS_LEVIATHAN, DONE);
{ instance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_NONE);
m_pInstance->SetData(TYPE_LEVIATHAN, DONE);
m_pInstance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_NONE);
}
Talk(FLAME_LEVIATHAN_SAY_DEATH); Talk(FLAME_LEVIATHAN_SAY_DEATH);
@@ -652,7 +630,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::JustDied(Unit*)
BindPlayers(); BindPlayers();
} }
void boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(Unit* who) void boss_flame_leviathan::KilledUnit(Unit* who)
{ {
if (who == me->GetVictim()) if (who == me->GetVictim())
events.RescheduleEvent(EVENT_PURSUE, 0ms); events.RescheduleEvent(EVENT_PURSUE, 0ms);
@@ -661,7 +639,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(Unit* who)
Talk(FLAME_LEVIATHAN_SAY_SLAY); Talk(FLAME_LEVIATHAN_SAY_SLAY);
} }
void boss_flame_leviathan::boss_flame_leviathanAI::SummonTowerHelpers(uint8 towerId) void boss_flame_leviathan::SummonTowerHelpers(uint8 towerId)
{ {
if (towerId == TOWER_OF_LIFE) if (towerId == TOWER_OF_LIFE)
{ {
@@ -691,7 +669,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SummonTowerHelpers(uint8 towe
} }
} }
void boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(Unit* target, SpellInfo const* spell) void boss_flame_leviathan::SpellHitTarget(Unit* target, SpellInfo const* spell)
{ {
if (spell->Id != SPELL_PURSUED) if (spell->Id != SPELL_PURSUED)
return; return;
@@ -706,19 +684,9 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(Unit* target,
} }
} }
class boss_flame_leviathan_seat : public CreatureScript struct boss_flame_leviathan_seat : public VehicleAI
{ {
public: boss_flame_leviathan_seat(Creature* creature) : VehicleAI(creature), vehicle(creature->GetVehicleKit())
boss_flame_leviathan_seat() : CreatureScript("boss_flame_leviathan_seat") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_flame_leviathan_seatAI>(pCreature);
}
struct boss_flame_leviathan_seatAI : public VehicleAI
{
boss_flame_leviathan_seatAI(Creature* creature) : VehicleAI(creature), vehicle(creature->GetVehicleKit())
{ {
ASSERT(vehicle); ASSERT(vehicle);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
@@ -787,16 +755,10 @@ public:
} }
} }
}; };
};
class boss_flame_leviathan_defense_turret : public CreatureScript struct boss_flame_leviathan_defense_turret : public TurretAI
{ {
public: boss_flame_leviathan_defense_turret(Creature* creature) : TurretAI(creature)
boss_flame_leviathan_defense_turret() : CreatureScript("boss_flame_leviathan_defense_turret") { }
struct boss_flame_leviathan_defense_turretAI : public TurretAI
{
boss_flame_leviathan_defense_turretAI(Creature* creature) : TurretAI(creature)
{ {
_setHealth = false; _setHealth = false;
_instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
@@ -823,7 +785,7 @@ public:
if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE)) if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE))
device->ReplaceAllUnitFlags(UNIT_FLAG_NONE); // unselectable device->ReplaceAllUnitFlags(UNIT_FLAG_NONE); // unselectable
if (Creature* leviathan = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(TYPE_LEVIATHAN))) if (Creature* leviathan = _instance->GetCreature(BOSS_LEVIATHAN))
leviathan->AI()->DoAction(ACTION_DESTROYED_TURRET); leviathan->AI()->DoAction(ACTION_DESTROYED_TURRET);
} }
@@ -853,20 +815,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct boss_flame_leviathan_overload_device : public NullCreatureAI
{ {
return GetUlduarAI<boss_flame_leviathan_defense_turretAI>(creature); boss_flame_leviathan_overload_device(Creature* creature) : NullCreatureAI(creature)
}
};
class boss_flame_leviathan_overload_device : public CreatureScript
{
public:
boss_flame_leviathan_overload_device() : CreatureScript("boss_flame_leviathan_overload_device") { }
struct boss_flame_leviathan_overload_deviceAI : public NullCreatureAI
{
boss_flame_leviathan_overload_deviceAI(Creature* creature) : NullCreatureAI(creature)
{ {
} }
@@ -889,25 +840,9 @@ public:
} }
}; };
CreatureAI* GetAI(Creature* creature) const override struct npc_freya_ward : public NullCreatureAI
{ {
return GetUlduarAI<boss_flame_leviathan_overload_deviceAI>(creature); npc_freya_ward(Creature* c) : NullCreatureAI(c), summons(c)
}
};
class npc_freya_ward : public CreatureScript
{
public:
npc_freya_ward() : CreatureScript("npc_freya_ward") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_freya_wardAI>(pCreature);
}
struct npc_freya_wardAI : public NullCreatureAI
{
npc_freya_wardAI(Creature* c) : NullCreatureAI(c), summons(c)
{ {
} }
@@ -973,21 +908,10 @@ public:
summons.DespawnAll(); summons.DespawnAll();
} }
}; };
};
class npc_hodirs_fury : public CreatureScript struct npc_hodirs_fury : public NullCreatureAI
{ {
public: npc_hodirs_fury(Creature* c) : NullCreatureAI(c)
npc_hodirs_fury() : CreatureScript("npc_hodirs_fury") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_hodirs_furyAI>(pCreature);
}
struct npc_hodirs_furyAI : public NullCreatureAI
{
npc_hodirs_furyAI(Creature* c) : NullCreatureAI(c)
{ {
} }
@@ -1052,21 +976,10 @@ public:
} }
} }
}; };
};
class npc_mimirons_inferno : public CreatureScript struct npc_mimirons_inferno : public npc_escortAI
{ {
public: npc_mimirons_inferno(Creature* creature) : npc_escortAI(creature), summons(me)
npc_mimirons_inferno() : CreatureScript("npc_mimirons_inferno") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_mimirons_infernoAI>(creature);
}
struct npc_mimirons_infernoAI : public npc_escortAI
{
npc_mimirons_infernoAI(Creature* creature) : npc_escortAI(creature), summons(me)
{ {
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
} }
@@ -1115,21 +1028,10 @@ public:
} }
} }
}; };
};
class npc_thorims_hammer : public CreatureScript struct npc_thorims_hammer : public NullCreatureAI
{ {
public: npc_thorims_hammer(Creature* c) : NullCreatureAI(c)
npc_thorims_hammer() : CreatureScript("npc_thorims_hammer") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_thorims_hammerAI>(pCreature);
}
struct npc_thorims_hammerAI : public NullCreatureAI
{
npc_thorims_hammerAI(Creature* c) : NullCreatureAI(c)
{ {
} }
@@ -1171,21 +1073,10 @@ public:
} }
} }
}; };
};
class npc_pool_of_tar : public CreatureScript struct npc_pool_of_tar : public NullCreatureAI
{ {
public: npc_pool_of_tar(Creature* c) : NullCreatureAI(c)
npc_pool_of_tar() : CreatureScript("npc_pool_of_tar") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_pool_of_tarAI>(pCreature);
}
struct npc_pool_of_tarAI : public NullCreatureAI
{
npc_pool_of_tarAI(Creature* c) : NullCreatureAI(c)
{ {
} }
@@ -1200,23 +1091,12 @@ public:
me->CastSpell(me, SPELL_BLAZE, true); me->CastSpell(me, SPELL_BLAZE, true);
} }
}; };
};
class npc_brann_radio : public CreatureScript struct npc_brann_radio : public NullCreatureAI
{ {
public: npc_brann_radio(Creature* c) : NullCreatureAI(c)
npc_brann_radio() : CreatureScript("npc_brann_radio") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<npc_brann_radioAI>(pCreature); _lock = (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(BOSS_LEVIATHAN) > NOT_STARTED);
}
struct npc_brann_radioAI : public NullCreatureAI
{
npc_brann_radioAI(Creature* c) : NullCreatureAI(c)
{
_lock = (me->GetInstanceScript() && me->GetInstanceScript()->GetData(TYPE_LEVIATHAN) > NOT_STARTED);
_helpLock = _lock; _helpLock = _lock;
} }
@@ -1292,21 +1172,10 @@ public:
} }
} }
}; };
};
class npc_storm_beacon_spawn : public CreatureScript struct npc_storm_beacon_spawn : public NullCreatureAI
{ {
public: npc_storm_beacon_spawn(Creature* c) : NullCreatureAI(c)
npc_storm_beacon_spawn() : CreatureScript("npc_storm_beacon_spawn") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_storm_beacon_spawnAI>(pCreature);
}
struct npc_storm_beacon_spawnAI : public NullCreatureAI
{
npc_storm_beacon_spawnAI(Creature* c) : NullCreatureAI(c)
{ {
_amount = 0; _amount = 0;
_checkTimer = 0; _checkTimer = 0;
@@ -1333,21 +1202,10 @@ public:
} }
} }
}; };
};
class boss_flame_leviathan_safety_container : public CreatureScript struct boss_flame_leviathan_safety_container : public NullCreatureAI
{ {
public: boss_flame_leviathan_safety_container(Creature* c) : NullCreatureAI(c)
boss_flame_leviathan_safety_container() : CreatureScript("boss_flame_leviathan_safety_container") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_flame_leviathan_safety_containerAI>(pCreature);
}
struct boss_flame_leviathan_safety_containerAI : public NullCreatureAI
{
boss_flame_leviathan_safety_containerAI(Creature* c) : NullCreatureAI(c)
{ {
_allowTimer = 0; _allowTimer = 0;
} }
@@ -1381,21 +1239,10 @@ public:
} }
} }
}; };
};
class npc_mechanolift : public CreatureScript struct npc_mechanolift : public NullCreatureAI
{ {
public: npc_mechanolift(Creature* c) : NullCreatureAI(c)
npc_mechanolift() : CreatureScript("npc_mechanolift") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_mechanoliftAI>(pCreature);
}
struct npc_mechanoliftAI : public NullCreatureAI
{
npc_mechanoliftAI(Creature* c) : NullCreatureAI(c)
{ {
me->SetSpeed(MOVE_RUN, rand_norm() + 0.5f); me->SetSpeed(MOVE_RUN, rand_norm() + 0.5f);
} }
@@ -1429,7 +1276,6 @@ public:
} }
} }
}; };
};
class go_ulduar_tower : public GameObjectScript class go_ulduar_tower : public GameObjectScript
{ {
@@ -2018,23 +1864,23 @@ public:
void AddSC_boss_flame_leviathan() void AddSC_boss_flame_leviathan()
{ {
new boss_flame_leviathan(); RegisterUlduarCreatureAI(boss_flame_leviathan);
new boss_flame_leviathan_seat(); RegisterUlduarCreatureAI(boss_flame_leviathan_seat);
new boss_flame_leviathan_defense_turret(); RegisterUlduarCreatureAI(boss_flame_leviathan_defense_turret);
new boss_flame_leviathan_overload_device(); RegisterUlduarCreatureAI(boss_flame_leviathan_overload_device);
new npc_pool_of_tar(); RegisterUlduarCreatureAI(npc_pool_of_tar);
// Hard Mode // Hard Mode
new npc_freya_ward(); RegisterUlduarCreatureAI(npc_freya_ward);
new npc_thorims_hammer(); RegisterUlduarCreatureAI(npc_thorims_hammer);
new npc_mimirons_inferno(); RegisterUlduarCreatureAI(npc_mimirons_inferno);
new npc_hodirs_fury(); RegisterUlduarCreatureAI(npc_hodirs_fury);
// Helpers // Helpers
new npc_brann_radio(); RegisterUlduarCreatureAI(npc_brann_radio);
new npc_storm_beacon_spawn(); RegisterUlduarCreatureAI(npc_storm_beacon_spawn);
new boss_flame_leviathan_safety_container(); RegisterUlduarCreatureAI(boss_flame_leviathan_safety_container);
new npc_mechanolift(); RegisterUlduarCreatureAI(npc_mechanolift);
// GOs // GOs
new go_ulduar_tower(); new go_ulduar_tower();
@@ -198,30 +198,14 @@ enum Misc
CRITERIA_LUMBERJACKED = 21686, CRITERIA_LUMBERJACKED = 21686,
}; };
class boss_freya : public CreatureScript struct boss_freya : public BossAI
{ {
public: boss_freya(Creature* pCreature) : BossAI(pCreature, BOSS_FREYA)
boss_freya() : CreatureScript("boss_freya") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_freyaAI>(pCreature);
}
struct boss_freyaAI : public ScriptedAI
{
boss_freyaAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
m_pInstance = pCreature->GetInstanceScript();
if (!me->IsAlive()) if (!me->IsAlive())
if (m_pInstance) instance->SetBossState(BOSS_FREYA, DONE);
m_pInstance->SetData(TYPE_FREYA, DONE);
} }
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 _waveNumber; uint8 _waveNumber;
uint8 _trioKilled; uint8 _trioKilled;
uint8 _spawnedAmount; uint8 _spawnedAmount;
@@ -234,11 +218,7 @@ public:
void Reset() override void Reset() override
{ {
if (m_pInstance && m_pInstance->GetData(TYPE_FREYA) != DONE) _Reset();
m_pInstance->SetData(TYPE_FREYA, NOT_STARTED);
events.Reset();
summons.DespawnAll();
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
@@ -273,7 +253,7 @@ public:
if (damage >= me->GetHealth()) if (damage >= me->GetHealth())
{ {
damage = 0; damage = 0;
if (m_pInstance->GetData(TYPE_FREYA) != DONE) if (instance->GetBossState(BOSS_FREYA) != DONE)
{ {
Talk(SAY_DEATH); Talk(SAY_DEATH);
@@ -309,11 +289,8 @@ public:
} }
// Defeat credit // Defeat credit
if (m_pInstance)
{
me->CastSpell(me, 65074, true); // credit me->CastSpell(me, 65074, true); // credit
m_pInstance->SetData(TYPE_FREYA, DONE); instance->SetBossState(BOSS_FREYA, DONE);
}
scheduler.Schedule(14s, [this](TaskContext /*context*/) scheduler.Schedule(14s, [this](TaskContext /*context*/)
{ {
@@ -328,7 +305,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT) if (spellInfo->Id == SPELL_TELEPORT)
{ {
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
m_pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE); instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
} }
} }
@@ -339,7 +316,7 @@ public:
cr->CastSpell(cr, SPELL_UNSTABLE_SUN_VISUAL, true); cr->CastSpell(cr, SPELL_UNSTABLE_SUN_VISUAL, true);
cr->CastSpell(cr, SPELL_UNSTABLE_SUN_FREYA_DAMAGE, true); cr->CastSpell(cr, SPELL_UNSTABLE_SUN_FREYA_DAMAGE, true);
} }
summons.Summon(cr); BossAI::JustSummoned(cr);
} }
void SpawnWave() void SpawnWave()
@@ -374,14 +351,11 @@ public:
{ {
if (param == ACTION_LUMBERJACKED) if (param == ACTION_LUMBERJACKED)
{ {
if (!m_pInstance)
return;
++_lumberjacked; ++_lumberjacked;
if (_lumberjacked == 1) if (_lumberjacked == 1)
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED);
else if (_lumberjacked == 3) else if (_lumberjacked == 3)
m_pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65296 /*SPELL_LUMBERJACKED*/, 0, me); instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65296 /*SPELL_LUMBERJACKED*/, 0, me);
return; return;
} }
@@ -401,8 +375,8 @@ public:
if (param == ACTION_REMOVE_10_STACK) if (param == ACTION_REMOVE_10_STACK)
{ {
++_deforestation; ++_deforestation;
if (_deforestation >= 6 && m_pInstance) if (_deforestation >= 6)
m_pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFORESTATION_CREDIT, 0, me); instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFORESTATION_CREDIT, 0, me);
// do not return // do not return
} }
@@ -441,7 +415,7 @@ public:
return 0; return 0;
} }
void JustReachedHome() override { me->setActive(false); } void JustReachedHome() override { _JustReachedHome(); me->setActive(false); }
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
{ {
@@ -457,14 +431,11 @@ public:
events.ScheduleEvent(EVENT_FREYA_BERSERK, 10min); events.ScheduleEvent(EVENT_FREYA_BERSERK, 10min);
events.SetPhase(EVENT_PHASE_ADDS); events.SetPhase(EVENT_PHASE_ADDS);
if (!m_pInstance) if (instance->GetBossState(BOSS_FREYA) != DONE)
return; instance->SetBossState(BOSS_FREYA, IN_PROGRESS);
if (m_pInstance->GetData(TYPE_FREYA) != DONE)
m_pInstance->SetData(TYPE_FREYA, IN_PROGRESS);
// HARD MODE CHECKS // HARD MODE CHECKS
Creature* elder = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_ELDER_STONEBARK)); Creature* elder = instance->GetCreature(DATA_ELDER_STONEBARK);
if (elder && elder->IsAlive()) if (elder && elder->IsAlive())
{ {
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true); elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -475,7 +446,7 @@ public:
_elderGUID[0] = elder->GetGUID(); _elderGUID[0] = elder->GetGUID();
} }
elder = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_ELDER_IRONBRANCH)); elder = instance->GetCreature(DATA_ELDER_IRONBRANCH);
if (elder && elder->IsAlive()) if (elder && elder->IsAlive())
{ {
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true); elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -486,7 +457,7 @@ public:
_elderGUID[1] = elder->GetGUID(); _elderGUID[1] = elder->GetGUID();
} }
elder = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_ELDER_BRIGHTLEAF)); elder = instance->GetCreature(DATA_ELDER_BRIGHTLEAF);
if (elder && elder->IsAlive()) if (elder && elder->IsAlive())
{ {
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true); elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -621,21 +592,10 @@ public:
return me->GetPositionX() < 2135.0f; return me->GetPositionX() < 2135.0f;
} }
}; };
};
class boss_freya_elder_stonebark : public CreatureScript struct boss_freya_elder_stonebark : public ScriptedAI
{ {
public: boss_freya_elder_stonebark(Creature* pCreature) : ScriptedAI(pCreature)
boss_freya_elder_stonebark() : CreatureScript("boss_freya_elder_stonebark") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_elder_stonebarkAI>(pCreature);
}
struct boss_freya_elder_stonebarkAI : public ScriptedAI
{
boss_freya_elder_stonebarkAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
} }
@@ -664,7 +624,7 @@ public:
// Lumberjacked // Lumberjacked
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* freya = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_FREYA))) if (Creature* freya = me->GetInstanceScript()->GetCreature(BOSS_FREYA))
freya->AI()->DoAction(ACTION_LUMBERJACKED); freya->AI()->DoAction(ACTION_LUMBERJACKED);
} }
@@ -717,21 +677,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_freya_elder_brightleaf : public CreatureScript struct boss_freya_elder_brightleaf : public ScriptedAI
{ {
public: boss_freya_elder_brightleaf(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
boss_freya_elder_brightleaf() : CreatureScript("boss_freya_elder_brightleaf") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_elder_brightleafAI>(pCreature);
}
struct boss_freya_elder_brightleafAI : public ScriptedAI
{
boss_freya_elder_brightleafAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{ {
} }
@@ -760,7 +709,7 @@ public:
// Lumberjacked // Lumberjacked
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* freya = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_FREYA))) if (Creature* freya = me->GetInstanceScript()->GetCreature(BOSS_FREYA))
freya->AI()->DoAction(ACTION_LUMBERJACKED); freya->AI()->DoAction(ACTION_LUMBERJACKED);
} }
@@ -830,21 +779,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_freya_elder_ironbranch : public CreatureScript struct boss_freya_elder_ironbranch : public ScriptedAI
{ {
public: boss_freya_elder_ironbranch(Creature* pCreature) : ScriptedAI(pCreature)
boss_freya_elder_ironbranch() : CreatureScript("boss_freya_elder_ironbranch") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_elder_ironbranchAI>(pCreature);
}
struct boss_freya_elder_ironbranchAI : public ScriptedAI
{
boss_freya_elder_ironbranchAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
} }
@@ -871,7 +809,7 @@ public:
// Lumberjacked // Lumberjacked
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* freya = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_FREYA))) if (Creature* freya = me->GetInstanceScript()->GetCreature(BOSS_FREYA))
freya->AI()->DoAction(ACTION_LUMBERJACKED); freya->AI()->DoAction(ACTION_LUMBERJACKED);
} }
@@ -914,21 +852,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_freya_iron_root : public CreatureScript struct boss_freya_iron_root : public NullCreatureAI
{ {
public: boss_freya_iron_root(Creature* pCreature) : NullCreatureAI(pCreature) { }
boss_freya_iron_root() : CreatureScript("boss_freya_iron_root") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_iron_rootAI>(pCreature);
}
struct boss_freya_iron_rootAI : public NullCreatureAI
{
boss_freya_iron_rootAI(Creature* pCreature) : NullCreatureAI(pCreature) { }
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
@@ -944,21 +871,10 @@ public:
} }
} }
}; };
};
class boss_freya_lifebinder : public CreatureScript struct boss_freya_lifebinder : public NullCreatureAI
{ {
public: boss_freya_lifebinder(Creature* pCreature) : NullCreatureAI(pCreature)
boss_freya_lifebinder() : CreatureScript("boss_freya_lifebinder") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_lifebinderAI>(pCreature);
}
struct boss_freya_lifebinderAI : public NullCreatureAI
{
boss_freya_lifebinderAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
} }
@@ -984,21 +900,10 @@ public:
} }
} }
}; };
};
class boss_freya_healthy_spore : public CreatureScript struct boss_freya_healthy_spore : public NullCreatureAI
{ {
public: boss_freya_healthy_spore(Creature* pCreature) : NullCreatureAI(pCreature)
boss_freya_healthy_spore() : CreatureScript("boss_freya_healthy_spore") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_healthy_sporeAI>(pCreature);
}
struct boss_freya_healthy_sporeAI : public NullCreatureAI
{
boss_freya_healthy_sporeAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
} }
@@ -1023,29 +928,16 @@ public:
} }
} }
}; };
};
class boss_freya_summons : public CreatureScript struct boss_freya_summons : public ScriptedAI
{ {
public: boss_freya_summons(Creature* pCreature) : ScriptedAI(pCreature)
boss_freya_summons() : CreatureScript("boss_freya_summons") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_freya_summonsAI>(pCreature);
}
struct boss_freya_summonsAI : public ScriptedAI
{
boss_freya_summonsAI(Creature* pCreature) : ScriptedAI(pCreature)
{
_freyaGUID = me->GetInstanceScript() ? me->GetInstanceScript()->GetGuidData(TYPE_FREYA) : ObjectGuid::Empty;
_isTrio = me->GetEntry() == NPC_ANCIENT_WATER_SPIRIT || me->GetEntry() == NPC_STORM_LASHER || me->GetEntry() == NPC_SNAPLASHER; _isTrio = me->GetEntry() == NPC_ANCIENT_WATER_SPIRIT || me->GetEntry() == NPC_STORM_LASHER || me->GetEntry() == NPC_SNAPLASHER;
_hasDied = false; _hasDied = false;
} }
EventMap events; EventMap events;
ObjectGuid _freyaGUID;
uint8 _stackCount; uint8 _stackCount;
bool _hasDied; bool _hasDied;
bool _isTrio; bool _isTrio;
@@ -1060,7 +952,9 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (Creature* freya = ObjectAccessor::GetCreature(*me, _freyaGUID)) if (InstanceScript* instance = me->GetInstanceScript())
{
if (Creature* freya = instance->GetCreature(BOSS_FREYA))
{ {
if (!_hasDied) if (!_hasDied)
freya->AI()->DoAction(_stackCount); freya->AI()->DoAction(_stackCount);
@@ -1071,6 +965,7 @@ public:
_hasDied = true; _hasDied = true;
} }
} }
}
if (me->GetEntry() == NPC_DETONATING_LASHER) if (me->GetEntry() == NPC_DETONATING_LASHER)
me->CastSpell(me, SPELL_DETONATE, true); me->CastSpell(me, SPELL_DETONATE, true);
} }
@@ -1166,21 +1061,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_freya_nature_bomb : public CreatureScript struct boss_freya_nature_bomb : public NullCreatureAI
{ {
public: boss_freya_nature_bomb(Creature* pCreature) : NullCreatureAI(pCreature)
boss_freya_nature_bomb() : CreatureScript("boss_freya_nature_bomb") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_freya_nature_bombAI>(pCreature);
}
struct boss_freya_nature_bombAI : public NullCreatureAI
{
boss_freya_nature_bombAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
_goGUID.Clear(); _goGUID.Clear();
} }
@@ -1218,7 +1102,6 @@ public:
} }
} }
}; };
};
class achievement_freya_getting_back_to_nature : public AchievementCriteriaScript class achievement_freya_getting_back_to_nature : public AchievementCriteriaScript
{ {
@@ -1253,15 +1136,15 @@ private:
void AddSC_boss_freya() void AddSC_boss_freya()
{ {
new boss_freya(); RegisterUlduarCreatureAI(boss_freya);
new boss_freya_elder_stonebark(); RegisterUlduarCreatureAI(boss_freya_elder_stonebark);
new boss_freya_elder_brightleaf(); RegisterUlduarCreatureAI(boss_freya_elder_brightleaf);
new boss_freya_elder_ironbranch(); RegisterUlduarCreatureAI(boss_freya_elder_ironbranch);
new boss_freya_iron_root(); RegisterUlduarCreatureAI(boss_freya_iron_root);
new boss_freya_lifebinder(); RegisterUlduarCreatureAI(boss_freya_lifebinder);
new boss_freya_healthy_spore(); RegisterUlduarCreatureAI(boss_freya_healthy_spore);
new boss_freya_summons(); RegisterUlduarCreatureAI(boss_freya_summons);
new boss_freya_nature_bomb(); RegisterUlduarCreatureAI(boss_freya_nature_bomb);
new achievement_freya_getting_back_to_nature(); new achievement_freya_getting_back_to_nature();
new achievement_freya_knock_on_wood("achievement_freya_knock_on_wood", 1); new achievement_freya_knock_on_wood("achievement_freya_knock_on_wood", 1);
@@ -15,18 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "AccountMgr.h"
#include "AchievementCriteriaScript.h" #include "AchievementCriteriaScript.h"
#include "AreaDefines.h" #include "AreaDefines.h"
#include "BanMgr.h"
#include "CreatureScript.h" #include "CreatureScript.h"
#include "GameObjectScript.h"
#include "PassiveAI.h" #include "PassiveAI.h"
#include "Player.h" #include "Player.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellScript.h" #include "SpellScript.h"
#include "SpellScriptLoader.h" #include "SpellScriptLoader.h"
#include "WorldSession.h"
#include "ulduar.h" #include "ulduar.h"
enum VezaxSpellData enum VezaxSpellData
@@ -110,57 +106,36 @@ enum VaporsText
SAY_EMOTE_VAPORS = 0, SAY_EMOTE_VAPORS = 0,
}; };
class boss_vezax : public CreatureScript struct boss_vezax : public BossAI
{ {
public: boss_vezax(Creature* pCreature) : BossAI(pCreature, BOSS_VEZAX) { }
boss_vezax() : CreatureScript("boss_vezax") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_vezaxAI>(pCreature);
}
struct boss_vezaxAI : public ScriptedAI
{
boss_vezaxAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = pCreature->GetInstanceScript();
}
EventMap events;
SummonList summons;
uint8 vaporsCount; uint8 vaporsCount;
bool hardmodeAvailable; bool hardmodeAvailable;
bool berserk; bool berserk;
bool bAchievShadowdodger; bool bAchievShadowdodger;
InstanceScript* pInstance;
void Reset() override void Reset() override
{ {
_Reset();
vaporsCount = 0; vaporsCount = 0;
hardmodeAvailable = true; hardmodeAvailable = true;
berserk = false; berserk = false;
bAchievShadowdodger = true; bAchievShadowdodger = true;
events.Reset();
summons.DespawnAll();
me->SetLootMode(1); me->SetLootMode(1);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, NOT_STARTED);
} }
void JustReachedHome() override void JustReachedHome() override
{ {
_JustReachedHome();
me->setActive(false); me->setActive(false);
} }
void JustEngagedWith(Unit* /*pWho*/) override void JustEngagedWith(Unit* /*pWho*/) override
{ {
me->setActive(true); me->setActive(true);
me->SetInCombatWithZone(); _JustEngagedWith();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_VEZAX_SHADOW_CRASH, 13s); events.RescheduleEvent(EVENT_SPELL_VEZAX_SHADOW_CRASH, 13s);
events.RescheduleEvent(EVENT_SPELL_SEARING_FLAMES, 10s, 1); events.RescheduleEvent(EVENT_SPELL_SEARING_FLAMES, 10s, 1);
events.RescheduleEvent(EVENT_SPELL_SURGE_OF_DARKNESS, 63s); events.RescheduleEvent(EVENT_SPELL_SURGE_OF_DARKNESS, 63s);
@@ -170,9 +145,6 @@ public:
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, IN_PROGRESS);
me->CastSpell(me, SPELL_AURA_OF_DESPAIR_1, true); me->CastSpell(me, SPELL_AURA_OF_DESPAIR_1, true);
} }
@@ -352,10 +324,7 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
summons.DespawnAll(); _JustDied();
if (pInstance)
pInstance->SetData(TYPE_VEZAX, DONE);
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (GameObject* door = me->FindNearestGameObject(GO_VEZAX_DOOR, 500.0f)) if (GameObject* door = me->FindNearestGameObject(GO_VEZAX_DOOR, 500.0f))
@@ -373,32 +342,11 @@ public:
} }
void MoveInLineOfSight(Unit* /*who*/) override {} void MoveInLineOfSight(Unit* /*who*/) override {}
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
}
void SummonedCreatureDespawn(Creature* s) override
{
summons.Despawn(s);
}
};
}; };
class npc_ulduar_saronite_vapors : public CreatureScript struct npc_ulduar_saronite_vapors : public NullCreatureAI
{ {
public: npc_ulduar_saronite_vapors(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_saronite_vapors() : CreatureScript("npc_ulduar_saronite_vapors") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_saronite_vaporsAI>(pCreature);
}
struct npc_ulduar_saronite_vaporsAI : public NullCreatureAI
{
npc_ulduar_saronite_vaporsAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
pInstance = pCreature->GetInstanceScript(); pInstance = pCreature->GetInstanceScript();
me->GetMotionMaster()->MoveRandom(4.0f); me->GetMotionMaster()->MoveRandom(4.0f);
@@ -412,7 +360,7 @@ public:
// killed saronite vapors, hard mode unavailable // killed saronite vapors, hard mode unavailable
if (pInstance) if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX))) if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->DoAction(1); vezax->AI()->DoAction(1);
} }
@@ -421,25 +369,14 @@ public:
Talk(SAY_EMOTE_VAPORS); Talk(SAY_EMOTE_VAPORS);
} }
}; };
};
class npc_ulduar_saronite_animus : public CreatureScript struct npc_ulduar_saronite_animus : public ScriptedAI
{ {
public: npc_ulduar_saronite_animus(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_saronite_animus() : CreatureScript("npc_ulduar_saronite_animus") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_saronite_animusAI>(pCreature);
}
struct npc_ulduar_saronite_animusAI : public ScriptedAI
{
npc_ulduar_saronite_animusAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = pCreature->GetInstanceScript(); pInstance = pCreature->GetInstanceScript();
if (pInstance) if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX))) if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->JustSummoned(me); vezax->AI()->JustSummoned(me);
timer = 0; timer = 0;
me->SetInCombatWithZone(); me->SetInCombatWithZone();
@@ -453,7 +390,7 @@ public:
me->DespawnOrUnsummon(3s); me->DespawnOrUnsummon(3s);
if (pInstance) if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX))) if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->DoAction(2); vezax->AI()->DoAction(2);
} }
@@ -471,7 +408,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class spell_aura_of_despair_aura : public AuraScript class spell_aura_of_despair_aura : public AuraScript
{ {
@@ -630,34 +566,11 @@ public:
} }
}; };
class go_ulduar_pure_saronite_deposit : public GameObjectScript
{
public:
go_ulduar_pure_saronite_deposit() : GameObjectScript("go_ulduar_pure_saronite_deposit") { }
bool OnGossipHello(Player* plr, GameObject* go) override
{
if (plr->IsGameMaster())
return false;
if (InstanceScript* pInstance = go->GetInstanceScript())
if (pInstance->GetData(TYPE_XT002) != DONE && pInstance->GetData(TYPE_MIMIRON) != DONE && pInstance->GetData(TYPE_THORIM) != DONE && pInstance->GetData(TYPE_FREYA) != DONE && pInstance->GetData(TYPE_HODIR) != DONE)
{
std::string accountName;
AccountMgr::GetName(plr->GetSession()->GetAccountId(), accountName);
sBan->BanAccount(accountName, "0s", "Tele hack", "Server");
return true;
}
return false;
}
};
void AddSC_boss_vezax() void AddSC_boss_vezax()
{ {
new boss_vezax(); RegisterUlduarCreatureAI(boss_vezax);
new npc_ulduar_saronite_vapors(); RegisterUlduarCreatureAI(npc_ulduar_saronite_vapors);
new npc_ulduar_saronite_animus(); RegisterUlduarCreatureAI(npc_ulduar_saronite_animus);
RegisterSpellScript(spell_aura_of_despair_aura); RegisterSpellScript(spell_aura_of_despair_aura);
RegisterSpellScript(spell_mark_of_the_faceless_periodic_aura); RegisterSpellScript(spell_mark_of_the_faceless_periodic_aura);
@@ -668,5 +581,4 @@ void AddSC_boss_vezax()
new achievement_smell_saronite(); new achievement_smell_saronite();
new achievement_shadowdodger(); new achievement_shadowdodger();
new go_ulduar_pure_saronite_deposit();
} }
@@ -197,29 +197,14 @@ HodirHelperData hhd[4][4] =
} }
}; };
class boss_hodir : public CreatureScript struct boss_hodir : public BossAI
{ {
public: boss_hodir(Creature* pCreature) : BossAI(pCreature, BOSS_HODIR)
boss_hodir() : CreatureScript("boss_hodir") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_hodirAI>(pCreature);
}
struct boss_hodirAI : public ScriptedAI
{
boss_hodirAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = pCreature->GetInstanceScript();
if (!me->IsAlive()) if (!me->IsAlive())
if (pInstance) instance->SetBossState(BOSS_HODIR, DONE);
pInstance->SetData(TYPE_HODIR, DONE);
} }
InstanceScript* pInstance;
EventMap events;
SummonList summons;
ObjectGuid Helpers[8]; ObjectGuid Helpers[8];
bool berserk{ false }; bool berserk{ false };
bool bAchievCheese{ true }; bool bAchievCheese{ true };
@@ -234,8 +219,7 @@ public:
void Reset() override void Reset() override
{ {
events.Reset(); _Reset();
summons.DespawnAll();
berserk = false; berserk = false;
bAchievCheese = true; bAchievCheese = true;
bAchievGettingCold = true; bAchievGettingCold = true;
@@ -245,12 +229,7 @@ public:
// Reset the spells cast after wipe // Reset the spells cast after wipe
me->RemoveAllAuras(); me->RemoveAllAuras();
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE)
{
pInstance->SetData(TYPE_HODIR, NOT_STARTED);
}
if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 900.0f)) if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 900.0f))
{ {
@@ -273,9 +252,9 @@ public:
events.ScheduleEvent(EVENT_HARD_MODE_MISSED, 3min); events.ScheduleEvent(EVENT_HARD_MODE_MISSED, 3min);
Talk(TEXT_AGGRO); Talk(TEXT_AGGRO);
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE) if (instance->GetBossState(BOSS_HODIR) != DONE)
{ {
pInstance->SetData(TYPE_HODIR, IN_PROGRESS); instance->SetBossState(BOSS_HODIR, IN_PROGRESS);
} }
if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 300.0f)) if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 300.0f))
@@ -284,6 +263,13 @@ public:
} }
} }
GameObject* GetHardmodeChest()
{
if (GameObject* go = instance->GetGameObject(DATA_HODIR_CHEST_HARD))
return go;
return instance->GetGameObject(DATA_HODIR_CHEST_HARD_HERO);
}
void DoAction(int action) override void DoAction(int action) override
{ {
if (action) if (action)
@@ -291,9 +277,9 @@ public:
switch (action) switch (action)
{ {
case EVENT_FAIL_HM: case EVENT_FAIL_HM:
if (pInstance) if (instance)
{ {
if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_HODIR_CHEST_HARD))) if (GameObject* go = GetHardmodeChest())
{ {
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
events.ScheduleEvent(EVENT_DESPAWN_CHEST, 3s); events.ScheduleEvent(EVENT_DESPAWN_CHEST, 3s);
@@ -338,11 +324,11 @@ public:
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
if (!me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) if (!me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
{ {
if (pInstance) if (instance)
{ {
pInstance->SetData(TYPE_HODIR, DONE); instance->SetBossState(BOSS_HODIR, DONE);
me->CastSpell(me, 64899, true); // credit me->CastSpell(me, 64899, true); // credit
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
} }
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
@@ -392,7 +378,7 @@ public:
scheduler.Update(diff); scheduler.Update(diff);
if (me->GetPositionY() <= ENTRANCE_DOOR.GetPositionY() || me->GetPositionY() >= EXIT_DOOR.GetPositionY()) if (me->GetPositionY() <= ENTRANCE_DOOR.GetPositionY() || me->GetPositionY() >= EXIT_DOOR.GetPositionY())
{ {
boss_hodirAI::EnterEvadeMode(); boss_hodir::EnterEvadeMode();
return; return;
} }
@@ -428,18 +414,16 @@ public:
{ {
Talk(TEXT_HM_MISS); Talk(TEXT_HM_MISS);
bAchievCacheRare = false; bAchievCacheRare = false;
if (pInstance) if (instance)
{
if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_HODIR_CHEST_HARD)))
{ {
if (GameObject* go = GetHardmodeChest())
me->CastSpell(go, SPELL_SHATTER_CHEST, false); me->CastSpell(go, SPELL_SHATTER_CHEST, false);
} }
} }
}
break; break;
case EVENT_DESPAWN_CHEST: case EVENT_DESPAWN_CHEST:
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE) if (instance && instance->GetBossState(BOSS_HODIR) != DONE)
pInstance->SetData(TYPE_HODIR_HM_FAIL, 0); instance->SetData(TYPE_HODIR_HM_FAIL, 0);
break; break;
case EVENT_FLASH_FREEZE: case EVENT_FLASH_FREEZE:
{ {
@@ -502,7 +486,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT) if (spellInfo->Id == SPELL_TELEPORT)
{ {
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE); instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
} }
} }
@@ -560,16 +544,6 @@ public:
Talk(TEXT_SLAY); Talk(TEXT_SLAY);
} }
void JustSummoned(Creature* s) override
{
summons.Summon(s);
}
void SummonedCreatureDespawn(Creature* s) override
{
summons.Despawn(s);
}
bool CanAIAttack(Unit const* t) const override bool CanAIAttack(Unit const* t) const override
{ {
if (t->IsPlayer()) if (t->IsPlayer())
@@ -615,21 +589,10 @@ public:
void MoveInLineOfSight(Unit* /*who*/) override {} void MoveInLineOfSight(Unit* /*who*/) override {}
}; };
};
class npc_ulduar_icicle : public CreatureScript struct npc_ulduar_icicle : public NullCreatureAI
{ {
public: npc_ulduar_icicle(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_icicle() : CreatureScript("npc_ulduar_icicle") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_icicleAI>(pCreature);
}
struct npc_ulduar_icicleAI : public NullCreatureAI
{
npc_ulduar_icicleAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
timer1 = 2000; timer1 = 2000;
timer2 = 5000; timer2 = 5000;
@@ -658,21 +621,10 @@ public:
timer2 -= diff; timer2 -= diff;
} }
}; };
};
class npc_ulduar_flash_freeze : public CreatureScript struct npc_ulduar_flash_freeze : public NullCreatureAI
{ {
public: npc_ulduar_flash_freeze(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_flash_freeze() : CreatureScript("npc_ulduar_flash_freeze") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_flash_freezeAI>(pCreature);
}
struct npc_ulduar_flash_freezeAI : public NullCreatureAI
{
npc_ulduar_flash_freezeAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
timer = 2500; timer = 2500;
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
@@ -684,8 +636,8 @@ public:
void DamageTaken(Unit* doneBy, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit* doneBy, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
{ {
if (pInstance && doneBy) if (pInstance && doneBy)
if (pInstance->GetData(TYPE_HODIR) == NOT_STARTED) if (pInstance->GetBossState(BOSS_HODIR) == NOT_STARTED)
if (Creature* hodir = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->AttackStart(doneBy); hodir->AI()->AttackStart(doneBy);
} }
@@ -702,7 +654,7 @@ public:
me->DespawnOrUnsummon(2s); me->DespawnOrUnsummon(2s);
else if (s->IsPlayer()) else if (s->IsPlayer())
if (InstanceScript* instanceScript = me->GetInstanceScript()) if (InstanceScript* instanceScript = me->GetInstanceScript())
if (instanceScript->GetData(TYPE_HODIR) == NOT_STARTED) if (instanceScript->GetBossState(BOSS_HODIR) == NOT_STARTED)
{ {
s->CastSpell(s, SPELL_FLASH_FREEZE_INSTAKILL, true); s->CastSpell(s, SPELL_FLASH_FREEZE_INSTAKILL, true);
me->DespawnOrUnsummon(2s); me->DespawnOrUnsummon(2s);
@@ -718,21 +670,10 @@ public:
timer -= diff; timer -= diff;
} }
}; };
};
class npc_ulduar_toasty_fire : public CreatureScript struct npc_ulduar_toasty_fire : public NullCreatureAI
{ {
public: npc_ulduar_toasty_fire(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_toasty_fire() : CreatureScript("npc_ulduar_toasty_fire") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_toasty_fireAI>(pCreature);
}
struct npc_ulduar_toasty_fireAI : public NullCreatureAI
{
npc_ulduar_toasty_fireAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
me->CastSpell(me, SPELL_MAGE_TOASTY_FIRE_AURA, true); me->CastSpell(me, SPELL_MAGE_TOASTY_FIRE_AURA, true);
} }
@@ -761,21 +702,10 @@ public:
} }
} }
}; };
};
class npc_ulduar_hodir_priest : public CreatureScript struct npc_ulduar_hodir_priest : public ScriptedAI
{ {
public: npc_ulduar_hodir_priest(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_hodir_priest() : CreatureScript("npc_ulduar_hodir_priest") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_hodir_priestAI>(pCreature);
}
struct npc_ulduar_hodir_priestAI : public ScriptedAI
{
npc_ulduar_hodir_priestAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
events.Reset(); events.Reset();
@@ -821,8 +751,7 @@ public:
{ {
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC)) if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance) if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR)) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
{ {
AttackStart(hodir); AttackStart(hodir);
ScheduleAbilities(); ScheduleAbilities();
@@ -855,25 +784,14 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (pInstance) if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1); hodir->AI()->SetData(4, 1);
} }
}; };
};
class npc_ulduar_hodir_druid : public CreatureScript struct npc_ulduar_hodir_druid : public ScriptedAI
{ {
public: npc_ulduar_hodir_druid(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_hodir_druid() : CreatureScript("npc_ulduar_hodir_druid") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_hodir_druidAI>(pCreature);
}
struct npc_ulduar_hodir_druidAI : public ScriptedAI
{
npc_ulduar_hodir_druidAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
events.Reset(); events.Reset();
@@ -918,8 +836,7 @@ public:
{ {
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC)) if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance) if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR)) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
{ {
AttackStart(hodir); AttackStart(hodir);
ScheduleAbilities(); ScheduleAbilities();
@@ -953,25 +870,14 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (pInstance) if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1); hodir->AI()->SetData(4, 1);
} }
}; };
};
class npc_ulduar_hodir_shaman : public CreatureScript struct npc_ulduar_hodir_shaman : public ScriptedAI
{ {
public: npc_ulduar_hodir_shaman(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_hodir_shaman() : CreatureScript("npc_ulduar_hodir_shaman") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_hodir_shamanAI>(pCreature);
}
struct npc_ulduar_hodir_shamanAI : public ScriptedAI
{
npc_ulduar_hodir_shamanAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
events.Reset(); events.Reset();
@@ -1024,8 +930,7 @@ public:
{ {
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC)) if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance) if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR)) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
{ {
AttackStart(hodir); AttackStart(hodir);
ScheduleAbilities(); ScheduleAbilities();
@@ -1058,25 +963,14 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (pInstance) if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1); hodir->AI()->SetData(4, 1);
} }
}; };
};
class npc_ulduar_hodir_mage : public CreatureScript struct npc_ulduar_hodir_mage : public ScriptedAI
{ {
public: npc_ulduar_hodir_mage(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_hodir_mage() : CreatureScript("npc_ulduar_hodir_mage") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_hodir_mageAI>(pCreature);
}
struct npc_ulduar_hodir_mageAI : public ScriptedAI
{
npc_ulduar_hodir_mageAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
events.Reset(); events.Reset();
@@ -1122,8 +1016,7 @@ public:
{ {
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC)) if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance) if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR)) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
{ {
AttackStart(hodir); AttackStart(hodir);
ScheduleAbilities(); ScheduleAbilities();
@@ -1174,11 +1067,10 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (pInstance) if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1); hodir->AI()->SetData(4, 1);
} }
}; };
};
class spell_hodir_shatter_chest : public SpellScript class spell_hodir_shatter_chest : public SpellScript
{ {
@@ -1271,7 +1163,7 @@ class spell_hodir_biting_cold_player_aura : public AuraScript
{ {
if (GetStackAmount() == 2) // increasing from 2 to 3 (not checking >= to improve performance) if (GetStackAmount() == 2) // increasing from 2 to 3 (not checking >= to improve performance)
if (InstanceScript* pInstance = target->GetInstanceScript()) if (InstanceScript* pInstance = target->GetInstanceScript())
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(2, 1); hodir->AI()->SetData(2, 1);
ModStackAmount(1); ModStackAmount(1);
_counter = 0; _counter = 0;
@@ -1544,15 +1436,15 @@ public:
void AddSC_boss_hodir() void AddSC_boss_hodir()
{ {
new boss_hodir(); RegisterUlduarCreatureAI(boss_hodir);
new npc_ulduar_icicle(); RegisterUlduarCreatureAI(npc_ulduar_icicle);
new npc_ulduar_flash_freeze(); RegisterUlduarCreatureAI(npc_ulduar_flash_freeze);
new npc_ulduar_toasty_fire(); RegisterUlduarCreatureAI(npc_ulduar_toasty_fire);
new npc_ulduar_hodir_priest(); RegisterUlduarCreatureAI(npc_ulduar_hodir_priest);
new npc_ulduar_hodir_druid(); RegisterUlduarCreatureAI(npc_ulduar_hodir_druid);
new npc_ulduar_hodir_shaman(); RegisterUlduarCreatureAI(npc_ulduar_hodir_shaman);
new npc_ulduar_hodir_mage(); RegisterUlduarCreatureAI(npc_ulduar_hodir_mage);
RegisterSpellScript(spell_hodir_shatter_chest); RegisterSpellScript(spell_hodir_shatter_chest);
RegisterSpellScript(spell_hodir_biting_cold_main_aura); RegisterSpellScript(spell_hodir_biting_cold_main_aura);
@@ -48,7 +48,6 @@ enum IgnisSpellData
enum IgnisNPCs enum IgnisNPCs
{ {
BOSS_IGNIS = 33118,
NPC_IRON_CONSTRUCT = 33121, NPC_IRON_CONSTRUCT = 33121,
NPC_SCORCHED_GROUND = 33123, NPC_SCORCHED_GROUND = 33123,
NPC_WATER_TRIGGER = 22515, NPC_WATER_TRIGGER = 22515,
@@ -78,19 +77,9 @@ enum eEvents
EVENT_GRAB, EVENT_GRAB,
}; };
class npc_ulduar_iron_construct : public CreatureScript struct npc_ulduar_iron_construct : public ScriptedAI
{ {
public: npc_ulduar_iron_construct(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_iron_construct() : CreatureScript("npc_ulduar_iron_construct") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_iron_constructAI>(pCreature);
}
struct npc_ulduar_iron_constructAI : public ScriptedAI
{
npc_ulduar_iron_constructAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
me->CastSpell(me, 38757, true); me->CastSpell(me, 38757, true);
} }
@@ -117,7 +106,7 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetGuidData(TYPE_IGNIS))) if (Creature* ignis = instance->GetCreature(BOSS_IGNIS))
{ {
ignis->CastSpell(ignis, SPELL_STRENGTH_OF_THE_CREATOR, true); ignis->CastSpell(ignis, SPELL_STRENGTH_OF_THE_CREATOR, true);
AttackStart(ignis->GetVictim()); AttackStart(ignis->GetVictim());
@@ -149,7 +138,7 @@ public:
Unit::Kill(attacker, me); Unit::Kill(attacker, me);
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetGuidData(TYPE_IGNIS))) if (Creature* ignis = instance->GetCreature(BOSS_IGNIS))
ignis->AI()->SetData(1337, 0); ignis->AI()->SetData(1337, 0);
} }
} }
@@ -157,7 +146,7 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetGuidData(TYPE_IGNIS))) if (Creature* ignis = instance->GetCreature(BOSS_IGNIS))
ignis->RemoveAuraFromStack(SPELL_STRENGTH_OF_THE_CREATOR); ignis->RemoveAuraFromStack(SPELL_STRENGTH_OF_THE_CREATOR);
} }
@@ -184,41 +173,26 @@ public:
void MoveInLineOfSight(Unit* /*who*/) override {} void MoveInLineOfSight(Unit* /*who*/) override {}
}; };
};
class boss_ignis : public CreatureScript struct boss_ignis : public BossAI
{ {
public: boss_ignis(Creature* pCreature) : BossAI(pCreature, BOSS_IGNIS) { }
boss_ignis() : CreatureScript("boss_ignis") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_ignisAI>(pCreature);
}
struct boss_ignisAI : public ScriptedAI
{
boss_ignisAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
uint8 counter; uint8 counter;
bool bShattered; bool bShattered;
uint32 lastShatterMSTime; uint32 lastShatterMSTime;
void Reset() override void Reset() override
{ {
events.Reset(); _Reset();
me->SetControlled(false, UNIT_STATE_ROOT); me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false); me->DisableRotate(false);
counter = 0; counter = 0;
bShattered = false; bShattered = false;
lastShatterMSTime = 0; lastShatterMSTime = 0;
if (InstanceScript* m_pInstance = me->GetInstanceScript()) if (instance)
{ instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
m_pInstance->SetData(TYPE_IGNIS, NOT_STARTED);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
}
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
@@ -251,11 +225,11 @@ public:
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
DoZoneInCombat(); DoZoneInCombat();
if (InstanceScript* m_pInstance = me->GetInstanceScript()) if (instance)
{ {
m_pInstance->SetData(TYPE_IGNIS, IN_PROGRESS); instance->SetBossState(BOSS_IGNIS, IN_PROGRESS);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
} }
} }
@@ -280,6 +254,7 @@ public:
void JustReachedHome() override void JustReachedHome() override
{ {
_JustReachedHome();
me->setActive(false); me->setActive(false);
} }
@@ -292,9 +267,7 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
Talk(SAY_DEATH); Talk(SAY_DEATH);
_JustDied();
if (me->GetInstanceScript())
me->GetInstanceScript()->SetData(TYPE_IGNIS, DONE);
std::list<Creature*> icl; std::list<Creature*> icl;
me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT); me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);
@@ -416,10 +389,9 @@ public:
{ {
me->SetControlled(false, UNIT_STATE_ROOT); me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false); me->DisableRotate(false);
ScriptedAI::EnterEvadeMode(why); BossAI::EnterEvadeMode(why);
} }
}; };
};
class spell_ignis_scorch_aura : public AuraScript class spell_ignis_scorch_aura : public AuraScript
{ {
@@ -541,8 +513,8 @@ public:
void AddSC_boss_ignis() void AddSC_boss_ignis()
{ {
new boss_ignis(); RegisterUlduarCreatureAI(boss_ignis);
new npc_ulduar_iron_construct(); RegisterUlduarCreatureAI(npc_ulduar_iron_construct);
RegisterSpellScript(spell_ignis_scorch_aura); RegisterSpellScript(spell_ignis_scorch_aura);
RegisterSpellScript(spell_ignis_grab_initial); RegisterSpellScript(spell_ignis_grab_initial);
RegisterSpellScript(spell_ignis_slag_pot_aura); RegisterSpellScript(spell_ignis_slag_pot_aura);
@@ -117,31 +117,16 @@ enum Misc
DATA_KOLOGARN_ARMS_ACHIEV = 57, DATA_KOLOGARN_ARMS_ACHIEV = 57,
}; };
class boss_kologarn : public CreatureScript struct boss_kologarn : public BossAI
{ {
public: boss_kologarn(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), vehicle(me->GetVehicleKit()), breathReady(false)
boss_kologarn() : CreatureScript("boss_kologarn") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_kologarnAI>(pCreature);
}
struct boss_kologarnAI : public ScriptedAI
{
boss_kologarnAI(Creature* pCreature) : ScriptedAI(pCreature), vehicle(me->GetVehicleKit()), summons(me), breathReady(false)
{
m_pInstance = me->GetInstanceScript();
assert(vehicle); assert(vehicle);
me->SetStandState(UNIT_STAND_STATE_SUBMERGED); me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
} }
InstanceScript* m_pInstance;
Vehicle* vehicle; Vehicle* vehicle;
ObjectGuid _left, _right; ObjectGuid _left, _right;
EventMap events;
SummonList summons;
bool _looksAchievement, breathReady; bool _looksAchievement, breathReady;
uint8 _rubbleAchievement; uint8 _rubbleAchievement;
@@ -158,13 +143,18 @@ public:
} }
if (me->GetExactDist2d(who) < 30.0f) if (me->GetExactDist2d(who) < 30.0f)
ScriptedAI::MoveInLineOfSight(who); BossAI::MoveInLineOfSight(who);
} }
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
{ {
if (!_EnterEvadeMode(why)) if (!CreatureAI::_EnterEvadeMode(why))
return; return;
if (instance && instance->GetBossState(BOSS_KOLOGARN) != DONE)
{
instance->SetBossState(BOSS_KOLOGARN, NOT_STARTED);
instance->SaveToDB();
}
Reset(); Reset();
me->setActive(false); me->setActive(false);
} }
@@ -214,15 +204,12 @@ public:
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->DisableRotate(true); me->DisableRotate(true);
events.Reset(); _Reset();
summons.DespawnAll();
if (m_pInstance) if (instance)
{ {
m_pInstance->SetData(TYPE_KOLOGARN, NOT_STARTED);
// Open the door inside Kologarn chamber // Open the door inside Kologarn chamber
if (GameObject* door = m_pInstance->instance->GetGameObject(m_pInstance->GetGuidData(GO_KOLOGARN_DOORS))) if (GameObject* door = instance->GetGameObject(DATA_KOLOGARN_DOORS))
door->SetGoState(GO_STATE_ACTIVE); door->SetGoState(GO_STATE_ACTIVE);
} }
@@ -240,8 +227,8 @@ public:
if (param == DATA_KOLOGARN_RUBBLE_ACHIEV) if (param == DATA_KOLOGARN_RUBBLE_ACHIEV)
{ {
// Means arm died // Means arm died
if (m_pInstance && (!_left || !_right)) if (instance && (!_left || !_right))
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_DISARMED_CRITERIA); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_DISARMED_CRITERIA);
++_rubbleAchievement; ++_rubbleAchievement;
} }
@@ -267,12 +254,12 @@ public:
void JustSummoned(Creature* cr) override void JustSummoned(Creature* cr) override
{ {
if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM) if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM)
summons.Summon(cr); BossAI::JustSummoned(cr);
} }
void SummonedCreatureDespawn(Creature* cr) override void SummonedCreatureDespawn(Creature* cr) override
{ {
if (m_pInstance->GetData(TYPE_KOLOGARN) > NOT_STARTED) if (instance->GetBossState(BOSS_KOLOGARN) > NOT_STARTED)
return; return;
if (cr->GetEntry() == NPC_LEFT_ARM) if (cr->GetEntry() == NPC_LEFT_ARM)
@@ -290,17 +277,15 @@ public:
void JustDied(Unit*) override void JustDied(Unit*) override
{ {
summons.DespawnAll(); _JustDied();
me->StopMoving(); me->StopMoving();
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, DONE);
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (m_pInstance) if (instance)
{ {
// Open the door inside Kologarn chamber // Open the door inside Kologarn chamber
if (GameObject* door = m_pInstance->instance->GetGameObject(m_pInstance->GetGuidData(GO_KOLOGARN_DOORS))) if (GameObject* door = instance->GetGameObject(DATA_KOLOGARN_DOORS))
door->SetGoState(GO_STATE_ACTIVE); door->SetGoState(GO_STATE_ACTIVE);
} }
@@ -333,7 +318,7 @@ public:
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
{ {
if (!me->IsAlive() || m_pInstance->GetData(TYPE_KOLOGARN) != IN_PROGRESS) if (!me->IsAlive() || instance->GetBossState(BOSS_KOLOGARN) != IN_PROGRESS)
return; return;
if (!apply) if (!apply)
@@ -375,8 +360,8 @@ public:
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
if (m_pInstance) if (instance)
m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS); instance->SetBossState(BOSS_KOLOGARN, IN_PROGRESS);
events.ScheduleEvent(EVENT_SMASH, 8s); events.ScheduleEvent(EVENT_SMASH, 8s);
events.ScheduleEvent(EVENT_SWEEP, 17s); events.ScheduleEvent(EVENT_SWEEP, 17s);
@@ -389,9 +374,9 @@ public:
me->setActive(true); me->setActive(true);
// Close the door inside Kologarn chamber // Close the door inside Kologarn chamber
if (m_pInstance) if (instance)
{ {
if (GameObject* door = m_pInstance->instance->GetGameObject(m_pInstance->GetGuidData(GO_KOLOGARN_DOORS))) if (GameObject* door = instance->GetGameObject(DATA_KOLOGARN_DOORS))
{ {
door->SetGoState(GO_STATE_READY); door->SetGoState(GO_STATE_READY);
} }
@@ -492,22 +477,11 @@ public:
} }
} }
}; };
};
// also used for left arm, all functions except JustDied wont be used by left arm // also used for left arm, all functions except JustDied wont be used by left arm
class boss_kologarn_arms : public CreatureScript struct boss_kologarn_arms : public ScriptedAI
{ {
public: boss_kologarn_arms(Creature* c) : ScriptedAI(c) { }
boss_kologarn_arms() : CreatureScript("boss_kologarn_arms") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_kologarn_armsAI>(pCreature);
}
struct boss_kologarn_armsAI : public ScriptedAI
{
boss_kologarn_armsAI(Creature* c) : ScriptedAI(c) { }
int32 _damageDone; int32 _damageDone;
bool _combatStarted; bool _combatStarted;
@@ -539,7 +513,7 @@ public:
{ {
if (!_combatStarted) if (!_combatStarted)
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, instance->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = instance->GetCreature(BOSS_KOLOGARN))
{ {
_combatStarted = true; _combatStarted = true;
if (!cr->IsInCombat() && who) if (!cr->IsInCombat() && who)
@@ -576,7 +550,7 @@ public:
cr->CastSpell(cr, SPELL_RUBBLE_FALL, true); cr->CastSpell(cr, SPELL_RUBBLE_FALL, true);
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* kologarn = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_KOLOGARN))) if (Creature* kologarn = me->GetInstanceScript()->GetCreature(BOSS_KOLOGARN))
for (uint8 i = 0; i < 5; ++i) for (uint8 i = 0; i < 5; ++i)
if (Creature* cr2 = kologarn->SummonCreature(NPC_RUBBLE_SUMMON, cr->GetPositionX() + irand(-5, 5), cr->GetPositionY() + irand(-5, 5), cr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) if (Creature* cr2 = kologarn->SummonCreature(NPC_RUBBLE_SUMMON, cr->GetPositionX() + irand(-5, 5), cr->GetPositionY() + irand(-5, 5), cr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000))
{ {
@@ -587,26 +561,16 @@ public:
} }
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = me->GetInstanceScript()->GetCreature(BOSS_KOLOGARN))
cr->AI()->DoAction(DATA_KOLOGARN_RUBBLE_ACHIEV); cr->AI()->DoAction(DATA_KOLOGARN_RUBBLE_ACHIEV);
me->ExitVehicle(); me->ExitVehicle();
} }
}; };
};
class boss_kologarn_eyebeam : public CreatureScript struct boss_kologarn_eyebeam : public ScriptedAI
{ {
public: boss_kologarn_eyebeam(Creature* c) : ScriptedAI(c), _timer(1), _damaged(false)
boss_kologarn_eyebeam() : CreatureScript("boss_kologarn_eyebeam") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_kologarn_eyebeamAI>(pCreature);
}
struct boss_kologarn_eyebeamAI : public ScriptedAI
{
boss_kologarn_eyebeamAI(Creature* c) : ScriptedAI(c), _timer(1), _damaged(false)
{ {
m_pInstance = (InstanceScript*)c->GetInstanceScript(); m_pInstance = (InstanceScript*)c->GetInstanceScript();
} }
@@ -620,7 +584,7 @@ public:
if (damage > 0 && !_damaged && me->GetInstanceScript()) if (damage > 0 && !_damaged && me->GetInstanceScript())
{ {
_damaged = true; _damaged = true;
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = me->GetInstanceScript()->GetCreature(BOSS_KOLOGARN))
cr->AI()->DoAction(DATA_KOLOGARN_LOOKS_ACHIEV); cr->AI()->DoAction(DATA_KOLOGARN_LOOKS_ACHIEV);
} }
} }
@@ -638,7 +602,7 @@ public:
me->Attack(player, false); me->Attack(player, false);
me->GetMotionMaster()->MoveChase(player); me->GetMotionMaster()->MoveChase(player);
if (Creature* cr = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = m_pInstance->GetCreature(BOSS_KOLOGARN))
{ {
me->CastSpell(cr, me->GetEntry() == NPC_EYE_LEFT ? SPELL_FOCUSED_EYEBEAM_LEFT : SPELL_FOCUSED_EYEBEAM_RIGHT, true); me->CastSpell(cr, me->GetEntry() == NPC_EYE_LEFT ? SPELL_FOCUSED_EYEBEAM_LEFT : SPELL_FOCUSED_EYEBEAM_RIGHT, true);
} }
@@ -658,7 +622,6 @@ public:
} }
} }
}; };
};
class spell_kologarn_focused_eyebeam : public SpellScript class spell_kologarn_focused_eyebeam : public SpellScript
{ {
@@ -867,7 +830,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = instance->GetCreature(BOSS_KOLOGARN))
return cr->AI()->GetData(DATA_KOLOGARN_LOOKS_ACHIEV); return cr->AI()->GetData(DATA_KOLOGARN_LOOKS_ACHIEV);
return false; return false;
@@ -883,7 +846,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = instance->GetCreature(BOSS_KOLOGARN))
return cr->AI()->GetData(DATA_KOLOGARN_RUBBLE_ACHIEV); return cr->AI()->GetData(DATA_KOLOGARN_RUBBLE_ACHIEV);
return false; return false;
@@ -899,7 +862,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_KOLOGARN))) if (Creature* cr = instance->GetCreature(BOSS_KOLOGARN))
return cr->AI()->GetData(DATA_KOLOGARN_ARMS_ACHIEV); return cr->AI()->GetData(DATA_KOLOGARN_ARMS_ACHIEV);
return false; return false;
@@ -909,9 +872,9 @@ public:
void AddSC_boss_kologarn() void AddSC_boss_kologarn()
{ {
// Npcs // Npcs
new boss_kologarn(); RegisterUlduarCreatureAI(boss_kologarn);
new boss_kologarn_arms(); RegisterUlduarCreatureAI(boss_kologarn_arms);
new boss_kologarn_eyebeam(); RegisterUlduarCreatureAI(boss_kologarn_eyebeam);
RegisterUlduarCreatureAI(boss_kologarn_pit_kill_bunny); RegisterUlduarCreatureAI(boss_kologarn_pit_kill_bunny);
// Spells // Spells
@@ -250,35 +250,21 @@ enum Texts
TALK_COMPUTER_ZERO = 12, TALK_COMPUTER_ZERO = 12,
}; };
#define GetMimiron() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_MIMIRON)) #define GetMimiron() instance->GetCreature(BOSS_MIMIRON)
#define GetLMK2() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_LEVIATHAN_MKII)) #define GetLMK2() instance->GetCreature(DATA_MIMIRON_LEVIATHAN_MKII)
#define GetVX001() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_VX001)) #define GetVX001() instance->GetCreature(DATA_MIMIRON_VX001)
#define GetACU() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_ACU)) #define GetACU() instance->GetCreature(DATA_MIMIRON_ACU)
class boss_mimiron : public CreatureScript struct boss_mimiron : public BossAI
{ {
public: boss_mimiron(Creature* pCreature) : BossAI(pCreature, BOSS_MIMIRON)
boss_mimiron() : CreatureScript("boss_mimiron") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_mimironAI>(pCreature);
}
struct boss_mimironAI : public ScriptedAI
{
boss_mimironAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = me->GetInstanceScript();
if (!me->IsAlive()) if (!me->IsAlive())
if (pInstance) instance->SetBossState(BOSS_MIMIRON, DONE);
pInstance->SetData(TYPE_MIMIRON, DONE);
bIsEvading = false; bIsEvading = false;
} }
InstanceScript* pInstance;
EventMap events;
SummonList summons;
bool bIsEvading; bool bIsEvading;
bool hardmode; bool hardmode;
bool berserk; bool berserk;
@@ -301,12 +287,10 @@ public:
outofCombatTimer = 0; outofCombatTimer = 0;
changeAllowedFlameSpreadTime = false; changeAllowedFlameSpreadTime = false;
ResetGameObjects(); ResetGameObjects();
events.Reset();
summons.DespawnAll();
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
if (pInstance && pInstance->GetData(TYPE_MIMIRON) != DONE) if (!instance->IsBossDone(BOSS_MIMIRON))
pInstance->SetData(TYPE_MIMIRON, NOT_STARTED); _Reset();
} }
void AttackStart(Unit* who) override void AttackStart(Unit* who) override
@@ -317,8 +301,8 @@ public:
void JustReachedHome() override void JustReachedHome() override
{ {
_JustReachedHome();
me->setActive(false); me->setActive(false);
ScriptedAI::JustReachedHome();
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
@@ -359,7 +343,9 @@ public:
events.ScheduleEvent(EVENT_MIMIRON_SAY_HARDMODE, 7s); events.ScheduleEvent(EVENT_MIMIRON_SAY_HARDMODE, 7s);
events.ScheduleEvent(EVENT_BERSERK, Is25ManRaid() ? 10min : 8min); events.ScheduleEvent(EVENT_BERSERK, Is25ManRaid() ? 10min : 8min);
events.ScheduleEvent(EVENT_COMPUTER_SAY_INITIATED, 0ms); if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000))
computer->AI()->Talk(TALK_COMPUTER_INITIATED);
events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, 3s); events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, 3s);
minutesTalkNum = Is25ManRaid() ? TALK_COMPUTER_TEN : TALK_COMPUTER_EIGHT; minutesTalkNum = Is25ManRaid() ? TALK_COMPUTER_TEN : TALK_COMPUTER_EIGHT;
for (uint32 i = 0; i < uint32(TALK_COMPUTER_ZERO - minutesTalkNum - 1); ++i) for (uint32 i = 0; i < uint32(TALK_COMPUTER_ZERO - minutesTalkNum - 1); ++i)
@@ -368,15 +354,14 @@ public:
} }
// ensure LMK2 is at proper position // ensure LMK2 is at proper position
if (pInstance)
if (Creature* LMK2 = GetLMK2()) if (Creature* LMK2 = GetLMK2())
{ {
LMK2->UpdatePosition(LMK2->GetHomePosition(), true); LMK2->UpdatePosition(LMK2->GetHomePosition(), true);
LMK2->StopMovingOnCurrentPos(); LMK2->StopMovingOnCurrentPos();
} }
if (pInstance && pInstance->GetData(TYPE_MIMIRON) != DONE) if (!instance->IsBossDone(BOSS_MIMIRON))
pInstance->SetData(TYPE_MIMIRON, IN_PROGRESS); instance->SetBossState(BOSS_MIMIRON, IN_PROGRESS);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -406,10 +391,6 @@ public:
{ {
case 0: case 0:
break; break;
case EVENT_COMPUTER_SAY_INITIATED:
if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000))
computer->AI()->Talk(TALK_COMPUTER_INITIATED);
break;
case EVENT_COMPUTER_SAY_MINUTES: case EVENT_COMPUTER_SAY_MINUTES:
if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000)) if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000))
computer->AI()->Talk(minutesTalkNum++); computer->AI()->Talk(minutesTalkNum++);
@@ -755,18 +736,16 @@ public:
DoCastSelf(SPELL_SLEEP_VISUAL_1); DoCastSelf(SPELL_SLEEP_VISUAL_1);
if (pInstance) if (instance)
for( uint16 i = 0; i < 3; ++i ) for( uint16 i = 0; i < 3; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i)) if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (door->GetGoState() != GO_STATE_ACTIVE ) if (door->GetGoState() != GO_STATE_ACTIVE )
{ {
door->SetLootState(GO_READY); door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false); door->UseDoorOrButton(0, false);
} }
if (pInstance) instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_LEVIATHAN_MKII, 1, me);
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_LEVIATHAN_MKII, 1, me);
if (hardmode) if (hardmode)
if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000)) if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000))
@@ -785,8 +764,7 @@ public:
case EVENT_SAY_VOLTRON_DEAD: case EVENT_SAY_VOLTRON_DEAD:
Talk(SAY_V07TRON_DEATH); Talk(SAY_V07TRON_DEATH);
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
if (pInstance) instance->SetBossState(BOSS_MIMIRON, DONE);
pInstance->SetData(TYPE_MIMIRON, DONE);
// spawn chest // spawn chest
if (uint32 chestId = (hardmode ? RAID_MODE(GO_MIMIRON_CHEST_HARD, GO_MIMIRON_CHEST_HERO_HARD) : RAID_MODE(GO_MIMIRON_CHEST, GO_MIMIRON_CHEST_HERO))) if (uint32 chestId = (hardmode ? RAID_MODE(GO_MIMIRON_CHEST_HARD, GO_MIMIRON_CHEST_HERO_HARD) : RAID_MODE(GO_MIMIRON_CHEST, GO_MIMIRON_CHEST_HERO)))
{ {
@@ -810,7 +788,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT) if (spellInfo->Id == SPELL_TELEPORT)
{ {
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE); instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
} }
} }
@@ -823,9 +801,7 @@ public:
bIsEvading = true; bIsEvading = true;
if (Creature* c = GetLMK2()) if (Creature* c = GetLMK2())
{
c->AI()->EnterEvadeMode(why); c->AI()->EnterEvadeMode(why);
}
if (Creature* c = GetVX001()) if (Creature* c = GetVX001())
{ {
c->AI()->EnterEvadeMode(why); c->AI()->EnterEvadeMode(why);
@@ -841,27 +817,15 @@ public:
me->RemoveAllAuras(); me->RemoveAllAuras();
me->ExitVehicle(); me->ExitVehicle();
ScriptedAI::EnterEvadeMode(why); BossAI::EnterEvadeMode(why);
bIsEvading = false; bIsEvading = false;
} }
void JustSummoned(Creature* s) override
{
summons.Summon(s);
}
void SummonedCreatureDespawn(Creature* s) override
{
summons.Despawn(s);
}
void ResetGameObjects() void ResetGameObjects()
{ {
if (pInstance)
for (uint16 i = 0; i < 3; ++i) for (uint16 i = 0; i < 3; ++i)
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i)) if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (door->GetGoState() != GO_STATE_ACTIVE) if (door->GetGoState() != GO_STATE_ACTIVE)
{ {
door->SetLootState(GO_READY); door->SetLootState(GO_READY);
@@ -889,10 +853,8 @@ public:
void CloseDoorAndButton() void CloseDoorAndButton()
{ {
if (pInstance)
for (uint16 i = 0; i < 3; ++i) for (uint16 i = 0; i < 3; ++i)
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i)) if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (door->GetGoState() != GO_STATE_READY) if (door->GetGoState() != GO_STATE_READY)
{ {
door->SetLootState(GO_READY); door->SetLootState(GO_READY);
@@ -975,27 +937,16 @@ public:
return 0; return 0;
} }
}; };
};
class npc_ulduar_leviathan_mkii : public CreatureScript struct npc_ulduar_leviathan_mkii : public ScriptedAI
{ {
public: npc_ulduar_leviathan_mkii(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_leviathan_mkii() : CreatureScript("npc_ulduar_leviathan_mkii") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<npc_ulduar_leviathan_mkiiAI>(pCreature); instance = me->GetInstanceScript();
}
struct npc_ulduar_leviathan_mkiiAI : public ScriptedAI
{
npc_ulduar_leviathan_mkiiAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
bIsEvading = false; bIsEvading = false;
} }
InstanceScript* pInstance; InstanceScript* instance;
EventMap events; EventMap events;
bool bIsEvading; bool bIsEvading;
uint8 Phase; uint8 Phase;
@@ -1228,27 +1179,16 @@ public:
} }
} }
}; };
};
class npc_ulduar_vx001 : public CreatureScript struct npc_ulduar_vx001 : public ScriptedAI
{ {
public: npc_ulduar_vx001(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_vx001() : CreatureScript("npc_ulduar_vx001") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<npc_ulduar_vx001AI>(pCreature); instance = me->GetInstanceScript();
}
struct npc_ulduar_vx001AI : public ScriptedAI
{
npc_ulduar_vx001AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
bIsEvading = false; bIsEvading = false;
} }
InstanceScript* pInstance; InstanceScript* instance;
EventMap events; EventMap events;
bool bIsEvading; bool bIsEvading;
uint8 Phase; uint8 Phase;
@@ -1552,29 +1492,18 @@ public:
} }
} }
}; };
};
class npc_ulduar_aerial_command_unit : public CreatureScript struct npc_ulduar_aerial_command_unit : public ScriptedAI
{ {
public: npc_ulduar_aerial_command_unit(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
npc_ulduar_aerial_command_unit() : CreatureScript("npc_ulduar_aerial_command_unit") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<npc_ulduar_aerial_command_unitAI>(pCreature); instance = me->GetInstanceScript();
}
struct npc_ulduar_aerial_command_unitAI : public ScriptedAI
{
npc_ulduar_aerial_command_unitAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = me->GetInstanceScript();
bIsEvading = false; bIsEvading = false;
immobilized = false; immobilized = false;
me->SetDisableGravity(true); me->SetDisableGravity(true);
} }
InstanceScript* pInstance; InstanceScript* instance;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
bool bIsEvading; bool bIsEvading;
@@ -1845,21 +1774,10 @@ public:
} }
} }
}; };
};
class npc_ulduar_proximity_mine : public CreatureScript struct npc_ulduar_proximity_mine : public ScriptedAI
{ {
public: npc_ulduar_proximity_mine(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_proximity_mine() : CreatureScript("npc_ulduar_proximity_mine") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_proximity_mineAI>(pCreature);
}
struct npc_ulduar_proximity_mineAI : public ScriptedAI
{
npc_ulduar_proximity_mineAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
exploded = false; exploded = false;
timer = 2500; timer = 2500;
@@ -1902,7 +1820,6 @@ public:
timer -= diff; timer -= diff;
} }
}; };
};
class spell_ulduar_mimiron_mine_explosion : public SpellScript class spell_ulduar_mimiron_mine_explosion : public SpellScript
{ {
@@ -1911,8 +1828,8 @@ class spell_ulduar_mimiron_mine_explosion : public SpellScript
void HandleDamage(SpellEffIndex /*effIndex*/) void HandleDamage(SpellEffIndex /*effIndex*/)
{ {
if (GetHitPlayer()) if (GetHitPlayer())
if (InstanceScript* pInstance = GetCaster()->GetInstanceScript()) if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (Creature* mimi = pInstance->GetCreature(TYPE_MIMIRON)) if (Creature* mimi = instance->GetCreature(BOSS_MIMIRON))
mimi->AI()->SetData(0, 11); mimi->AI()->SetData(0, 11);
} }
@@ -1922,19 +1839,9 @@ class spell_ulduar_mimiron_mine_explosion : public SpellScript
} }
}; };
class npc_ulduar_mimiron_rocket : public CreatureScript struct npc_ulduar_mimiron_rocket : public NullCreatureAI
{ {
public: npc_ulduar_mimiron_rocket(Creature* pCreature) : NullCreatureAI(pCreature) {}
npc_ulduar_mimiron_rocket() : CreatureScript("npc_ulduar_mimiron_rocket") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_mimiron_rocketAI>(pCreature);
}
struct npc_ulduar_mimiron_rocketAI : public NullCreatureAI
{
npc_ulduar_mimiron_rocketAI(Creature* pCreature) : NullCreatureAI(pCreature) {}
void InitializeAI() override void InitializeAI() override
{ {
@@ -1963,23 +1870,12 @@ public:
} }
} }
}; };
};
class npc_ulduar_magnetic_core : public CreatureScript struct npc_ulduar_magnetic_core : public NullCreatureAI
{ {
public: npc_ulduar_magnetic_core(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_magnetic_core() : CreatureScript("npc_ulduar_magnetic_core") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<npc_ulduar_magnetic_coreAI>(pCreature); instance = me->GetInstanceScript();
}
struct npc_ulduar_magnetic_coreAI : public NullCreatureAI
{
npc_ulduar_magnetic_coreAI(Creature* pCreature) : NullCreatureAI(pCreature)
{
pInstance = me->GetInstanceScript();
if (Creature* c = GetACU()) if (Creature* c = GetACU())
if (c->GetExactDist2d(me) <= 10.0f) if (c->GetExactDist2d(me) <= 10.0f)
{ {
@@ -1993,7 +1889,7 @@ public:
despawnTimer = 60000; despawnTimer = 60000;
} }
InstanceScript* pInstance; InstanceScript* instance;
uint16 despawnTimer; uint16 despawnTimer;
void SetData(uint32 /*id*/, uint32 /*value*/) override void SetData(uint32 /*id*/, uint32 /*value*/) override
@@ -2012,21 +1908,10 @@ public:
despawnTimer -= diff; despawnTimer -= diff;
} }
}; };
};
class npc_ulduar_bot_summon_trigger : public CreatureScript struct npc_ulduar_bot_summon_trigger : public NullCreatureAI
{ {
public: npc_ulduar_bot_summon_trigger(Creature* pCreature) : NullCreatureAI(pCreature) { }
npc_ulduar_bot_summon_trigger() : CreatureScript("npc_ulduar_bot_summon_trigger") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_bot_summon_triggerAI>(pCreature);
}
struct npc_ulduar_bot_summon_triggerAI : public NullCreatureAI
{
npc_ulduar_bot_summon_triggerAI(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 timer; uint32 timer;
uint8 option; uint8 option;
@@ -2061,7 +1946,7 @@ public:
if (timer <= diff) if (timer <= diff)
{ {
uint32 option_npcid[3] = {NPC_JUNK_BOT, NPC_ASSAULT_BOT, NPC_EMERGENCY_FIRE_BOT}; uint32 option_npcid[3] = {NPC_JUNK_BOT, NPC_ASSAULT_BOT, NPC_EMERGENCY_FIRE_BOT};
InstanceScript* pInstance = me->GetInstanceScript(); InstanceScript* instance = me->GetInstanceScript();
if (Creature* ACU = GetACU()) // ACU summons for easy removing if (Creature* ACU = GetACU()) // ACU summons for easy removing
if (Creature* bot = ACU->SummonCreature( option_npcid[option - 1], *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 25000)) if (Creature* bot = ACU->SummonCreature( option_npcid[option - 1], *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 25000))
{ {
@@ -2079,7 +1964,6 @@ public:
timer -= diff; timer -= diff;
} }
}; };
};
class spell_mimiron_rapid_burst_aura : public AuraScript class spell_mimiron_rapid_burst_aura : public AuraScript
{ {
@@ -2170,10 +2054,10 @@ public:
if (InstanceScript* instance = go->GetInstanceScript()) if (InstanceScript* instance = go->GetInstanceScript())
{ {
if (instance->GetData(TYPE_MIMIRON) != NOT_STARTED) if (instance->GetBossState(BOSS_MIMIRON) != NOT_STARTED)
return false; return false;
if (Creature* c = ObjectAccessor::GetCreature(*go, instance->GetGuidData(TYPE_MIMIRON))) if (Creature* c = instance->GetCreature(BOSS_MIMIRON))
{ {
c->AI()->SetData(0, 7); c->AI()->SetData(0, 7);
c->AI()->AttackStart(player); c->AI()->AttackStart(player);
@@ -2184,19 +2068,9 @@ public:
} }
}; };
class npc_ulduar_flames_initial : public CreatureScript struct npc_ulduar_flames_initial : public NullCreatureAI
{ {
public: npc_ulduar_flames_initial(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_flames_initial() : CreatureScript("npc_ulduar_flames_initial") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_flames_initialAI>(pCreature);
}
struct npc_ulduar_flames_initialAI : public NullCreatureAI
{
npc_ulduar_flames_initialAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
CreateTime = GameTime::GetGameTime().count(); CreateTime = GameTime::GetGameTime().count();
events.Reset(); events.Reset();
@@ -2246,8 +2120,8 @@ public:
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (pInstance->GetData(TYPE_MIMIRON) != IN_PROGRESS) if (instance->GetBossState(BOSS_MIMIRON) != IN_PROGRESS)
{ {
RemoveAll(); RemoveAll();
return; return;
@@ -2267,12 +2141,10 @@ public:
return; return;
} }
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* mimiron = GetMimiron()) if (Creature* mimiron = GetMimiron())
if (CreateTime < mimiron->AI()->GetData(10)) if (CreateTime < mimiron->AI()->GetData(10))
{
break; break;
}
Creature* last = ObjectAccessor::GetCreature(*me, FlameList.back()); Creature* last = ObjectAccessor::GetCreature(*me, FlameList.back());
if (last) if (last)
@@ -2302,21 +2174,10 @@ public:
} }
} }
}; };
};
class npc_ulduar_flames_spread : public CreatureScript struct npc_ulduar_flames_spread : public NullCreatureAI
{ {
public: npc_ulduar_flames_spread(Creature* pCreature) : NullCreatureAI(pCreature) {}
npc_ulduar_flames_spread() : CreatureScript("npc_ulduar_flames_spread") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_flames_spreadAI>(pCreature);
}
struct npc_ulduar_flames_spreadAI : public NullCreatureAI
{
npc_ulduar_flames_spreadAI(Creature* pCreature) : NullCreatureAI(pCreature) {}
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
{ {
@@ -2332,7 +2193,7 @@ public:
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
if (Creature* c = summoner->ToCreature()) if (Creature* c = summoner->ToCreature())
if (c->AI()) if (c->AI())
CAST_AI(npc_ulduar_flames_initial::npc_ulduar_flames_initialAI, c->AI())->RemoveFlame(me->GetGUID()); CAST_AI(npc_ulduar_flames_initial, c->AI())->RemoveFlame(me->GetGUID());
me->RemoveAllAuras(); me->RemoveAllAuras();
me->DespawnOrUnsummon(2500ms); me->DespawnOrUnsummon(2500ms);
@@ -2344,21 +2205,10 @@ public:
} }
} }
}; };
};
class npc_ulduar_emergency_fire_bot : public CreatureScript struct npc_ulduar_emergency_fire_bot : public ScriptedAI
{ {
public: npc_ulduar_emergency_fire_bot(Creature* pCreature) : ScriptedAI(pCreature)
npc_ulduar_emergency_fire_bot() : CreatureScript("npc_ulduar_emergency_fire_bot") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_emergency_fire_botAI>(pCreature);
}
struct npc_ulduar_emergency_fire_botAI : public ScriptedAI
{
npc_ulduar_emergency_fire_botAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
events.Reset(); events.Reset();
events.ScheduleEvent(EVENT_EMERGENCY_BOT_CHECK, 1s); events.ScheduleEvent(EVENT_EMERGENCY_BOT_CHECK, 1s);
@@ -2401,21 +2251,10 @@ public:
} }
} }
}; };
};
class npc_ulduar_rocket_strike_trigger : public CreatureScript struct npc_ulduar_rocket_strike_trigger : public NullCreatureAI
{ {
public: npc_ulduar_rocket_strike_trigger(Creature* pCreature) : NullCreatureAI(pCreature) {}
npc_ulduar_rocket_strike_trigger() : CreatureScript("npc_ulduar_rocket_strike_trigger") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_rocket_strike_triggerAI>(pCreature);
}
struct npc_ulduar_rocket_strike_triggerAI : public NullCreatureAI
{
npc_ulduar_rocket_strike_triggerAI(Creature* pCreature) : NullCreatureAI(pCreature) {}
void SpellHitTarget(Unit* target, SpellInfo const* spell) override void SpellHitTarget(Unit* target, SpellInfo const* spell) override
{ {
@@ -2426,13 +2265,12 @@ public:
if (target->GetEntry() == NPC_ASSAULT_BOT) if (target->GetEntry() == NPC_ASSAULT_BOT)
me->CastSpell(me, 65040, true); // achievement Not-So-Friendly Fire me->CastSpell(me, 65040, true); // achievement Not-So-Friendly Fire
else if (target->IsPlayer()) else if (target->IsPlayer())
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* c = GetMimiron()) if (Creature* c = GetMimiron())
c->AI()->SetData(0, 13); c->AI()->SetData(0, 13);
} }
} }
}; };
};
class achievement_mimiron_firefighter : public AchievementCriteriaScript class achievement_mimiron_firefighter : public AchievementCriteriaScript
{ {
@@ -2480,23 +2318,23 @@ public:
void AddSC_boss_mimiron() void AddSC_boss_mimiron()
{ {
new boss_mimiron(); RegisterUlduarCreatureAI(boss_mimiron);
new npc_ulduar_leviathan_mkii(); RegisterUlduarCreatureAI(npc_ulduar_leviathan_mkii);
new npc_ulduar_vx001(); RegisterUlduarCreatureAI(npc_ulduar_vx001);
new npc_ulduar_aerial_command_unit(); RegisterUlduarCreatureAI(npc_ulduar_aerial_command_unit);
new npc_ulduar_proximity_mine(); RegisterUlduarCreatureAI(npc_ulduar_proximity_mine);
new npc_ulduar_mimiron_rocket(); RegisterUlduarCreatureAI(npc_ulduar_mimiron_rocket);
new npc_ulduar_magnetic_core(); RegisterUlduarCreatureAI(npc_ulduar_magnetic_core);
new npc_ulduar_bot_summon_trigger(); RegisterUlduarCreatureAI(npc_ulduar_bot_summon_trigger);
RegisterSpellScript(spell_mimiron_rapid_burst_aura); RegisterSpellScript(spell_mimiron_rapid_burst_aura);
RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura); RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura);
RegisterSpellScript(spell_ulduar_mimiron_mine_explosion); RegisterSpellScript(spell_ulduar_mimiron_mine_explosion);
new go_ulduar_do_not_push_this_button(); new go_ulduar_do_not_push_this_button();
new npc_ulduar_flames_initial(); RegisterUlduarCreatureAI(npc_ulduar_flames_initial);
new npc_ulduar_flames_spread(); RegisterUlduarCreatureAI(npc_ulduar_flames_spread);
new npc_ulduar_emergency_fire_bot(); RegisterUlduarCreatureAI(npc_ulduar_emergency_fire_bot);
new npc_ulduar_rocket_strike_trigger(); RegisterUlduarCreatureAI(npc_ulduar_rocket_strike_trigger);
new achievement_mimiron_firefighter(); new achievement_mimiron_firefighter();
new achievement_mimiron_set_up_us_the_bomb_11(); new achievement_mimiron_set_up_us_the_bomb_11();
@@ -135,27 +135,13 @@ enum Misc
const Position CORDS_GROUND = {588.0f, -166.0f, 391.1f}; const Position CORDS_GROUND = {588.0f, -166.0f, 391.1f};
const Position CORDS_AIR = {588.0f, -178.0f, 490.0f}; const Position CORDS_AIR = {588.0f, -178.0f, 490.0f};
class boss_razorscale : public CreatureScript struct boss_razorscale : public BossAI
{ {
public: boss_razorscale(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE)
boss_razorscale() : CreatureScript("boss_razorscale") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_razorscaleAI>(pCreature);
}
struct boss_razorscaleAI : public ScriptedAI
{
boss_razorscaleAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = me->GetInstanceScript();
startPath = true; startPath = true;
} }
InstanceScript* pInstance;
EventMap events;
SummonList summons;
ObjectGuid ExpeditionEngineerGUIDs[3]; ObjectGuid ExpeditionEngineerGUIDs[3];
ObjectGuid CommanderGUID; ObjectGuid CommanderGUID;
float cords[4][2]; float cords[4][2];
@@ -172,8 +158,7 @@ public:
void Reset() override void Reset() override
{ {
events.Reset(); _Reset();
summons.DespawnAll();
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
ExpeditionEngineerGUIDs[i].Clear(); ExpeditionEngineerGUIDs[i].Clear();
@@ -186,9 +171,6 @@ public:
CommanderGUID.Clear(); CommanderGUID.Clear();
bGroundPhase = false; bGroundPhase = false;
flyTimes = 0; flyTimes = 0;
if (pInstance)
pInstance->SetData(TYPE_RAZORSCALE, NOT_STARTED);
} }
void AttackStart(Unit* who) override void AttackStart(Unit* who) override
@@ -197,10 +179,9 @@ public:
me->GetMotionMaster()->MoveChase(who); me->GetMotionMaster()->MoveChase(who);
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* who) override
{ {
me->SetInCombatWithZone(); BossAI::JustEngagedWith(who);
events.Reset();
events.ScheduleEvent(EVENT_COMMANDER_SAY_AGGRO, 5s); events.ScheduleEvent(EVENT_COMMANDER_SAY_AGGRO, 5s);
events.ScheduleEvent(EVENT_EE_SAY_MOVE_OUT, 10s); events.ScheduleEvent(EVENT_EE_SAY_MOVE_OUT, 10s);
events.ScheduleEvent(EVENT_ENRAGE, 10min); events.ScheduleEvent(EVENT_ENRAGE, 10min);
@@ -222,22 +203,11 @@ public:
} }
if (Creature* c = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 300.0f, true)) if (Creature* c = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 300.0f, true))
CommanderGUID = c->GetGUID(); CommanderGUID = c->GetGUID();
if (pInstance)
pInstance->SetData(TYPE_RAZORSCALE, IN_PROGRESS);
}
void JustDied(Unit* /*Killer*/) override
{
summons.DespawnAll();
if (pInstance)
pInstance->SetData(TYPE_RAZORSCALE, DONE);
} }
void SpellHit(Unit* caster, SpellInfo const* spell) override void SpellHit(Unit* caster, SpellInfo const* spell) override
{ {
if (!caster || !pInstance) if (!caster || !instance)
return; return;
switch (spell->Id) switch (spell->Id)
@@ -246,15 +216,15 @@ public:
{ {
uint32 spellId = SPELL_CHAIN_4; uint32 spellId = SPELL_CHAIN_4;
if (caster->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1)) if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_1))
{ {
spellId = SPELL_CHAIN_1; spellId = SPELL_CHAIN_1;
} }
else if (caster->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_2)) else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_2))
{ {
spellId = SPELL_CHAIN_2; spellId = SPELL_CHAIN_2;
} }
else if (caster->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_3)) else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_3))
{ {
spellId = SPELL_CHAIN_3; spellId = SPELL_CHAIN_3;
} }
@@ -297,12 +267,14 @@ public:
} }
} }
void DamageTaken(Unit*, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override
{ {
if (me->GetPositionZ() > 440.0f) // protection, razorscale is attackable (so harpoons can hit him, etc.), but should not receive dmg while in air if (me->GetPositionZ() > 440.0f) // protection, razorscale is attackable (so harpoons can hit him, etc.), but should not receive dmg while in air
damage = 0; damage = 0;
else if (!bGroundPhase && ((me->GetHealth() * 100) / me->GetMaxHealth() < 50) && me->HasAura(62794)) // already below 50%, but still in chains and stunned else if (!bGroundPhase && ((me->GetHealth() * 100) / me->GetMaxHealth() < 50) && me->HasAura(62794)) // already below 50%, but still in chains and stunned
events.RescheduleEvent(EVENT_WARN_DEEP_BREATH, 0ms); events.RescheduleEvent(EVENT_WARN_DEEP_BREATH, 0ms);
BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask);
} }
void MovementInform(uint32 type, uint32 id) override void MovementInform(uint32 type, uint32 id) override
@@ -476,10 +448,9 @@ public:
break; break;
case EVENT_FLY_UP: case EVENT_FLY_UP:
me->SetInCombatWithZone(); // just in case me->SetInCombatWithZone(); // just in case
if (pInstance) if (instance)
for( int i = 0; i < 4; ++i ) for( int i = 0; i < 4; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1 + i)) if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i))
if (Creature* hfs = ObjectAccessor::GetCreature(*me, guid))
{ {
me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000);
hfs->AI()->SetData(1, 0); hfs->AI()->SetData(1, 0);
@@ -579,14 +550,10 @@ public:
void JustReachedHome() override void JustReachedHome() override
{ {
_JustReachedHome();
startPath = true; startPath = true;
} }
void JustSummoned(Creature* s) override
{
summons.Summon(s);
}
uint32 GetData(uint32 id) const override uint32 GetData(uint32 id) const override
{ {
if (id == 1) if (id == 1)
@@ -597,8 +564,8 @@ public:
void KilledUnit(Unit* victim) override void KilledUnit(Unit* victim) override
{ {
if (victim && victim->GetEntry() == NPC_DARK_RUNE_GUARDIAN) if (victim && victim->GetEntry() == NPC_DARK_RUNE_GUARDIAN)
if (pInstance) if (instance)
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_DARK_RUNE_GUARDIAN, 1, me); instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_DARK_RUNE_GUARDIAN, 1, me);
} }
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
@@ -606,10 +573,9 @@ public:
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetControlled(false, UNIT_STATE_ROOT); me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false); me->DisableRotate(false);
ScriptedAI::EnterEvadeMode(why); BossAI::EnterEvadeMode(why);
} }
}; };
};
class npc_ulduar_expedition_commander : public CreatureScript class npc_ulduar_expedition_commander : public CreatureScript
{ {
@@ -625,10 +591,10 @@ public:
if (!instance) if (!instance)
return true; return true;
if (instance->GetData(TYPE_RAZORSCALE) == DONE) if (instance->GetBossState(BOSS_RAZORSCALE) == DONE)
return true; return true;
Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetGuidData(TYPE_RAZORSCALE)); Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE);
if (!razorscale || razorscale->IsInCombat()) if (!razorscale || razorscale->IsInCombat())
return true; return true;
@@ -645,10 +611,10 @@ public:
if (uiAction == GOSSIP_ACTION_INFO_DEF + 1) if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
{ {
InstanceScript* instance = creature->GetInstanceScript(); InstanceScript* instance = creature->GetInstanceScript();
if (!instance || instance->GetData(TYPE_RAZORSCALE) == DONE) if (!instance || instance->GetBossState(BOSS_RAZORSCALE) == DONE)
return true; return true;
Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetGuidData(TYPE_RAZORSCALE)); Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE);
if (razorscale && !razorscale->IsInCombat()) if (razorscale && !razorscale->IsInCombat())
{ {
// Do not show gossip icon if encounter is in progress // Do not show gossip icon if encounter is in progress
@@ -656,7 +622,7 @@ public:
// reset npcs NPC_HARPOON_FIRE_STATE // reset npcs NPC_HARPOON_FIRE_STATE
for (uint8 i = 0; i < 4; ++i) for (uint8 i = 0; i < 4; ++i)
if (Creature* hfs = ObjectAccessor::GetCreature(*creature, instance->GetGuidData(DATA_HARPOON_FIRE_STATE_1 + i))) if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i))
hfs->AI()->SetData(1, 0); hfs->AI()->SetData(1, 0);
if (razorscale->AI()) if (razorscale->AI())
@@ -682,7 +648,7 @@ public:
npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature) npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature)
{ {
_instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
_introSpoken = _instance->GetData(TYPE_RAZORSCALE) == DONE; _introSpoken = _instance->GetBossState(BOSS_RAZORSCALE) == DONE;
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
} }
@@ -704,19 +670,9 @@ public:
}; };
}; };
class npc_ulduar_harpoonfirestate : public CreatureScript struct npc_ulduar_harpoonfirestate : public NullCreatureAI
{ {
public: npc_ulduar_harpoonfirestate(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_harpoonfirestate() : CreatureScript("npc_ulduar_harpoonfirestate") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_harpoonfirestateAI>(pCreature);
}
struct npc_ulduar_harpoonfirestateAI : public NullCreatureAI
{
npc_ulduar_harpoonfirestateAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
} }
@@ -783,7 +739,7 @@ public:
case 3: // shoot case 3: // shoot
if (pInstance) if (pInstance)
{ {
Creature* razorscale = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_RAZORSCALE)); Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE);
if (!razorscale) if (!razorscale)
return; return;
if (!razorscale->HasAura(value)) if (!razorscale->HasAura(value))
@@ -803,21 +759,10 @@ public:
return 0; return 0;
} }
}; };
};
class npc_ulduar_expedition_engineer : public CreatureScript struct npc_ulduar_expedition_engineer : public NullCreatureAI
{ {
public: npc_ulduar_expedition_engineer(Creature* pCreature) : NullCreatureAI(pCreature)
npc_ulduar_expedition_engineer() : CreatureScript("npc_ulduar_expedition_engineer") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_expedition_engineerAI>(pCreature);
}
struct npc_ulduar_expedition_engineerAI : public NullCreatureAI
{
npc_ulduar_expedition_engineerAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
} }
@@ -878,9 +823,7 @@ public:
if (!fixingGUID) if (!fixingGUID)
{ {
Creature* razorscale = nullptr; Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE);
if (ObjectGuid rsGUID = pInstance->GetGuidData(TYPE_RAZORSCALE))
razorscale = ObjectAccessor::GetCreature(*me, rsGUID);
if (!razorscale || !razorscale->IsInCombat()) if (!razorscale || !razorscale->IsInCombat())
{ {
@@ -890,8 +833,7 @@ public:
} }
for( int i = 0; i < 4; ++i ) for( int i = 0; i < 4; ++i )
if (ObjectGuid fs_GUID = pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1 + i)) if (Creature* fs = pInstance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i))
if (Creature* fs = ObjectAccessor::GetCreature(*me, fs_GUID))
if (!fs->AI()->GetData(2)) if (!fs->AI()->GetData(2))
{ {
float a = rand_norm() * M_PI; float a = rand_norm() * M_PI;
@@ -911,7 +853,6 @@ public:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND);
} }
}; };
};
class go_ulduar_working_harpoon : public GameObjectScript class go_ulduar_working_harpoon : public GameObjectScript
{ {
@@ -927,9 +868,7 @@ public:
if (!pInstance) if (!pInstance)
return true; return true;
Creature* rs = nullptr; Creature* rs = pInstance->GetCreature(BOSS_RAZORSCALE);
if (ObjectGuid rsGUID = pInstance->GetGuidData(TYPE_RAZORSCALE))
rs = ObjectAccessor::GetCreature(*go, rsGUID);
if (!rs || !rs->IsInCombat()) if (!rs || !rs->IsInCombat())
{ {
@@ -960,8 +899,7 @@ public:
break; break;
} }
if (ObjectGuid g = pInstance->GetGuidData(npc)) if (Creature* hfs = pInstance->GetCreature(npc))
if (Creature* hfs = ObjectAccessor::GetCreature(*go, g))
hfs->AI()->SetData(3, spell); hfs->AI()->SetData(3, spell);
go->SetLootState(GO_JUST_DEACTIVATED); go->SetLootState(GO_JUST_DEACTIVATED);
@@ -969,19 +907,9 @@ public:
} }
}; };
class npc_ulduar_dark_rune_guardian : public CreatureScript struct npc_ulduar_dark_rune_guardian : public ScriptedAI
{ {
public: npc_ulduar_dark_rune_guardian(Creature* pCreature) : ScriptedAI(pCreature) { }
npc_ulduar_dark_rune_guardian() : CreatureScript("npc_ulduar_dark_rune_guardian") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_dark_rune_guardianAI>(pCreature);
}
struct npc_ulduar_dark_rune_guardianAI : public ScriptedAI
{
npc_ulduar_dark_rune_guardianAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer2; uint32 timer2;
@@ -1014,21 +942,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class npc_ulduar_dark_rune_watcher : public CreatureScript struct npc_ulduar_dark_rune_watcher : public ScriptedAI
{ {
public: npc_ulduar_dark_rune_watcher(Creature* pCreature) : ScriptedAI(pCreature) { }
npc_ulduar_dark_rune_watcher() : CreatureScript("npc_ulduar_dark_rune_watcher") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_dark_rune_watcherAI>(pCreature);
}
struct npc_ulduar_dark_rune_watcherAI : public ScriptedAI
{
npc_ulduar_dark_rune_watcherAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer1; uint32 timer1;
uint32 timer2; uint32 timer2;
@@ -1070,21 +987,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class npc_ulduar_dark_rune_sentinel : public CreatureScript struct npc_ulduar_dark_rune_sentinel : public ScriptedAI
{ {
public: npc_ulduar_dark_rune_sentinel(Creature* pCreature) : ScriptedAI(pCreature) { }
npc_ulduar_dark_rune_sentinel() : CreatureScript("npc_ulduar_dark_rune_sentinel") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_ulduar_dark_rune_sentinelAI>(pCreature);
}
struct npc_ulduar_dark_rune_sentinelAI : public ScriptedAI
{
npc_ulduar_dark_rune_sentinelAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer1; uint32 timer1;
uint32 timer2; uint32 timer2;
@@ -1124,7 +1030,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class achievement_quick_shave : public AchievementCriteriaScript class achievement_quick_shave : public AchievementCriteriaScript
{ {
@@ -1150,14 +1055,14 @@ public:
void AddSC_boss_razorscale() void AddSC_boss_razorscale()
{ {
new boss_razorscale(); RegisterUlduarCreatureAI(boss_razorscale);
new npc_ulduar_expedition_commander(); new npc_ulduar_expedition_commander();
new npc_ulduar_harpoonfirestate(); RegisterUlduarCreatureAI(npc_ulduar_harpoonfirestate);
new npc_ulduar_expedition_engineer(); RegisterUlduarCreatureAI(npc_ulduar_expedition_engineer);
new go_ulduar_working_harpoon(); new go_ulduar_working_harpoon();
new npc_ulduar_dark_rune_guardian(); RegisterUlduarCreatureAI(npc_ulduar_dark_rune_guardian);
new npc_ulduar_dark_rune_watcher(); RegisterUlduarCreatureAI(npc_ulduar_dark_rune_watcher);
new npc_ulduar_dark_rune_sentinel(); RegisterUlduarCreatureAI(npc_ulduar_dark_rune_sentinel);
new achievement_quick_shave(); new achievement_quick_shave();
new achievement_iron_dwarf_medium_rare(); new achievement_iron_dwarf_medium_rare();
} }
@@ -299,24 +299,13 @@ enum Misc
const Position Middle = {2134.68f, -263.13f, 419.44f, M_PI * 1.5f}; const Position Middle = {2134.68f, -263.13f, 419.44f, M_PI * 1.5f};
class boss_thorim : public CreatureScript struct boss_thorim : public BossAI
{ {
public: boss_thorim(Creature* creature) : BossAI(creature, BOSS_THORIM)
boss_thorim() : CreatureScript("boss_thorim") { }
CreatureAI* GetAI(Creature* pCreature) const override
{ {
return GetUlduarAI<boss_thorimAI>(pCreature); _encounterFinished = !me->IsAlive();
} if (_encounterFinished)
instance->SetBossState(BOSS_THORIM, DONE);
struct boss_thorimAI : public ScriptedAI
{
boss_thorimAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
m_pInstance = pCreature->GetInstanceScript();
if ((_encounterFinished = (!me->IsAlive())))
if (m_pInstance)
m_pInstance->SetData(TYPE_THORIM, DONE);
} }
bool _isArenaEmpty; bool _isArenaEmpty;
@@ -327,10 +316,6 @@ public:
bool _isAlly; bool _isAlly;
uint8 _trashCounter; uint8 _trashCounter;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
bool _hitByLightning; bool _hitByLightning;
void DisableThorim(bool apply) void DisableThorim(bool apply)
@@ -352,13 +337,9 @@ public:
GameObject* GetThorimObject(uint32 entry) GameObject* GetThorimObject(uint32 entry)
{ {
if (m_pInstance) return instance->GetGameObject(entry);
return ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(entry));
return nullptr;
} }
void JustSummoned(Creature* cr) override { summons.Summon(cr); }
void SpawnAllNPCs() void SpawnAllNPCs()
{ {
// Jormungar Behemoth 32882 // Jormungar Behemoth 32882
@@ -421,17 +402,13 @@ public:
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
{ {
DisableThorim(false); DisableThorim(false);
CreatureAI::EnterEvadeMode(why); BossAI::EnterEvadeMode(why);
} }
void Reset() override void Reset() override
{ {
if (m_pInstance && !_encounterFinished) if (!_encounterFinished)
m_pInstance->SetData(TYPE_THORIM, NOT_STARTED); _Reset();
events.Reset();
events.SetPhase(0);
summons.DespawnAll();
_trashCounter = 0; _trashCounter = 0;
_isAlly = true; _isAlly = true;
@@ -488,12 +465,16 @@ public:
Talk(SAY_SLAY); Talk(SAY_SLAY);
} }
void JustReachedHome() override { me->setActive(false); } void JustReachedHome() override
{
_JustReachedHome();
me->setActive(false);
}
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
{ {
if (m_pInstance && !_encounterFinished) if (!_encounterFinished)
m_pInstance->SetData(TYPE_THORIM, IN_PROGRESS); instance->SetBossState(BOSS_THORIM, IN_PROGRESS);
me->setActive(true); me->setActive(true);
DisableThorim(true); DisableThorim(true);
me->CastSpell(me, SPELL_SHEATH_OF_LIGHTNING, true); me->CastSpell(me, SPELL_SHEATH_OF_LIGHTNING, true);
@@ -522,8 +503,7 @@ public:
// Hard Mode // Hard Mode
if (!me->HasAura(62565 /*TOUCH OF DOMINION TRIGGER*/)) if (!me->HasAura(62565 /*TOUCH OF DOMINION TRIGGER*/))
{ {
if (m_pInstance) instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 64980 /*SIFFED ACHIEVEMENT*/);
m_pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 64980 /*SIFFED ACHIEVEMENT*/);
_hardMode = true; _hardMode = true;
EntryCheckPredicate pred(NPC_SIF); EntryCheckPredicate pred(NPC_SIF);
@@ -569,11 +549,8 @@ public:
} }
// Defeat credit // Defeat credit
if (m_pInstance)
{
me->CastSpell(me, 64985, true); // credit me->CastSpell(me, 64985, true); // credit
m_pInstance->SetData(TYPE_THORIM, DONE); instance->SetBossState(BOSS_THORIM, DONE);
}
} }
} }
} }
@@ -608,7 +585,7 @@ public:
else if (spellInfo->Id == SPELL_TELEPORT) else if (spellInfo->Id == SPELL_TELEPORT)
{ {
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
m_pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE); instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
} }
} }
@@ -768,8 +745,7 @@ public:
Talk(SAY_END_NORMAL_3); Talk(SAY_END_NORMAL_3);
} }
// Defeat credit // Defeat credit
if (m_pInstance) instance->SetBossState(BOSS_THORIM, DONE);
m_pInstance->SetData(TYPE_THORIM, DONE);
events.ScheduleEvent(EVENT_THORIM_OUTRO4, 14s, 0, 3); events.ScheduleEvent(EVENT_THORIM_OUTRO4, 14s, 0, 3);
break; break;
case EVENT_THORIM_OUTRO4: case EVENT_THORIM_OUTRO4:
@@ -781,21 +757,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_thorim_sif : public CreatureScript struct boss_thorim_sif : public ScriptedAI
{ {
public: boss_thorim_sif(Creature* creature) : ScriptedAI(creature) { }
boss_thorim_sif() : CreatureScript("boss_thorim_sif") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_sifAI>(pCreature);
}
struct boss_thorim_sifAI : public ScriptedAI
{
boss_thorim_sifAI(Creature* pCreature) : ScriptedAI(pCreature) { }
void MoveInLineOfSight(Unit*) override {} void MoveInLineOfSight(Unit*) override {}
void AttackStart(Unit*) override {} void AttackStart(Unit*) override {}
@@ -817,7 +782,7 @@ public:
else if (param == ACTION_SIF_START_DOMINION) else if (param == ACTION_SIF_START_DOMINION)
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_THORIM))) if (Creature* cr = me->GetInstanceScript()->GetCreature(BOSS_THORIM))
me->CastSpell(cr, SPELL_TOUCH_OF_DOMINION, false); me->CastSpell(cr, SPELL_TOUCH_OF_DOMINION, false);
events.ScheduleEvent(EVENT_SIF_FINISH_DOMINION, 150s); events.ScheduleEvent(EVENT_SIF_FINISH_DOMINION, 150s);
@@ -889,21 +854,10 @@ public:
} }
} }
}; };
};
class boss_thorim_lightning_orb : public CreatureScript struct boss_thorim_lightning_orb : public npc_escortAI
{ {
public: boss_thorim_lightning_orb(Creature* creature) : npc_escortAI(creature)
boss_thorim_lightning_orb() : CreatureScript("boss_thorim_lightning_orb") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_lightning_orbAI>(pCreature);
}
struct boss_thorim_lightning_orbAI : public npc_escortAI
{
boss_thorim_lightning_orbAI(Creature* pCreature) : npc_escortAI(pCreature)
{ {
InitWaypoint(); InitWaypoint();
Reset(); Reset();
@@ -937,21 +891,10 @@ public:
{ {
} }
}; };
};
class boss_thorim_trap : public CreatureScript struct boss_thorim_trap : public NullCreatureAI
{ {
public: boss_thorim_trap(Creature* creature) : NullCreatureAI(creature) { }
boss_thorim_trap() : CreatureScript("boss_thorim_trap") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_trapAI>(pCreature);
}
struct boss_thorim_trapAI : public NullCreatureAI
{
boss_thorim_trapAI(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 _checkTimer; uint32 _checkTimer;
@@ -975,21 +918,10 @@ public:
} }
} }
}; };
};
class boss_thorim_sif_blizzard : public CreatureScript struct boss_thorim_sif_blizzard : public npc_escortAI
{ {
public: boss_thorim_sif_blizzard(Creature* creature) : npc_escortAI(creature)
boss_thorim_sif_blizzard() : CreatureScript("boss_thorim_sif_blizzard") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_sif_blizzardAI>(pCreature);
}
struct boss_thorim_sif_blizzardAI : public npc_escortAI
{
boss_thorim_sif_blizzardAI(Creature* pCreature) : npc_escortAI(pCreature)
{ {
InitWaypoint(); InitWaypoint();
Reset(); Reset();
@@ -1024,21 +956,10 @@ public:
{ {
} }
}; };
};
class boss_thorim_pillar : public CreatureScript struct boss_thorim_pillar : public NullCreatureAI
{ {
public: boss_thorim_pillar(Creature* pCreature) : NullCreatureAI(pCreature) { }
boss_thorim_pillar() : CreatureScript("boss_thorim_pillar") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_pillarAI>(pCreature);
}
struct boss_thorim_pillarAI : public NullCreatureAI
{
boss_thorim_pillarAI(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 _resetTimer; uint32 _resetTimer;
@@ -1067,21 +988,10 @@ public:
Reset(); // _resetTimer set to 0 Reset(); // _resetTimer set to 0
} }
}; };
};
class boss_thorim_start_npcs : public CreatureScript struct boss_thorim_start_npcs : public ScriptedAI
{ {
public: boss_thorim_start_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_thorim_start_npcs() : CreatureScript("boss_thorim_start_npcs") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_start_npcsAI>(pCreature);
}
struct boss_thorim_start_npcsAI : public ScriptedAI
{
boss_thorim_start_npcsAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events; EventMap events;
bool _isCaster; bool _isCaster;
@@ -1102,7 +1012,7 @@ public:
if (!_playerAttack && who && (who->IsPlayer() || who->GetOwnerGUID().IsPlayer())) if (!_playerAttack && who && (who->IsPlayer() || who->GetOwnerGUID().IsPlayer()))
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* thorim = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_THORIM))) if (Creature* thorim = me->GetInstanceScript()->GetCreature(BOSS_THORIM))
{ {
if (!thorim->IsInCombat()) if (!thorim->IsInCombat())
{ {
@@ -1123,7 +1033,7 @@ public:
void JustDied(Unit*) override void JustDied(Unit*) override
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* thorim = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_THORIM))) if (Creature* thorim = me->GetInstanceScript()->GetCreature(BOSS_THORIM))
thorim->AI()->DoAction(ACTION_START_TRASH_DIED); thorim->AI()->DoAction(ACTION_START_TRASH_DIED);
} }
@@ -1221,21 +1131,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_thorim_gauntlet_npcs : public CreatureScript struct boss_thorim_gauntlet_npcs : public ScriptedAI
{ {
public: boss_thorim_gauntlet_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_thorim_gauntlet_npcs() : CreatureScript("boss_thorim_gauntlet_npcs") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_gauntlet_npcsAI>(pCreature);
}
struct boss_thorim_gauntlet_npcsAI : public ScriptedAI
{
boss_thorim_gauntlet_npcsAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events; EventMap events;
bool _isCaster; bool _isCaster;
@@ -1328,21 +1227,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_thorim_runic_colossus : public CreatureScript struct boss_thorim_runic_colossus : public ScriptedAI
{ {
public: boss_thorim_runic_colossus(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_thorim_runic_colossus() : CreatureScript("boss_thorim_runic_colossus") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_runic_colossusAI>(pCreature);
}
struct boss_thorim_runic_colossusAI : public ScriptedAI
{
boss_thorim_runic_colossusAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events; EventMap events;
bool _leftHand; bool _leftHand;
@@ -1374,10 +1262,10 @@ public:
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
{ {
if (GameObject* go = ObjectAccessor::GetGameObject(*me, me->GetInstanceScript()->GetGuidData(DATA_THORIM_FIRST_DOORS))) if (GameObject* go = me->GetInstanceScript()->GetGameObject(DATA_THORIM_FIRST_DOORS))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_THORIM))) if (Creature* cr = me->GetInstanceScript()->GetCreature(BOSS_THORIM))
cr->AI()->Talk(SAY_SPECIAL_2); cr->AI()->Talk(SAY_SPECIAL_2);
} }
} }
@@ -1469,21 +1357,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_thorim_ancient_rune_giant : public CreatureScript struct boss_thorim_ancient_rune_giant : public ScriptedAI
{ {
public: boss_thorim_ancient_rune_giant(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_thorim_ancient_rune_giant() : CreatureScript("boss_thorim_ancient_rune_giant") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_ancient_rune_giantAI>(pCreature);
}
struct boss_thorim_ancient_rune_giantAI : public ScriptedAI
{
boss_thorim_ancient_rune_giantAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events; EventMap events;
bool _isInCombat; bool _isInCombat;
@@ -1509,10 +1386,10 @@ public:
{ {
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* pInstance = me->GetInstanceScript())
{ {
if (GameObject* go = ObjectAccessor::GetGameObject(*me, pInstance->GetGuidData(DATA_THORIM_SECOND_DOORS))) if (GameObject* go = pInstance->GetGameObject(DATA_THORIM_SECOND_DOORS))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
if (Creature* thorim = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_THORIM))) if (Creature* thorim = pInstance->GetCreature(BOSS_THORIM))
thorim->AI()->DoAction(ACTION_ALLOW_HIT); thorim->AI()->DoAction(ACTION_ALLOW_HIT);
} }
} }
@@ -1554,21 +1431,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_thorim_arena_npcs : public CreatureScript struct boss_thorim_arena_npcs : public ScriptedAI
{ {
public: boss_thorim_arena_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_thorim_arena_npcs() : CreatureScript("boss_thorim_arena_npcs") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_thorim_arena_npcsAI>(pCreature);
}
struct boss_thorim_arena_npcsAI : public ScriptedAI
{
boss_thorim_arena_npcsAI(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events; EventMap events;
bool _isCaster; bool _isCaster;
@@ -1700,7 +1566,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class go_thorim_lever : public GameObjectScript class go_thorim_lever : public GameObjectScript
{ {
@@ -1759,7 +1624,7 @@ public:
bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override
{ {
if (InstanceScript* instance = player->GetInstanceScript()) if (InstanceScript* instance = player->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetGuidData(TYPE_THORIM))) if (Creature* cr = instance->GetCreature(BOSS_THORIM))
return cr->AI()->GetData(DATA_HIT_BY_LIGHTNING); return cr->AI()->GetData(DATA_HIT_BY_LIGHTNING);
return false; return false;
@@ -1774,7 +1639,7 @@ public:
bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override
{ {
if (InstanceScript* instance = player->GetInstanceScript()) if (InstanceScript* instance = player->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*player, instance->GetGuidData(TYPE_THORIM))) if (Creature* cr = instance->GetCreature(BOSS_THORIM))
return cr->AI()->GetData(DATA_LOSE_YOUR_ILLUSION); return cr->AI()->GetData(DATA_LOSE_YOUR_ILLUSION);
return false; return false;
@@ -1784,21 +1649,21 @@ public:
void AddSC_boss_thorim() void AddSC_boss_thorim()
{ {
// Main encounter // Main encounter
new boss_thorim(); RegisterUlduarCreatureAI(boss_thorim);
new boss_thorim_sif(); RegisterUlduarCreatureAI(boss_thorim_sif);
new boss_thorim_lightning_orb(); RegisterUlduarCreatureAI(boss_thorim_lightning_orb);
new boss_thorim_trap(); RegisterUlduarCreatureAI(boss_thorim_trap);
new boss_thorim_pillar(); RegisterUlduarCreatureAI(boss_thorim_pillar);
new boss_thorim_sif_blizzard(); RegisterUlduarCreatureAI(boss_thorim_sif_blizzard);
// Trash // Trash
new boss_thorim_start_npcs(); RegisterUlduarCreatureAI(boss_thorim_start_npcs);
new boss_thorim_gauntlet_npcs(); RegisterUlduarCreatureAI(boss_thorim_gauntlet_npcs);
new boss_thorim_arena_npcs(); RegisterUlduarCreatureAI(boss_thorim_arena_npcs);
// Mini bosses // Mini bosses
new boss_thorim_runic_colossus(); RegisterUlduarCreatureAI(boss_thorim_runic_colossus);
new boss_thorim_ancient_rune_giant(); RegisterUlduarCreatureAI(boss_thorim_ancient_rune_giant);
// GOs // GOs
new go_thorim_lever(); new go_thorim_lever();
@@ -112,30 +112,14 @@ enum Misc
DATA_XT002_GRAVITY_ACHIEV = 51, DATA_XT002_GRAVITY_ACHIEV = 51,
}; };
class boss_xt002 : public CreatureScript struct boss_xt002 : public BossAI
{ {
public: boss_xt002(Creature* pCreature) : BossAI(pCreature, BOSS_XT002) { }
boss_xt002() : CreatureScript("boss_xt002") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_xt002AI>(pCreature);
}
struct boss_xt002AI : public ScriptedAI
{
boss_xt002AI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
m_pInstance = pCreature->GetInstanceScript();
}
InstanceScript* m_pInstance;
uint8 _healthCheck; uint8 _healthCheck;
bool _hardMode; bool _hardMode;
bool _nerfAchievement; bool _nerfAchievement;
bool _gravityAchievement; bool _gravityAchievement;
EventMap events;
SummonList summons;
void RescheduleEvents() void RescheduleEvents()
{ {
@@ -147,8 +131,7 @@ public:
void Reset() override void Reset() override
{ {
summons.DespawnAll(); _Reset();
events.Reset();
me->ResetLootMode(); me->ResetLootMode();
me->RemoveAllAuras(); me->RemoveAllAuras();
@@ -163,18 +146,14 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(false, UNIT_STATE_STUNNED); me->SetControlled(false, UNIT_STATE_STUNNED);
if (m_pInstance) if (instance)
{ {
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
m_pInstance->SetData(TYPE_XT002, NOT_STARTED); if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS)))
pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetGoState(GO_STATE_ACTIVE);
} }
} }
void JustSummoned(Creature* cr) override { summons.Summon(cr); }
void SummonedCreatureDespawn(Creature* cr) override { summons.Despawn(cr); }
void AttachHeart() void AttachHeart()
{ {
if (Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : nullptr) if (Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT) : nullptr)
@@ -187,7 +166,11 @@ public:
} }
} }
void JustReachedHome() override { me->setActive(false); } void JustReachedHome() override
{
_JustReachedHome();
me->setActive(false);
}
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
{ {
@@ -199,11 +182,11 @@ public:
me->setActive(true); me->setActive(true);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
if (m_pInstance) if (instance)
{ {
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
m_pInstance->SetData(TYPE_XT002, IN_PROGRESS); instance->SetBossState(BOSS_XT002, IN_PROGRESS);
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS))) if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
pGo->SetGoState(GO_STATE_READY); pGo->SetGoState(GO_STATE_READY);
} }
@@ -223,16 +206,13 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
Talk(SAY_DEATH); Talk(SAY_DEATH);
_JustDied();
if (m_pInstance) if (instance)
{ {
m_pInstance->SetData(TYPE_XT002, DONE); if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS)))
pGo->SetGoState(GO_STATE_ACTIVE); pGo->SetGoState(GO_STATE_ACTIVE);
} }
// Despawn summons
summons.DespawnAll();
} }
void DoAction(int32 param) override void DoAction(int32 param) override
@@ -384,21 +364,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class npc_xt002_heart : public CreatureScript struct npc_xt002_heart : public PassiveAI
{ {
public: npc_xt002_heart(Creature* pCreature) : PassiveAI(pCreature), summons(me)
npc_xt002_heart() : CreatureScript("npc_xt002_heart") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_xt002_heartAI>(pCreature);
}
struct npc_xt002_heartAI : public PassiveAI
{
npc_xt002_heartAI(Creature* pCreature) : PassiveAI(pCreature), summons(me)
{ {
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
} }
@@ -450,7 +419,7 @@ public:
} }
else if (param == ACTION_HIDE_HEART) else if (param == ACTION_HIDE_HEART)
{ {
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
if (pXT002->AI()) if (pXT002->AI())
{ {
pXT002->AI()->DoAction(_damageDone); pXT002->AI()->DoAction(_damageDone);
@@ -516,7 +485,7 @@ public:
{ {
me->SetVisible(false); me->SetVisible(false);
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* XT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* XT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
if (XT002->AI()) if (XT002->AI())
XT002->AI()->DoAction(ACTION_HEART_BROKEN); XT002->AI()->DoAction(ACTION_HEART_BROKEN);
} }
@@ -534,21 +503,10 @@ public:
} }
} }
}; };
};
class npc_xt002_scrapbot : public CreatureScript struct npc_xt002_scrapbot : public PassiveAI
{ {
public: npc_xt002_scrapbot(Creature* pCreature) : PassiveAI(pCreature) { }
npc_xt002_scrapbot() : CreatureScript("npc_xt002_scrapbot") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_xt002_scrapbotAI>(pCreature);
}
struct npc_xt002_scrapbotAI : public PassiveAI
{
npc_xt002_scrapbotAI(Creature* pCreature) : PassiveAI(pCreature) { }
bool _locked; bool _locked;
void Reset() override void Reset() override
@@ -558,7 +516,7 @@ public:
me->SetWalk(true); me->SetWalk(true);
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
{ {
if (pXT002->GetPositionZ() > 411.0f) // he is on stairs... idiot cryness protection if (pXT002->GetPositionZ() > 411.0f) // he is on stairs... idiot cryness protection
me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f); me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f);
@@ -589,7 +547,7 @@ public:
// we reached the target :) // we reached the target :)
if (type == FOLLOW_MOTION_TYPE && me->GetInstanceScript()) if (type == FOLLOW_MOTION_TYPE && me->GetInstanceScript())
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
{ {
if (pXT002->IsAlive()) if (pXT002->IsAlive())
{ {
@@ -609,7 +567,7 @@ public:
if (!_locked) if (!_locked)
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
{ {
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
_locked = true; _locked = true;
@@ -617,21 +575,10 @@ public:
} }
} }
}; };
};
class npc_xt002_pummeller : public CreatureScript struct npc_xt002_pummeller : public ScriptedAI
{ {
public: npc_xt002_pummeller(Creature* pCreature) : ScriptedAI(pCreature) { }
npc_xt002_pummeller() : CreatureScript("npc_xt002_pummeller") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_xt002_pummellerAI>(pCreature);
}
struct npc_xt002_pummellerAI : public ScriptedAI
{
npc_xt002_pummellerAI(Creature* pCreature) : ScriptedAI(pCreature) { }
int32 _arcingSmashTimer; int32 _arcingSmashTimer;
int32 _trampleTimer; int32 _trampleTimer;
@@ -680,7 +627,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class BoomEvent : public BasicEvent class BoomEvent : public BasicEvent
{ {
@@ -705,19 +651,9 @@ private:
Creature* _me; Creature* _me;
}; };
class npc_xt002_boombot : public CreatureScript struct npc_xt002_boombot : public PassiveAI
{ {
public: npc_xt002_boombot(Creature* pCreature) : PassiveAI(pCreature) { }
npc_xt002_boombot() : CreatureScript("npc_xt002_boombot") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_xt002_boombotAI>(pCreature);
}
struct npc_xt002_boombotAI : public PassiveAI
{
npc_xt002_boombotAI(Creature* pCreature) : PassiveAI(pCreature) { }
bool _locked; bool _locked;
bool _boomed; bool _boomed;
@@ -729,7 +665,7 @@ public:
me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING); me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
{ {
if (pXT002->GetPositionZ() > 411.0f) // he is on stairs... idiot cryness protection if (pXT002->GetPositionZ() > 411.0f) // he is on stairs... idiot cryness protection
me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f); me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f);
@@ -796,7 +732,7 @@ public:
if (!_locked) if (!_locked)
{ {
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_XT002))) if (Creature* pXT002 = me->GetInstanceScript()->GetCreature(BOSS_XT002))
{ {
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
_locked = true; _locked = true;
@@ -804,21 +740,10 @@ public:
} }
} }
}; };
};
class npc_xt002_life_spark : public CreatureScript struct npc_xt002_life_spark : public ScriptedAI
{ {
public: npc_xt002_life_spark(Creature* pCreature) : ScriptedAI(pCreature)
npc_xt002_life_spark() : CreatureScript("npc_xt002_life_spark") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<npc_xt002_life_sparkAI>(pCreature);
}
struct npc_xt002_life_sparkAI : public ScriptedAI
{
npc_xt002_life_sparkAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
me->SetMaxHealth(RAID_MODE(54000, 172000)); me->SetMaxHealth(RAID_MODE(54000, 172000));
me->SetHealth(me->GetMaxHealth()); me->SetHealth(me->GetMaxHealth());
@@ -843,7 +768,6 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
// 62775 - Tympanic Tantrum // 62775 - Tympanic Tantrum
class spell_xt002_tympanic_tantrum : public SpellScript class spell_xt002_tympanic_tantrum : public SpellScript
@@ -999,7 +923,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_XT002))) if (Creature* cr = instance->GetCreature(BOSS_XT002))
return cr->AI()->GetData(DATA_XT002_NERF_ENGINEERING); return cr->AI()->GetData(DATA_XT002_NERF_ENGINEERING);
return false; return false;
@@ -1015,7 +939,7 @@ public:
{ {
if (target) if (target)
if (InstanceScript* instance = target->GetInstanceScript()) if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_XT002))) if (Creature* cr = instance->GetCreature(BOSS_XT002))
return cr->AI()->GetData(DATA_XT002_GRAVITY_ACHIEV); return cr->AI()->GetData(DATA_XT002_GRAVITY_ACHIEV);
return false; return false;
@@ -1025,12 +949,12 @@ public:
void AddSC_boss_xt002() void AddSC_boss_xt002()
{ {
// Npcs // Npcs
new boss_xt002(); RegisterUlduarCreatureAI(boss_xt002);
new npc_xt002_heart(); RegisterUlduarCreatureAI(npc_xt002_heart);
new npc_xt002_scrapbot(); RegisterUlduarCreatureAI(npc_xt002_scrapbot);
new npc_xt002_pummeller(); RegisterUlduarCreatureAI(npc_xt002_pummeller);
new npc_xt002_boombot(); RegisterUlduarCreatureAI(npc_xt002_boombot);
new npc_xt002_life_spark(); RegisterUlduarCreatureAI(npc_xt002_life_spark);
// Spells // Spells
RegisterSpellScript(spell_xt002_tympanic_tantrum); RegisterSpellScript(spell_xt002_tympanic_tantrum);
@@ -285,7 +285,7 @@ const Position KeepersPos[4] =
const uint32 TABLE_KEEPER_ENTRY[4] = {NPC_FREYA_KEEPER, NPC_HODIR_KEEPER, NPC_MIMIRON_KEEPER, NPC_THORIM_KEEPER}; const uint32 TABLE_KEEPER_ENTRY[4] = {NPC_FREYA_KEEPER, NPC_HODIR_KEEPER, NPC_MIMIRON_KEEPER, NPC_THORIM_KEEPER};
const uint32 TABLE_GOSSIP_ENTRY[4] = {NPC_FREYA_GOSSIP, NPC_HODIR_GOSSIP, NPC_MIMIRON_GOSSIP, NPC_THORIM_GOSSIP}; const uint32 TABLE_GOSSIP_ENTRY[4] = {NPC_FREYA_GOSSIP, NPC_HODIR_GOSSIP, NPC_MIMIRON_GOSSIP, NPC_THORIM_GOSSIP};
const uint32 TABLE_KEEPER_TYPE[4] = {TYPE_FREYA, TYPE_HODIR, TYPE_MIMIRON, TYPE_THORIM}; const uint32 TABLE_KEEPER_TYPE[4] = {BOSS_FREYA, BOSS_HODIR, BOSS_MIMIRON, BOSS_THORIM};
static LocationsXY yoggPortalLoc[] = static LocationsXY yoggPortalLoc[] =
{ {
@@ -364,19 +364,9 @@ enum Texts
const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI * 1.5f}; const Position Middle = {1980.28f, -25.5868f, 329.397f, M_PI * 1.5f};
class boss_yoggsaron_sara : public CreatureScript struct boss_yoggsaron_sara : public ScriptedAI
{ {
public: boss_yoggsaron_sara(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
boss_yoggsaron_sara() : CreatureScript("boss_yoggsaron_sara") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_saraAI>(pCreature);
}
struct boss_yoggsaron_saraAI : public ScriptedAI
{
boss_yoggsaron_saraAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{ {
m_pInstance = pCreature->GetInstanceScript(); m_pInstance = pCreature->GetInstanceScript();
} }
@@ -478,8 +468,8 @@ public:
{ {
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER); m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER);
m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SANITY); m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SANITY);
m_pInstance->SetData(TYPE_YOGGSARON, NOT_STARTED); m_pInstance->SetData(BOSS_YOGGSARON, NOT_STARTED);
if (GameObject* go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_YOGG_SARON_DOORS))) if (GameObject* go = m_pInstance->GetGameObject(DATA_YOGG_SARON_DOORS))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
} }
} }
@@ -490,11 +480,11 @@ public:
return; return;
// some simple hack checks // some simple hack checks
if (m_pInstance->GetData(TYPE_VEZAX) != DONE || m_pInstance->GetData(TYPE_XT002) != DONE) if (m_pInstance->GetBossState(BOSS_VEZAX) != DONE || m_pInstance->GetBossState(BOSS_XT002) != DONE)
return; return;
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER); m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER);
m_pInstance->SetData(TYPE_YOGGSARON, IN_PROGRESS); m_pInstance->SetData(BOSS_YOGGSARON, IN_PROGRESS);
me->SetInCombatWithZone(); me->SetInCombatWithZone();
AttackStart(target); AttackStart(target);
@@ -688,7 +678,7 @@ public:
return; return;
// Illusion shatters (param - stun time) // Illusion shatters (param - stun time)
if (Creature* yoggb = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(NPC_BRAIN_OF_YOGG_SARON))) if (Creature* yoggb = me->GetInstanceScript()->GetCreature(DATA_BRAIN_OF_YOGG_SARON))
{ {
yoggb->AI()->Talk(EMOTE_YOGG_SARON_BRAIN_SHATTERED); yoggb->AI()->Talk(EMOTE_YOGG_SARON_BRAIN_SHATTERED);
} }
@@ -795,7 +785,7 @@ public:
me->SummonCreature(NPC_VOICE_OF_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); me->SummonCreature(NPC_VOICE_OF_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
if (m_pInstance) if (m_pInstance)
if (GameObject* go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_YOGG_SARON_DOORS))) if (GameObject* go = m_pInstance->GetGameObject(DATA_YOGG_SARON_DOORS))
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
events.ScheduleEvent(EVENT_SARA_P1_SPELLS, 0ms, 1, EVENT_PHASE_ONE); events.ScheduleEvent(EVENT_SARA_P1_SPELLS, 0ms, 1, EVENT_PHASE_ONE);
@@ -905,7 +895,7 @@ public:
case EVENT_SARA_P1_BERSERK: case EVENT_SARA_P1_BERSERK:
if (me->GetInstanceScript()) if (me->GetInstanceScript())
{ {
if (Creature* yogg = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_YOGGSARON))) if (Creature* yogg = me->GetInstanceScript()->GetCreature(BOSS_YOGGSARON))
{ {
yogg->AI()->Talk(EMOTE_YOGG_SARON_BERSERK); yogg->AI()->Talk(EMOTE_YOGG_SARON_BERSERK);
} }
@@ -916,21 +906,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_cloud : public CreatureScript struct boss_yoggsaron_cloud : public npc_escortAI
{ {
public: boss_yoggsaron_cloud(Creature* pCreature) : npc_escortAI(pCreature)
boss_yoggsaron_cloud() : CreatureScript("boss_yoggsaron_cloud") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_cloudAI>(pCreature);
}
struct boss_yoggsaron_cloudAI : public npc_escortAI
{
boss_yoggsaron_cloudAI(Creature* pCreature) : npc_escortAI(pCreature)
{ {
InitWaypoint(); InitWaypoint();
Reset(); Reset();
@@ -946,7 +925,7 @@ public:
_isSummoning = false; _isSummoning = false;
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* sara = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(NPC_SARA))) if (Creature* sara = me->GetInstanceScript()->GetCreature(DATA_SARA))
sara->AI()->JustSummoned(cr); sara->AI()->JustSummoned(cr);
} }
@@ -1012,21 +991,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_guardian_of_ys : public CreatureScript struct boss_yoggsaron_guardian_of_ys : public ScriptedAI
{ {
public: boss_yoggsaron_guardian_of_ys(Creature* pCreature) : ScriptedAI(pCreature) { }
boss_yoggsaron_guardian_of_ys() : CreatureScript("boss_yoggsaron_guardian_of_ys") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_guardian_of_ysAI>(pCreature);
}
struct boss_yoggsaron_guardian_of_ysAI : public ScriptedAI
{
boss_yoggsaron_guardian_of_ysAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 _spellTimer; uint32 _spellTimer;
@@ -1056,21 +1024,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_yoggsaron : public CreatureScript struct boss_yoggsaron : public ScriptedAI
{ {
public: boss_yoggsaron(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
boss_yoggsaron() : CreatureScript("boss_yoggsaron") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaronAI>(pCreature);
}
struct boss_yoggsaronAI : public ScriptedAI
{
boss_yoggsaronAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{ {
m_pInstance = me->GetInstanceScript(); m_pInstance = me->GetInstanceScript();
_thirdPhase = false; _thirdPhase = false;
@@ -1118,10 +1075,10 @@ public:
if (m_pInstance) if (m_pInstance)
{ {
m_pInstance->SetData(TYPE_YOGGSARON, DONE); m_pInstance->SetData(BOSS_YOGGSARON, DONE);
if (Creature* sara = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_SARA))) if (Creature* sara = m_pInstance->GetCreature(DATA_SARA))
sara->AI()->DoAction(ACTION_YOGG_SARON_DEATH); sara->AI()->DoAction(ACTION_YOGG_SARON_DEATH);
if (GameObject* go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_YOGG_SARON_DOORS))) if (GameObject* go = m_pInstance->GetGameObject(DATA_YOGG_SARON_DOORS))
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
} }
@@ -1236,21 +1193,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_brain : public CreatureScript struct boss_yoggsaron_brain : public NullCreatureAI
{ {
public: boss_yoggsaron_brain(Creature* pCreature) : NullCreatureAI(pCreature), summons(pCreature)
boss_yoggsaron_brain() : CreatureScript("boss_yoggsaron_brain") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_brainAI>(pCreature);
}
struct boss_yoggsaron_brainAI : public NullCreatureAI
{
boss_yoggsaron_brainAI(Creature* pCreature) : NullCreatureAI(pCreature), summons(pCreature)
{ {
me->SetDisableGravity(true); me->SetDisableGravity(true);
_tentacleCount = 0; _tentacleCount = 0;
@@ -1402,7 +1348,7 @@ public:
{ {
// Stun // Stun
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* sara = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(NPC_SARA))) if (Creature* sara = me->GetInstanceScript()->GetCreature(DATA_SARA))
sara->AI()->DoAction(MINUTE * IN_MILLISECONDS - std::min((uint32)MINUTE * IN_MILLISECONDS, _induceTimer)); sara->AI()->DoAction(MINUTE * IN_MILLISECONDS - std::min((uint32)MINUTE * IN_MILLISECONDS, _induceTimer));
_induceTimer = 0; _induceTimer = 0;
@@ -1469,7 +1415,7 @@ public:
me->CastSpell(me, SPELL_BRAIN_HURT_VISUAL, true); me->CastSpell(me, SPELL_BRAIN_HURT_VISUAL, true);
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* sara = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(NPC_SARA))) if (Creature* sara = me->GetInstanceScript()->GetCreature(DATA_SARA))
sara->AI()->DoAction(ACTION_BRAIN_DAMAGED); sara->AI()->DoAction(ACTION_BRAIN_DAMAGED);
} }
} }
@@ -1481,21 +1427,10 @@ public:
_induceTimer += diff; _induceTimer += diff;
} }
}; };
};
class boss_yoggsaron_death_orb : public CreatureScript struct boss_yoggsaron_death_orb : public NullCreatureAI
{ {
public: boss_yoggsaron_death_orb(Creature* pCreature) : NullCreatureAI(pCreature)
boss_yoggsaron_death_orb() : CreatureScript("boss_yoggsaron_death_orb") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_death_orbAI>(pCreature);
}
struct boss_yoggsaron_death_orbAI : public NullCreatureAI
{
boss_yoggsaron_death_orbAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
me->CastSpell(me, SPELL_DEATH_RAY_WARNING, true); me->CastSpell(me, SPELL_DEATH_RAY_WARNING, true);
_startTimer = 1; _startTimer = 1;
@@ -1521,21 +1456,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_crusher_tentacle : public CreatureScript struct boss_yoggsaron_crusher_tentacle : public ScriptedAI
{ {
public: boss_yoggsaron_crusher_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
boss_yoggsaron_crusher_tentacle() : CreatureScript("boss_yoggsaron_crusher_tentacle") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_crusher_tentacleAI>(pCreature);
}
struct boss_yoggsaron_crusher_tentacleAI : public ScriptedAI
{
boss_yoggsaron_crusher_tentacleAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
me->SetCombatMovement(false); me->SetCombatMovement(false);
me->CastSpell(me, SPELL_CRUSH, true); me->CastSpell(me, SPELL_CRUSH, true);
@@ -1583,21 +1507,10 @@ public:
DoResetThreatList(); DoResetThreatList();
} }
}; };
};
class boss_yoggsaron_corruptor_tentacle : public CreatureScript struct boss_yoggsaron_corruptor_tentacle : public ScriptedAI
{ {
public: boss_yoggsaron_corruptor_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
boss_yoggsaron_corruptor_tentacle() : CreatureScript("boss_yoggsaron_corruptor_tentacle") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_corruptor_tentacleAI>(pCreature);
}
struct boss_yoggsaron_corruptor_tentacleAI : public ScriptedAI
{
boss_yoggsaron_corruptor_tentacleAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
me->SetCombatMovement(false); me->SetCombatMovement(false);
} }
@@ -1640,21 +1553,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_constrictor_tentacle : public CreatureScript struct boss_yoggsaron_constrictor_tentacle : public ScriptedAI
{ {
public: boss_yoggsaron_constrictor_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
boss_yoggsaron_constrictor_tentacle() : CreatureScript("boss_yoggsaron_constrictor_tentacle") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_constrictor_tentacleAI>(pCreature);
}
struct boss_yoggsaron_constrictor_tentacleAI : public ScriptedAI
{
boss_yoggsaron_constrictor_tentacleAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
me->SetCombatMovement(false); me->SetCombatMovement(false);
_checkTimer = 1; _checkTimer = 1;
@@ -1719,7 +1621,6 @@ public:
player->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, me)); player->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, me));
} }
}; };
};
struct boss_yoggsaron_keeper : public NullCreatureAI struct boss_yoggsaron_keeper : public NullCreatureAI
{ {
@@ -1773,14 +1674,9 @@ private:
SummonList _summons; SummonList _summons;
}; };
class boss_yoggsaron_descend_portal : public CreatureScript struct boss_yoggsaron_descend_portal : public PassiveAI
{ {
public: boss_yoggsaron_descend_portal(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) {}
boss_yoggsaron_descend_portal() : CreatureScript("boss_yoggsaron_descend_portal") { }
struct boss_yoggsaron_descend_portalAI : public PassiveAI
{
boss_yoggsaron_descend_portalAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) {}
void OnSpellClick(Unit* clicker, bool& spellClickHandled) override void OnSpellClick(Unit* clicker, bool& spellClickHandled) override
{ {
@@ -1811,25 +1707,9 @@ public:
InstanceScript* _instance; InstanceScript* _instance;
}; };
CreatureAI* GetAI(Creature* creature) const override struct boss_yoggsaron_influence_tentacle : public NullCreatureAI
{ {
return GetUlduarAI<boss_yoggsaron_descend_portalAI>(creature); boss_yoggsaron_influence_tentacle(Creature* pCreature) : NullCreatureAI(pCreature)
}
};
class boss_yoggsaron_influence_tentacle : public CreatureScript
{
public:
boss_yoggsaron_influence_tentacle() : CreatureScript("boss_yoggsaron_influence_tentacle") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_influence_tentacleAI>(pCreature);
}
struct boss_yoggsaron_influence_tentacleAI : public NullCreatureAI
{
boss_yoggsaron_influence_tentacleAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
me->CastSpell(me, SPELL_GRIM_REPRISAL, true); me->CastSpell(me, SPELL_GRIM_REPRISAL, true);
} }
@@ -1847,21 +1727,10 @@ public:
sara->GetAI()->DoAction(ACTION_INFLUENCE_TENTACLE_DIED); sara->GetAI()->DoAction(ACTION_INFLUENCE_TENTACLE_DIED);
} }
}; };
};
class boss_yoggsaron_immortal_guardian : public CreatureScript struct boss_yoggsaron_immortal_guardian : public ScriptedAI
{ {
public: boss_yoggsaron_immortal_guardian(Creature* pCreature) : ScriptedAI(pCreature)
boss_yoggsaron_immortal_guardian() : CreatureScript("boss_yoggsaron_immortal_guardian") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_immortal_guardianAI>(pCreature);
}
struct boss_yoggsaron_immortal_guardianAI : public ScriptedAI
{
boss_yoggsaron_immortal_guardianAI(Creature* pCreature) : ScriptedAI(pCreature)
{ {
Reset(); Reset();
} }
@@ -1935,21 +1804,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class boss_yoggsaron_lich_king : public CreatureScript struct boss_yoggsaron_lich_king : public NullCreatureAI
{ {
public: boss_yoggsaron_lich_king(Creature* c) : NullCreatureAI(c) { }
boss_yoggsaron_lich_king() : CreatureScript("boss_yoggsaron_lich_king") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_lich_kingAI>(pCreature);
}
struct boss_yoggsaron_lich_kingAI : public NullCreatureAI
{
boss_yoggsaron_lich_kingAI(Creature* c) : NullCreatureAI(c) { }
bool _running; bool _running;
int32 _checkTimer; int32 _checkTimer;
@@ -2022,21 +1880,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_llane : public CreatureScript struct boss_yoggsaron_llane : public NullCreatureAI
{ {
public: boss_yoggsaron_llane(Creature* c) : NullCreatureAI(c) { }
boss_yoggsaron_llane() : CreatureScript("boss_yoggsaron_llane") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_llaneAI>(pCreature);
}
struct boss_yoggsaron_llaneAI : public NullCreatureAI
{
boss_yoggsaron_llaneAI(Creature* c) : NullCreatureAI(c) { }
bool _running; bool _running;
int32 _checkTimer; int32 _checkTimer;
@@ -2117,21 +1964,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_neltharion : public CreatureScript struct boss_yoggsaron_neltharion : public ScriptedAI
{ {
public: boss_yoggsaron_neltharion(Creature* c) : ScriptedAI(c) { }
boss_yoggsaron_neltharion() : CreatureScript("boss_yoggsaron_neltharion") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_neltharionAI>(pCreature);
}
struct boss_yoggsaron_neltharionAI : public ScriptedAI
{
boss_yoggsaron_neltharionAI(Creature* c) : ScriptedAI(c) { }
bool _running; bool _running;
int32 _checkTimer; int32 _checkTimer;
@@ -2200,21 +2036,10 @@ public:
} }
} }
}; };
};
class boss_yoggsaron_voice : public CreatureScript struct boss_yoggsaron_voice : public NullCreatureAI
{ {
public: boss_yoggsaron_voice(Creature* pCreature) : NullCreatureAI(pCreature)
boss_yoggsaron_voice() : CreatureScript("boss_yoggsaron_voice") { }
CreatureAI* GetAI(Creature* pCreature) const override
{
return GetUlduarAI<boss_yoggsaron_voiceAI>(pCreature);
}
struct boss_yoggsaron_voiceAI : public NullCreatureAI
{
boss_yoggsaron_voiceAI(Creature* pCreature) : NullCreatureAI(pCreature)
{ {
_targets.clear(); _targets.clear();
_current = 0; _current = 0;
@@ -2235,7 +2060,7 @@ public:
{ {
// Drive Me Crazy achievement failed // Drive Me Crazy achievement failed
if (me->GetInstanceScript()) if (me->GetInstanceScript())
if (Creature* yogg = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_YOGGSARON))) if (Creature* yogg = me->GetInstanceScript()->GetCreature(BOSS_YOGGSARON))
yogg->AI()->DoAction(ACTION_FAILED_DRIVE_ME_CRAZY); yogg->AI()->DoAction(ACTION_FAILED_DRIVE_ME_CRAZY);
events.ScheduleEvent(40, 2s); events.ScheduleEvent(40, 2s);
@@ -2262,7 +2087,6 @@ public:
} }
} }
}; };
};
// 63830, 63881 - Malady of the Mind // 63830, 63881 - Malady of the Mind
class spell_yogg_saron_malady_of_the_mind_aura : public AuraScript class spell_yogg_saron_malady_of_the_mind_aura : public AuraScript
@@ -2894,7 +2718,7 @@ public:
bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override
{ {
if (player->GetInstanceScript()) if (player->GetInstanceScript())
if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetGuidData(NPC_SARA))) if (Creature* sara = player->GetInstanceScript()->GetCreature(DATA_SARA))
return sara->GetAI()->GetData(DATA_GET_KEEPERS_COUNT) <= _keepersCount; return sara->GetAI()->GetData(DATA_GET_KEEPERS_COUNT) <= _keepersCount;
return false; return false;
@@ -2915,7 +2739,7 @@ public:
bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override
{ {
if (player->GetInstanceScript()) if (player->GetInstanceScript())
if (Creature* sara = ObjectAccessor::GetCreature(*player, player->GetInstanceScript()->GetGuidData(NPC_BRAIN_OF_YOGG_SARON))) if (Creature* sara = player->GetInstanceScript()->GetCreature(DATA_BRAIN_OF_YOGG_SARON))
return sara->GetAI()->GetData(DATA_GET_CURRENT_ILLUSION) == _requiredIllusion; return sara->GetAI()->GetData(DATA_GET_CURRENT_ILLUSION) == _requiredIllusion;
return false; return false;
@@ -2938,23 +2762,23 @@ public:
void AddSC_boss_yoggsaron() void AddSC_boss_yoggsaron()
{ {
new boss_yoggsaron(); RegisterUlduarCreatureAI(boss_yoggsaron);
new boss_yoggsaron_sara(); RegisterUlduarCreatureAI(boss_yoggsaron_sara);
new boss_yoggsaron_cloud(); RegisterUlduarCreatureAI(boss_yoggsaron_cloud);
new boss_yoggsaron_guardian_of_ys(); RegisterUlduarCreatureAI(boss_yoggsaron_guardian_of_ys);
new boss_yoggsaron_brain(); RegisterUlduarCreatureAI(boss_yoggsaron_brain);
new boss_yoggsaron_death_orb(); RegisterUlduarCreatureAI(boss_yoggsaron_death_orb);
new boss_yoggsaron_crusher_tentacle(); RegisterUlduarCreatureAI(boss_yoggsaron_crusher_tentacle);
new boss_yoggsaron_corruptor_tentacle(); RegisterUlduarCreatureAI(boss_yoggsaron_corruptor_tentacle);
new boss_yoggsaron_constrictor_tentacle(); RegisterUlduarCreatureAI(boss_yoggsaron_constrictor_tentacle);
RegisterUlduarCreatureAI(boss_yoggsaron_keeper); RegisterUlduarCreatureAI(boss_yoggsaron_keeper);
new boss_yoggsaron_descend_portal(); RegisterUlduarCreatureAI(boss_yoggsaron_descend_portal);
new boss_yoggsaron_influence_tentacle(); RegisterUlduarCreatureAI(boss_yoggsaron_influence_tentacle);
new boss_yoggsaron_immortal_guardian(); RegisterUlduarCreatureAI(boss_yoggsaron_immortal_guardian);
new boss_yoggsaron_lich_king(); RegisterUlduarCreatureAI(boss_yoggsaron_lich_king);
new boss_yoggsaron_llane(); RegisterUlduarCreatureAI(boss_yoggsaron_llane);
new boss_yoggsaron_neltharion(); RegisterUlduarCreatureAI(boss_yoggsaron_neltharion);
new boss_yoggsaron_voice(); RegisterUlduarCreatureAI(boss_yoggsaron_voice);
// SPELLS // SPELLS
RegisterSpellScript(spell_yogg_saron_malady_of_the_mind_aura); RegisterSpellScript(spell_yogg_saron_malady_of_the_mind_aura);
File diff suppressed because it is too large Load Diff
@@ -300,19 +300,9 @@ private:
uint8 _counter; uint8 _counter;
}; };
class npc_ulduar_storm_tempered_keeper : public CreatureScript struct npc_ulduar_storm_tempered_keeper : public ScriptedAI
{ {
public: npc_ulduar_storm_tempered_keeper(Creature* creature) : ScriptedAI(creature)
npc_ulduar_storm_tempered_keeper() : CreatureScript("npc_ulduar_storm_tempered_keeper") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_ulduar_storm_tempered_keeperAI>(creature);
}
struct npc_ulduar_storm_tempered_keeperAI : public ScriptedAI
{
npc_ulduar_storm_tempered_keeperAI(Creature* creature) : ScriptedAI(creature)
{ {
otherGUID.Clear(); otherGUID.Clear();
} }
@@ -387,21 +377,10 @@ public:
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
};
class npc_ulduar_arachnopod_destroyer : public CreatureScript struct npc_ulduar_arachnopod_destroyer : public ScriptedAI
{ {
public: npc_ulduar_arachnopod_destroyer(Creature* creature) : ScriptedAI(creature)
npc_ulduar_arachnopod_destroyer() : CreatureScript("npc_ulduar_arachnopod_destroyer") { }
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_ulduar_arachnopod_destroyerAI>(creature);
}
struct npc_ulduar_arachnopod_destroyerAI : public ScriptedAI
{
npc_ulduar_arachnopod_destroyerAI(Creature* creature) : ScriptedAI(creature)
{ {
_spawnedMechanic = false; _spawnedMechanic = false;
me->ApplySpellImmune(0, IMMUNITY_ID, 64919, true); // Ice Nova from Ice Turret me->ApplySpellImmune(0, IMMUNITY_ID, 64919, true); // Ice Nova from Ice Turret
@@ -502,7 +481,6 @@ public:
} }
} }
}; };
};
class spell_ulduar_arachnopod_damaged_aura : public AuraScript class spell_ulduar_arachnopod_damaged_aura : public AuraScript
{ {
@@ -571,8 +549,8 @@ void AddSC_ulduar()
new npc_ulduar_keeper(); new npc_ulduar_keeper();
RegisterSpellScript(spell_ulduar_energy_sap_aura); RegisterSpellScript(spell_ulduar_energy_sap_aura);
RegisterUlduarCreatureAI(npc_ulduar_snow_mound); RegisterUlduarCreatureAI(npc_ulduar_snow_mound);
new npc_ulduar_storm_tempered_keeper(); RegisterUlduarCreatureAI(npc_ulduar_storm_tempered_keeper);
new npc_ulduar_arachnopod_destroyer(); RegisterUlduarCreatureAI(npc_ulduar_arachnopod_destroyer);
RegisterSpellScript(spell_ulduar_arachnopod_damaged_aura); RegisterSpellScript(spell_ulduar_arachnopod_damaged_aura);
new AreaTrigger_at_celestial_planetarium_enterance(); new AreaTrigger_at_celestial_planetarium_enterance();
RegisterCreatureAI(npc_salvaged_siege_engine); RegisterCreatureAI(npc_salvaged_siege_engine);
@@ -25,31 +25,38 @@
#define UlduarScriptName "instance_ulduar" #define UlduarScriptName "instance_ulduar"
enum UlduarEncounters enum UlduarBossIds
{ {
MAX_ENCOUNTER = 15, // Boss IDs used by SetBossNumber/SetBossState (0-indexed)
BOSS_LEVIATHAN = 0,
TYPE_LEVIATHAN = 0, BOSS_IGNIS = 1,
TYPE_IGNIS = 1, BOSS_RAZORSCALE = 2,
TYPE_RAZORSCALE = 2, BOSS_XT002 = 3,
TYPE_XT002 = 3, BOSS_ASSEMBLY = 4,
TYPE_ASSEMBLY = 4, BOSS_KOLOGARN = 5,
TYPE_KOLOGARN = 5, BOSS_AURIAYA = 6,
TYPE_AURIAYA = 6, BOSS_FREYA = 7,
TYPE_FREYA = 7, BOSS_HODIR = 8,
TYPE_HODIR = 8, BOSS_MIMIRON = 9,
TYPE_MIMIRON = 9, BOSS_THORIM = 10,
TYPE_THORIM = 10, BOSS_VEZAX = 11,
TYPE_VEZAX = 11, BOSS_YOGGSARON = 12,
TYPE_YOGGSARON = 12, BOSS_ALGALON = 13,
TYPE_ALGALON = 13, MAX_ENCOUNTER = 14
TYPE_WATCHERS = 14,
TYPE_HODIR_HM_FAIL = 15,
TYPE_WINTER_CACHE = 16
}; };
enum UlduarData enum UlduarData
{ {
// Non-boss encounter data
TYPE_WATCHERS = 14,
TYPE_HODIR_HM_FAIL = 15,
TYPE_WINTER_CACHE = 16,
// Assembly of Iron
DATA_STEELBREAKER = 20,
DATA_MOLGEIM = 21,
DATA_BRUNDIR = 22,
// Flame Leviathan // Flame Leviathan
DATA_VEHICLE_SPAWN = 100, DATA_VEHICLE_SPAWN = 100,
DATA_LIGHTNING_WALL1 = 101, DATA_LIGHTNING_WALL1 = 101,
@@ -57,6 +64,7 @@ enum UlduarData
DATA_REPAIR_STATION1 = 103, DATA_REPAIR_STATION1 = 103,
DATA_REPAIR_STATION2 = 104, DATA_REPAIR_STATION2 = 104,
DATA_UNBROKEN_ACHIEVEMENT = 105, DATA_UNBROKEN_ACHIEVEMENT = 105,
DATA_LEVIATHAN_DOORS = 106,
// Razorscales Harpoon Fire State GUIDs // Razorscales Harpoon Fire State GUIDs
DATA_HARPOON_FIRE_STATE_1 = 200, DATA_HARPOON_FIRE_STATE_1 = 200,
@@ -64,16 +72,31 @@ enum UlduarData
DATA_HARPOON_FIRE_STATE_3 = 202, DATA_HARPOON_FIRE_STATE_3 = 202,
DATA_HARPOON_FIRE_STATE_4 = 203, DATA_HARPOON_FIRE_STATE_4 = 203,
// Mimiron's first vehicle (spawned by default) // Mimiron creatures
DATA_MIMIRON_LEVIATHAN_MKII = 301, DATA_MIMIRON_LEVIATHAN_MKII = 301,
DATA_MIMIRON_VX001 = 302, DATA_MIMIRON_VX001 = 302,
DATA_MIMIRON_ACU = 303, DATA_MIMIRON_ACU = 303,
// Mimiron's Doors // Mimiron doors
DATA_GO_MIMIRON_DOOR_1 = 311, DATA_GO_MIMIRON_DOOR_1 = 311,
DATA_GO_MIMIRON_DOOR_2 = 312, DATA_GO_MIMIRON_DOOR_2 = 312,
DATA_GO_MIMIRON_DOOR_3 = 313, DATA_GO_MIMIRON_DOOR_3 = 313,
// Mimiron tram
DATA_MIMIRON_TRAM = 320,
DATA_MIMIRON_ACTIVATE_TRAM = 321,
DATA_MIMIRON_TRAM_ROCKET_BOOSTER = 322,
DATA_MIMIRON_CALL_TRAM_CENTER = 323,
DATA_MIMIRON_CALL_TRAM_MIMIRON = 324,
DATA_MIMIRON_TRAM_TURNAROUND_1 = 325,
DATA_MIMIRON_TRAM_TURNAROUND_2 = 326,
// XT-002
DATA_XT002_DOORS = 400,
// Kologarn
DATA_KOLOGARN_DOORS = 410,
// Thorim // Thorim
DATA_THORIM_LEVER_GATE = 500, DATA_THORIM_LEVER_GATE = 500,
DATA_THORIM_LEVER = 501, DATA_THORIM_LEVER = 501,
@@ -81,15 +104,18 @@ enum UlduarData
DATA_THORIM_FIRST_DOORS = 503, DATA_THORIM_FIRST_DOORS = 503,
DATA_THORIM_SECOND_DOORS = 504, DATA_THORIM_SECOND_DOORS = 504,
// Assembly of Iron
DATA_STEELBREAKER = 20,
DATA_MOLGEIM = 21,
DATA_BRUNDIR = 22,
// Algalon the Observer // Algalon the Observer
DATA_ALGALON_SUMMON_STATE = 600, DATA_ALGALON_SUMMON_STATE = 600,
DATA_DESPAWN_ALGALON = 601, DATA_DESPAWN_ALGALON = 601,
DATA_ALGALON_DEFEATED = 602, DATA_ALGALON_DEFEATED = 602,
DATA_SIGILDOOR_01 = 603,
DATA_SIGILDOOR_02 = 604,
DATA_SIGILDOOR_03 = 605,
DATA_UNIVERSE_FLOOR_01 = 606,
DATA_UNIVERSE_FLOOR_02 = 607,
DATA_UNIVERSE_GLOBE = 608,
DATA_ALGALON_TRAPDOOR = 609,
DATA_BRANN_BRONZEBEARD_ALG = 610,
// Achievements // Achievements
DATA_DWARFAGEDDON = 700, DATA_DWARFAGEDDON = 700,
@@ -97,10 +123,32 @@ enum UlduarData
// Tram // Tram
DATA_CALL_TRAM = 710, DATA_CALL_TRAM = 710,
// Freya elders
DATA_ELDER_IRONBRANCH = 750,
DATA_ELDER_STONEBARK = 751,
DATA_ELDER_BRIGHTLEAF = 752,
// Yogg-Saron
DATA_SARA = 760,
DATA_BRAIN_OF_YOGG_SARON = 761,
DATA_YOGG_SARON_DOORS = 762,
// Middle section
DATA_ASSEMBLY_DOORS = 770,
DATA_ARCHIVUM_DOORS = 771,
DATA_KEEPERS_GATE = 772,
// Hodir chests (dynamically spawned)
DATA_HODIR_CHEST_NORMAL = 780,
DATA_HODIR_CHEST_HARD = 781,
DATA_HODIR_CHEST_NORMAL_HERO = 782,
DATA_HODIR_CHEST_HARD_HERO = 783,
// Mage Barrier // Mage Barrier
DATA_MAGE_BARRIER = 800, DATA_MAGE_BARRIER = 800,
DATA_BRANN_MEMOTESAY = 801, DATA_BRANN_MEMOTESAY = 801,
DATA_BRANN_EASY_MODE = 802, DATA_BRANN_EASY_MODE = 802,
DATA_BRANN_BASE_CAMP = 803,
}; };
enum UlduarNPCs enum UlduarNPCs