diff options
3 files changed, 42 insertions, 20 deletions
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index ab53351cd6b..94325ca015b 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -135,13 +135,18 @@ class boss_general_zarithrian : public CreatureScript Talk(SAY_KILL); } + bool CanAIAttack(Unit const* /*target*/) const + { + return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE); + } + void UpdateAI(uint32 const diff) { if (!UpdateVictim()) return; // Can't use room boundary here, the gameobject is spawned at the same position as the boss. This is just as good anyway. - if (me->GetPositionX() > 3060.0f) + if (me->GetPositionX() > 3058.0f) { EnterEvadeMode(); return; @@ -159,9 +164,11 @@ class boss_general_zarithrian : public CreatureScript case EVENT_SUMMON_ADDS: { if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1))) - stalker1->AI()->DoCast(stalker1, SPELL_SUMMON_FLAMECALLER); + stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); + if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2))) - stalker2->AI()->DoCast(stalker2, SPELL_SUMMON_FLAMECALLER); + stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); + Talk(SAY_ADDS); events.ScheduleEvent(EVENT_SUMMON_ADDS, 42000); break; @@ -195,9 +202,8 @@ class npc_onyx_flamecaller : public CreatureScript struct npc_onyx_flamecallerAI : public npc_escortAI { - npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature) + npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) { - _instance = creature->GetInstanceScript(); npc_escortAI::SetDespawnAtEnd(false); } @@ -289,7 +295,6 @@ class npc_onyx_flamecaller : public CreatureScript } private: EventMap _events; - bool _movementComplete; InstanceScript* _instance; uint8 _lavaGoutCount; }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 781dd86cb86..d849e21f01f 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -226,9 +226,9 @@ struct generic_halionAI : public BossAI { generic_halionAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId), _canEvade(false) { } - void EnterCombat(Unit* who) + void EnterCombat(Unit* /*who*/) { - BossAI::EnterCombat(who); + _EnterCombat(); me->AddAura(SPELL_TWILIGHT_PRECISION, me); _canEvade = false; events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000)); @@ -239,12 +239,12 @@ struct generic_halionAI : public BossAI void Reset() { _canEvade = false; - BossAI::Reset(); + _Reset(); } void EnterEvadeMode() { - BossAI::EnterEvadeMode(); + _EnterEvadeMode(); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } @@ -349,15 +349,20 @@ class boss_halion : public CreatureScript controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_ONE); } - void JustDied(Unit* killer) + void JustDied(Unit* /*killer*/) { - BossAI::JustDied(killer); + _JustDied(); Talk(SAY_DEATH); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TWILIGHT_HALION))) + if (twilightHalion->isAlive()) + twilightHalion->Kill(twilightHalion); + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) - me->Kill(controller); + if (controller->isAlive()) + controller->Kill(controller); } Position const* GetMeteorStrikePosition() const { return &_meteorStrikePos; } @@ -515,7 +520,8 @@ class boss_twilight_halion : public CreatureScript } if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER))) - controller->Kill(controller); + if (controller->isAlive()) + controller->Kill(controller); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } @@ -592,7 +598,6 @@ class npc_halion_controller : public CreatureScript _instance(creature->GetInstanceScript()), _summons(me) { me->SetPhaseMask(me->GetPhaseMask() | 0x20, true); - _events.SetPhase(PHASE_INTRO); } void Reset() diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp index c373c2340ff..abfa2df5c97 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -60,8 +60,11 @@ class instance_ruby_sanctum : public InstanceMapScript void OnPlayerEnter(Player* /*player*/) { if (!GetData64(DATA_HALION_CONTROLLER) && GetBossState(DATA_HALION) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE) + { + instance->LoadGrid(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()); if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos)) halionController->AI()->DoAction(ACTION_INTRO_HALION); + } } void OnCreatureCreate(Creature* creature) @@ -164,6 +167,20 @@ class instance_ruby_sanctum : public InstanceMapScript } } + void OnUnitDeath(Unit* unit) + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + if (creature->GetEntry() == NPC_GENERAL_ZARITHRIAN && GetBossState(DATA_HALION) != DONE) + { + instance->LoadGrid(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()); + if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos)) + halionController->AI()->DoAction(ACTION_INTRO_HALION); + } + } + uint64 GetData64(uint32 type) const { switch (type) @@ -238,11 +255,6 @@ class instance_ruby_sanctum : public InstanceMapScript { if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) HandleGameObject(FlameWallsGUID, state != IN_PROGRESS); - - // Not called at instance loading, no big deal. - if (state == DONE && GetBossState(DATA_HALION) != DONE) - if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos)) - halionController->AI()->DoAction(ACTION_INTRO_HALION); break; } case DATA_HALION: |