Core/Scripts: Updated Ruby Sanctum instance model
(cherrypicked from ce774918a7959b7780d6af9e095b3b5fcdbccfe2)
This commit is contained in:
+3
-3
@@ -83,7 +83,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);
|
||||
}
|
||||
|
||||
@@ -128,7 +128,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);
|
||||
}
|
||||
|
||||
@@ -268,7 +268,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);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -201,7 +201,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);
|
||||
}
|
||||
|
||||
|
||||
@@ -235,7 +235,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);
|
||||
}
|
||||
|
||||
@@ -257,7 +257,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);
|
||||
}
|
||||
|
||||
@@ -268,11 +268,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();
|
||||
}
|
||||
@@ -288,9 +288,9 @@ class boss_halion : public CreatureScript
|
||||
|
||||
me->CastStop();
|
||||
me->AddUnitFlag(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;
|
||||
}
|
||||
@@ -301,7 +301,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);
|
||||
}
|
||||
}
|
||||
@@ -335,14 +335,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:
|
||||
{
|
||||
@@ -399,14 +399,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());
|
||||
PhasingHandler::AddPhase(me, 174, false);
|
||||
@@ -442,7 +442,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())
|
||||
@@ -452,7 +452,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();
|
||||
|
||||
@@ -469,7 +469,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;
|
||||
}
|
||||
@@ -480,7 +480,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);
|
||||
}
|
||||
}
|
||||
@@ -490,7 +490,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:
|
||||
@@ -524,7 +524,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:
|
||||
@@ -582,7 +582,7 @@ class npc_halion_controller : public CreatureScript
|
||||
_events.Reset();
|
||||
Initialize();
|
||||
|
||||
DoCast(me, SPELL_CLEAR_DEBUFFS);
|
||||
DoCastSelf(SPELL_CLEAR_DEBUFFS);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* who) override
|
||||
@@ -595,7 +595,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
|
||||
@@ -609,13 +609,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);
|
||||
@@ -650,15 +650,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;
|
||||
|
||||
@@ -673,7 +673,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.
|
||||
@@ -709,40 +709,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).IsEmpty())
|
||||
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;
|
||||
@@ -870,7 +870,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);
|
||||
|
||||
@@ -930,7 +930,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
|
||||
}
|
||||
|
||||
@@ -959,7 +959,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())
|
||||
@@ -1011,8 +1011,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;
|
||||
@@ -1026,11 +1026,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()))
|
||||
{
|
||||
@@ -1084,7 +1084,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));
|
||||
}
|
||||
@@ -1093,7 +1093,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);
|
||||
}
|
||||
|
||||
@@ -1156,7 +1156,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);
|
||||
}
|
||||
|
||||
@@ -1233,7 +1233,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();
|
||||
@@ -1247,7 +1247,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);
|
||||
@@ -1289,7 +1289,7 @@ class npc_living_inferno : public CreatureScript
|
||||
me->CastSpell(me, SPELL_SPAWN_LIVING_EMBERS, true);
|
||||
});
|
||||
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);
|
||||
@@ -1329,7 +1329,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);
|
||||
}
|
||||
|
||||
|
||||
+60
-168
@@ -30,15 +30,49 @@ Position const HalionControllerSpawnPos = { 3156.037f, 533.2656f, 72.97205f, 0.0
|
||||
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:
|
||||
@@ -52,7 +86,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
|
||||
@@ -67,151 +102,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
|
||||
@@ -222,49 +151,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->RemoveUnitFlag(UnitFlags(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->RemoveUnitFlag(UnitFlags(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;
|
||||
}
|
||||
@@ -272,6 +172,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->RemoveUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE));
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
if (type != DATA_BALTHARUS_SHARED_HEALTH)
|
||||
@@ -296,22 +203,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;
|
||||
};
|
||||
|
||||
|
||||
@@ -163,10 +163,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