mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/Scripts: Updated Ruby Sanctum instance model
This commit is contained in:
@@ -81,7 +81,7 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
_Reset();
|
||||
events.SetPhase(PHASE_INTRO);
|
||||
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth());
|
||||
if (Creature* channelTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CRYSTAL_CHANNEL_TARGET)))
|
||||
if (Creature* channelTarget = instance->GetCreature(DATA_CRYSTAL_CHANNEL_TARGET))
|
||||
DoCast(channelTarget, SPELL_BARRIER_CHANNEL);
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ class boss_baltharus_the_warborn : public CreatureScript
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XERESTRASZA)))
|
||||
if (Creature* xerestrasza = instance->GetCreature(DATA_XERESTRASZA))
|
||||
xerestrasza->AI()->DoAction(ACTION_BALTHARUS_DEATH);
|
||||
}
|
||||
|
||||
@@ -266,7 +266,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
// This is here because DamageTaken wont trigger if the damage is deadly.
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN)))
|
||||
if (Creature* baltharus = instance->GetCreature(DATA_BALTHARUS_THE_WARBORN))
|
||||
killer->Kill(baltharus);
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@ class npc_onyx_flamecaller : public CreatureScript
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
// Let Zarithrian count as summoner.
|
||||
if (Creature* zarithrian = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_GENERAL_ZARITHRIAN)))
|
||||
if (Creature* zarithrian = _instance->GetCreature(DATA_GENERAL_ZARITHRIAN))
|
||||
zarithrian->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ class boss_halion : public CreatureScript
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
{
|
||||
if (why == EVADE_REASON_BOUNDARY || events.IsInPhase(PHASE_ONE))
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->EnterEvadeMode(why);
|
||||
}
|
||||
|
||||
@@ -251,7 +251,7 @@ class boss_halion : public CreatureScript
|
||||
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_ONE);
|
||||
}
|
||||
|
||||
@@ -262,11 +262,11 @@ class boss_halion : public CreatureScript
|
||||
Talk(SAY_DEATH);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
|
||||
if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TWILIGHT_HALION)))
|
||||
if (Creature* twilightHalion = instance->GetCreature(DATA_TWILIGHT_HALION))
|
||||
if (twilightHalion->IsAlive())
|
||||
twilightHalion->KillSelf();
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
if (controller->IsAlive())
|
||||
controller->KillSelf();
|
||||
}
|
||||
@@ -282,9 +282,9 @@ class boss_halion : public CreatureScript
|
||||
|
||||
me->CastStop();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoCast(me, SPELL_TWILIGHT_PHASING);
|
||||
DoCastSelf(SPELL_TWILIGHT_PHASING);
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_TWO);
|
||||
return;
|
||||
}
|
||||
@@ -295,7 +295,7 @@ class boss_halion : public CreatureScript
|
||||
if (!me->IsInPhase(attacker))
|
||||
return;
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->SetData(DATA_MATERIAL_DAMAGE_TAKEN, damage);
|
||||
}
|
||||
}
|
||||
@@ -329,14 +329,14 @@ class boss_halion : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, randtime(Seconds(11), Seconds(16)));
|
||||
break;
|
||||
case EVENT_BREATH:
|
||||
DoCast(me, SPELL_FLAME_BREATH);
|
||||
DoCastSelf(SPELL_FLAME_BREATH);
|
||||
events.ScheduleEvent(EVENT_BREATH, randtime(Seconds(16), Seconds(25)));
|
||||
break;
|
||||
case EVENT_ACTIVATE_FIREWALL:
|
||||
// Flame ring is activated 5 seconds after starting encounter, DOOR_TYPE_ROOM is only instant.
|
||||
for (uint8 i = DATA_FLAME_RING; i <= DATA_TWILIGHT_FLAME_RING; ++i)
|
||||
if (GameObject* flameRing = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(i)))
|
||||
instance->HandleGameObject(instance->GetGuidData(DATA_FLAME_RING), false, flameRing);
|
||||
if (GameObject* flameRing = instance->GetGameObject(i))
|
||||
instance->HandleGameObject(ObjectGuid::Empty, false, flameRing);
|
||||
break;
|
||||
case EVENT_METEOR_STRIKE:
|
||||
{
|
||||
@@ -393,14 +393,14 @@ class boss_twilight_halion : public CreatureScript
|
||||
{
|
||||
boss_twilight_halionAI(Creature* creature) : BossAI(creature, DATA_TWILIGHT_HALION)
|
||||
{
|
||||
Creature* halion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION));
|
||||
Creature* halion = instance->GetCreature(DATA_HALION);
|
||||
if (!halion)
|
||||
return;
|
||||
|
||||
// Using AddAura because no spell cast packet in sniffs.
|
||||
halion->AddAura(SPELL_COPY_DAMAGE, me); // We use explicit targeting here to avoid conditions + SPELL_ATTR6_CANT_TARGET_SELF.
|
||||
me->AddAura(SPELL_COPY_DAMAGE, halion);
|
||||
DoCast(me, SPELL_DUSK_SHROUD, true);
|
||||
DoCastSelf(SPELL_DUSK_SHROUD, true);
|
||||
|
||||
me->SetHealth(halion->GetHealth());
|
||||
me->SetPhaseMask(0x20, true);
|
||||
@@ -436,7 +436,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
if (Creature* halion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION)))
|
||||
if (Creature* halion = instance->GetCreature(DATA_HALION))
|
||||
{
|
||||
// Ensure looting
|
||||
if (me->IsDamageEnoughForLootingAndReward())
|
||||
@@ -446,7 +446,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
killer->Kill(halion);
|
||||
}
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
if (controller->IsAlive())
|
||||
controller->KillSelf();
|
||||
|
||||
@@ -463,7 +463,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
{
|
||||
events.SetPhase(PHASE_THREE);
|
||||
me->CastStop();
|
||||
DoCast(me, SPELL_TWILIGHT_DIVISION);
|
||||
DoCastSelf(SPELL_TWILIGHT_DIVISION);
|
||||
Talk(SAY_PHASE_THREE);
|
||||
return;
|
||||
}
|
||||
@@ -474,7 +474,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
if (!me->IsInPhase(attacker))
|
||||
return;
|
||||
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->SetData(DATA_TWILIGHT_DAMAGE_TAKEN, damage);
|
||||
}
|
||||
}
|
||||
@@ -484,7 +484,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
switch (spell->Id)
|
||||
{
|
||||
case SPELL_TWILIGHT_DIVISION:
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->DoAction(ACTION_MONITOR_CORPOREALITY);
|
||||
break;
|
||||
case SPELL_TWILIGHT_MENDING:
|
||||
@@ -518,7 +518,7 @@ class boss_twilight_halion : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, randtime(Seconds(12), Seconds(16)));
|
||||
break;
|
||||
case EVENT_BREATH:
|
||||
DoCast(me, SPELL_DARK_BREATH);
|
||||
DoCastSelf(SPELL_DARK_BREATH);
|
||||
events.ScheduleEvent(EVENT_BREATH, randtime(Seconds(10), Seconds(14)));
|
||||
break;
|
||||
case EVENT_SOUL_CONSUMPTION:
|
||||
@@ -576,7 +576,7 @@ class npc_halion_controller : public CreatureScript
|
||||
_events.Reset();
|
||||
Initialize();
|
||||
|
||||
DoCast(me, SPELL_CLEAR_DEBUFFS);
|
||||
DoCastSelf(SPELL_CLEAR_DEBUFFS);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* who) override
|
||||
@@ -589,7 +589,7 @@ class npc_halion_controller : public CreatureScript
|
||||
_events.Reset();
|
||||
_summons.DespawnAll();
|
||||
|
||||
DoCast(me, SPELL_CLEAR_DEBUFFS);
|
||||
DoCastSelf(SPELL_CLEAR_DEBUFFS);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -603,13 +603,13 @@ class npc_halion_controller : public CreatureScript
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_TWILIGHT_HALION)))
|
||||
if (Creature* twilightHalion = _instance->GetCreature(DATA_TWILIGHT_HALION))
|
||||
{
|
||||
twilightHalion->DespawnOrUnsummon();
|
||||
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, twilightHalion);
|
||||
}
|
||||
|
||||
if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION)))
|
||||
if (Creature* halion = _instance->GetCreature(DATA_HALION))
|
||||
{
|
||||
halion->DespawnOrUnsummon();
|
||||
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, halion);
|
||||
@@ -644,15 +644,15 @@ class npc_halion_controller : public CreatureScript
|
||||
return;
|
||||
|
||||
for (uint8 i = DATA_BURNING_TREE_1; i <= DATA_BURNING_TREE_4; ++i)
|
||||
if (GameObject* tree = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(i)))
|
||||
_instance->HandleGameObject(_instance->GetGuidData(i), true, tree);
|
||||
if (GameObject* tree = _instance->GetGameObject(i))
|
||||
_instance->HandleGameObject(ObjectGuid::Empty, true, tree);
|
||||
me->GetMap()->SummonCreature(NPC_HALION, HalionRespawnPos);
|
||||
break;
|
||||
case ACTION_MONITOR_CORPOREALITY:
|
||||
{
|
||||
for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
|
||||
{
|
||||
Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(itr));
|
||||
Creature* halion = _instance->GetCreature(itr);
|
||||
if (!halion)
|
||||
continue;
|
||||
|
||||
@@ -667,7 +667,7 @@ class npc_halion_controller : public CreatureScript
|
||||
}
|
||||
|
||||
// Summon Twilight portals
|
||||
DoCast(me, SPELL_SUMMON_EXIT_PORTALS);
|
||||
DoCastSelf(SPELL_SUMMON_EXIT_PORTALS);
|
||||
|
||||
_instance->DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 1);
|
||||
// Hardcoding doesn't really matter here.
|
||||
@@ -703,40 +703,40 @@ class npc_halion_controller : public CreatureScript
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_START_INTRO:
|
||||
DoCast(me, SPELL_COSMETIC_FIRE_PILLAR, true);
|
||||
DoCastSelf(SPELL_COSMETIC_FIRE_PILLAR, true);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_1, Seconds(4));
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_1:
|
||||
for (uint8 i = DATA_BURNING_TREE_3; i <= DATA_BURNING_TREE_4; ++i)
|
||||
if (GameObject* tree = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(i)))
|
||||
_instance->HandleGameObject(_instance->GetGuidData(i), true, tree);
|
||||
if (GameObject* tree = _instance->GetGameObject(i))
|
||||
_instance->HandleGameObject(ObjectGuid::Empty, true, tree);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_2, Seconds(4));
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_2:
|
||||
for (uint8 i = DATA_BURNING_TREE_1; i <= DATA_BURNING_TREE_2; ++i)
|
||||
if (GameObject* tree = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(i)))
|
||||
_instance->HandleGameObject(_instance->GetGuidData(i), true, tree);
|
||||
if (GameObject* tree = _instance->GetGameObject(i))
|
||||
_instance->HandleGameObject(ObjectGuid::Empty, true, tree);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_3, Seconds(4));
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_3:
|
||||
DoCast(me, SPELL_FIERY_EXPLOSION);
|
||||
DoCastSelf(SPELL_FIERY_EXPLOSION);
|
||||
if (_instance->GetGuidData(DATA_HALION))
|
||||
return;
|
||||
if (Creature* halion = me->GetMap()->SummonCreature(NPC_HALION, HalionSpawnPos))
|
||||
halion->AI()->Talk(SAY_INTRO);
|
||||
break;
|
||||
case EVENT_TWILIGHT_MENDING:
|
||||
if (ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION))) // Just check if physical Halion is spawned
|
||||
if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_TWILIGHT_HALION)))
|
||||
if (_instance->GetCreature(DATA_HALION)) // Just check if physical Halion is spawned
|
||||
if (Creature* twilightHalion = _instance->GetCreature(DATA_TWILIGHT_HALION))
|
||||
twilightHalion->CastSpell((Unit*)nullptr, SPELL_TWILIGHT_MENDING, true);
|
||||
break;
|
||||
case EVENT_TRIGGER_BERSERK:
|
||||
for (uint8 i = DATA_HALION; i <= DATA_TWILIGHT_HALION; i++)
|
||||
if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(i)))
|
||||
if (Creature* halion = _instance->GetCreature(i))
|
||||
halion->CastSpell(halion, SPELL_BERSERK, true);
|
||||
break;
|
||||
case EVENT_SHADOW_PULSARS_SHOOT:
|
||||
if (Creature* orbCarrier = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_ORB_CARRIER)))
|
||||
if (Creature* orbCarrier = _instance->GetCreature(DATA_ORB_CARRIER))
|
||||
orbCarrier->AI()->DoAction(ACTION_WARNING_SHOOT);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, Seconds(30));
|
||||
break;
|
||||
@@ -864,7 +864,7 @@ class npc_halion_controller : public CreatureScript
|
||||
|
||||
for (uint8 itr = DATA_HALION; itr <= DATA_TWILIGHT_HALION; itr++)
|
||||
{
|
||||
if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(itr)))
|
||||
if (Creature* halion = _instance->GetCreature(itr))
|
||||
{
|
||||
halion->CastSpell(halion, GetSpell(_materialCorporealityValue, itr == DATA_TWILIGHT_HALION), true);
|
||||
|
||||
@@ -924,7 +924,7 @@ class npc_orb_carrier : public CreatureScript
|
||||
/// we are having two creatures involded here. This attribute is handled clientside, meaning the client
|
||||
/// sends orientation update itself. Here, no packet is sent, and the creature does not rotate. By
|
||||
/// forcing the carrier to always be facing the rotation focus, we ensure everything works as it should.
|
||||
if (Creature* rotationFocus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_ORB_ROTATION_FOCUS)))
|
||||
if (Creature* rotationFocus = _instance->GetCreature(DATA_ORB_ROTATION_FOCUS))
|
||||
me->SetFacingToObject(rotationFocus); // setInFront
|
||||
}
|
||||
|
||||
@@ -953,7 +953,7 @@ class npc_orb_carrier : public CreatureScript
|
||||
if (southOrb && northOrb)
|
||||
TriggerCutter(northOrb, southOrb);
|
||||
|
||||
if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_TWILIGHT_HALION)))
|
||||
if (Creature* twilightHalion = _instance->GetCreature(DATA_TWILIGHT_HALION))
|
||||
twilightHalion->AI()->Talk(SAY_SPHERE_PULSE);
|
||||
|
||||
if (!IsHeroic())
|
||||
@@ -1005,8 +1005,8 @@ class npc_meteor_strike_initial : public CreatureScript
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_METEOR_STRIKE_AOE:
|
||||
DoCast(me, SPELL_METEOR_STRIKE_AOE_DAMAGE, true);
|
||||
DoCast(me, SPELL_METEOR_STRIKE_FIRE_AURA_1, true);
|
||||
DoCastSelf(SPELL_METEOR_STRIKE_AOE_DAMAGE, true);
|
||||
DoCastSelf(SPELL_METEOR_STRIKE_FIRE_AURA_1, true);
|
||||
for (std::list<Creature*>::iterator itr = _meteorList.begin(); itr != _meteorList.end(); ++itr)
|
||||
(*itr)->AI()->DoAction(ACTION_METEOR_STRIKE_BURN);
|
||||
break;
|
||||
@@ -1020,11 +1020,11 @@ class npc_meteor_strike_initial : public CreatureScript
|
||||
return;
|
||||
|
||||
// Let Controller count as summoner
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = _instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->JustSummoned(me);
|
||||
|
||||
DoCast(me, SPELL_METEOR_STRIKE_COUNTDOWN);
|
||||
DoCast(me, SPELL_BIRTH_NO_VISUAL);
|
||||
DoCastSelf(SPELL_METEOR_STRIKE_COUNTDOWN);
|
||||
DoCastSelf(SPELL_BIRTH_NO_VISUAL);
|
||||
|
||||
if (HalionAI* halionAI = CAST_AI(HalionAI, owner->AI()))
|
||||
{
|
||||
@@ -1078,7 +1078,7 @@ class npc_meteor_strike : public CreatureScript
|
||||
{
|
||||
if (action == ACTION_METEOR_STRIKE_BURN)
|
||||
{
|
||||
DoCast(me, SPELL_METEOR_STRIKE_FIRE_AURA_2, true);
|
||||
DoCastSelf(SPELL_METEOR_STRIKE_FIRE_AURA_2, true);
|
||||
me->setActive(true);
|
||||
_events.ScheduleEvent(EVENT_SPAWN_METEOR_FLAME, Milliseconds(500));
|
||||
}
|
||||
@@ -1087,7 +1087,7 @@ class npc_meteor_strike : public CreatureScript
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
// Let Halion Controller count as summoner.
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = _instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
@@ -1150,7 +1150,7 @@ class npc_meteor_strike_flame : public CreatureScript
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
// Let Halion Controller count as summoner.
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = _instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
@@ -1223,7 +1223,7 @@ class npc_combustion_consumption : public CreatureScript
|
||||
void IsSummonedBy(Unit* summoner) override
|
||||
{
|
||||
// Let Halion Controller count as summoner
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = _instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->JustSummoned(me);
|
||||
|
||||
_summonerGuid = summoner->GetGUID();
|
||||
@@ -1237,7 +1237,7 @@ class npc_combustion_consumption : public CreatureScript
|
||||
return;
|
||||
|
||||
me->CastCustomSpell(SPELL_SCALE_AURA, SPELLVALUE_AURA_STACK, stackAmount + 1, me);
|
||||
DoCast(me, _damageSpell);
|
||||
DoCastSelf(_damageSpell);
|
||||
|
||||
int32 damage = 1200 + (stackAmount * 1290); // Needs more research.
|
||||
summoner->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, summoner);
|
||||
@@ -1280,7 +1280,7 @@ class npc_living_inferno : public CreatureScript
|
||||
});
|
||||
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
{
|
||||
controller->AI()->DoAction(ACTION_ACTIVATE_EMBERS);
|
||||
controller->AI()->JustSummoned(me);
|
||||
@@ -1320,7 +1320,7 @@ class npc_living_ember : public CreatureScript
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER))
|
||||
controller->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,15 +26,49 @@
|
||||
BossBoundaryData const boundaries =
|
||||
{
|
||||
{ DATA_GENERAL_ZARITHRIAN, new EllipseBoundary(Position(3013.409f, 529.492f), 45.0, 100.0) },
|
||||
{ DATA_HALION, new CircleBoundary(Position(3156.037f, 533.2656f), 48.5) }
|
||||
{ DATA_HALION, new CircleBoundary(Position(3156.037f, 533.2656f), 48.5) }
|
||||
};
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{GO_FIRE_FIELD, DATA_BALTHARUS_THE_WARBORN, DOOR_TYPE_PASSAGE },
|
||||
{0, 0, DOOR_TYPE_ROOM },
|
||||
{ GO_FIRE_FIELD, DATA_BALTHARUS_THE_WARBORN, DOOR_TYPE_PASSAGE },
|
||||
{ GO_FLAME_WALLS, DATA_BALTHARUS_THE_WARBORN, DOOR_TYPE_PASSAGE },
|
||||
{ GO_FLAME_WALLS, DATA_SAVIANA_RAGEFIRE, DOOR_TYPE_PASSAGE },
|
||||
{ GO_FLAME_WALLS, DATA_GENERAL_ZARITHRIAN, DOOR_TYPE_ROOM },
|
||||
{ GO_FLAME_RING, DATA_HALION, DOOR_TYPE_ROOM },
|
||||
{ GO_TWILIGHT_FLAME_RING, DATA_HALION, DOOR_TYPE_ROOM },
|
||||
{ 0, 0, DOOR_TYPE_ROOM } // END
|
||||
};
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_BALTHARUS_THE_WARBORN, DATA_BALTHARUS_THE_WARBORN },
|
||||
{ NPC_BALTHARUS_THE_WARBORN_CLONE, DATA_BALTHARUS_CLONE },
|
||||
{ NPC_BALTHARUS_TARGET, DATA_CRYSTAL_CHANNEL_TARGET },
|
||||
{ NPC_GENERAL_ZARITHRIAN, DATA_GENERAL_ZARITHRIAN },
|
||||
{ NPC_SAVIANA_RAGEFIRE, DATA_SAVIANA_RAGEFIRE },
|
||||
{ NPC_HALION, DATA_HALION },
|
||||
{ NPC_TWILIGHT_HALION, DATA_TWILIGHT_HALION },
|
||||
{ NPC_HALION_CONTROLLER, DATA_HALION_CONTROLLER },
|
||||
{ NPC_ORB_CARRIER, DATA_ORB_CARRIER },
|
||||
{ NPC_ORB_ROTATION_FOCUS, DATA_ORB_ROTATION_FOCUS },
|
||||
{ NPC_XERESTRASZA, DATA_XERESTRASZA },
|
||||
{ 0, 0 } // END
|
||||
};
|
||||
|
||||
ObjectData const gameObjectData[] =
|
||||
{
|
||||
{ GO_FLAME_WALLS, DATA_FLAME_WALLS },
|
||||
{ GO_BURNING_TREE_1, DATA_BURNING_TREE_1 },
|
||||
{ GO_BURNING_TREE_2, DATA_BURNING_TREE_2 },
|
||||
{ GO_BURNING_TREE_3, DATA_BURNING_TREE_3 },
|
||||
{ GO_BURNING_TREE_4, DATA_BURNING_TREE_4 },
|
||||
{ GO_FLAME_RING, DATA_FLAME_RING },
|
||||
{ GO_TWILIGHT_FLAME_RING, DATA_TWILIGHT_FLAME_RING },
|
||||
{ 0, 0 } //END
|
||||
};
|
||||
|
||||
|
||||
class instance_ruby_sanctum : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -48,7 +82,8 @@ class instance_ruby_sanctum : public InstanceMapScript
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadBossBoundaries(boundaries);
|
||||
LoadDoorData(doorData);
|
||||
BaltharusSharedHealth = 0;
|
||||
LoadObjectData(creatureData, gameObjectData);
|
||||
BaltharusSharedHealth = 0;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* /*player*/) override
|
||||
@@ -63,151 +98,45 @@ class instance_ruby_sanctum : public InstanceMapScript
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
InstanceScript::OnCreatureCreate(creature);
|
||||
|
||||
if (creature->GetEntry() == NPC_ZARITHRIAN_SPAWN_STALKER)
|
||||
{
|
||||
case NPC_BALTHARUS_THE_WARBORN:
|
||||
BaltharusTheWarbornGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GENERAL_ZARITHRIAN:
|
||||
GeneralZarithrianGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SAVIANA_RAGEFIRE:
|
||||
SavianaRagefireGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION:
|
||||
HalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TWILIGHT_HALION:
|
||||
TwilightHalionGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALION_CONTROLLER:
|
||||
HalionControllerGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ORB_CARRIER:
|
||||
OrbCarrierGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ORB_ROTATION_FOCUS:
|
||||
OrbRotationFocusGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_BALTHARUS_TARGET:
|
||||
CrystalChannelTargetGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_XERESTRASZA:
|
||||
XerestraszaGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_ZARITHRIAN_SPAWN_STALKER:
|
||||
if (!ZarithrianSpawnStalkerGUID[0])
|
||||
ZarithrianSpawnStalkerGUID[0] = creature->GetGUID();
|
||||
else
|
||||
ZarithrianSpawnStalkerGUID[1] = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (!ZarithrianSpawnStalkerGUID[0])
|
||||
ZarithrianSpawnStalkerGUID[0] = creature->GetGUID();
|
||||
else
|
||||
ZarithrianSpawnStalkerGUID[1] = creature->GetGUID();
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
InstanceScript::OnGameObjectCreate(go);
|
||||
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
AddDoor(go, true);
|
||||
break;
|
||||
case GO_FLAME_WALLS:
|
||||
FlameWallsGUID = go->GetGUID();
|
||||
if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
HandleGameObject(FlameWallsGUID, true, go);
|
||||
break;
|
||||
case GO_FLAME_RING:
|
||||
FlameRingGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_TWILIGHT_FLAME_RING:
|
||||
TwilightFlameRingGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_BURNING_TREE_1:
|
||||
BurningTreeGUID[0] = go->GetGUID();
|
||||
if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
HandleGameObject(BurningTreeGUID[0], true);
|
||||
break;
|
||||
case GO_BURNING_TREE_2:
|
||||
BurningTreeGUID[1] = go->GetGUID();
|
||||
if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
HandleGameObject(BurningTreeGUID[1], true);
|
||||
break;
|
||||
case GO_BURNING_TREE_3:
|
||||
BurningTreeGUID[2] = go->GetGUID();
|
||||
if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
HandleGameObject(BurningTreeGUID[2], true);
|
||||
break;
|
||||
case GO_BURNING_TREE_4:
|
||||
BurningTreeGUID[3] = go->GetGUID();
|
||||
if (GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
|
||||
HandleGameObject(BurningTreeGUID[3], true);
|
||||
HandleGameObject(ObjectGuid::Empty, true, go);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectRemove(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_FIRE_FIELD:
|
||||
AddDoor(go, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature) override
|
||||
{
|
||||
if (creature->GetEntry() == NPC_HALION)
|
||||
HalionGUID = ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
ObjectGuid GetGuidData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_BALTHARUS_THE_WARBORN:
|
||||
return BaltharusTheWarbornGUID;
|
||||
case DATA_CRYSTAL_CHANNEL_TARGET:
|
||||
return CrystalChannelTargetGUID;
|
||||
case DATA_XERESTRASZA:
|
||||
return XerestraszaGUID;
|
||||
case DATA_SAVIANA_RAGEFIRE:
|
||||
return SavianaRagefireGUID;
|
||||
case DATA_GENERAL_ZARITHRIAN:
|
||||
return GeneralZarithrianGUID;
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_1:
|
||||
case DATA_ZARITHRIAN_SPAWN_STALKER_2:
|
||||
return ZarithrianSpawnStalkerGUID[type - DATA_ZARITHRIAN_SPAWN_STALKER_1];
|
||||
case DATA_HALION:
|
||||
return HalionGUID;
|
||||
case DATA_TWILIGHT_HALION:
|
||||
return TwilightHalionGUID;
|
||||
case DATA_ORB_CARRIER:
|
||||
return OrbCarrierGUID;
|
||||
case DATA_ORB_ROTATION_FOCUS:
|
||||
return OrbRotationFocusGUID;
|
||||
case DATA_HALION_CONTROLLER:
|
||||
return HalionControllerGUID;
|
||||
case DATA_BURNING_TREE_1:
|
||||
case DATA_BURNING_TREE_2:
|
||||
case DATA_BURNING_TREE_3:
|
||||
case DATA_BURNING_TREE_4:
|
||||
return BurningTreeGUID[type - DATA_BURNING_TREE_1];
|
||||
case DATA_FLAME_RING:
|
||||
return FlameRingGUID;
|
||||
case DATA_TWILIGHT_FLAME_RING:
|
||||
return TwilightFlameRingGUID;
|
||||
default:
|
||||
break;
|
||||
return InstanceScript::GetGuidData(type);
|
||||
}
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
@@ -218,49 +147,20 @@ class instance_ruby_sanctum : public InstanceMapScript
|
||||
switch (type)
|
||||
{
|
||||
case DATA_BALTHARUS_THE_WARBORN:
|
||||
{
|
||||
if (state == DONE && GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE)
|
||||
{
|
||||
HandleGameObject(FlameWallsGUID, true);
|
||||
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
|
||||
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DATA_SAVIANA_RAGEFIRE:
|
||||
{
|
||||
if (state == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
{
|
||||
HandleGameObject(FlameWallsGUID, true);
|
||||
if (Creature* zarithrian = instance->GetCreature(GeneralZarithrianGUID))
|
||||
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
if (state == DONE)
|
||||
CheckGeneral();
|
||||
break;
|
||||
}
|
||||
case DATA_GENERAL_ZARITHRIAN:
|
||||
{
|
||||
if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
HandleGameObject(FlameWallsGUID, state != IN_PROGRESS);
|
||||
|
||||
if (state == DONE && GetBossState(DATA_HALION) != DONE)
|
||||
if (Creature* halionController = instance->GetCreature(GetGuidData(DATA_HALION_CONTROLLER)))
|
||||
if (Creature* halionController = GetCreature(DATA_HALION_CONTROLLER))
|
||||
halionController->AI()->DoAction(ACTION_INTRO_HALION);
|
||||
break;
|
||||
}
|
||||
case DATA_HALION:
|
||||
{
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TOGGLE, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_TWILIGHT, 0);
|
||||
DoUpdateWorldState(WORLDSTATE_CORPOREALITY_MATERIAL, 0);
|
||||
|
||||
// Reopen rings on wipe or success
|
||||
if (state == DONE || state == FAIL)
|
||||
{
|
||||
HandleGameObject(FlameRingGUID, true);
|
||||
HandleGameObject(TwilightFlameRingGUID, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -268,6 +168,13 @@ class instance_ruby_sanctum : public InstanceMapScript
|
||||
return true;
|
||||
}
|
||||
|
||||
void CheckGeneral()
|
||||
{
|
||||
if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
|
||||
if (Creature* zarithrian = GetCreature(DATA_GENERAL_ZARITHRIAN))
|
||||
zarithrian->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
if (type != DATA_BALTHARUS_SHARED_HEALTH)
|
||||
@@ -292,22 +199,7 @@ class instance_ruby_sanctum : public InstanceMapScript
|
||||
}
|
||||
|
||||
protected:
|
||||
ObjectGuid BaltharusTheWarbornGUID;
|
||||
ObjectGuid GeneralZarithrianGUID;
|
||||
ObjectGuid SavianaRagefireGUID;
|
||||
ObjectGuid HalionGUID;
|
||||
ObjectGuid TwilightHalionGUID;
|
||||
ObjectGuid HalionControllerGUID;
|
||||
ObjectGuid OrbCarrierGUID;
|
||||
ObjectGuid OrbRotationFocusGUID;
|
||||
ObjectGuid CrystalChannelTargetGUID;
|
||||
ObjectGuid XerestraszaGUID;
|
||||
ObjectGuid FlameWallsGUID;
|
||||
ObjectGuid ZarithrianSpawnStalkerGUID[2];
|
||||
ObjectGuid BurningTreeGUID[4];
|
||||
ObjectGuid FlameRingGUID;
|
||||
ObjectGuid TwilightFlameRingGUID;
|
||||
|
||||
uint32 BaltharusSharedHealth;
|
||||
};
|
||||
|
||||
|
||||
@@ -160,10 +160,10 @@ class at_baltharus_plateau : public AreaTriggerScript
|
||||
// Only trigger once
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
{
|
||||
if (Creature* xerestrasza = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_XERESTRASZA)))
|
||||
if (Creature* xerestrasza = instance->GetCreature(DATA_XERESTRASZA))
|
||||
xerestrasza->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
|
||||
if (Creature* baltharus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN)))
|
||||
if (Creature* baltharus = instance->GetCreature(DATA_BALTHARUS_THE_WARBORN))
|
||||
baltharus->AI()->DoAction(ACTION_INTRO_BALTHARUS);
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,8 @@ enum RSDataTypes
|
||||
DATA_BURNING_TREE_4 = 16,
|
||||
DATA_FLAME_RING = 17,
|
||||
DATA_TWILIGHT_FLAME_RING = 18,
|
||||
DATA_BALTHARUS_CLONE = 19
|
||||
DATA_BALTHARUS_CLONE = 19,
|
||||
DATA_FLAME_WALLS = 20
|
||||
};
|
||||
|
||||
enum RSSharedActions
|
||||
|
||||
Reference in New Issue
Block a user