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:
Keader
2017-02-03 22:28:20 -03:00
committed by Shauren
parent 3d30140e45
commit 732f3ce377
3 changed files with 107 additions and 119 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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: