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:
wotlk-enthusiast
2021-01-08 14:56:55 -07:00
committed by Shauren
parent c7bff97d1a
commit 850d60c4b3
2 changed files with 47 additions and 36 deletions

View File

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

View File

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