diff options
3 files changed, 107 insertions, 119 deletions
diff --git a/sql/updates/world/3.3.5/2017_02_04_00_world.sql b/sql/updates/world/3.3.5/2017_02_04_00_world.sql new file mode 100644 index 00000000000..14510bc094f --- /dev/null +++ b/sql/updates/world/3.3.5/2017_02_04_00_world.sql @@ -0,0 +1,37 @@ + -- East +DELETE FROM `script_spline_chain_meta` WHERE `entry`=39814 AND `chainId`=1; +INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES +(39814, 1, 0, 2314, 0); +DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=39814 AND `chainId`=1; +INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES +(39814, 1, 0, 0, 3062.4450, 613.99300, 84.232710), +(39814, 1, 0, 1, 3058.9580, 610.40010, 85.552370), +(39814, 1, 0, 2, 3055.7080, 606.65010, 86.302370), +(39814, 1, 0, 3, 3046.2080, 596.15010, 86.552370), +(39814, 1, 0, 4, 3043.7080, 593.15010, 87.302370), +(39814, 1, 0, 5, 3040.2080, 589.65010, 88.052370), +(39814, 1, 0, 6, 3034.4580, 583.15010, 88.802370), +(39814, 1, 0, 7, 3014.9700, 561.80730, 88.872020); + -- West +DELETE FROM `script_spline_chain_meta` WHERE `entry`=39814 AND `chainId`=2; +INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES +(39814, 2, 0, 3486, 0); +DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=39814 AND `chainId`=2; +INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES +(39814, 2, 0, 0, 3047.4820, 454.40800, 84.374650), +(39814, 2, 0, 1, 3045.4070, 456.82900, 85.912670), +(39814, 2, 0, 2, 3043.6570, 458.57900, 86.912670), +(39814, 2, 0, 3, 3042.4070, 460.07900, 87.412670), +(39814, 2, 0, 4, 3041.6570, 460.57900, 87.662670), +(39814, 2, 0, 5, 3039.1570, 462.07900, 88.412670), +(39814, 2, 0, 6, 3037.9070, 462.82900, 88.662670), +(39814, 2, 0, 7, 3037.9070, 463.82900, 88.912670), +(39814, 2, 0, 8, 3037.9070, 464.82900, 89.162670), +(39814, 2, 0, 9, 3037.9070, 466.82900, 89.162670), +(39814, 2, 0, 10, 3033.4070, 469.07900, 89.412670), +(39814, 2, 0, 11, 3027.1570, 475.32900, 89.412670), +(39814, 2, 0, 12, 3025.1570, 477.32900, 89.412670), +(39814, 2, 0, 13, 3016.9070, 481.32900, 89.662670), +(39814, 2, 0, 14, 3014.9070, 483.32900, 89.662670), +(39814, 2, 0, 15, 3008.6570, 500.07900, 89.662670), +(39814, 2, 0, 16, 3003.8320, 501.25000, 89.450690); 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 80ab200d148..04619af0d20 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -33,54 +33,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 @@ -90,9 +69,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 { @@ -101,20 +78,20 @@ class boss_general_zarithrian : public CreatureScript me->RemoveFlag(UNIT_FIELD_FLAGS, 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. @@ -129,15 +106,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 @@ -145,33 +123,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; @@ -196,38 +177,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 { @@ -236,57 +204,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 1687c09e293..ad94c5587ee 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp @@ -167,20 +167,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) @@ -255,6 +241,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: |