mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/Utgarde Pinnacle: Svala Sorrowgrave Intro and Ritual of the Sword (#24503)
* Scripts/Svala SorrowGrave - Fix broken intro event and Ritual of the Sword
* Added missing header for non-PCH build.
* Added error checking for Svala's targeting, and tightened up the timing on the intro event.
* Update WorldDB\Creature_Template_Movement for Svala
* Fix movement during intro and ritual event
* Rename SQL file for merge
Co-authored-by: Carbenium <carbenium@outlook.com>
(cherry picked from commit a225717b99)
This commit is contained in:
committed by
Shauren
parent
c7bff97d1a
commit
850d60c4b3
@@ -0,0 +1,8 @@
|
||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra`| 0x200 WHERE `entry` IN (29281, 30809, 26668, 30810);
|
||||
|
||||
DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (29281, 30809, 26668, 30810);
|
||||
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`) VALUES
|
||||
(29281, 1, 0, 1, 0, 0, 0),
|
||||
(30809, 1, 0, 1, 0, 0, 0),
|
||||
(26668, 2, 0, 1, 0, 0, 0),
|
||||
(30810, 2, 0, 1, 0, 0, 0);
|
||||
@@ -16,9 +16,11 @@
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "Player.h"
|
||||
#include "GameObject.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "MotionMaster.h"
|
||||
#include "MoveSplineInit.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
@@ -117,7 +119,8 @@ enum Events
|
||||
//SACRIFICING
|
||||
EVENT_SPAWN_RITUAL_CHANNELERS,
|
||||
EVENT_RITUAL_STRIKE,
|
||||
EVENT_RITUAL_DISARM
|
||||
EVENT_RITUAL_DISARM,
|
||||
EVENT_FINISH_RITUAL
|
||||
};
|
||||
|
||||
enum Misc
|
||||
@@ -163,7 +166,7 @@ class boss_svala : public CreatureScript
|
||||
else
|
||||
events.SetPhase(IDLE);
|
||||
|
||||
me->SetDisableGravity(events.IsInPhase(NORMAL));
|
||||
me->SetDisableGravity(false);
|
||||
|
||||
Initialize();
|
||||
|
||||
@@ -220,20 +223,6 @@ class boss_svala : public CreatureScript
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id == SPELL_RITUAL_STRIKE_EFF_1 && !events.IsInPhase(NORMAL) && !events.IsInPhase(SVALADEAD))
|
||||
{
|
||||
events.SetPhase(NORMAL);
|
||||
events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL);
|
||||
events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL);
|
||||
SetCombatMovement(true);
|
||||
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 300.0f, true))
|
||||
me->GetMotionMaster()->MoveChase(target);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (events.IsInPhase(IDLE))
|
||||
@@ -244,7 +233,7 @@ class boss_svala : public CreatureScript
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (!_sacrificed && HealthBelowPct(50))
|
||||
if (events.IsInPhase(NORMAL) && !_sacrificed && HealthBelowPct(50))
|
||||
{
|
||||
_sacrificed = true;
|
||||
events.SetPhase(SACRIFICING);
|
||||
@@ -271,20 +260,23 @@ class boss_svala : public CreatureScript
|
||||
{
|
||||
if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
|
||||
arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true);
|
||||
Position pos;
|
||||
pos.Relocate(me);
|
||||
pos.m_positionZ += 8.0f;
|
||||
me->GetMotionMaster()->MoveTakeoff(0, pos);
|
||||
|
||||
me->SetDisableGravity(true);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MoveTo(296.614f, -346.2484f, 95.62769f);
|
||||
init.SetFly();
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init));
|
||||
|
||||
// spectators flee event
|
||||
std::list<Creature*> lspectatorList;
|
||||
GetCreatureListWithEntryInGrid(lspectatorList, me, NPC_SPECTATOR, 100.0f);
|
||||
for (std::list<Creature*>::iterator itr = lspectatorList.begin(); itr != lspectatorList.end(); ++itr)
|
||||
std::list<Creature*> spectators;
|
||||
GetCreatureListWithEntryInGrid(spectators, me, NPC_SPECTATOR, 100.0f);
|
||||
for (Creature* spectator : spectators)
|
||||
{
|
||||
if ((*itr)->IsAlive())
|
||||
if (spectator->IsAlive())
|
||||
{
|
||||
(*itr)->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
(*itr)->SetWalk(false);
|
||||
(*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0]);
|
||||
spectator->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
spectator->SetWalk(false);
|
||||
spectator->GetMotionMaster()->MovePoint(1, spectatorWP[0]);
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_INTRO_TRANSFORM_1, 4200ms, 0, INTRO);
|
||||
@@ -304,7 +296,7 @@ class boss_svala : public CreatureScript
|
||||
me->RemoveAllAuras();
|
||||
me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
|
||||
me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_1, 6s, 0, INTRO);
|
||||
events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_1, 2s, 0, INTRO);
|
||||
break;
|
||||
case EVENT_INTRO_SVALA_TALK_1:
|
||||
Talk(SAY_SVALA_INTRO_1);
|
||||
@@ -317,21 +309,17 @@ class boss_svala : public CreatureScript
|
||||
break;
|
||||
case EVENT_INTRO_SVALA_TALK_2:
|
||||
Talk(SAY_SVALA_INTRO_2);
|
||||
me->SetFacingTo(1.58f);
|
||||
me->SetFacingTo(1.832595f);
|
||||
if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
|
||||
arthas->SetVisible(false);
|
||||
events.ScheduleEvent(EVENT_INTRO_RELOCATE_SVALA, 13800ms, 0, INTRO);
|
||||
break;
|
||||
case EVENT_INTRO_RELOCATE_SVALA:
|
||||
{
|
||||
Position pos;
|
||||
pos.Relocate(me);
|
||||
pos.m_positionX = me->GetHomePosition().GetPositionX();
|
||||
pos.m_positionY = me->GetHomePosition().GetPositionY();
|
||||
pos.m_positionZ = 90.6065f;
|
||||
me->GetMotionMaster()->MoveLand(0, pos);
|
||||
me->SetDisableGravity(false);
|
||||
me->SetHover(true);
|
||||
me->GetMotionMaster()->MoveFall();
|
||||
|
||||
events.ScheduleEvent(EVENT_INTRO_DESPAWN_ARTHAS, 3s, 0, INTRO);
|
||||
break;
|
||||
}
|
||||
@@ -344,6 +332,8 @@ class boss_svala : public CreatureScript
|
||||
_arthasGUID.Clear();
|
||||
events.SetPhase(NORMAL);
|
||||
_introCompleted = true;
|
||||
if (Unit* target = me->SelectNearestPlayer(100.0f))
|
||||
AttackStart(target);
|
||||
events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL);
|
||||
events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL);
|
||||
break;
|
||||
@@ -359,6 +349,7 @@ class boss_svala : public CreatureScript
|
||||
case EVENT_RITUAL_PREPARATION:
|
||||
if (Unit* sacrificeTarget = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true))
|
||||
{
|
||||
me->SetDisableGravity(true, true);
|
||||
instance->SetGuidData(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID());
|
||||
Talk(SAY_SACRIFICE_PLAYER);
|
||||
DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION);
|
||||
@@ -366,6 +357,7 @@ class boss_svala : public CreatureScript
|
||||
DoCast(me, SPELL_RITUAL_OF_THE_SWORD);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPAWN_RITUAL_CHANNELERS, 1s, 0, SACRIFICING);
|
||||
events.ScheduleEvent(EVENT_FINISH_RITUAL, 25s, 0);
|
||||
break;
|
||||
case EVENT_SPAWN_RITUAL_CHANNELERS:
|
||||
DoCast(me, SPELL_RITUAL_CHANNELER_1, true);
|
||||
@@ -383,6 +375,17 @@ class boss_svala : public CreatureScript
|
||||
case EVENT_RITUAL_DISARM:
|
||||
DoCast(me, SPELL_RITUAL_DISARM);
|
||||
break;
|
||||
case EVENT_FINISH_RITUAL:
|
||||
me->SetDisableGravity(false, true);
|
||||
SetCombatMovement(true);
|
||||
|
||||
if (Unit* target = me->SelectNearestPlayer(100.0f))
|
||||
AttackStart(target);
|
||||
|
||||
events.SetPhase(NORMAL);
|
||||
events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7s, 0, NORMAL);
|
||||
events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 20s, 0, NORMAL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user