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;
};
class boss_algalon_the_observer : public CreatureScript
struct boss_algalon_the_observer : public ScriptedAI
{
public:
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)
boss_algalon_the_observer(Creature* creature) : ScriptedAI(creature), summons(me)
{
_fedOnTears = true;
_firstPull = true;
@@ -369,7 +364,7 @@ public:
}
if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, FAIL);
m_pInstance->SetData(BOSS_ALGALON, FAIL);
ScriptedAI::EnterEvadeMode(why);
}
@@ -390,13 +385,13 @@ public:
_phaseTwo = false;
_heraldOfTheTitans = true;
if (m_pInstance->GetData(TYPE_ALGALON) == FAIL)
if (m_pInstance->GetBossState(BOSS_ALGALON) == FAIL)
{
_firstPull = false;
}
if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED);
m_pInstance->SetData(BOSS_ALGALON, NOT_STARTED);
}
void KilledUnit(Unit* victim) override
@@ -451,7 +446,7 @@ public:
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->InterruptNonMeleeSpells(false);
if (m_pInstance)
m_pInstance->SetData(TYPE_ALGALON, NOT_STARTED);
m_pInstance->SetData(BOSS_ALGALON, NOT_STARTED);
break;
case ACTION_INIT_ALGALON:
_firstPull = false;
@@ -661,11 +656,11 @@ public:
case EVENT_INTRO_FINISH:
events.Reset();
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);
break;
case EVENT_START_COMBAT:
m_pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
m_pInstance->SetData(BOSS_ALGALON, IN_PROGRESS);
Talk(SAY_ALGALON_AGGRO);
break;
case EVENT_REMOVE_UNNATTACKABLE:
@@ -742,7 +737,7 @@ public:
case EVENT_OUTRO_START:
if (m_pInstance)
{
m_pInstance->SetData(TYPE_ALGALON, DONE);
m_pInstance->SetData(BOSS_ALGALON, DONE);
m_pInstance->SetData(DATA_ALGALON_DEFEATED, 1);
}
break;
@@ -822,22 +817,11 @@ public:
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<boss_algalon_the_observerAI>(creature);
}
};
class npc_brann_bronzebeard_algalon : public CreatureScript
struct npc_brann_bronzebeard_algalon : public CreatureAI
{
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)
npc_brann_bronzebeard_algalon(Creature* creature) : CreatureAI(creature)
{
}
@@ -908,7 +892,7 @@ public:
me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
break;
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))
algalon->AI()->DoAction(ACTION_START_INTRO);
break;
@@ -920,22 +904,11 @@ public:
break;
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_brann_bronzebeard_algalonAI>(creature);
}
};
class npc_collapsing_star : public CreatureScript
struct npc_collapsing_star : public NullCreatureAI
{
public:
npc_collapsing_star() : CreatureScript("npc_collapsing_star") { }
struct npc_collapsing_starAI : public NullCreatureAI
{
npc_collapsing_starAI(Creature* creature) : NullCreatureAI(creature)
npc_collapsing_star(Creature* creature) : NullCreatureAI(creature)
{
creature->GetMotionMaster()->MoveRandom(25.0f);
creature->CastSpell(creature, SPELL_COLLAPSE, true);
@@ -956,22 +929,11 @@ public:
me->CastSpell(me, SPELL_SUMMON_BLACK_HOLE, true);
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_collapsing_starAI>(creature);
}
};
class npc_living_constellation : public CreatureScript
struct npc_living_constellation : public ScriptedAI
{
public:
npc_living_constellation() : CreatureScript("npc_living_constellation") { }
struct npc_living_constellationAI : public ScriptedAI
{
npc_living_constellationAI(Creature* creature) : ScriptedAI(creature)
npc_living_constellation(Creature* creature) : ScriptedAI(creature)
{
me->SetReactState(REACT_PASSIVE);
}
@@ -1048,22 +1010,11 @@ public:
break;
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_living_constellationAI>(creature);
}
};
class npc_algalon_worm_hole : public CreatureScript
struct npc_algalon_worm_hole : public NullCreatureAI
{
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)
npc_algalon_worm_hole(Creature* creature) : NullCreatureAI(creature)
{
creature->CastSpell(creature, SPELL_WORM_HOLE_TRIGGER, true);
creature->CastSpell(creature, SPELL_SUMMON_VOID_ZONE_VISUAL, true);
@@ -1096,12 +1047,6 @@ public:
_summonTimer = 0;
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<npc_algalon_worm_holeAI>(creature);
}
};
class go_celestial_planetarium_access : public GameObjectScript
@@ -1153,10 +1098,10 @@ public:
if (InstanceScript* instance = me->GetInstanceScript())
{
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);
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);
if (Map* map = player->GetMap())
@@ -1394,11 +1339,11 @@ public:
void AddSC_boss_algalon_the_observer()
{
// NPCs
new boss_algalon_the_observer();
new npc_brann_bronzebeard_algalon();
new npc_collapsing_star();
new npc_living_constellation();
new npc_algalon_worm_hole();
RegisterUlduarCreatureAI(boss_algalon_the_observer);
RegisterUlduarCreatureAI(npc_brann_bronzebeard_algalon);
RegisterUlduarCreatureAI(npc_collapsing_star);
RegisterUlduarCreatureAI(npc_living_constellation);
RegisterUlduarCreatureAI(npc_algalon_worm_hole);
// GOs
new go_celestial_planetarium_access();
@@ -128,11 +128,7 @@ bool IsEncounterComplete(InstanceScript* pInstance, Creature* me)
for (uint8 i = 0; i < 3; ++i)
{
ObjectGuid guid = pInstance->GetGuidData(DATA_STEELBREAKER + i);
if (!guid)
return false;
if (Creature* boss = (ObjectAccessor::GetCreature(*me, guid)))
if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
{
if (boss->IsAlive())
return false;
@@ -151,41 +147,27 @@ void RespawnAssemblyOfIron(InstanceScript* pInstance, Creature* me)
for (uint8 i = 0; i < 3; ++i)
{
ObjectGuid guid = pInstance->GetGuidData(DATA_STEELBREAKER + i);
if (!guid)
return;
if (Creature* boss = (ObjectAccessor::GetCreature((*me), guid)))
if (Creature* boss = pInstance->GetCreature(DATA_STEELBREAKER + i))
if (!boss->IsAlive())
boss->Respawn();
}
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())
cr->SetHealth(cr->GetMaxHealth());
if (Creature* cr2 = ObjectAccessor::GetCreature(*me, guid2))
if (Creature* cr2 = pInstance->GetCreature(dataId2))
if (cr2->IsAlive())
cr2->SetHealth(cr2->GetMaxHealth());
}
class boss_steelbreaker : public CreatureScript
struct boss_steelbreaker : public ScriptedAI
{
public:
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)
boss_steelbreaker(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
@@ -202,7 +184,7 @@ public:
_phase = 0;
events.Reset();
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
}
void JustReachedHome() override
@@ -214,7 +196,7 @@ public:
void JustEngagedWith(Unit* who) override
{
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS);
pInstance->SetBossState(BOSS_ASSEMBLY, IN_PROGRESS);
me->setActive(true);
me->SetInCombatWithZone();
@@ -225,7 +207,7 @@ public:
if (!pInstance)
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())
{
@@ -242,7 +224,7 @@ public:
}
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())
boss->AI()->AttackStart(who);
}
@@ -276,13 +258,13 @@ public:
if (IsEncounterComplete(pInstance, me))
{
pInstance->SetData(TYPE_ASSEMBLY, DONE);
pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit
Talk(SAY_STEELBREAKER_ENCOUNTER_DEFEATED);
}
else
{
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_BRUNDIR), pInstance->GetGuidData(DATA_MOLGEIM), me);
RestoreAssemblyHealth(DATA_BRUNDIR, DATA_MOLGEIM, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_STEELBREAKER_DEATH);
}
@@ -345,7 +327,6 @@ public:
DoMeleeAttackIfReady();
}
};
};
class CastRunesEvent : public BasicEvent
@@ -364,19 +345,9 @@ private:
Creature& _owner;
};
class boss_runemaster_molgeim : public CreatureScript
struct boss_runemaster_molgeim : public ScriptedAI
{
public:
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)
boss_runemaster_molgeim(Creature* c) : ScriptedAI(c), summons(me)
{
pInstance = c->GetInstanceScript();
}
@@ -396,7 +367,7 @@ public:
summons.DespawnAll();
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
me->m_Events.AddEventAtOffset(new CastRunesEvent(*me), 8s);
}
@@ -419,7 +390,7 @@ public:
return;
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())
boss->AI()->AttackStart(who);
}
@@ -454,13 +425,13 @@ public:
if (IsEncounterComplete(pInstance, me))
{
pInstance->SetData(TYPE_ASSEMBLY, DONE);
pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit
Talk(SAY_MOLGEIM_ENCOUNTER_DEFEATED);
}
else
{
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_STEELBREAKER), pInstance->GetGuidData(DATA_BRUNDIR), me);
RestoreAssemblyHealth(DATA_STEELBREAKER, DATA_BRUNDIR, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_MOLGEIM_DEATH);
}
@@ -526,22 +497,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class npc_assembly_lightning : public CreatureScript
struct npc_assembly_lightning : public ScriptedAI
{
public:
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)
npc_assembly_lightning(Creature* c) : ScriptedAI(c)
{
_boomed = false;
}
@@ -571,22 +531,11 @@ public:
me->DespawnOrUnsummon(1s);
}
}
};
};
class boss_stormcaller_brundir : public CreatureScript
struct boss_stormcaller_brundir : public ScriptedAI
{
public:
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)
boss_stormcaller_brundir(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
@@ -615,7 +564,7 @@ public:
me->SetRegeneratingHealth(true);
me->SetReactState(REACT_AGGRESSIVE);
if (pInstance)
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
pInstance->SetBossState(BOSS_ASSEMBLY, NOT_STARTED);
}
void JustReachedHome() override
@@ -636,7 +585,7 @@ public:
return;
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())
boss->AI()->AttackStart(who);
}
@@ -672,13 +621,13 @@ public:
me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), 427.5, me->GetOrientation());
if (IsEncounterComplete(pInstance, me))
{
pInstance->SetData(TYPE_ASSEMBLY, DONE);
pInstance->SetBossState(BOSS_ASSEMBLY, DONE);
me->CastSpell(me, 65195, true); // credit
Talk(SAY_BRUNDIR_ENCOUNTER_DEFEATED);
}
else
{
RestoreAssemblyHealth(pInstance->GetGuidData(DATA_STEELBREAKER), pInstance->GetGuidData(DATA_MOLGEIM), me);
RestoreAssemblyHealth(DATA_STEELBREAKER, DATA_MOLGEIM, pInstance);
me->CastSpell(me, SPELL_SUPERCHARGE, true);
Talk(SAY_BRUNDIR_DEATH);
}
@@ -821,7 +770,6 @@ public:
DoMeleeAttackIfReady();
}
};
};
class spell_shield_of_runes_aura : public AuraScript
@@ -853,7 +801,7 @@ class spell_assembly_meltdown : public SpellScript
void HandleInstaKill(SpellEffIndex /*effIndex*/)
{
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);
}
@@ -921,7 +869,7 @@ public:
return false;
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 false;
@@ -930,10 +878,10 @@ public:
void AddSC_boss_assembly_of_iron()
{
new boss_steelbreaker();
new boss_runemaster_molgeim();
new boss_stormcaller_brundir();
new npc_assembly_lightning();
RegisterUlduarCreatureAI(boss_steelbreaker);
RegisterUlduarCreatureAI(boss_runemaster_molgeim);
RegisterUlduarCreatureAI(boss_stormcaller_brundir);
RegisterUlduarCreatureAI(npc_assembly_lightning);
RegisterSpellScript(spell_shield_of_runes_aura);
RegisterSpellScript(spell_assembly_meltdown);
@@ -97,7 +97,7 @@ enum Misc
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 _nineLives{false};
@@ -230,8 +230,8 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI
void JustEngagedWith(Unit*) override
{
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_AURIAYA)))
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = instance->GetCreature(BOSS_AURIAYA))
cr->SetInCombatWithZone();
events.ScheduleEvent(EVENT_SAVAGE_POUNCE, 5s);
@@ -241,7 +241,7 @@ struct npc_auriaya_sanctum_sentry : public ScriptedAI
void Reset() override
{
events.Reset();
me->CastSpell(me, SPELL_STRENGTH_OF_THE_PACK, true);
DoCastSelf(SPELL_STRENGTH_OF_THE_PACK, true);
}
void UpdateAI(uint32 diff) override
@@ -303,8 +303,8 @@ struct npc_auriaya_feral_defender : public ScriptedAI
void JustDied(Unit*) override
{
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(TYPE_AURIAYA)))
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = instance->GetCreature(BOSS_AURIAYA))
cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH);
if (_feralEssenceStack)
@@ -357,11 +357,11 @@ struct npc_auriaya_feral_defender : public ScriptedAI
DoResetThreatList();
if (!UpdateVictim())
return;
me->CastSpell(me->GetVictim(), SPELL_FERAL_RUSH, true);
DoCastVictim(SPELL_FERAL_RUSH, true);
events.Repeat(6s);
break;
case EVENT_FERAL_POUNCE:
me->CastSpell(me->GetVictim(), SPELL_FERAL_POUNCE, false);
DoCastVictim(SPELL_FERAL_POUNCE);
events.Repeat(6s);
break;
}
@@ -394,8 +394,8 @@ public:
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetGuidData(TYPE_AURIAYA)))
return cr->AI()->GetData(DATA_CRAZY_CAT);
if (Creature* auriaya = instance->GetCreature(BOSS_AURIAYA))
return auriaya->AI()->GetData(DATA_CRAZY_CAT);
return false;
}
@@ -410,7 +410,7 @@ public:
{
if (target)
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 false;
@@ -193,28 +193,14 @@ enum Misc
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() : CreatureScript("boss_flame_leviathan") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_flame_leviathan(Creature* pCreature) : BossAI(pCreature, BOSS_LEVIATHAN), vehicle(me->GetVehicleKit())
{
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);
}
InstanceScript* m_pInstance;
Vehicle* vehicle;
EventMap events;
SummonList summons;
uint32 _startTimer;
uint32 _speakTimer;
@@ -234,9 +220,9 @@ public:
// Original
void JustReachedHome() override
{
_JustReachedHome();
// For achievement
if (m_pInstance)
m_pInstance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0);
instance->SetData(DATA_UNBROKEN_ACHIEVEMENT, 0);
me->setActive(false);
}
@@ -256,9 +242,9 @@ public:
void AttackStart(Unit* who) override
{
if (Unit* veh = who->GetVehicleBase())
ScriptedAI::AttackStart(veh);
BossAI::AttackStart(veh);
else
ScriptedAI::AttackStart(who);
BossAI::AttackStart(who);
}
void JustEngagedWith(Unit*) override
@@ -270,8 +256,7 @@ public:
me->SetHomePosition(homePos);
TurnHealStations(false);
ActivateTowers();
if (m_pInstance)
m_pInstance->SetData(TYPE_LEVIATHAN, SPECIAL);
instance->SetBossState(BOSS_LEVIATHAN, SPECIAL);
BindPlayers();
me->SetInCombatWithZone();
@@ -284,14 +269,14 @@ public:
void InitializeAI() override
{
if (m_pInstance && m_pInstance->GetData(TYPE_LEVIATHAN) == SPECIAL)
if (instance->GetBossState(BOSS_LEVIATHAN) == SPECIAL)
{
me->SetHomePosition(homePos);
me->UpdatePosition(homePos);
me->StopMovingOnCurrentPos();
}
ScriptedAI::InitializeAI();
BossAI::InitializeAI();
}
void Reset() override
@@ -310,20 +295,17 @@ public:
_towersCount = 0;
_destroyedTurretCount = 0;
if (m_pInstance)
if (instance->GetBossState(BOSS_LEVIATHAN) != SPECIAL)
{
if (m_pInstance->GetData(TYPE_LEVIATHAN) != SPECIAL)
{
m_pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED);
instance->SetBossState(BOSS_LEVIATHAN, NOT_STARTED);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
}
else
{
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;
}
}
TurnGates(false, false);
TurnHealStations(true);
@@ -497,15 +479,14 @@ public:
}
}
}
};
};
void boss_flame_leviathan::boss_flame_leviathanAI::BindPlayers()
void boss_flame_leviathan::BindPlayers()
{
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))
{
@@ -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;
me->ResetLootMode();
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;
@@ -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;
if (_start)
{
// first one is ALWAYS turned on, unless leviathan is beaten
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);
if (m_pInstance->GetData(TYPE_LEVIATHAN) == NOT_STARTED)
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_LEVIATHAN_DOORS))))
if (instance->GetBossState(BOSS_LEVIATHAN) == NOT_STARTED)
if ((go = instance->GetGameObject(DATA_LEVIATHAN_DOORS)))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
}
else
{
GameObject* go = nullptr;
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);
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_LIGHTNING_WALL2))))
if ((go = instance->GetGameObject(DATA_LIGHTNING_WALL2)))
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);
else
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;
GameObject* go = nullptr;
if (_apply)
{
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION1))))
if ((go = instance->GetGameObject(DATA_REPAIR_STATION1)))
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);
}
else
{
if ((go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(DATA_REPAIR_STATION1))))
if ((go = instance->GetGameObject(DATA_REPAIR_STATION1)))
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);
}
}
void boss_flame_leviathan::boss_flame_leviathanAI::ScheduleEvents()
void boss_flame_leviathan::ScheduleEvents()
{
events.RescheduleEvent(EVENT_MISSILE, 5s);
events.RescheduleEvent(EVENT_VENT, 20s);
@@ -617,7 +598,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::ScheduleEvents()
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)
{
@@ -634,17 +615,14 @@ void boss_flame_leviathan::boss_flame_leviathanAI::SpellHit(Unit* /*caster*/, S
me->InterruptNonMeleeSpells(false);
}
void boss_flame_leviathan::boss_flame_leviathanAI::JustDied(Unit*)
void boss_flame_leviathan::JustDied(Unit*)
{
// Despawn Lashers, do before summons clear
summons.DoAction(ACTION_DESPAWN_ADDS);
summons.DespawnAll();
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LEVIATHAN, DONE);
m_pInstance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_NONE);
}
instance->SetBossState(BOSS_LEVIATHAN, DONE);
instance->SetData(DATA_VEHICLE_SPAWN, VEHICLE_POS_NONE);
Talk(FLAME_LEVIATHAN_SAY_DEATH);
@@ -652,7 +630,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::JustDied(Unit*)
BindPlayers();
}
void boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(Unit* who)
void boss_flame_leviathan::KilledUnit(Unit* who)
{
if (who == me->GetVictim())
events.RescheduleEvent(EVENT_PURSUE, 0ms);
@@ -661,7 +639,7 @@ void boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(Unit* who)
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)
{
@@ -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)
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() : 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())
boss_flame_leviathan_seat(Creature* creature) : VehicleAI(creature), vehicle(creature->GetVehicleKit())
{
ASSERT(vehicle);
me->SetReactState(REACT_PASSIVE);
@@ -786,17 +754,11 @@ public:
}
}
}
};
};
class boss_flame_leviathan_defense_turret : public CreatureScript
struct boss_flame_leviathan_defense_turret : public TurretAI
{
public:
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)
boss_flame_leviathan_defense_turret(Creature* creature) : TurretAI(creature)
{
_setHealth = false;
_instance = creature->GetInstanceScript();
@@ -823,7 +785,7 @@ public:
if (Unit* device = vehicle->GetPassenger(SEAT_DEVICE))
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);
}
@@ -851,22 +813,11 @@ public:
if (plr->GetVehicle())
plr->ExitVehicle();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<boss_flame_leviathan_defense_turretAI>(creature);
}
};
class boss_flame_leviathan_overload_device : public CreatureScript
struct boss_flame_leviathan_overload_device : public NullCreatureAI
{
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)
boss_flame_leviathan_overload_device(Creature* creature) : NullCreatureAI(creature)
{
}
@@ -887,27 +838,11 @@ public:
}
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<boss_flame_leviathan_overload_deviceAI>(creature);
}
};
class npc_freya_ward : public CreatureScript
struct npc_freya_ward : public NullCreatureAI
{
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)
npc_freya_ward(Creature* c) : NullCreatureAI(c), summons(c)
{
}
@@ -972,22 +907,11 @@ public:
if (param == ACTION_DESPAWN_ADDS)
summons.DespawnAll();
}
};
};
class npc_hodirs_fury : public CreatureScript
struct npc_hodirs_fury : public NullCreatureAI
{
public:
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)
npc_hodirs_fury(Creature* c) : NullCreatureAI(c)
{
}
@@ -1051,22 +975,11 @@ public:
_switchTargetTimer = 25000;
}
}
};
};
class npc_mimirons_inferno : public CreatureScript
struct npc_mimirons_inferno : public npc_escortAI
{
public:
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)
npc_mimirons_inferno(Creature* creature) : npc_escortAI(creature), summons(me)
{
me->SetReactState(REACT_PASSIVE);
}
@@ -1114,22 +1027,11 @@ public:
_spellTimer = 0;
}
}
};
};
class npc_thorims_hammer : public CreatureScript
struct npc_thorims_hammer : public NullCreatureAI
{
public:
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)
npc_thorims_hammer(Creature* c) : NullCreatureAI(c)
{
}
@@ -1170,22 +1072,11 @@ public:
}
}
}
};
};
class npc_pool_of_tar : public CreatureScript
struct npc_pool_of_tar : public NullCreatureAI
{
public:
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)
npc_pool_of_tar(Creature* c) : NullCreatureAI(c)
{
}
@@ -1199,24 +1090,13 @@ public:
if (spellInfo->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !me->HasAura(SPELL_BLAZE))
me->CastSpell(me, SPELL_BLAZE, true);
}
};
};
class npc_brann_radio : public CreatureScript
struct npc_brann_radio : public NullCreatureAI
{
public:
npc_brann_radio() : CreatureScript("npc_brann_radio") { }
CreatureAI* GetAI(Creature* pCreature) const override
npc_brann_radio(Creature* c) : NullCreatureAI(c)
{
return GetUlduarAI<npc_brann_radioAI>(pCreature);
}
struct npc_brann_radioAI : public NullCreatureAI
{
npc_brann_radioAI(Creature* c) : NullCreatureAI(c)
{
_lock = (me->GetInstanceScript() && me->GetInstanceScript()->GetData(TYPE_LEVIATHAN) > NOT_STARTED);
_lock = (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(BOSS_LEVIATHAN) > NOT_STARTED);
_helpLock = _lock;
}
@@ -1291,22 +1171,11 @@ public:
}
}
}
};
};
class npc_storm_beacon_spawn : public CreatureScript
struct npc_storm_beacon_spawn : public NullCreatureAI
{
public:
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)
npc_storm_beacon_spawn(Creature* c) : NullCreatureAI(c)
{
_amount = 0;
_checkTimer = 0;
@@ -1332,22 +1201,11 @@ public:
}
}
}
};
};
class boss_flame_leviathan_safety_container : public CreatureScript
struct boss_flame_leviathan_safety_container : public NullCreatureAI
{
public:
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)
boss_flame_leviathan_safety_container(Creature* c) : NullCreatureAI(c)
{
_allowTimer = 0;
}
@@ -1380,22 +1238,11 @@ public:
me->SetPosition(x, y, z, 0);
}
}
};
};
class npc_mechanolift : public CreatureScript
struct npc_mechanolift : public NullCreatureAI
{
public:
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)
npc_mechanolift(Creature* c) : NullCreatureAI(c)
{
me->SetSpeed(MOVE_RUN, rand_norm() + 0.5f);
}
@@ -1428,7 +1275,6 @@ public:
_evadeTimer = 0;
}
}
};
};
class go_ulduar_tower : public GameObjectScript
@@ -2018,23 +1864,23 @@ public:
void AddSC_boss_flame_leviathan()
{
new boss_flame_leviathan();
new boss_flame_leviathan_seat();
new boss_flame_leviathan_defense_turret();
new boss_flame_leviathan_overload_device();
new npc_pool_of_tar();
RegisterUlduarCreatureAI(boss_flame_leviathan);
RegisterUlduarCreatureAI(boss_flame_leviathan_seat);
RegisterUlduarCreatureAI(boss_flame_leviathan_defense_turret);
RegisterUlduarCreatureAI(boss_flame_leviathan_overload_device);
RegisterUlduarCreatureAI(npc_pool_of_tar);
// Hard Mode
new npc_freya_ward();
new npc_thorims_hammer();
new npc_mimirons_inferno();
new npc_hodirs_fury();
RegisterUlduarCreatureAI(npc_freya_ward);
RegisterUlduarCreatureAI(npc_thorims_hammer);
RegisterUlduarCreatureAI(npc_mimirons_inferno);
RegisterUlduarCreatureAI(npc_hodirs_fury);
// Helpers
new npc_brann_radio();
new npc_storm_beacon_spawn();
new boss_flame_leviathan_safety_container();
new npc_mechanolift();
RegisterUlduarCreatureAI(npc_brann_radio);
RegisterUlduarCreatureAI(npc_storm_beacon_spawn);
RegisterUlduarCreatureAI(boss_flame_leviathan_safety_container);
RegisterUlduarCreatureAI(npc_mechanolift);
// GOs
new go_ulduar_tower();
@@ -198,30 +198,14 @@ enum Misc
CRITERIA_LUMBERJACKED = 21686,
};
class boss_freya : public CreatureScript
struct boss_freya : public BossAI
{
public:
boss_freya() : CreatureScript("boss_freya") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_freya(Creature* pCreature) : BossAI(pCreature, BOSS_FREYA)
{
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 (m_pInstance)
m_pInstance->SetData(TYPE_FREYA, DONE);
instance->SetBossState(BOSS_FREYA, DONE);
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 _waveNumber;
uint8 _trioKilled;
uint8 _spawnedAmount;
@@ -234,11 +218,7 @@ public:
void Reset() override
{
if (m_pInstance && m_pInstance->GetData(TYPE_FREYA) != DONE)
m_pInstance->SetData(TYPE_FREYA, NOT_STARTED);
events.Reset();
summons.DespawnAll();
_Reset();
for (uint8 i = 0; i < 3; ++i)
{
@@ -273,7 +253,7 @@ public:
if (damage >= me->GetHealth())
{
damage = 0;
if (m_pInstance->GetData(TYPE_FREYA) != DONE)
if (instance->GetBossState(BOSS_FREYA) != DONE)
{
Talk(SAY_DEATH);
@@ -309,11 +289,8 @@ public:
}
// Defeat credit
if (m_pInstance)
{
me->CastSpell(me, 65074, true); // credit
m_pInstance->SetData(TYPE_FREYA, DONE);
}
instance->SetBossState(BOSS_FREYA, DONE);
scheduler.Schedule(14s, [this](TaskContext /*context*/)
{
@@ -328,7 +305,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT)
{
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_FREYA_DAMAGE, true);
}
summons.Summon(cr);
BossAI::JustSummoned(cr);
}
void SpawnWave()
@@ -374,14 +351,11 @@ public:
{
if (param == ACTION_LUMBERJACKED)
{
if (!m_pInstance)
return;
++_lumberjacked;
if (_lumberjacked == 1)
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED);
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;
}
@@ -401,8 +375,8 @@ public:
if (param == ACTION_REMOVE_10_STACK)
{
++_deforestation;
if (_deforestation >= 6 && m_pInstance)
m_pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFORESTATION_CREDIT, 0, me);
if (_deforestation >= 6)
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFORESTATION_CREDIT, 0, me);
// do not return
}
@@ -441,7 +415,7 @@ public:
return 0;
}
void JustReachedHome() override { me->setActive(false); }
void JustReachedHome() override { _JustReachedHome(); me->setActive(false); }
void JustEngagedWith(Unit*) override
{
@@ -457,14 +431,11 @@ public:
events.ScheduleEvent(EVENT_FREYA_BERSERK, 10min);
events.SetPhase(EVENT_PHASE_ADDS);
if (!m_pInstance)
return;
if (m_pInstance->GetData(TYPE_FREYA) != DONE)
m_pInstance->SetData(TYPE_FREYA, IN_PROGRESS);
if (instance->GetBossState(BOSS_FREYA) != DONE)
instance->SetBossState(BOSS_FREYA, IN_PROGRESS);
// 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())
{
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -475,7 +446,7 @@ public:
_elderGUID[0] = elder->GetGUID();
}
elder = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_ELDER_IRONBRANCH));
elder = instance->GetCreature(DATA_ELDER_IRONBRANCH);
if (elder && elder->IsAlive())
{
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -486,7 +457,7 @@ public:
_elderGUID[1] = elder->GetGUID();
}
elder = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_ELDER_BRIGHTLEAF));
elder = instance->GetCreature(DATA_ELDER_BRIGHTLEAF);
if (elder && elder->IsAlive())
{
elder->CastSpell(elder, SPELL_DRAINED_OF_POWER, true);
@@ -620,22 +591,11 @@ public:
{
return me->GetPositionX() < 2135.0f;
}
};
};
class boss_freya_elder_stonebark : public CreatureScript
struct boss_freya_elder_stonebark : public ScriptedAI
{
public:
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)
boss_freya_elder_stonebark(Creature* pCreature) : ScriptedAI(pCreature)
{
}
@@ -664,7 +624,7 @@ public:
// Lumberjacked
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);
}
@@ -716,22 +676,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_freya_elder_brightleaf : public CreatureScript
struct boss_freya_elder_brightleaf : public ScriptedAI
{
public:
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)
boss_freya_elder_brightleaf(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
}
@@ -760,7 +709,7 @@ public:
// Lumberjacked
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);
}
@@ -829,22 +778,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_freya_elder_ironbranch : public CreatureScript
struct boss_freya_elder_ironbranch : public ScriptedAI
{
public:
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)
boss_freya_elder_ironbranch(Creature* pCreature) : ScriptedAI(pCreature)
{
}
@@ -871,7 +809,7 @@ public:
// Lumberjacked
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);
}
@@ -913,22 +851,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_freya_iron_root : public CreatureScript
struct boss_freya_iron_root : public NullCreatureAI
{
public:
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) { }
boss_freya_iron_root(Creature* pCreature) : NullCreatureAI(pCreature) { }
void JustDied(Unit* /*killer*/) override
{
@@ -943,22 +870,11 @@ public:
target->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_IRON_ROOTS_FREYA_DAMAGE, me));
}
}
};
};
class boss_freya_lifebinder : public CreatureScript
struct boss_freya_lifebinder : public NullCreatureAI
{
public:
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)
boss_freya_lifebinder(Creature* pCreature) : NullCreatureAI(pCreature)
{
}
@@ -983,22 +899,11 @@ public:
_healTimer = 0;
}
}
};
};
class boss_freya_healthy_spore : public CreatureScript
struct boss_freya_healthy_spore : public NullCreatureAI
{
public:
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)
boss_freya_healthy_spore(Creature* pCreature) : NullCreatureAI(pCreature)
{
}
@@ -1022,30 +927,17 @@ public:
_despawnTimer = 0;
}
}
};
};
class boss_freya_summons : public CreatureScript
struct boss_freya_summons : public ScriptedAI
{
public:
boss_freya_summons() : CreatureScript("boss_freya_summons") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_freya_summons(Creature* pCreature) : ScriptedAI(pCreature)
{
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;
_hasDied = false;
}
EventMap events;
ObjectGuid _freyaGUID;
uint8 _stackCount;
bool _hasDied;
bool _isTrio;
@@ -1060,7 +952,9 @@ public:
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)
freya->AI()->DoAction(_stackCount);
@@ -1071,6 +965,7 @@ public:
_hasDied = true;
}
}
}
if (me->GetEntry() == NPC_DETONATING_LASHER)
me->CastSpell(me, SPELL_DETONATE, true);
}
@@ -1165,22 +1060,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_freya_nature_bomb : public CreatureScript
struct boss_freya_nature_bomb : public NullCreatureAI
{
public:
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)
boss_freya_nature_bomb(Creature* pCreature) : NullCreatureAI(pCreature)
{
_goGUID.Clear();
}
@@ -1217,7 +1101,6 @@ public:
go->SetGoState(GO_STATE_ACTIVE);
}
}
};
};
class achievement_freya_getting_back_to_nature : public AchievementCriteriaScript
@@ -1253,15 +1136,15 @@ private:
void AddSC_boss_freya()
{
new boss_freya();
new boss_freya_elder_stonebark();
new boss_freya_elder_brightleaf();
new boss_freya_elder_ironbranch();
new boss_freya_iron_root();
new boss_freya_lifebinder();
new boss_freya_healthy_spore();
new boss_freya_summons();
new boss_freya_nature_bomb();
RegisterUlduarCreatureAI(boss_freya);
RegisterUlduarCreatureAI(boss_freya_elder_stonebark);
RegisterUlduarCreatureAI(boss_freya_elder_brightleaf);
RegisterUlduarCreatureAI(boss_freya_elder_ironbranch);
RegisterUlduarCreatureAI(boss_freya_iron_root);
RegisterUlduarCreatureAI(boss_freya_lifebinder);
RegisterUlduarCreatureAI(boss_freya_healthy_spore);
RegisterUlduarCreatureAI(boss_freya_summons);
RegisterUlduarCreatureAI(boss_freya_nature_bomb);
new achievement_freya_getting_back_to_nature();
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/>.
*/
#include "AccountMgr.h"
#include "AchievementCriteriaScript.h"
#include "AreaDefines.h"
#include "BanMgr.h"
#include "CreatureScript.h"
#include "GameObjectScript.h"
#include "PassiveAI.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "WorldSession.h"
#include "ulduar.h"
enum VezaxSpellData
@@ -110,57 +106,36 @@ enum VaporsText
SAY_EMOTE_VAPORS = 0,
};
class boss_vezax : public CreatureScript
struct boss_vezax : public BossAI
{
public:
boss_vezax() : CreatureScript("boss_vezax") { }
boss_vezax(Creature* pCreature) : BossAI(pCreature, 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;
bool hardmodeAvailable;
bool berserk;
bool bAchievShadowdodger;
InstanceScript* pInstance;
void Reset() override
{
_Reset();
vaporsCount = 0;
hardmodeAvailable = true;
berserk = false;
bAchievShadowdodger = true;
events.Reset();
summons.DespawnAll();
me->SetLootMode(1);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, NOT_STARTED);
}
void JustReachedHome() override
{
_JustReachedHome();
me->setActive(false);
}
void JustEngagedWith(Unit* /*pWho*/) override
{
me->setActive(true);
me->SetInCombatWithZone();
_JustEngagedWith();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_VEZAX_SHADOW_CRASH, 13s);
events.RescheduleEvent(EVENT_SPELL_SEARING_FLAMES, 10s, 1);
events.RescheduleEvent(EVENT_SPELL_SURGE_OF_DARKNESS, 63s);
@@ -170,9 +145,6 @@ public:
Talk(SAY_AGGRO);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, IN_PROGRESS);
me->CastSpell(me, SPELL_AURA_OF_DESPAIR_1, true);
}
@@ -236,10 +208,10 @@ public:
std::vector<Player*> players;
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
{
Player* temp = itr->GetSource();
if (temp->IsAlive() && temp->GetDistance(me) > 15.0f )
if (temp->IsAlive() && temp->GetDistance(me) > 15.0f)
players.push_back(temp);
}
if (!players.empty())
@@ -273,11 +245,11 @@ public:
std::vector<Player*> outside;
std::vector<Player*> inside;
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* tmp = itr->GetSource())
if (tmp->IsAlive())
{
if (tmp->GetDistance(me) > 15.0f )
if (tmp->GetDistance(me) > 15.0f)
outside.push_back(tmp);
else
inside.push_back(tmp);
@@ -352,14 +324,11 @@ public:
void JustDied(Unit* /*killer*/) override
{
summons.DespawnAll();
if (pInstance)
pInstance->SetData(TYPE_VEZAX, DONE);
_JustDied();
Talk(SAY_DEATH);
if (GameObject* door = me->FindNearestGameObject(GO_VEZAX_DOOR, 500.0f))
if (door->GetGoState() != GO_STATE_ACTIVE )
if (door->GetGoState() != GO_STATE_ACTIVE)
{
door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false);
@@ -373,32 +342,11 @@ public:
}
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() : 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)
npc_ulduar_saronite_vapors(Creature* pCreature) : NullCreatureAI(pCreature)
{
pInstance = pCreature->GetInstanceScript();
me->GetMotionMaster()->MoveRandom(4.0f);
@@ -412,7 +360,7 @@ public:
// killed saronite vapors, hard mode unavailable
if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX)))
if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->DoAction(1);
}
@@ -420,26 +368,15 @@ public:
{
Talk(SAY_EMOTE_VAPORS);
}
};
};
class npc_ulduar_saronite_animus : public CreatureScript
struct npc_ulduar_saronite_animus : public ScriptedAI
{
public:
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)
npc_ulduar_saronite_animus(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceScript();
if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX)))
if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->JustSummoned(me);
timer = 0;
me->SetInCombatWithZone();
@@ -453,7 +390,7 @@ public:
me->DespawnOrUnsummon(3s);
if (pInstance)
if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX)))
if (Creature* vezax = pInstance->GetCreature(BOSS_VEZAX))
vezax->AI()->DoAction(2);
}
@@ -470,7 +407,6 @@ public:
DoMeleeAttackIfReady();
}
};
};
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()
{
new boss_vezax();
new npc_ulduar_saronite_vapors();
new npc_ulduar_saronite_animus();
RegisterUlduarCreatureAI(boss_vezax);
RegisterUlduarCreatureAI(npc_ulduar_saronite_vapors);
RegisterUlduarCreatureAI(npc_ulduar_saronite_animus);
RegisterSpellScript(spell_aura_of_despair_aura);
RegisterSpellScript(spell_mark_of_the_faceless_periodic_aura);
@@ -668,5 +581,4 @@ void AddSC_boss_vezax()
new achievement_smell_saronite();
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() : CreatureScript("boss_hodir") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_hodir(Creature* pCreature) : BossAI(pCreature, BOSS_HODIR)
{
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 (pInstance)
pInstance->SetData(TYPE_HODIR, DONE);
instance->SetBossState(BOSS_HODIR, DONE);
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
ObjectGuid Helpers[8];
bool berserk{ false };
bool bAchievCheese{ true };
@@ -234,8 +219,7 @@ public:
void Reset() override
{
events.Reset();
summons.DespawnAll();
_Reset();
berserk = false;
bAchievCheese = true;
bAchievGettingCold = true;
@@ -245,12 +229,7 @@ public:
// Reset the spells cast after wipe
me->RemoveAllAuras();
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE)
{
pInstance->SetData(TYPE_HODIR, NOT_STARTED);
}
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
if (GameObject* go = me->FindNearestGameObject(GO_HODIR_FRONTDOOR, 900.0f))
{
@@ -273,9 +252,9 @@ public:
events.ScheduleEvent(EVENT_HARD_MODE_MISSED, 3min);
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))
@@ -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
{
if (action)
@@ -291,9 +277,9 @@ public:
switch (action)
{
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);
events.ScheduleEvent(EVENT_DESPAWN_CHEST, 3s);
@@ -338,11 +324,11 @@ public:
me->SetReactState(REACT_PASSIVE);
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
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BITING_COLD_PLAYER_AURA);
}
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
@@ -392,7 +378,7 @@ public:
scheduler.Update(diff);
if (me->GetPositionY() <= ENTRANCE_DOOR.GetPositionY() || me->GetPositionY() >= EXIT_DOOR.GetPositionY())
{
boss_hodirAI::EnterEvadeMode();
boss_hodir::EnterEvadeMode();
return;
}
@@ -428,18 +414,16 @@ public:
{
Talk(TEXT_HM_MISS);
bAchievCacheRare = false;
if (pInstance)
{
if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_HODIR_CHEST_HARD)))
if (instance)
{
if (GameObject* go = GetHardmodeChest())
me->CastSpell(go, SPELL_SHATTER_CHEST, false);
}
}
}
break;
case EVENT_DESPAWN_CHEST:
if (pInstance && pInstance->GetData(TYPE_HODIR) != DONE)
pInstance->SetData(TYPE_HODIR_HM_FAIL, 0);
if (instance && instance->GetBossState(BOSS_HODIR) != DONE)
instance->SetData(TYPE_HODIR_HM_FAIL, 0);
break;
case EVENT_FLASH_FREEZE:
{
@@ -502,7 +486,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
}
@@ -560,16 +544,6 @@ public:
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
{
if (t->IsPlayer())
@@ -614,22 +588,11 @@ public:
}
void MoveInLineOfSight(Unit* /*who*/) override {}
};
};
class npc_ulduar_icicle : public CreatureScript
struct npc_ulduar_icicle : public NullCreatureAI
{
public:
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)
npc_ulduar_icicle(Creature* pCreature) : NullCreatureAI(pCreature)
{
timer1 = 2000;
timer2 = 5000;
@@ -657,22 +620,11 @@ public:
else
timer2 -= diff;
}
};
};
class npc_ulduar_flash_freeze : public CreatureScript
struct npc_ulduar_flash_freeze : public NullCreatureAI
{
public:
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)
npc_ulduar_flash_freeze(Creature* pCreature) : NullCreatureAI(pCreature)
{
timer = 2500;
pInstance = me->GetInstanceScript();
@@ -684,8 +636,8 @@ public:
void DamageTaken(Unit* doneBy, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
{
if (pInstance && doneBy)
if (pInstance->GetData(TYPE_HODIR) == NOT_STARTED)
if (Creature* hodir = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_HODIR)))
if (pInstance->GetBossState(BOSS_HODIR) == NOT_STARTED)
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->AttackStart(doneBy);
}
@@ -702,7 +654,7 @@ public:
me->DespawnOrUnsummon(2s);
else if (s->IsPlayer())
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);
me->DespawnOrUnsummon(2s);
@@ -717,22 +669,11 @@ public:
else
timer -= diff;
}
};
};
class npc_ulduar_toasty_fire : public CreatureScript
struct npc_ulduar_toasty_fire : public NullCreatureAI
{
public:
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)
npc_ulduar_toasty_fire(Creature* pCreature) : NullCreatureAI(pCreature)
{
me->CastSpell(me, SPELL_MAGE_TOASTY_FIRE_AURA, true);
}
@@ -760,22 +701,11 @@ public:
break;
}
}
};
};
class npc_ulduar_hodir_priest : public CreatureScript
struct npc_ulduar_hodir_priest : public ScriptedAI
{
public:
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)
npc_ulduar_hodir_priest(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
events.Reset();
@@ -821,8 +751,7 @@ public:
{
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
{
AttackStart(hodir);
ScheduleAbilities();
@@ -855,25 +784,14 @@ public:
void JustDied(Unit* /*killer*/) override
{
if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR)))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1);
}
};
};
class npc_ulduar_hodir_druid : public CreatureScript
struct npc_ulduar_hodir_druid : public ScriptedAI
{
public:
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)
npc_ulduar_hodir_druid(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
events.Reset();
@@ -918,8 +836,7 @@ public:
{
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
{
AttackStart(hodir);
ScheduleAbilities();
@@ -953,25 +870,14 @@ public:
void JustDied(Unit* /*killer*/) override
{
if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR)))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1);
}
};
};
class npc_ulduar_hodir_shaman : public CreatureScript
struct npc_ulduar_hodir_shaman : public ScriptedAI
{
public:
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)
npc_ulduar_hodir_shaman(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
events.Reset();
@@ -1024,8 +930,7 @@ public:
{
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
{
AttackStart(hodir);
ScheduleAbilities();
@@ -1058,25 +963,14 @@ public:
void JustDied(Unit* /*killer*/) override
{
if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR)))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1);
}
};
};
class npc_ulduar_hodir_mage : public CreatureScript
struct npc_ulduar_hodir_mage : public ScriptedAI
{
public:
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)
npc_ulduar_hodir_mage(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
events.Reset();
@@ -1122,8 +1016,7 @@ public:
{
if (!me->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))
if (pInstance)
if (ObjectGuid g = pInstance->GetGuidData(TYPE_HODIR))
if (Creature* hodir = ObjectAccessor::GetCreature(*me, g))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
{
AttackStart(hodir);
ScheduleAbilities();
@@ -1174,10 +1067,9 @@ public:
void JustDied(Unit* /*killer*/) override
{
if (pInstance)
if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR)))
if (Creature* hodir = pInstance->GetCreature(BOSS_HODIR))
hodir->AI()->SetData(4, 1);
}
};
};
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 (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);
ModStackAmount(1);
_counter = 0;
@@ -1544,15 +1436,15 @@ public:
void AddSC_boss_hodir()
{
new boss_hodir();
new npc_ulduar_icicle();
new npc_ulduar_flash_freeze();
new npc_ulduar_toasty_fire();
RegisterUlduarCreatureAI(boss_hodir);
RegisterUlduarCreatureAI(npc_ulduar_icicle);
RegisterUlduarCreatureAI(npc_ulduar_flash_freeze);
RegisterUlduarCreatureAI(npc_ulduar_toasty_fire);
new npc_ulduar_hodir_priest();
new npc_ulduar_hodir_druid();
new npc_ulduar_hodir_shaman();
new npc_ulduar_hodir_mage();
RegisterUlduarCreatureAI(npc_ulduar_hodir_priest);
RegisterUlduarCreatureAI(npc_ulduar_hodir_druid);
RegisterUlduarCreatureAI(npc_ulduar_hodir_shaman);
RegisterUlduarCreatureAI(npc_ulduar_hodir_mage);
RegisterSpellScript(spell_hodir_shatter_chest);
RegisterSpellScript(spell_hodir_biting_cold_main_aura);
@@ -48,7 +48,6 @@ enum IgnisSpellData
enum IgnisNPCs
{
BOSS_IGNIS = 33118,
NPC_IRON_CONSTRUCT = 33121,
NPC_SCORCHED_GROUND = 33123,
NPC_WATER_TRIGGER = 22515,
@@ -78,19 +77,9 @@ enum eEvents
EVENT_GRAB,
};
class npc_ulduar_iron_construct : public CreatureScript
struct npc_ulduar_iron_construct : public ScriptedAI
{
public:
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)
npc_ulduar_iron_construct(Creature* pCreature) : ScriptedAI(pCreature)
{
me->CastSpell(me, 38757, true);
}
@@ -117,7 +106,7 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
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);
AttackStart(ignis->GetVictim());
@@ -149,7 +138,7 @@ public:
Unit::Kill(attacker, me);
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);
}
}
@@ -157,7 +146,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
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);
}
@@ -183,42 +172,27 @@ public:
}
void MoveInLineOfSight(Unit* /*who*/) override {}
};
};
class boss_ignis : public CreatureScript
struct boss_ignis : public BossAI
{
public:
boss_ignis() : CreatureScript("boss_ignis") { }
boss_ignis(Creature* pCreature) : BossAI(pCreature, 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;
bool bShattered;
uint32 lastShatterMSTime;
void Reset() override
{
events.Reset();
_Reset();
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
counter = 0;
bShattered = false;
lastShatterMSTime = 0;
if (InstanceScript* m_pInstance = me->GetInstanceScript())
{
m_pInstance->SetData(TYPE_IGNIS, NOT_STARTED);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
}
if (instance)
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
}
void JustEngagedWith(Unit* /*who*/) override
@@ -251,11 +225,11 @@ public:
Talk(SAY_AGGRO);
DoZoneInCombat();
if (InstanceScript* m_pInstance = me->GetInstanceScript())
if (instance)
{
m_pInstance->SetData(TYPE_IGNIS, IN_PROGRESS);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
instance->SetBossState(BOSS_IGNIS, IN_PROGRESS);
instance->DoStopTimedAchievement(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
{
_JustReachedHome();
me->setActive(false);
}
@@ -292,13 +267,11 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
if (me->GetInstanceScript())
me->GetInstanceScript()->SetData(TYPE_IGNIS, DONE);
_JustDied();
std::list<Creature*> icl;
me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);
for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr )
for (std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr)
if ((*itr)->IsAlive() && (*itr)->IsInCombat())
Unit::Kill(*itr, *itr);
}
@@ -319,7 +292,7 @@ public:
if (!UpdateVictim())
return;
if (me->GetPositionX() < 490.0f || me->GetPositionX() > 690.0f || me->GetPositionY() < 130.0f || me->GetPositionY() > 410.0f )
if (me->GetPositionX() < 490.0f || me->GetPositionX() > 690.0f || me->GetPositionY() < 130.0f || me->GetPositionY() > 410.0f)
{
EnterEvadeMode(EVADE_REASON_OTHER);
return;
@@ -372,10 +345,10 @@ public:
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
Player* temp = nullptr;
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
{
temp = itr->GetSource();
if (!temp->IsAlive() || temp->GetExactDist2d(me) > 90.0f )
if (!temp->IsAlive() || temp->GetExactDist2d(me) > 90.0f)
continue;
if (me->GetVictim() && temp->GetGUID() == me->GetVictim()->GetGUID())
continue;
@@ -416,9 +389,8 @@ public:
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode(why);
BossAI::EnterEvadeMode(why);
}
};
};
class spell_ignis_scorch_aura : public AuraScript
@@ -541,8 +513,8 @@ public:
void AddSC_boss_ignis()
{
new boss_ignis();
new npc_ulduar_iron_construct();
RegisterUlduarCreatureAI(boss_ignis);
RegisterUlduarCreatureAI(npc_ulduar_iron_construct);
RegisterSpellScript(spell_ignis_scorch_aura);
RegisterSpellScript(spell_ignis_grab_initial);
RegisterSpellScript(spell_ignis_slag_pot_aura);
@@ -117,31 +117,16 @@ enum Misc
DATA_KOLOGARN_ARMS_ACHIEV = 57,
};
class boss_kologarn : public CreatureScript
struct boss_kologarn : public BossAI
{
public:
boss_kologarn() : CreatureScript("boss_kologarn") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_kologarn(Creature* creature) : BossAI(creature, BOSS_KOLOGARN), vehicle(me->GetVehicleKit()), breathReady(false)
{
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);
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
}
InstanceScript* m_pInstance;
Vehicle* vehicle;
ObjectGuid _left, _right;
EventMap events;
SummonList summons;
bool _looksAchievement, breathReady;
uint8 _rubbleAchievement;
@@ -158,13 +143,18 @@ public:
}
if (me->GetExactDist2d(who) < 30.0f)
ScriptedAI::MoveInLineOfSight(who);
BossAI::MoveInLineOfSight(who);
}
void EnterEvadeMode(EvadeReason why) override
{
if (!_EnterEvadeMode(why))
if (!CreatureAI::_EnterEvadeMode(why))
return;
if (instance && instance->GetBossState(BOSS_KOLOGARN) != DONE)
{
instance->SetBossState(BOSS_KOLOGARN, NOT_STARTED);
instance->SaveToDB();
}
Reset();
me->setActive(false);
}
@@ -214,15 +204,12 @@ public:
me->SetDisableGravity(true);
me->DisableRotate(true);
events.Reset();
summons.DespawnAll();
_Reset();
if (m_pInstance)
if (instance)
{
m_pInstance->SetData(TYPE_KOLOGARN, NOT_STARTED);
// 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);
}
@@ -240,8 +227,8 @@ public:
if (param == DATA_KOLOGARN_RUBBLE_ACHIEV)
{
// Means arm died
if (m_pInstance && (!_left || !_right))
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_DISARMED_CRITERIA);
if (instance && (!_left || !_right))
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_DISARMED_CRITERIA);
++_rubbleAchievement;
}
@@ -267,12 +254,12 @@ public:
void JustSummoned(Creature* cr) override
{
if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM)
summons.Summon(cr);
BossAI::JustSummoned(cr);
}
void SummonedCreatureDespawn(Creature* cr) override
{
if (m_pInstance->GetData(TYPE_KOLOGARN) > NOT_STARTED)
if (instance->GetBossState(BOSS_KOLOGARN) > NOT_STARTED)
return;
if (cr->GetEntry() == NPC_LEFT_ARM)
@@ -290,17 +277,15 @@ public:
void JustDied(Unit*) override
{
summons.DespawnAll();
_JustDied();
me->StopMoving();
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, DONE);
Talk(SAY_DEATH);
if (m_pInstance)
if (instance)
{
// 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);
}
@@ -333,7 +318,7 @@ public:
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;
if (!apply)
@@ -375,8 +360,8 @@ public:
void JustEngagedWith(Unit* /*who*/) override
{
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS);
if (instance)
instance->SetBossState(BOSS_KOLOGARN, IN_PROGRESS);
events.ScheduleEvent(EVENT_SMASH, 8s);
events.ScheduleEvent(EVENT_SWEEP, 17s);
@@ -389,9 +374,9 @@ public:
me->setActive(true);
// 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);
}
@@ -491,23 +476,12 @@ public:
me->resetAttackTimer();
}
}
};
};
// 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() : 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) { }
boss_kologarn_arms(Creature* c) : ScriptedAI(c) { }
int32 _damageDone;
bool _combatStarted;
@@ -539,7 +513,7 @@ public:
{
if (!_combatStarted)
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, instance->GetGuidData(TYPE_KOLOGARN)))
if (Creature* cr = instance->GetCreature(BOSS_KOLOGARN))
{
_combatStarted = true;
if (!cr->IsInCombat() && who)
@@ -576,7 +550,7 @@ public:
cr->CastSpell(cr, SPELL_RUBBLE_FALL, true);
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)
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 (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);
me->ExitVehicle();
}
};
};
class boss_kologarn_eyebeam : public CreatureScript
struct boss_kologarn_eyebeam : public ScriptedAI
{
public:
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)
boss_kologarn_eyebeam(Creature* c) : ScriptedAI(c), _timer(1), _damaged(false)
{
m_pInstance = (InstanceScript*)c->GetInstanceScript();
}
@@ -620,7 +584,7 @@ public:
if (damage > 0 && !_damaged && me->GetInstanceScript())
{
_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);
}
}
@@ -638,7 +602,7 @@ public:
me->Attack(player, false);
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);
}
@@ -657,7 +621,6 @@ public:
}
}
}
};
};
class spell_kologarn_focused_eyebeam : public SpellScript
@@ -867,7 +830,7 @@ public:
{
if (target)
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 false;
@@ -883,7 +846,7 @@ public:
{
if (target)
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 false;
@@ -899,7 +862,7 @@ public:
{
if (target)
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 false;
@@ -909,9 +872,9 @@ public:
void AddSC_boss_kologarn()
{
// Npcs
new boss_kologarn();
new boss_kologarn_arms();
new boss_kologarn_eyebeam();
RegisterUlduarCreatureAI(boss_kologarn);
RegisterUlduarCreatureAI(boss_kologarn_arms);
RegisterUlduarCreatureAI(boss_kologarn_eyebeam);
RegisterUlduarCreatureAI(boss_kologarn_pit_kill_bunny);
// Spells
@@ -250,35 +250,21 @@ enum Texts
TALK_COMPUTER_ZERO = 12,
};
#define GetMimiron() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_MIMIRON))
#define GetLMK2() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_LEVIATHAN_MKII))
#define GetVX001() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_VX001))
#define GetACU() ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MIMIRON_ACU))
#define GetMimiron() instance->GetCreature(BOSS_MIMIRON)
#define GetLMK2() instance->GetCreature(DATA_MIMIRON_LEVIATHAN_MKII)
#define GetVX001() instance->GetCreature(DATA_MIMIRON_VX001)
#define GetACU() instance->GetCreature(DATA_MIMIRON_ACU)
class boss_mimiron : public CreatureScript
struct boss_mimiron : public BossAI
{
public:
boss_mimiron() : CreatureScript("boss_mimiron") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_mimiron(Creature* pCreature) : BossAI(pCreature, BOSS_MIMIRON)
{
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 (pInstance)
pInstance->SetData(TYPE_MIMIRON, DONE);
instance->SetBossState(BOSS_MIMIRON, DONE);
bIsEvading = false;
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
bool bIsEvading;
bool hardmode;
bool berserk;
@@ -301,12 +287,10 @@ public:
outofCombatTimer = 0;
changeAllowedFlameSpreadTime = false;
ResetGameObjects();
events.Reset();
summons.DespawnAll();
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
if (pInstance && pInstance->GetData(TYPE_MIMIRON) != DONE)
pInstance->SetData(TYPE_MIMIRON, NOT_STARTED);
if (!instance->IsBossDone(BOSS_MIMIRON))
_Reset();
}
void AttackStart(Unit* who) override
@@ -317,8 +301,8 @@ public:
void JustReachedHome() override
{
_JustReachedHome();
me->setActive(false);
ScriptedAI::JustReachedHome();
}
void JustEngagedWith(Unit* /*who*/) override
@@ -359,7 +343,9 @@ public:
events.ScheduleEvent(EVENT_MIMIRON_SAY_HARDMODE, 7s);
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);
minutesTalkNum = Is25ManRaid() ? TALK_COMPUTER_TEN : TALK_COMPUTER_EIGHT;
for (uint32 i = 0; i < uint32(TALK_COMPUTER_ZERO - minutesTalkNum - 1); ++i)
@@ -368,15 +354,14 @@ public:
}
// ensure LMK2 is at proper position
if (pInstance)
if (Creature* LMK2 = GetLMK2())
{
LMK2->UpdatePosition(LMK2->GetHomePosition(), true);
LMK2->StopMovingOnCurrentPos();
}
if (pInstance && pInstance->GetData(TYPE_MIMIRON) != DONE)
pInstance->SetData(TYPE_MIMIRON, IN_PROGRESS);
if (!instance->IsBossDone(BOSS_MIMIRON))
instance->SetBossState(BOSS_MIMIRON, IN_PROGRESS);
}
void UpdateAI(uint32 diff) override
@@ -406,10 +391,6 @@ public:
{
case 0:
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:
if (Creature* computer = me->SummonCreature(NPC_COMPUTER, 2746.7f, 2569.44f, 410.39f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1000))
computer->AI()->Talk(minutesTalkNum++);
@@ -755,18 +736,16 @@ public:
DoCastSelf(SPELL_SLEEP_VISUAL_1);
if (pInstance)
if (instance)
for( uint16 i = 0; i < 3; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (door->GetGoState() != GO_STATE_ACTIVE )
{
door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false);
}
if (pInstance)
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_LEVIATHAN_MKII, 1, me);
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_LEVIATHAN_MKII, 1, me);
if (hardmode)
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:
Talk(SAY_V07TRON_DEATH);
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
if (pInstance)
pInstance->SetData(TYPE_MIMIRON, DONE);
instance->SetBossState(BOSS_MIMIRON, DONE);
// 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)))
{
@@ -810,7 +788,7 @@ public:
if (spellInfo->Id == SPELL_TELEPORT)
{
me->DespawnOrUnsummon();
pInstance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
instance->SetData(EVENT_KEEPER_TELEPORTED, DONE);
}
}
@@ -823,9 +801,7 @@ public:
bIsEvading = true;
if (Creature* c = GetLMK2())
{
c->AI()->EnterEvadeMode(why);
}
if (Creature* c = GetVX001())
{
c->AI()->EnterEvadeMode(why);
@@ -841,28 +817,16 @@ public:
me->RemoveAllAuras();
me->ExitVehicle();
ScriptedAI::EnterEvadeMode(why);
BossAI::EnterEvadeMode(why);
bIsEvading = false;
}
void JustSummoned(Creature* s) override
{
summons.Summon(s);
}
void SummonedCreatureDespawn(Creature* s) override
{
summons.Despawn(s);
}
void ResetGameObjects()
{
if (pInstance)
for( uint16 i = 0; i < 3; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (door->GetGoState() != GO_STATE_ACTIVE )
for (uint16 i = 0; i < 3; ++i)
if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (door->GetGoState() != GO_STATE_ACTIVE)
{
door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false);
@@ -889,18 +853,16 @@ public:
void CloseDoorAndButton()
{
if (pInstance)
for( uint16 i = 0; i < 3; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_GO_MIMIRON_DOOR_1 + i))
if (GameObject* door = ObjectAccessor::GetGameObject(*me, guid))
if (door->GetGoState() != GO_STATE_READY )
for (uint16 i = 0; i < 3; ++i)
if (GameObject* door = instance->GetGameObject(DATA_GO_MIMIRON_DOOR_1 + i))
if (door->GetGoState() != GO_STATE_READY)
{
door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false);
}
if (GameObject* button = me->FindNearestGameObject(GO_BUTTON, 200.0f))
if (button->GetGoState() != GO_STATE_ACTIVE )
if (button->GetGoState() != GO_STATE_ACTIVE)
{
button->SetLootState(GO_READY);
button->UseDoorOrButton(0, false);
@@ -974,28 +936,17 @@ public:
}
return 0;
}
};
};
class npc_ulduar_leviathan_mkii : public CreatureScript
struct npc_ulduar_leviathan_mkii : public ScriptedAI
{
public:
npc_ulduar_leviathan_mkii() : CreatureScript("npc_ulduar_leviathan_mkii") { }
CreatureAI* GetAI(Creature* pCreature) const override
npc_ulduar_leviathan_mkii(Creature* pCreature) : ScriptedAI(pCreature)
{
return GetUlduarAI<npc_ulduar_leviathan_mkiiAI>(pCreature);
}
struct npc_ulduar_leviathan_mkiiAI : public ScriptedAI
{
npc_ulduar_leviathan_mkiiAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
instance = me->GetInstanceScript();
bIsEvading = false;
}
InstanceScript* pInstance;
InstanceScript* instance;
EventMap events;
bool bIsEvading;
uint8 Phase;
@@ -1227,28 +1178,17 @@ public:
me->SetReactState(REACT_AGGRESSIVE);
}
}
};
};
class npc_ulduar_vx001 : public CreatureScript
struct npc_ulduar_vx001 : public ScriptedAI
{
public:
npc_ulduar_vx001() : CreatureScript("npc_ulduar_vx001") { }
CreatureAI* GetAI(Creature* pCreature) const override
npc_ulduar_vx001(Creature* pCreature) : ScriptedAI(pCreature)
{
return GetUlduarAI<npc_ulduar_vx001AI>(pCreature);
}
struct npc_ulduar_vx001AI : public ScriptedAI
{
npc_ulduar_vx001AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = me->GetInstanceScript();
instance = me->GetInstanceScript();
bIsEvading = false;
}
InstanceScript* pInstance;
InstanceScript* instance;
EventMap events;
bool bIsEvading;
uint8 Phase;
@@ -1551,30 +1491,19 @@ public:
me->SetReactState(REACT_AGGRESSIVE);
}
}
};
};
class npc_ulduar_aerial_command_unit : public CreatureScript
struct npc_ulduar_aerial_command_unit : public ScriptedAI
{
public:
npc_ulduar_aerial_command_unit() : CreatureScript("npc_ulduar_aerial_command_unit") { }
CreatureAI* GetAI(Creature* pCreature) const override
npc_ulduar_aerial_command_unit(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
return GetUlduarAI<npc_ulduar_aerial_command_unitAI>(pCreature);
}
struct npc_ulduar_aerial_command_unitAI : public ScriptedAI
{
npc_ulduar_aerial_command_unitAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = me->GetInstanceScript();
instance = me->GetInstanceScript();
bIsEvading = false;
immobilized = false;
me->SetDisableGravity(true);
}
InstanceScript* pInstance;
InstanceScript* instance;
EventMap events;
SummonList summons;
bool bIsEvading;
@@ -1844,22 +1773,11 @@ public:
me->SetReactState(REACT_AGGRESSIVE);
}
}
};
};
class npc_ulduar_proximity_mine : public CreatureScript
struct npc_ulduar_proximity_mine : public ScriptedAI
{
public:
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)
npc_ulduar_proximity_mine(Creature* pCreature) : ScriptedAI(pCreature)
{
exploded = false;
timer = 2500;
@@ -1901,7 +1819,6 @@ public:
else
timer -= diff;
}
};
};
class spell_ulduar_mimiron_mine_explosion : public SpellScript
@@ -1911,8 +1828,8 @@ class spell_ulduar_mimiron_mine_explosion : public SpellScript
void HandleDamage(SpellEffIndex /*effIndex*/)
{
if (GetHitPlayer())
if (InstanceScript* pInstance = GetCaster()->GetInstanceScript())
if (Creature* mimi = pInstance->GetCreature(TYPE_MIMIRON))
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (Creature* mimi = instance->GetCreature(BOSS_MIMIRON))
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() : 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) {}
npc_ulduar_mimiron_rocket(Creature* pCreature) : NullCreatureAI(pCreature) {}
void InitializeAI() override
{
@@ -1962,24 +1869,13 @@ public:
me->SetSpeed(MOVE_FLIGHT, me->GetSpeedRate(MOVE_RUN), false);
}
}
};
};
class npc_ulduar_magnetic_core : public CreatureScript
struct npc_ulduar_magnetic_core : public NullCreatureAI
{
public:
npc_ulduar_magnetic_core() : CreatureScript("npc_ulduar_magnetic_core") { }
CreatureAI* GetAI(Creature* pCreature) const override
npc_ulduar_magnetic_core(Creature* pCreature) : NullCreatureAI(pCreature)
{
return GetUlduarAI<npc_ulduar_magnetic_coreAI>(pCreature);
}
struct npc_ulduar_magnetic_coreAI : public NullCreatureAI
{
npc_ulduar_magnetic_coreAI(Creature* pCreature) : NullCreatureAI(pCreature)
{
pInstance = me->GetInstanceScript();
instance = me->GetInstanceScript();
if (Creature* c = GetACU())
if (c->GetExactDist2d(me) <= 10.0f)
{
@@ -1993,7 +1889,7 @@ public:
despawnTimer = 60000;
}
InstanceScript* pInstance;
InstanceScript* instance;
uint16 despawnTimer;
void SetData(uint32 /*id*/, uint32 /*value*/) override
@@ -2011,22 +1907,11 @@ public:
else
despawnTimer -= diff;
}
};
};
class npc_ulduar_bot_summon_trigger : public CreatureScript
struct npc_ulduar_bot_summon_trigger : public NullCreatureAI
{
public:
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) { }
npc_ulduar_bot_summon_trigger(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 timer;
uint8 option;
@@ -2061,7 +1946,7 @@ public:
if (timer <= diff)
{
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* bot = ACU->SummonCreature( option_npcid[option - 1], *me, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 25000))
{
@@ -2078,7 +1963,6 @@ public:
else
timer -= diff;
}
};
};
class spell_mimiron_rapid_burst_aura : public AuraScript
@@ -2170,10 +2054,10 @@ public:
if (InstanceScript* instance = go->GetInstanceScript())
{
if (instance->GetData(TYPE_MIMIRON) != NOT_STARTED)
if (instance->GetBossState(BOSS_MIMIRON) != NOT_STARTED)
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()->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() : 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)
npc_ulduar_flames_initial(Creature* pCreature) : NullCreatureAI(pCreature)
{
CreateTime = GameTime::GetGameTime().count();
events.Reset();
@@ -2246,8 +2120,8 @@ public:
void UpdateAI(uint32 diff) override
{
if (InstanceScript* pInstance = me->GetInstanceScript())
if (pInstance->GetData(TYPE_MIMIRON) != IN_PROGRESS)
if (InstanceScript* instance = me->GetInstanceScript())
if (instance->GetBossState(BOSS_MIMIRON) != IN_PROGRESS)
{
RemoveAll();
return;
@@ -2267,12 +2141,10 @@ public:
return;
}
if (InstanceScript* pInstance = me->GetInstanceScript())
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* mimiron = GetMimiron())
if (CreateTime < mimiron->AI()->GetData(10))
{
break;
}
Creature* last = ObjectAccessor::GetCreature(*me, FlameList.back());
if (last)
@@ -2301,22 +2173,11 @@ public:
break;
}
}
};
};
class npc_ulduar_flames_spread : public CreatureScript
struct npc_ulduar_flames_spread : public NullCreatureAI
{
public:
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) {}
npc_ulduar_flames_spread(Creature* pCreature) : NullCreatureAI(pCreature) {}
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
{
@@ -2332,7 +2193,7 @@ public:
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
if (Creature* c = summoner->ToCreature())
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->DespawnOrUnsummon(2500ms);
@@ -2343,22 +2204,11 @@ public:
break;
}
}
};
};
class npc_ulduar_emergency_fire_bot : public CreatureScript
struct npc_ulduar_emergency_fire_bot : public ScriptedAI
{
public:
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)
npc_ulduar_emergency_fire_bot(Creature* pCreature) : ScriptedAI(pCreature)
{
events.Reset();
events.ScheduleEvent(EVENT_EMERGENCY_BOT_CHECK, 1s);
@@ -2400,22 +2250,11 @@ public:
break;
}
}
};
};
class npc_ulduar_rocket_strike_trigger : public CreatureScript
struct npc_ulduar_rocket_strike_trigger : public NullCreatureAI
{
public:
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) {}
npc_ulduar_rocket_strike_trigger(Creature* pCreature) : NullCreatureAI(pCreature) {}
void SpellHitTarget(Unit* target, SpellInfo const* spell) override
{
@@ -2426,12 +2265,11 @@ public:
if (target->GetEntry() == NPC_ASSAULT_BOT)
me->CastSpell(me, 65040, true); // achievement Not-So-Friendly Fire
else if (target->IsPlayer())
if (InstanceScript* pInstance = me->GetInstanceScript())
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* c = GetMimiron())
c->AI()->SetData(0, 13);
}
}
};
};
class achievement_mimiron_firefighter : public AchievementCriteriaScript
@@ -2480,23 +2318,23 @@ public:
void AddSC_boss_mimiron()
{
new boss_mimiron();
new npc_ulduar_leviathan_mkii();
new npc_ulduar_vx001();
new npc_ulduar_aerial_command_unit();
RegisterUlduarCreatureAI(boss_mimiron);
RegisterUlduarCreatureAI(npc_ulduar_leviathan_mkii);
RegisterUlduarCreatureAI(npc_ulduar_vx001);
RegisterUlduarCreatureAI(npc_ulduar_aerial_command_unit);
new npc_ulduar_proximity_mine();
new npc_ulduar_mimiron_rocket();
new npc_ulduar_magnetic_core();
new npc_ulduar_bot_summon_trigger();
RegisterUlduarCreatureAI(npc_ulduar_proximity_mine);
RegisterUlduarCreatureAI(npc_ulduar_mimiron_rocket);
RegisterUlduarCreatureAI(npc_ulduar_magnetic_core);
RegisterUlduarCreatureAI(npc_ulduar_bot_summon_trigger);
RegisterSpellScript(spell_mimiron_rapid_burst_aura);
RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura);
RegisterSpellScript(spell_ulduar_mimiron_mine_explosion);
new go_ulduar_do_not_push_this_button();
new npc_ulduar_flames_initial();
new npc_ulduar_flames_spread();
new npc_ulduar_emergency_fire_bot();
new npc_ulduar_rocket_strike_trigger();
RegisterUlduarCreatureAI(npc_ulduar_flames_initial);
RegisterUlduarCreatureAI(npc_ulduar_flames_spread);
RegisterUlduarCreatureAI(npc_ulduar_emergency_fire_bot);
RegisterUlduarCreatureAI(npc_ulduar_rocket_strike_trigger);
new achievement_mimiron_firefighter();
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_AIR = {588.0f, -178.0f, 490.0f};
class boss_razorscale : public CreatureScript
struct boss_razorscale : public BossAI
{
public:
boss_razorscale() : CreatureScript("boss_razorscale") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_razorscale(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE)
{
return GetUlduarAI<boss_razorscaleAI>(pCreature);
}
struct boss_razorscaleAI : public ScriptedAI
{
boss_razorscaleAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = me->GetInstanceScript();
startPath = true;
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
ObjectGuid ExpeditionEngineerGUIDs[3];
ObjectGuid CommanderGUID;
float cords[4][2];
@@ -172,8 +158,7 @@ public:
void Reset() override
{
events.Reset();
summons.DespawnAll();
_Reset();
for (uint8 i = 0; i < 3; ++i)
ExpeditionEngineerGUIDs[i].Clear();
@@ -186,9 +171,6 @@ public:
CommanderGUID.Clear();
bGroundPhase = false;
flyTimes = 0;
if (pInstance)
pInstance->SetData(TYPE_RAZORSCALE, NOT_STARTED);
}
void AttackStart(Unit* who) override
@@ -197,10 +179,9 @@ public:
me->GetMotionMaster()->MoveChase(who);
}
void JustEngagedWith(Unit* /*who*/) override
void JustEngagedWith(Unit* who) override
{
me->SetInCombatWithZone();
events.Reset();
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_COMMANDER_SAY_AGGRO, 5s);
events.ScheduleEvent(EVENT_EE_SAY_MOVE_OUT, 10s);
events.ScheduleEvent(EVENT_ENRAGE, 10min);
@@ -222,22 +203,11 @@ public:
}
if (Creature* c = me->FindNearestCreature(NPC_EXPEDITION_COMMANDER, 300.0f, true))
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
{
if (!caster || !pInstance)
if (!caster || !instance)
return;
switch (spell->Id)
@@ -246,15 +216,15 @@ public:
{
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;
}
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;
}
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;
}
@@ -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
damage = 0;
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);
BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask);
}
void MovementInform(uint32 type, uint32 id) override
@@ -476,10 +448,9 @@ public:
break;
case EVENT_FLY_UP:
me->SetInCombatWithZone(); // just in case
if (pInstance)
if (instance)
for( int i = 0; i < 4; ++i )
if (ObjectGuid guid = pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1 + i))
if (Creature* hfs = ObjectAccessor::GetCreature(*me, guid))
if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i))
{
me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000);
hfs->AI()->SetData(1, 0);
@@ -579,14 +550,10 @@ public:
void JustReachedHome() override
{
_JustReachedHome();
startPath = true;
}
void JustSummoned(Creature* s) override
{
summons.Summon(s);
}
uint32 GetData(uint32 id) const override
{
if (id == 1)
@@ -597,8 +564,8 @@ public:
void KilledUnit(Unit* victim) override
{
if (victim && victim->GetEntry() == NPC_DARK_RUNE_GUARDIAN)
if (pInstance)
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_DARK_RUNE_GUARDIAN, 1, me);
if (instance)
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_DARK_RUNE_GUARDIAN, 1, me);
}
void EnterEvadeMode(EvadeReason why) override
@@ -606,9 +573,8 @@ public:
me->SetDisableGravity(true);
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode(why);
BossAI::EnterEvadeMode(why);
}
};
};
class npc_ulduar_expedition_commander : public CreatureScript
@@ -625,10 +591,10 @@ public:
if (!instance)
return true;
if (instance->GetData(TYPE_RAZORSCALE) == DONE)
if (instance->GetBossState(BOSS_RAZORSCALE) == DONE)
return true;
Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetGuidData(TYPE_RAZORSCALE));
Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE);
if (!razorscale || razorscale->IsInCombat())
return true;
@@ -645,10 +611,10 @@ public:
if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
{
InstanceScript* instance = creature->GetInstanceScript();
if (!instance || instance->GetData(TYPE_RAZORSCALE) == DONE)
if (!instance || instance->GetBossState(BOSS_RAZORSCALE) == DONE)
return true;
Creature* razorscale = ObjectAccessor::GetCreature(*creature, instance->GetGuidData(TYPE_RAZORSCALE));
Creature* razorscale = instance->GetCreature(BOSS_RAZORSCALE);
if (razorscale && !razorscale->IsInCombat())
{
// Do not show gossip icon if encounter is in progress
@@ -656,7 +622,7 @@ public:
// reset npcs NPC_HARPOON_FIRE_STATE
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);
if (razorscale->AI())
@@ -682,7 +648,7 @@ public:
npc_ulduar_expedition_commanderAI(Creature* creature) : NullCreatureAI(creature)
{
_instance = creature->GetInstanceScript();
_introSpoken = _instance->GetData(TYPE_RAZORSCALE) == DONE;
_introSpoken = _instance->GetBossState(BOSS_RAZORSCALE) == DONE;
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() : 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)
npc_ulduar_harpoonfirestate(Creature* pCreature) : NullCreatureAI(pCreature)
{
pInstance = me->GetInstanceScript();
}
@@ -783,7 +739,7 @@ public:
case 3: // shoot
if (pInstance)
{
Creature* razorscale = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_RAZORSCALE));
Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE);
if (!razorscale)
return;
if (!razorscale->HasAura(value))
@@ -802,22 +758,11 @@ public:
}
return 0;
}
};
};
class npc_ulduar_expedition_engineer : public CreatureScript
struct npc_ulduar_expedition_engineer : public NullCreatureAI
{
public:
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)
npc_ulduar_expedition_engineer(Creature* pCreature) : NullCreatureAI(pCreature)
{
pInstance = me->GetInstanceScript();
}
@@ -878,9 +823,7 @@ public:
if (!fixingGUID)
{
Creature* razorscale = nullptr;
if (ObjectGuid rsGUID = pInstance->GetGuidData(TYPE_RAZORSCALE))
razorscale = ObjectAccessor::GetCreature(*me, rsGUID);
Creature* razorscale = pInstance->GetCreature(BOSS_RAZORSCALE);
if (!razorscale || !razorscale->IsInCombat())
{
@@ -890,8 +833,7 @@ public:
}
for( int i = 0; i < 4; ++i )
if (ObjectGuid fs_GUID = pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1 + i))
if (Creature* fs = ObjectAccessor::GetCreature(*me, fs_GUID))
if (Creature* fs = pInstance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i))
if (!fs->AI()->GetData(2))
{
float a = rand_norm() * M_PI;
@@ -910,7 +852,6 @@ public:
else if (me->GetUInt32Value(UNIT_NPC_EMOTESTATE) == EMOTE_STATE_WORK)
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STAND);
}
};
};
class go_ulduar_working_harpoon : public GameObjectScript
@@ -927,9 +868,7 @@ public:
if (!pInstance)
return true;
Creature* rs = nullptr;
if (ObjectGuid rsGUID = pInstance->GetGuidData(TYPE_RAZORSCALE))
rs = ObjectAccessor::GetCreature(*go, rsGUID);
Creature* rs = pInstance->GetCreature(BOSS_RAZORSCALE);
if (!rs || !rs->IsInCombat())
{
@@ -960,8 +899,7 @@ public:
break;
}
if (ObjectGuid g = pInstance->GetGuidData(npc))
if (Creature* hfs = ObjectAccessor::GetCreature(*go, g))
if (Creature* hfs = pInstance->GetCreature(npc))
hfs->AI()->SetData(3, spell);
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() : 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) { }
npc_ulduar_dark_rune_guardian(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer2;
@@ -1013,22 +941,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class npc_ulduar_dark_rune_watcher : public CreatureScript
struct npc_ulduar_dark_rune_watcher : public ScriptedAI
{
public:
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) { }
npc_ulduar_dark_rune_watcher(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer1;
uint32 timer2;
@@ -1069,22 +986,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class npc_ulduar_dark_rune_sentinel : public CreatureScript
struct npc_ulduar_dark_rune_sentinel : public ScriptedAI
{
public:
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) { }
npc_ulduar_dark_rune_sentinel(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 timer1;
uint32 timer2;
@@ -1123,7 +1029,6 @@ public:
DoMeleeAttackIfReady();
}
};
};
class achievement_quick_shave : public AchievementCriteriaScript
@@ -1150,14 +1055,14 @@ public:
void AddSC_boss_razorscale()
{
new boss_razorscale();
RegisterUlduarCreatureAI(boss_razorscale);
new npc_ulduar_expedition_commander();
new npc_ulduar_harpoonfirestate();
new npc_ulduar_expedition_engineer();
RegisterUlduarCreatureAI(npc_ulduar_harpoonfirestate);
RegisterUlduarCreatureAI(npc_ulduar_expedition_engineer);
new go_ulduar_working_harpoon();
new npc_ulduar_dark_rune_guardian();
new npc_ulduar_dark_rune_watcher();
new npc_ulduar_dark_rune_sentinel();
RegisterUlduarCreatureAI(npc_ulduar_dark_rune_guardian);
RegisterUlduarCreatureAI(npc_ulduar_dark_rune_watcher);
RegisterUlduarCreatureAI(npc_ulduar_dark_rune_sentinel);
new achievement_quick_shave();
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};
class boss_thorim : public CreatureScript
struct boss_thorim : public BossAI
{
public:
boss_thorim() : CreatureScript("boss_thorim") { }
CreatureAI* GetAI(Creature* pCreature) const override
boss_thorim(Creature* creature) : BossAI(creature, BOSS_THORIM)
{
return GetUlduarAI<boss_thorimAI>(pCreature);
}
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);
_encounterFinished = !me->IsAlive();
if (_encounterFinished)
instance->SetBossState(BOSS_THORIM, DONE);
}
bool _isArenaEmpty;
@@ -327,10 +316,6 @@ public:
bool _isAlly;
uint8 _trashCounter;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
bool _hitByLightning;
void DisableThorim(bool apply)
@@ -352,13 +337,9 @@ public:
GameObject* GetThorimObject(uint32 entry)
{
if (m_pInstance)
return ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(entry));
return nullptr;
return instance->GetGameObject(entry);
}
void JustSummoned(Creature* cr) override { summons.Summon(cr); }
void SpawnAllNPCs()
{
// Jormungar Behemoth 32882
@@ -421,17 +402,13 @@ public:
void EnterEvadeMode(EvadeReason why) override
{
DisableThorim(false);
CreatureAI::EnterEvadeMode(why);
BossAI::EnterEvadeMode(why);
}
void Reset() override
{
if (m_pInstance && !_encounterFinished)
m_pInstance->SetData(TYPE_THORIM, NOT_STARTED);
events.Reset();
events.SetPhase(0);
summons.DespawnAll();
if (!_encounterFinished)
_Reset();
_trashCounter = 0;
_isAlly = true;
@@ -488,12 +465,16 @@ public:
Talk(SAY_SLAY);
}
void JustReachedHome() override { me->setActive(false); }
void JustReachedHome() override
{
_JustReachedHome();
me->setActive(false);
}
void JustEngagedWith(Unit*) override
{
if (m_pInstance && !_encounterFinished)
m_pInstance->SetData(TYPE_THORIM, IN_PROGRESS);
if (!_encounterFinished)
instance->SetBossState(BOSS_THORIM, IN_PROGRESS);
me->setActive(true);
DisableThorim(true);
me->CastSpell(me, SPELL_SHEATH_OF_LIGHTNING, true);
@@ -522,8 +503,7 @@ public:
// Hard Mode
if (!me->HasAura(62565 /*TOUCH OF DOMINION TRIGGER*/))
{
if (m_pInstance)
m_pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 64980 /*SIFFED ACHIEVEMENT*/);
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 64980 /*SIFFED ACHIEVEMENT*/);
_hardMode = true;
EntryCheckPredicate pred(NPC_SIF);
@@ -569,11 +549,8 @@ public:
}
// Defeat credit
if (m_pInstance)
{
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)
{
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);
}
// Defeat credit
if (m_pInstance)
m_pInstance->SetData(TYPE_THORIM, DONE);
instance->SetBossState(BOSS_THORIM, DONE);
events.ScheduleEvent(EVENT_THORIM_OUTRO4, 14s, 0, 3);
break;
case EVENT_THORIM_OUTRO4:
@@ -780,22 +756,11 @@ public:
if (!_encounterFinished)
DoMeleeAttackIfReady();
}
};
};
class boss_thorim_sif : public CreatureScript
struct boss_thorim_sif : public ScriptedAI
{
public:
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) { }
boss_thorim_sif(Creature* creature) : ScriptedAI(creature) { }
void MoveInLineOfSight(Unit*) override {}
void AttackStart(Unit*) override {}
@@ -817,7 +782,7 @@ public:
else if (param == ACTION_SIF_START_DOMINION)
{
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);
events.ScheduleEvent(EVENT_SIF_FINISH_DOMINION, 150s);
@@ -888,22 +853,11 @@ public:
me->StopMoving();
}
}
};
};
class boss_thorim_lightning_orb : public CreatureScript
struct boss_thorim_lightning_orb : public npc_escortAI
{
public:
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)
boss_thorim_lightning_orb(Creature* creature) : npc_escortAI(creature)
{
InitWaypoint();
Reset();
@@ -936,22 +890,11 @@ public:
void WaypointReached(uint32 /*point*/) override
{
}
};
};
class boss_thorim_trap : public CreatureScript
struct boss_thorim_trap : public NullCreatureAI
{
public:
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) { }
boss_thorim_trap(Creature* creature) : NullCreatureAI(creature) { }
uint32 _checkTimer;
@@ -974,22 +917,11 @@ public:
}
}
}
};
};
class boss_thorim_sif_blizzard : public CreatureScript
struct boss_thorim_sif_blizzard : public npc_escortAI
{
public:
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)
boss_thorim_sif_blizzard(Creature* creature) : npc_escortAI(creature)
{
InitWaypoint();
Reset();
@@ -1023,22 +955,11 @@ public:
void WaypointReached(uint32 /*point*/) override
{
}
};
};
class boss_thorim_pillar : public CreatureScript
struct boss_thorim_pillar : public NullCreatureAI
{
public:
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) { }
boss_thorim_pillar(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 _resetTimer;
@@ -1066,22 +987,11 @@ public:
if (_resetTimer >= 10000)
Reset(); // _resetTimer set to 0
}
};
};
class boss_thorim_start_npcs : public CreatureScript
struct boss_thorim_start_npcs : public ScriptedAI
{
public:
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) { }
boss_thorim_start_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
bool _isCaster;
@@ -1102,7 +1012,7 @@ public:
if (!_playerAttack && who && (who->IsPlayer() || who->GetOwnerGUID().IsPlayer()))
{
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())
{
@@ -1123,7 +1033,7 @@ public:
void JustDied(Unit*) override
{
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);
}
@@ -1220,22 +1130,11 @@ public:
if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10))
DoMeleeAttackIfReady();
}
};
};
class boss_thorim_gauntlet_npcs : public CreatureScript
struct boss_thorim_gauntlet_npcs : public ScriptedAI
{
public:
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) { }
boss_thorim_gauntlet_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
bool _isCaster;
@@ -1327,22 +1226,11 @@ public:
if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10))
DoMeleeAttackIfReady();
}
};
};
class boss_thorim_runic_colossus : public CreatureScript
struct boss_thorim_runic_colossus : public ScriptedAI
{
public:
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) { }
boss_thorim_runic_colossus(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
bool _leftHand;
@@ -1374,10 +1262,10 @@ public:
{
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);
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);
}
}
@@ -1468,22 +1356,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_thorim_ancient_rune_giant : public CreatureScript
struct boss_thorim_ancient_rune_giant : public ScriptedAI
{
public:
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) { }
boss_thorim_ancient_rune_giant(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
bool _isInCombat;
@@ -1509,10 +1386,10 @@ public:
{
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);
if (Creature* thorim = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_THORIM)))
if (Creature* thorim = pInstance->GetCreature(BOSS_THORIM))
thorim->AI()->DoAction(ACTION_ALLOW_HIT);
}
}
@@ -1553,22 +1430,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_thorim_arena_npcs : public CreatureScript
struct boss_thorim_arena_npcs : public ScriptedAI
{
public:
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) { }
boss_thorim_arena_npcs(Creature* pCreature) : ScriptedAI(pCreature) { }
EventMap events;
bool _isCaster;
@@ -1699,7 +1565,6 @@ public:
if (!_isCaster || (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA) < 10))
DoMeleeAttackIfReady();
}
};
};
class go_thorim_lever : public GameObjectScript
@@ -1759,7 +1624,7 @@ public:
bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override
{
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 false;
@@ -1774,7 +1639,7 @@ public:
bool OnCheck(Player* player, Unit*, uint32 /*criteria_id*/) override
{
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 false;
@@ -1784,21 +1649,21 @@ public:
void AddSC_boss_thorim()
{
// Main encounter
new boss_thorim();
new boss_thorim_sif();
new boss_thorim_lightning_orb();
new boss_thorim_trap();
new boss_thorim_pillar();
new boss_thorim_sif_blizzard();
RegisterUlduarCreatureAI(boss_thorim);
RegisterUlduarCreatureAI(boss_thorim_sif);
RegisterUlduarCreatureAI(boss_thorim_lightning_orb);
RegisterUlduarCreatureAI(boss_thorim_trap);
RegisterUlduarCreatureAI(boss_thorim_pillar);
RegisterUlduarCreatureAI(boss_thorim_sif_blizzard);
// Trash
new boss_thorim_start_npcs();
new boss_thorim_gauntlet_npcs();
new boss_thorim_arena_npcs();
RegisterUlduarCreatureAI(boss_thorim_start_npcs);
RegisterUlduarCreatureAI(boss_thorim_gauntlet_npcs);
RegisterUlduarCreatureAI(boss_thorim_arena_npcs);
// Mini bosses
new boss_thorim_runic_colossus();
new boss_thorim_ancient_rune_giant();
RegisterUlduarCreatureAI(boss_thorim_runic_colossus);
RegisterUlduarCreatureAI(boss_thorim_ancient_rune_giant);
// GOs
new go_thorim_lever();
@@ -112,30 +112,14 @@ enum Misc
DATA_XT002_GRAVITY_ACHIEV = 51,
};
class boss_xt002 : public CreatureScript
struct boss_xt002 : public BossAI
{
public:
boss_xt002() : CreatureScript("boss_xt002") { }
boss_xt002(Creature* pCreature) : BossAI(pCreature, 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;
bool _hardMode;
bool _nerfAchievement;
bool _gravityAchievement;
EventMap events;
SummonList summons;
void RescheduleEvents()
{
@@ -147,8 +131,7 @@ public:
void Reset() override
{
summons.DespawnAll();
events.Reset();
_Reset();
me->ResetLootMode();
me->RemoveAllAuras();
@@ -163,18 +146,14 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(false, UNIT_STATE_STUNNED);
if (m_pInstance)
if (instance)
{
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
m_pInstance->SetData(TYPE_XT002, NOT_STARTED);
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS)))
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
pGo->SetGoState(GO_STATE_ACTIVE);
}
}
void JustSummoned(Creature* cr) override { summons.Summon(cr); }
void SummonedCreatureDespawn(Creature* cr) override { summons.Despawn(cr); }
void AttachHeart()
{
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
{
@@ -199,11 +182,11 @@ public:
me->setActive(true);
Talk(SAY_AGGRO);
if (m_pInstance)
if (instance)
{
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
m_pInstance->SetData(TYPE_XT002, IN_PROGRESS);
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS)))
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_MUST_DECONSTRUCT_FASTER);
instance->SetBossState(BOSS_XT002, IN_PROGRESS);
if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
pGo->SetGoState(GO_STATE_READY);
}
@@ -223,16 +206,13 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
if (m_pInstance)
if (instance)
{
m_pInstance->SetData(TYPE_XT002, DONE);
if (GameObject* pGo = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_XT002_DOORS)))
if (GameObject* pGo = instance->GetGameObject(DATA_XT002_DOORS))
pGo->SetGoState(GO_STATE_ACTIVE);
}
// Despawn summons
summons.DespawnAll();
}
void DoAction(int32 param) override
@@ -383,22 +363,11 @@ public:
// Disabled by stunned state
DoMeleeAttackIfReady();
}
};
};
class npc_xt002_heart : public CreatureScript
struct npc_xt002_heart : public PassiveAI
{
public:
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)
npc_xt002_heart(Creature* pCreature) : PassiveAI(pCreature), summons(me)
{
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
}
@@ -450,7 +419,7 @@ public:
}
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())
{
pXT002->AI()->DoAction(_damageDone);
@@ -516,7 +485,7 @@ public:
{
me->SetVisible(false);
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())
XT002->AI()->DoAction(ACTION_HEART_BROKEN);
}
@@ -533,22 +502,11 @@ public:
}
}
}
};
};
class npc_xt002_scrapbot : public CreatureScript
struct npc_xt002_scrapbot : public PassiveAI
{
public:
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) { }
npc_xt002_scrapbot(Creature* pCreature) : PassiveAI(pCreature) { }
bool _locked;
void Reset() override
@@ -558,7 +516,7 @@ public:
me->SetWalk(true);
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
me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f);
@@ -589,7 +547,7 @@ public:
// we reached the target :)
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())
{
@@ -609,29 +567,18 @@ public:
if (!_locked)
{
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);
_locked = true;
}
}
}
};
};
class npc_xt002_pummeller : public CreatureScript
struct npc_xt002_pummeller : public ScriptedAI
{
public:
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) { }
npc_xt002_pummeller(Creature* pCreature) : ScriptedAI(pCreature) { }
int32 _arcingSmashTimer;
int32 _trampleTimer;
@@ -679,7 +626,6 @@ public:
DoMeleeAttackIfReady();
}
};
};
class BoomEvent : public BasicEvent
@@ -705,19 +651,9 @@ private:
Creature* _me;
};
class npc_xt002_boombot : public CreatureScript
struct npc_xt002_boombot : public PassiveAI
{
public:
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) { }
npc_xt002_boombot(Creature* pCreature) : PassiveAI(pCreature) { }
bool _locked;
bool _boomed;
@@ -729,7 +665,7 @@ public:
me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
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
me->GetMotionMaster()->MovePoint(0, 884.028931f, -14.593809f, 409.786987f);
@@ -796,29 +732,18 @@ public:
if (!_locked)
{
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);
_locked = true;
}
}
}
};
};
class npc_xt002_life_spark : public CreatureScript
struct npc_xt002_life_spark : public ScriptedAI
{
public:
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)
npc_xt002_life_spark(Creature* pCreature) : ScriptedAI(pCreature)
{
me->SetMaxHealth(RAID_MODE(54000, 172000));
me->SetHealth(me->GetMaxHealth());
@@ -842,7 +767,6 @@ public:
me->CastSpell(me->GetVictim(), SPELL_SPARK_MELEE, false);
DoMeleeAttackIfReady();
}
};
};
// 62775 - Tympanic Tantrum
@@ -999,7 +923,7 @@ public:
{
if (target)
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 false;
@@ -1015,7 +939,7 @@ public:
{
if (target)
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 false;
@@ -1025,12 +949,12 @@ public:
void AddSC_boss_xt002()
{
// Npcs
new boss_xt002();
new npc_xt002_heart();
new npc_xt002_scrapbot();
new npc_xt002_pummeller();
new npc_xt002_boombot();
new npc_xt002_life_spark();
RegisterUlduarCreatureAI(boss_xt002);
RegisterUlduarCreatureAI(npc_xt002_heart);
RegisterUlduarCreatureAI(npc_xt002_scrapbot);
RegisterUlduarCreatureAI(npc_xt002_pummeller);
RegisterUlduarCreatureAI(npc_xt002_boombot);
RegisterUlduarCreatureAI(npc_xt002_life_spark);
// Spells
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_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[] =
{
@@ -364,19 +364,9 @@ enum Texts
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() : 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)
boss_yoggsaron_sara(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
m_pInstance = pCreature->GetInstanceScript();
}
@@ -478,8 +468,8 @@ public:
{
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_NOT_GETTING_OLDER);
m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SANITY);
m_pInstance->SetData(TYPE_YOGGSARON, NOT_STARTED);
if (GameObject* go = ObjectAccessor::GetGameObject(*me, m_pInstance->GetGuidData(GO_YOGG_SARON_DOORS)))
m_pInstance->SetData(BOSS_YOGGSARON, NOT_STARTED);
if (GameObject* go = m_pInstance->GetGameObject(DATA_YOGG_SARON_DOORS))
go->SetGoState(GO_STATE_ACTIVE);
}
}
@@ -490,11 +480,11 @@ public:
return;
// 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;
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();
AttackStart(target);
@@ -688,7 +678,7 @@ public:
return;
// 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);
}
@@ -795,7 +785,7 @@ public:
me->SummonCreature(NPC_VOICE_OF_YOGG_SARON, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
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);
events.ScheduleEvent(EVENT_SARA_P1_SPELLS, 0ms, 1, EVENT_PHASE_ONE);
@@ -905,7 +895,7 @@ public:
case EVENT_SARA_P1_BERSERK:
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);
}
@@ -915,22 +905,11 @@ public:
break;
}
}
};
};
class boss_yoggsaron_cloud : public CreatureScript
struct boss_yoggsaron_cloud : public npc_escortAI
{
public:
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)
boss_yoggsaron_cloud(Creature* pCreature) : npc_escortAI(pCreature)
{
InitWaypoint();
Reset();
@@ -946,7 +925,7 @@ public:
_isSummoning = false;
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);
}
@@ -1011,22 +990,11 @@ public:
_checkTimer = 0;
}
}
};
};
class boss_yoggsaron_guardian_of_ys : public CreatureScript
struct boss_yoggsaron_guardian_of_ys : public ScriptedAI
{
public:
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) { }
boss_yoggsaron_guardian_of_ys(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 _spellTimer;
@@ -1055,22 +1023,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_yoggsaron : public CreatureScript
struct boss_yoggsaron : public ScriptedAI
{
public:
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)
boss_yoggsaron(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
m_pInstance = me->GetInstanceScript();
_thirdPhase = false;
@@ -1118,10 +1075,10 @@ public:
if (m_pInstance)
{
m_pInstance->SetData(TYPE_YOGGSARON, DONE);
if (Creature* sara = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(NPC_SARA)))
m_pInstance->SetData(BOSS_YOGGSARON, DONE);
if (Creature* sara = m_pInstance->GetCreature(DATA_SARA))
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);
}
@@ -1235,22 +1192,11 @@ public:
break;
}
}
};
};
class boss_yoggsaron_brain : public CreatureScript
struct boss_yoggsaron_brain : public NullCreatureAI
{
public:
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)
boss_yoggsaron_brain(Creature* pCreature) : NullCreatureAI(pCreature), summons(pCreature)
{
me->SetDisableGravity(true);
_tentacleCount = 0;
@@ -1402,7 +1348,7 @@ public:
{
// Stun
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));
_induceTimer = 0;
@@ -1469,7 +1415,7 @@ public:
me->CastSpell(me, SPELL_BRAIN_HURT_VISUAL, true);
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);
}
}
@@ -1480,22 +1426,11 @@ public:
if (_induceTimer)
_induceTimer += diff;
}
};
};
class boss_yoggsaron_death_orb : public CreatureScript
struct boss_yoggsaron_death_orb : public NullCreatureAI
{
public:
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)
boss_yoggsaron_death_orb(Creature* pCreature) : NullCreatureAI(pCreature)
{
me->CastSpell(me, SPELL_DEATH_RAY_WARNING, true);
_startTimer = 1;
@@ -1520,22 +1455,11 @@ public:
}
}
}
};
};
class boss_yoggsaron_crusher_tentacle : public CreatureScript
struct boss_yoggsaron_crusher_tentacle : public ScriptedAI
{
public:
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)
boss_yoggsaron_crusher_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
{
me->SetCombatMovement(false);
me->CastSpell(me, SPELL_CRUSH, true);
@@ -1582,22 +1506,11 @@ public:
me->CastSpell(me, SPELL_DIMINISH_POWER, false);
DoResetThreatList();
}
};
};
class boss_yoggsaron_corruptor_tentacle : public CreatureScript
struct boss_yoggsaron_corruptor_tentacle : public ScriptedAI
{
public:
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)
boss_yoggsaron_corruptor_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
{
me->SetCombatMovement(false);
}
@@ -1639,22 +1552,11 @@ public:
me->CastSpell(target, spellid, false);
}
}
};
};
class boss_yoggsaron_constrictor_tentacle : public CreatureScript
struct boss_yoggsaron_constrictor_tentacle : public ScriptedAI
{
public:
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)
boss_yoggsaron_constrictor_tentacle(Creature* pCreature) : ScriptedAI(pCreature)
{
me->SetCombatMovement(false);
_checkTimer = 1;
@@ -1718,7 +1620,6 @@ public:
if (Unit* player = ObjectAccessor::GetUnit(*me, _playerGUID))
player->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, me));
}
};
};
struct boss_yoggsaron_keeper : public NullCreatureAI
@@ -1773,14 +1674,9 @@ private:
SummonList _summons;
};
class boss_yoggsaron_descend_portal : public CreatureScript
struct boss_yoggsaron_descend_portal : public PassiveAI
{
public:
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()) {}
boss_yoggsaron_descend_portal(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) {}
void OnSpellClick(Unit* clicker, bool& spellClickHandled) override
{
@@ -1807,29 +1703,13 @@ public:
me->DespawnOrUnsummon(1s);
}
private:
private:
InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetUlduarAI<boss_yoggsaron_descend_portalAI>(creature);
}
};
class boss_yoggsaron_influence_tentacle : public CreatureScript
struct boss_yoggsaron_influence_tentacle : public NullCreatureAI
{
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)
boss_yoggsaron_influence_tentacle(Creature* pCreature) : NullCreatureAI(pCreature)
{
me->CastSpell(me, SPELL_GRIM_REPRISAL, true);
}
@@ -1846,22 +1726,11 @@ public:
if (Unit* sara = me->ToTempSummon()->GetSummonerUnit())
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() : 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)
boss_yoggsaron_immortal_guardian(Creature* pCreature) : ScriptedAI(pCreature)
{
Reset();
}
@@ -1934,22 +1803,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class boss_yoggsaron_lich_king : public CreatureScript
struct boss_yoggsaron_lich_king : public NullCreatureAI
{
public:
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) { }
boss_yoggsaron_lich_king(Creature* c) : NullCreatureAI(c) { }
bool _running;
int32 _checkTimer;
@@ -2021,22 +1879,11 @@ public:
break;
}
}
};
};
class boss_yoggsaron_llane : public CreatureScript
struct boss_yoggsaron_llane : public NullCreatureAI
{
public:
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) { }
boss_yoggsaron_llane(Creature* c) : NullCreatureAI(c) { }
bool _running;
int32 _checkTimer;
@@ -2116,22 +1963,11 @@ public:
break;
}
}
};
};
class boss_yoggsaron_neltharion : public CreatureScript
struct boss_yoggsaron_neltharion : public ScriptedAI
{
public:
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) { }
boss_yoggsaron_neltharion(Creature* c) : ScriptedAI(c) { }
bool _running;
int32 _checkTimer;
@@ -2199,22 +2035,11 @@ public:
break;
}
}
};
};
class boss_yoggsaron_voice : public CreatureScript
struct boss_yoggsaron_voice : public NullCreatureAI
{
public:
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)
boss_yoggsaron_voice(Creature* pCreature) : NullCreatureAI(pCreature)
{
_targets.clear();
_current = 0;
@@ -2235,7 +2060,7 @@ public:
{
// Drive Me Crazy achievement failed
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);
events.ScheduleEvent(40, 2s);
@@ -2261,7 +2086,6 @@ public:
}
}
}
};
};
// 63830, 63881 - Malady of the Mind
@@ -2894,7 +2718,7 @@ public:
bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override
{
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 false;
@@ -2915,7 +2739,7 @@ public:
bool OnCheck(Player* player, Unit* /*target*/ /*Yogg-Saron*/, uint32 /*criteria_id*/) override
{
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 false;
@@ -2938,23 +2762,23 @@ public:
void AddSC_boss_yoggsaron()
{
new boss_yoggsaron();
new boss_yoggsaron_sara();
new boss_yoggsaron_cloud();
new boss_yoggsaron_guardian_of_ys();
new boss_yoggsaron_brain();
new boss_yoggsaron_death_orb();
new boss_yoggsaron_crusher_tentacle();
new boss_yoggsaron_corruptor_tentacle();
new boss_yoggsaron_constrictor_tentacle();
RegisterUlduarCreatureAI(boss_yoggsaron);
RegisterUlduarCreatureAI(boss_yoggsaron_sara);
RegisterUlduarCreatureAI(boss_yoggsaron_cloud);
RegisterUlduarCreatureAI(boss_yoggsaron_guardian_of_ys);
RegisterUlduarCreatureAI(boss_yoggsaron_brain);
RegisterUlduarCreatureAI(boss_yoggsaron_death_orb);
RegisterUlduarCreatureAI(boss_yoggsaron_crusher_tentacle);
RegisterUlduarCreatureAI(boss_yoggsaron_corruptor_tentacle);
RegisterUlduarCreatureAI(boss_yoggsaron_constrictor_tentacle);
RegisterUlduarCreatureAI(boss_yoggsaron_keeper);
new boss_yoggsaron_descend_portal();
new boss_yoggsaron_influence_tentacle();
new boss_yoggsaron_immortal_guardian();
new boss_yoggsaron_lich_king();
new boss_yoggsaron_llane();
new boss_yoggsaron_neltharion();
new boss_yoggsaron_voice();
RegisterUlduarCreatureAI(boss_yoggsaron_descend_portal);
RegisterUlduarCreatureAI(boss_yoggsaron_influence_tentacle);
RegisterUlduarCreatureAI(boss_yoggsaron_immortal_guardian);
RegisterUlduarCreatureAI(boss_yoggsaron_lich_king);
RegisterUlduarCreatureAI(boss_yoggsaron_llane);
RegisterUlduarCreatureAI(boss_yoggsaron_neltharion);
RegisterUlduarCreatureAI(boss_yoggsaron_voice);
// SPELLS
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;
};
class npc_ulduar_storm_tempered_keeper : public CreatureScript
struct npc_ulduar_storm_tempered_keeper : public ScriptedAI
{
public:
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)
npc_ulduar_storm_tempered_keeper(Creature* creature) : ScriptedAI(creature)
{
otherGUID.Clear();
}
@@ -386,22 +376,11 @@ public:
DoMeleeAttackIfReady();
}
};
};
class npc_ulduar_arachnopod_destroyer : public CreatureScript
struct npc_ulduar_arachnopod_destroyer : public ScriptedAI
{
public:
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)
npc_ulduar_arachnopod_destroyer(Creature* creature) : ScriptedAI(creature)
{
_spawnedMechanic = false;
me->ApplySpellImmune(0, IMMUNITY_ID, 64919, true); // Ice Nova from Ice Turret
@@ -501,7 +480,6 @@ public:
DoMeleeAttackIfReady();
}
}
};
};
class spell_ulduar_arachnopod_damaged_aura : public AuraScript
@@ -571,8 +549,8 @@ void AddSC_ulduar()
new npc_ulduar_keeper();
RegisterSpellScript(spell_ulduar_energy_sap_aura);
RegisterUlduarCreatureAI(npc_ulduar_snow_mound);
new npc_ulduar_storm_tempered_keeper();
new npc_ulduar_arachnopod_destroyer();
RegisterUlduarCreatureAI(npc_ulduar_storm_tempered_keeper);
RegisterUlduarCreatureAI(npc_ulduar_arachnopod_destroyer);
RegisterSpellScript(spell_ulduar_arachnopod_damaged_aura);
new AreaTrigger_at_celestial_planetarium_enterance();
RegisterCreatureAI(npc_salvaged_siege_engine);
@@ -25,31 +25,38 @@
#define UlduarScriptName "instance_ulduar"
enum UlduarEncounters
enum UlduarBossIds
{
MAX_ENCOUNTER = 15,
TYPE_LEVIATHAN = 0,
TYPE_IGNIS = 1,
TYPE_RAZORSCALE = 2,
TYPE_XT002 = 3,
TYPE_ASSEMBLY = 4,
TYPE_KOLOGARN = 5,
TYPE_AURIAYA = 6,
TYPE_FREYA = 7,
TYPE_HODIR = 8,
TYPE_MIMIRON = 9,
TYPE_THORIM = 10,
TYPE_VEZAX = 11,
TYPE_YOGGSARON = 12,
TYPE_ALGALON = 13,
TYPE_WATCHERS = 14,
TYPE_HODIR_HM_FAIL = 15,
TYPE_WINTER_CACHE = 16
// Boss IDs used by SetBossNumber/SetBossState (0-indexed)
BOSS_LEVIATHAN = 0,
BOSS_IGNIS = 1,
BOSS_RAZORSCALE = 2,
BOSS_XT002 = 3,
BOSS_ASSEMBLY = 4,
BOSS_KOLOGARN = 5,
BOSS_AURIAYA = 6,
BOSS_FREYA = 7,
BOSS_HODIR = 8,
BOSS_MIMIRON = 9,
BOSS_THORIM = 10,
BOSS_VEZAX = 11,
BOSS_YOGGSARON = 12,
BOSS_ALGALON = 13,
MAX_ENCOUNTER = 14
};
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
DATA_VEHICLE_SPAWN = 100,
DATA_LIGHTNING_WALL1 = 101,
@@ -57,6 +64,7 @@ enum UlduarData
DATA_REPAIR_STATION1 = 103,
DATA_REPAIR_STATION2 = 104,
DATA_UNBROKEN_ACHIEVEMENT = 105,
DATA_LEVIATHAN_DOORS = 106,
// Razorscales Harpoon Fire State GUIDs
DATA_HARPOON_FIRE_STATE_1 = 200,
@@ -64,16 +72,31 @@ enum UlduarData
DATA_HARPOON_FIRE_STATE_3 = 202,
DATA_HARPOON_FIRE_STATE_4 = 203,
// Mimiron's first vehicle (spawned by default)
// Mimiron creatures
DATA_MIMIRON_LEVIATHAN_MKII = 301,
DATA_MIMIRON_VX001 = 302,
DATA_MIMIRON_ACU = 303,
// Mimiron's Doors
// Mimiron doors
DATA_GO_MIMIRON_DOOR_1 = 311,
DATA_GO_MIMIRON_DOOR_2 = 312,
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
DATA_THORIM_LEVER_GATE = 500,
DATA_THORIM_LEVER = 501,
@@ -81,15 +104,18 @@ enum UlduarData
DATA_THORIM_FIRST_DOORS = 503,
DATA_THORIM_SECOND_DOORS = 504,
// Assembly of Iron
DATA_STEELBREAKER = 20,
DATA_MOLGEIM = 21,
DATA_BRUNDIR = 22,
// Algalon the Observer
DATA_ALGALON_SUMMON_STATE = 600,
DATA_DESPAWN_ALGALON = 601,
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
DATA_DWARFAGEDDON = 700,
@@ -97,10 +123,32 @@ enum UlduarData
// Tram
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
DATA_MAGE_BARRIER = 800,
DATA_BRANN_MEMOTESAY = 801,
DATA_BRANN_EASY_MODE = 802,
DATA_BRANN_BASE_CAMP = 803,
};
enum UlduarNPCs