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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user