Core/Scripts: Updated Ruby Sanctum instance model

This commit is contained in:
Keader
2017-02-04 10:13:22 -03:00
committed by Aokromes
parent e015d7f7b9
commit 37cb06e294
6 changed files with 119 additions and 226 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;
};

View File

@@ -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);
}

View File

@@ -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