diff options
author | Keader <keader.android@gmail.com> | 2017-02-03 22:28:20 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-06-15 18:41:09 +0200 |
commit | 732f3ce377014cbcba38bd31c177685bd099cdb9 (patch) | |
tree | 5b5114460dd6630e72732d177bafa4479b0f90e0 /src | |
parent | 3d30140e45979e1f50b989e8511c2b732c9d2a54 (diff) |
Core/Ruby Sanctum: Improved General Zarithrian encounter
* Fixed spell timers
* Improved Codestyle
* Fixed minions number in 25 man
* Fixed movement
* Implemented DespawnAtEvade
*
(cherrypicked from c58dd6c16683a4c84bbc2ec85b7833f946f3e6e3)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp | 171 | ||||
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp | 18 |
2 files changed, 70 insertions, 119 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 498c82e0c7f..066c97fd6e0 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -34,54 +34,33 @@ enum Spells // General Zarithrian SPELL_INTIMIDATING_ROAR = 74384, SPELL_CLEAVE_ARMOR = 74367, + // Zarithrian Spawn Stalker SPELL_SUMMON_FLAMECALLER = 74398, + // Onyx Flamecaller SPELL_BLAST_NOVA = 74392, - SPELL_LAVA_GOUT = 74394, + SPELL_LAVA_GOUT = 74394 }; enum Events { // General Zarithrian - EVENT_CLEAVE = 1, - EVENT_INTIDMDATING_ROAR = 2, - EVENT_SUMMON_ADDS = 3, + EVENT_CLEAVE = 1, + EVENT_INTIDMDATING_ROAR, + EVENT_SUMMON_ADDS, + EVENT_SUMMON_ADDS2, + // Onyx Flamecaller - EVENT_BLAST_NOVA = 4, - EVENT_LAVA_GOUT = 5, + EVENT_BLAST_NOVA, + EVENT_LAVA_GOUT }; -uint32 const MAX_PATH_FLAMECALLER_WAYPOINTS = 12; - -Position const FlamecallerWaypoints[MAX_PATH_FLAMECALLER_WAYPOINTS*2] = +enum MinionsMovement { - // East - {3042.971f, 419.8809f, 86.94320f, 0.0f}, - {3043.971f, 419.8809f, 86.94320f, 0.0f}, - {3044.885f, 428.8281f, 86.19320f, 0.0f}, - {3045.494f, 434.7930f, 85.56398f, 0.0f}, - {3045.900f, 438.7695f, 84.81398f, 0.0f}, - {3045.657f, 456.8290f, 85.95601f, 0.0f}, - {3043.657f, 459.0790f, 87.20601f, 0.0f}, - {3042.157f, 460.5790f, 87.70601f, 0.0f}, - {3040.907f, 462.0790f, 88.45601f, 0.0f}, - {3038.907f, 464.0790f, 89.20601f, 0.0f}, - {3025.907f, 478.0790f, 89.70601f, 0.0f}, - {3003.832f, 501.2510f, 89.47303f, 0.0f}, - // West - {3062.596f, 636.9980f, 82.50338f, 0.0f}, - {3062.514f, 624.9980f, 83.70634f, 0.0f}, - {3062.486f, 620.9980f, 84.33134f, 0.0f}, - {3062.445f, 613.9930f, 84.45634f, 0.0f}, - {3062.445f, 613.9930f, 84.45634f, 0.0f}, - {3059.208f, 610.6501f, 85.39581f, 0.0f}, - {3055.958f, 606.9001f, 86.14581f, 0.0f}, - {3046.458f, 596.4001f, 86.89581f, 0.0f}, - {3043.958f, 593.4001f, 87.64581f, 0.0f}, - {3040.458f, 589.9001f, 88.39581f, 0.0f}, - {3034.458f, 583.1501f, 88.89581f, 0.0f}, - {3014.970f, 561.8073f, 88.83527f, 0.0f}, + SPLINE_GENERAL_EAST = 1, + SPLINE_GENERAL_WEST = 2, + POINT_GENERAL_ROOM = 3 }; class boss_general_zarithrian : public CreatureScript @@ -91,9 +70,7 @@ class boss_general_zarithrian : public CreatureScript struct boss_general_zarithrianAI : public BossAI { - boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN) - { - } + boss_general_zarithrianAI(Creature* creature) : BossAI(creature, DATA_GENERAL_ZARITHRIAN) { } void Reset() override { @@ -102,20 +79,20 @@ class boss_general_zarithrian : public CreatureScript me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE)); } - void EnterCombat(Unit* /*who*/) override + bool CanAIAttack(Unit const* target) const override { - _EnterCombat(); - Talk(SAY_AGGRO); - events.Reset(); - events.ScheduleEvent(EVENT_CLEAVE, 15000); - events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000); - events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000); + return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && BossAI::CanAIAttack(target)); } - void JustReachedHome() override + void EnterCombat(Unit* /*who*/) override { - _JustReachedHome(); - instance->SetBossState(DATA_GENERAL_ZARITHRIAN, FAIL); + _EnterCombat(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_CLEAVE, Seconds(8)); + events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, Seconds(14)); + events.ScheduleEvent(EVENT_SUMMON_ADDS, Seconds(15)); + if (Is25ManRaid()) + events.ScheduleEvent(EVENT_SUMMON_ADDS2, Seconds(16)); } // Override to not set adds in combat yet. @@ -130,15 +107,16 @@ class boss_general_zarithrian : public CreatureScript Talk(SAY_DEATH); } - void KilledUnit(Unit* victim) override + void EnterEvadeMode(EvadeReason /*why*/) override { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); + summons.DespawnAll(); + _DespawnAtEvade(); } - bool CanAIAttack(Unit const* target) const override + void KilledUnit(Unit* victim) override { - return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && BossAI::CanAIAttack(target)); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void UpdateAI(uint32 diff) override @@ -146,33 +124,36 @@ class boss_general_zarithrian : public CreatureScript if (!UpdateVictim()) return; - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) return; + events.Update(diff); + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SUMMON_ADDS: + Talk(SAY_ADDS); + // no break + case EVENT_SUMMON_ADDS2: { if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ZARITHRIAN_SPAWN_STALKER_1))) - stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false); + stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, true); if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ZARITHRIAN_SPAWN_STALKER_2))) - stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false); + stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, true); - Talk(SAY_ADDS); - events.ScheduleEvent(EVENT_SUMMON_ADDS, 42000); + events.Repeat(Seconds(45)); break; } case EVENT_INTIDMDATING_ROAR: - DoCast(me, SPELL_INTIMIDATING_ROAR, true); - events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000); + DoCastSelf(SPELL_INTIMIDATING_ROAR); + events.Repeat(Seconds(35), Seconds(40)); + break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE_ARMOR); - events.ScheduleEvent(EVENT_CLEAVE, 15000); + events.ScheduleEvent(EVENT_CLEAVE, Seconds(15)); break; default: break; @@ -197,38 +178,25 @@ class npc_onyx_flamecaller : public CreatureScript public: npc_onyx_flamecaller() : CreatureScript("npc_onyx_flamecaller") { } - struct npc_onyx_flamecallerAI : public npc_escortAI + struct npc_onyx_flamecallerAI : public ScriptedAI { - npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript()) - { - Initialize(); - npc_escortAI::SetDespawnAtEnd(false); - } - - void Initialize() - { - _lavaGoutCount = 0; - } + npc_onyx_flamecallerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _lavaGoutCount(0) { } void Reset() override { - Initialize(); - me->setActive(true); - AddWaypoints(); - Start(true, true); + _events.Reset(); + _lavaGoutCount = 0; + me->SetReactState(REACT_DEFENSIVE); + MoveToGeneral(); } void EnterCombat(Unit* /*who*/) override { - _events.Reset(); - _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); - _events.ScheduleEvent(EVENT_LAVA_GOUT, 5000); + _events.ScheduleEvent(EVENT_BLAST_NOVA, Seconds(17)); + _events.ScheduleEvent(EVENT_LAVA_GOUT, Seconds(3)); } - void EnterEvadeMode(EvadeReason /*why*/) override - { - // Prevent EvadeMode - } + void EnterEvadeMode(EvadeReason /*why*/) override { } void IsSummonedBy(Unit* /*summoner*/) override { @@ -237,57 +205,50 @@ class npc_onyx_flamecaller : public CreatureScript zarithrian->AI()->JustSummoned(me); } - void WaypointReached(uint32 waypointId) override + void MovementInform(uint32 type, uint32 pointId) override { - if (waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS - 1 || waypointId == MAX_PATH_FLAMECALLER_WAYPOINTS * 2 - 1) - { - DoZoneInCombat(); - SetEscortPaused(true); - } + if (type != SPLINE_CHAIN_MOTION_TYPE && pointId != POINT_GENERAL_ROOM) + return; + + me->SetInCombatWithZone(); } - void AddWaypoints() + void MoveToGeneral() { if (me->GetPositionY() < 500.0f) - { - for (uint8 i = 0; i < MAX_PATH_FLAMECALLER_WAYPOINTS; i++) - AddWaypoint(i, FlamecallerWaypoints[i].GetPositionX(), FlamecallerWaypoints[i].GetPositionY(), FlamecallerWaypoints[i].GetPositionZ()); - } + me->GetMotionMaster()->MoveAlongSplineChain(POINT_GENERAL_ROOM, SPLINE_GENERAL_WEST, false); else - { - for (uint8 i = 0, j = MAX_PATH_FLAMECALLER_WAYPOINTS; j < MAX_PATH_FLAMECALLER_WAYPOINTS*2; j++, i++) - AddWaypoint(i, FlamecallerWaypoints[j].GetPositionX(), FlamecallerWaypoints[j].GetPositionY(), FlamecallerWaypoints[j].GetPositionZ()); - } + me->GetMotionMaster()->MoveAlongSplineChain(POINT_GENERAL_ROOM, SPLINE_GENERAL_EAST, false); } - void UpdateEscortAI(uint32 diff) override + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) return; + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_BLAST_NOVA: DoCastAOE(SPELL_BLAST_NOVA); - _events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000)); + _events.Repeat(Seconds(15), Seconds(20)); break; case EVENT_LAVA_GOUT: if (_lavaGoutCount >= 3) { _lavaGoutCount = 0; - _events.ScheduleEvent(EVENT_LAVA_GOUT, 8000); + _events.Repeat(Seconds(8)); break; } DoCastVictim(SPELL_LAVA_GOUT); _lavaGoutCount++; - _events.ScheduleEvent(EVENT_LAVA_GOUT, 1500); + _events.Repeat(Seconds(1)); break; default: break; 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 f3fda6385f8..ea7dfe87068 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -171,20 +171,6 @@ class instance_ruby_sanctum : public InstanceMapScript HalionGUID = ObjectGuid::Empty; } - void OnUnitDeath(Unit* unit) override - { - 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->GetCreature(GetGuidData(DATA_HALION_CONTROLLER))) - halionController->AI()->DoAction(ACTION_INTRO_HALION); - } - } - ObjectGuid GetGuidData(uint32 type) const override { switch (type) @@ -259,6 +245,10 @@ class instance_ruby_sanctum : public InstanceMapScript { 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))) + halionController->AI()->DoAction(ACTION_INTRO_HALION); break; } case DATA_HALION: |