aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeader <keader.android@gmail.com>2017-02-03 22:28:20 -0300
committerShauren <shauren.trinity@gmail.com>2019-06-15 18:41:09 +0200
commit732f3ce377014cbcba38bd31c177685bd099cdb9 (patch)
tree5b5114460dd6630e72732d177bafa4479b0f90e0 /src
parent3d30140e45979e1f50b989e8511c2b732c9d2a54 (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.cpp171
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp18
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: