mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/Ruby Sanctum: Improved General Zarithrian encounter
* Fixed spell timers
* Improved Codestyle
* Fixed minions number in 25 man
* Fixed movement
* Implemented DespawnAtEvade
*
(cherrypicked from c58dd6c166)
This commit is contained in:
@@ -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);
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
bool CanAIAttack(Unit const* target) const override
|
||||
{
|
||||
return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && BossAI::CanAIAttack(target));
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 42000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 40000);
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
_JustReachedHome();
|
||||
instance->SetBossState(DATA_GENERAL_ZARITHRIAN, FAIL);
|
||||
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,49 +107,53 @@ class boss_general_zarithrian : public CreatureScript
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
summons.DespawnAll();
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
bool CanAIAttack(Unit const* target) const override
|
||||
{
|
||||
return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && BossAI::CanAIAttack(target));
|
||||
}
|
||||
|
||||
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_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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user