fix(Scripts/HallsOfReflection): Improve Halls of Reflection Events (Horde) (#16165)

* fix(DB/Creature): Grunda Bronzewing is now mounted

Grunda Bronzewing is now mounted

* Update Fix-Grunda Bronzewing in Honor Hold is not riding on a golden gryphon.sql

Grunda Bronzewing is now mounted

* Rename Fix-Grunda Bronzewing in Honor Hold is not riding on a golden gryphon.sql to Fix-Grunda.sql

Grunda Bronzewing is now mounted

* Delete Fix-Grunda.sql

* Create Fix-NPCs_Halls_Off_Reflection.sql

* Fix-events_Halls_of_Reflection(HORDE)

* Rename Fix-NPCs_Halls_Off_Reflection.sql to Fix-NPCs_Halls_of_Reflection.sql

* Rename halls_of_reflection.cpp to fix halls_of_reflection.cpp

* Rename halls_of_reflection.h to fix halls_of_reflection.h

* Rename instance_halls_of_reflection.cpp to fix instance_halls_of_reflection.cpp

* Update fix halls_of_reflection.h

* Update and rename fix halls_of_reflection.cpp to halls_of_reflection.cpp

* Update and rename fix instance_halls_of_reflection.cpp to instance_halls_of_reflection.cpp

* Update instance_halls_of_reflection.cpp

* Update instance_halls_of_reflection.cpp

* Update instance_halls_of_reflection.cpp

* Update and rename fix halls_of_reflection.h to halls_of_reflection.h

* Update instance_halls_of_reflection.cpp

* Update halls_of_reflection.h

* Update Fix-NPCs_Halls_of_Reflection.sql

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update instance_halls_of_reflection.cpp

* Update halls_of_reflection.h

* Update instance_halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update Fix-NPCs_Halls_of_Reflection.sql

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update and rename Fix-NPCs_Halls_of_Reflection.sql to Fix_NPCs_Halls_of_Reflection.sql

* Update halls_of_reflection.cpp

* Update halls_of_reflection.cpp

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update Fix_NPCs_Halls_of_Reflection.sql

* Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

* Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

* Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

* Apply suggestions from code review

* Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

* Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp

---------
This commit is contained in:
pedrohfm9
2023-05-13 15:25:53 -03:00
committed by GitHub
parent ca1c6328e5
commit 3c401ad4ad
4 changed files with 692 additions and 398 deletions
@@ -0,0 +1,16 @@
-- SQL Dark Ranger Loralen emote
DELETE FROM `creature_template_addon` WHERE (`entry` = 37779);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(37779, 0, 0, 0, 2, 0, 0, '');
-- SQL LK Boss final
DELETE FROM `creature` WHERE (`id1` = 36954);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(1972025, 36954, 0, 0, 668, 0, 0, 3, 1, 1, 5552.77, 2262.57, 733.012, 4.15523, 86400, 0, 0, 27890000, 0, 0, 0, 0, 0, '', 48999);
-- SQL LK Sylvanas final
DELETE FROM `creature` WHERE (`id1` = 37554);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(1972026, 37554, 0, 0, 668, 0, 0, 3, 1, 1, 5549.51, 2257.59, 733.011, 0.99299, 86400, 0, 0, 5040000, 881400, 0, 0, 0, 0, '', 48999);
-- Add Gossip Sylvanas Final
DELETE FROM `gossip_menu` WHERE (`MenuID` = 10931);
INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES (10931, 15190);
@@ -26,8 +26,13 @@ enum Events
EVENT_PRE_INTRO_2,
EVENT_PRE_INTRO_3,
EVENT_TALK_LEADER_1,
EVENT_EMOTE_LEADER_1,
EVENT_START_INTRO,
EVENT_SKIP_INTRO,
EVENT_LORALEN_MOVE_1,
EVENT_LORALEN_MOVE_2,
EVENT_INTRO_A2_1,
EVENT_INTRO_A2_2,
@@ -51,7 +56,10 @@ enum Events
EVENT_INTRO_H2_1,
EVENT_INTRO_H2_2,
EVENT_INTRO_H2_2_1,
EVENT_INTRO_H2_3,
EVENT_INTRO_H2_3_1,
EVENT_INTRO_H2_3_2,
EVENT_INTRO_H2_4,
EVENT_INTRO_H2_5,
EVENT_INTRO_H2_6,
@@ -65,20 +73,31 @@ enum Events
EVENT_INTRO_H2_14,
EVENT_INTRO_H2_15,
//BATTLE SYLVANAS X LK//
BATTLE_SYLVANAS_PART1,
EVENT_INTRO_LK_1,
EVENT_INTRO_LK_1_1,
EVENT_INTRO_LK_1_2,
EVENT_INTRO_LK_1_3,
EVENT_INTRO_LK_2,
EVENT_INTRO_LK_2_1,
EVENT_INTRO_LK_3,
EVENT_INTRO_LK_4,
EVENT_INTRO_LK_4_2,
EVENT_INTRO_LK_4_3,
EVENT_INTRO_LK_5,
EVENT_INTRO_LK_5_1,
EVENT_INTRO_LK_5_2,
EVENT_INTRO_LK_5_3,
EVENT_INTRO_LK_6,
EVENT_INTRO_LK_7,
EVENT_INTRO_LK_8,
EVENT_INTRO_LK_9,
EVENT_INTRO_LK_10,
EVENT_INTRO_LK_11,
EVENT_INTRO_LK_12,
EVENT_INTRO_LK_13,
EVENT_INTRO_END,
EVENT_INTRO_END_SET,
@@ -92,6 +111,18 @@ enum Gossips
GOSSIP_OPTION_START = 0,
GOSSIP_OPTION_START_SKIP = 1,
};
Position const NpcJainaOrSylvanasEscapeRoute[] =
{
{ 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room
{ 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route
{ 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking
{ 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall
{ 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall
{ 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall
{ 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall
{ 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed)
{ 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed)
};
class npc_hor_leader : public CreatureScript
{
@@ -198,7 +229,9 @@ public:
first = false;
events.ScheduleEvent(EVENT_PRE_INTRO_1, 10s);
events.ScheduleEvent(EVENT_PRE_INTRO_2, 11s);
events.ScheduleEvent(EVENT_PRE_INTRO_3, 17s);
events.ScheduleEvent(EVENT_EMOTE_LEADER_1, 16s);
events.ScheduleEvent(EVENT_TALK_LEADER_1, 16s);
events.ScheduleEvent(EVENT_PRE_INTRO_3, 19s);
}
}
@@ -218,45 +251,68 @@ public:
void UpdateAI(uint32 diff) override
{
events.Update(diff);
switch(events.ExecuteEvent())
switch (events.ExecuteEvent())
{
case EVENT_PRE_INTRO_1:
if (pInstance)
{
me->SetSheath(SHEATH_STATE_MELEE);
me->SetVisible(true);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->SetVisible(true);
}
break;
case EVENT_PRE_INTRO_2:
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_1);
}
me->GetMotionMaster()->MovePoint(0, SpawnPos);
break;
case EVENT_TALK_LEADER_1:
me->SetSheath(SHEATH_STATE_UNARMED);
Talk(me->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_INTRO_2 : SAY_SYLVANAS_INTRO_1);
break;
case EVENT_EMOTE_LEADER_1:
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
break;
case EVENT_PRE_INTRO_3:
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
Talk(me->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_INTRO_2 : SAY_SYLVANAS_INTRO_1);
me->SetFacingTo(0.89f);
me->SetSheath(SHEATH_STATE_MELEE);
break;
case EVENT_START_INTRO:
shortver = false;
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->GetMotionMaster()->MovePoint(0, MoveThronePos);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->LoadEquipment(true);
pLoralen->SetVisible(true);
pLoralen->SetWalk(true);
pLoralen->GetMotionMaster()->MovePoint(0, LoralenMidleFollowPos);
}
// Begining of intro is differents between factions as the speech sequence and timers are differents.
if (me->GetEntry() == NPC_JAINA_PART1)
{
events.ScheduleEvent(EVENT_INTRO_A2_1, 10s);
}
else
events.ScheduleEvent(EVENT_INTRO_H2_2, 10s);
{
events.ScheduleEvent(EVENT_INTRO_H2_2, 9s);
events.ScheduleEvent(EVENT_LORALEN_MOVE_1, 24s);
events.ScheduleEvent(EVENT_LORALEN_MOVE_2, 32s);
}
break;
case EVENT_SKIP_INTRO:
shortver = true;
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, (me->GetEntry() == NPC_JAINA_PART1 ? EMOTE_STATE_READY2H : EMOTE_STATE_READY1H));
me->GetMotionMaster()->MovePoint(0, MoveThronePos);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
}
events.ScheduleEvent(EVENT_INTRO_LK_1, 0ms);
break;
@@ -272,7 +328,7 @@ public:
case EVENT_INTRO_A2_3:
pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true);
me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true);
me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false);
//me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false);// the sniff is missing from the alliance
events.ScheduleEvent(EVENT_INTRO_A2_4, 10s);
break;
case EVENT_INTRO_A2_4:
@@ -287,8 +343,10 @@ public:
break;
case EVENT_INTRO_A2_5:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
events.ScheduleEvent(EVENT_INTRO_A2_6, 3s);
}
break;
case EVENT_INTRO_A2_6:
Talk(SAY_JAINA_INTRO_5);
@@ -296,7 +354,9 @@ public:
break;
case EVENT_INTRO_A2_7:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
}
events.ScheduleEvent(EVENT_INTRO_A2_8, 6500ms);
break;
case EVENT_INTRO_A2_8:
@@ -305,7 +365,9 @@ public:
break;
case EVENT_INTRO_A2_9:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
}
events.ScheduleEvent(EVENT_INTRO_A2_10, 9s);
break;
case EVENT_INTRO_A2_10:
@@ -314,7 +376,9 @@ public:
break;
case EVENT_INTRO_A2_11:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
}
events.ScheduleEvent(EVENT_INTRO_A2_12, 11s);
break;
case EVENT_INTRO_A2_12:
@@ -323,7 +387,9 @@ public:
break;
case EVENT_INTRO_A2_13:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
}
events.ScheduleEvent(EVENT_INTRO_A2_14, 12s + 500ms);
break;
case EVENT_INTRO_A2_14:
@@ -332,7 +398,9 @@ public:
break;
case EVENT_INTRO_A2_15:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
}
events.ScheduleEvent(EVENT_INTRO_A2_16, 24s);
break;
case EVENT_INTRO_A2_16:
@@ -347,7 +415,7 @@ public:
case EVENT_INTRO_A2_18:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
}
events.ScheduleEvent(EVENT_INTRO_A2_19, 11s);
@@ -358,77 +426,131 @@ public:
break;
// H2 Intro Events
case EVENT_INTRO_H2_2:
Talk(SAY_SYLVANAS_INTRO_2);
events.ScheduleEvent(EVENT_INTRO_H2_3, 6s);
case EVENT_LORALEN_MOVE_1:
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
}
break;
case EVENT_INTRO_H2_3:
case EVENT_LORALEN_MOVE_2:
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
}
break;
case EVENT_INTRO_H2_2:
me->SetSheath(SHEATH_STATE_UNARMED);
me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
Talk(SAY_SYLVANAS_INTRO_2);
events.ScheduleEvent(EVENT_INTRO_H2_2_1, 7s + 500ms);
break;
case EVENT_INTRO_H2_2_1:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_3);
events.ScheduleEvent(EVENT_INTRO_H2_3, 2s);
break;
case EVENT_INTRO_H2_3:
me->CastSpell(me, SPELL_SUMMON_SOULS, false);
events.ScheduleEvent(EVENT_INTRO_H2_3_1, 5s);
break;
case EVENT_INTRO_H2_3_1:
me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, false);
pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true);
me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true);
me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false);
events.ScheduleEvent(EVENT_INTRO_H2_4, 6s);
events.ScheduleEvent(EVENT_INTRO_H2_3_2, 3s);
break;
case EVENT_INTRO_H2_3_2:
me->RemoveAurasDueToSpell(SPELL_SUMMON_SOULS);
events.ScheduleEvent(EVENT_INTRO_H2_4, 2s);
break;
case EVENT_INTRO_H2_4:
if (Creature* pUther = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
pUther->SetVisible(true);
if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther))
{
a->SetDuration(8000);
}
events.ScheduleEvent(EVENT_INTRO_H2_5, 2s);
}
events.ScheduleEvent(EVENT_INTRO_H2_5, 7s);
break;
case EVENT_INTRO_H2_5:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
}
events.ScheduleEvent(EVENT_INTRO_H2_6, 11s);
break;
case EVENT_INTRO_H2_6:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_4);
events.ScheduleEvent(EVENT_INTRO_H2_7, 3s);
events.ScheduleEvent(EVENT_INTRO_H2_7, 2s + 500ms);
break;
case EVENT_INTRO_H2_7:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
events.ScheduleEvent(EVENT_INTRO_H2_8, 6s);
}
events.ScheduleEvent(EVENT_INTRO_H2_8, 9s);//
break;
case EVENT_INTRO_H2_8:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_5);
events.ScheduleEvent(EVENT_INTRO_H2_9, 5s);
break;
case EVENT_INTRO_H2_9:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
events.ScheduleEvent(EVENT_INTRO_H2_10, 19s);
}
events.ScheduleEvent(EVENT_INTRO_H2_10, 20s);
break;
case EVENT_INTRO_H2_10:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_6);
events.ScheduleEvent(EVENT_INTRO_H2_11, 1500ms);
events.ScheduleEvent(EVENT_INTRO_H2_11, 3s);
break;
case EVENT_INTRO_H2_11:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
events.ScheduleEvent(EVENT_INTRO_H2_12, 19s + 500ms);
}
events.ScheduleEvent(EVENT_INTRO_H2_12, 21s + 500ms);
break;
case EVENT_INTRO_H2_12:
me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
Talk(SAY_SYLVANAS_INTRO_7);
events.ScheduleEvent(EVENT_INTRO_H2_13, 2s);
events.ScheduleEvent(EVENT_INTRO_H2_13, 3s + 500ms);
break;
case EVENT_INTRO_H2_13:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
}
events.ScheduleEvent(EVENT_INTRO_H2_14, 12s);
events.ScheduleEvent(EVENT_INTRO_H2_14, 12s + 500ms);
break;
case EVENT_INTRO_H2_14:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
}
events.ScheduleEvent(EVENT_INTRO_H2_15, 8s);
break;
case EVENT_INTRO_H2_15:
me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
Talk(SAY_SYLVANAS_INTRO_8);
events.ScheduleEvent(EVENT_INTRO_LK_1, 2s);
break;
@@ -437,29 +559,46 @@ public:
case EVENT_INTRO_LK_1:
if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true);
pLichKing->SetVisible(true);
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, false);
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveMidlelThronePos, false);
}
if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
if (me->GetEntry() == NPC_JAINA_PART1)
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
else
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
}
events.ScheduleEvent(EVENT_INTRO_LK_1_2, 2s);
events.ScheduleEvent(EVENT_INTRO_LK_1_3, 4s);
events.ScheduleEvent(EVENT_INTRO_LK_2, 11s);
}
events.ScheduleEvent(EVENT_INTRO_LK_1_1, 9s);
events.ScheduleEvent(EVENT_INTRO_LK_1_2, 3s);
events.ScheduleEvent(EVENT_INTRO_LK_1_3, 6s);
events.ScheduleEvent(EVENT_INTRO_LK_2, 12s);
break;
case EVENT_INTRO_LK_1_1:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
pLichKing->AI()->Talk(SAY_LK_INTRO_1);
}
break;
case EVENT_INTRO_LK_1_2:
if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER);
pUther->SetFacingTo(0.89f);
}
break;
case EVENT_INTRO_LK_1_3:
@@ -469,20 +608,38 @@ public:
case EVENT_INTRO_LK_2:
if (!shortver)
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
pLichKing->AI()->Talk(SAY_LK_INTRO_1);
{
pLichKing->SetVisible(true);
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, false);
}
events.ScheduleEvent(EVENT_INTRO_LK_2_1, 1s);
break;
case EVENT_INTRO_LK_2_1:
if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SendPlaySpellVisual(SPELL_UTHER_DESPAWN);
pUther->CastSpell(pUther, SPELL_UTHER_DESPAWN, true);
}
events.ScheduleEvent(EVENT_INTRO_LK_3, 2s);
break;
case EVENT_INTRO_LK_3:
if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SetVisible(false);
events.ScheduleEvent(EVENT_INTRO_LK_4, 4s);
}
events.ScheduleEvent(EVENT_INTRO_LK_4, 6s);
break;
case EVENT_INTRO_LK_4:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
pLichKing->AI()->Talk(SAY_LK_INTRO_2);
}
events.ScheduleEvent(EVENT_INTRO_LK_4_2, 10s);
break;
@@ -527,66 +684,132 @@ public:
a->SetDuration(8000);
}
}
events.ScheduleEvent(EVENT_INTRO_LK_5_1, 0s);
events.ScheduleEvent(EVENT_INTRO_LK_5_2, 7s);
events.ScheduleEvent(EVENT_INTRO_LK_5_3, 0s);
events.ScheduleEvent(EVENT_INTRO_LK_6, 11s);
break;
case EVENT_INTRO_LK_5_1:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pLichKing->AI()->Talk(SAY_LK_INTRO_3);
events.ScheduleEvent(EVENT_INTRO_LK_5_2, 5s);
events.ScheduleEvent(EVENT_INTRO_LK_6, 8s);
}
break;
case EVENT_INTRO_LK_5_2:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false);
}
break;
case EVENT_INTRO_LK_5_3:
me->SetSpeed(MOVE_RUN, 1.6);
me->SetSheath(SHEATH_STATE_MELEE);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H);
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->SetSheath(SHEATH_STATE_MELEE);
pLoralen->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H);
pLoralen->SetWalk(false);
pLoralen->LoadEquipment(true);
}
break;
case EVENT_INTRO_LK_6:
if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC)))
{
pFalric->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
pFalric->AI()->Talk(SAY_FALRIC_INTRO_1);
}
events.ScheduleEvent(EVENT_INTRO_LK_7, 2s);
break;
case EVENT_INTRO_LK_7:
if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN)))
{
pMarwyn->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
pMarwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
events.ScheduleEvent(EVENT_INTRO_LK_8, 2s);
}
events.ScheduleEvent(EVENT_INTRO_LK_8, 3s);
break;
case EVENT_INTRO_LK_8:
if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC)))
{
pFalric->AI()->Talk(SAY_FALRIC_INTRO_2);
pInstance->SetData(ACTION_SHOW_TRASH, 1);
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true);
events.ScheduleEvent(EVENT_INTRO_LK_9, 5s);
}
events.ScheduleEvent(EVENT_INTRO_LK_9, 6s);
break;
case EVENT_INTRO_LK_9:
if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_END);
}
else
{
Talk(SAY_SYLVANAS_INTRO_END);
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false);
events.ScheduleEvent(EVENT_INTRO_END, 14s);
}
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk1, false);
}
events.ScheduleEvent(EVENT_INTRO_LK_10, 1s + 500ms);
break;
case EVENT_INTRO_LK_10:
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk2, false);
}
events.ScheduleEvent(EVENT_INTRO_LK_11, 2s);
break;
case EVENT_INTRO_LK_11:
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk3, false);
}
events.ScheduleEvent(EVENT_INTRO_LK_12, 5s + 500ms);
break;
case EVENT_INTRO_LK_12:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->SetVisible(false);
}
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLkFinal, false);
}
events.ScheduleEvent(EVENT_INTRO_LK_13, 2s);
break;
case EVENT_INTRO_LK_13:
me->SetVisible(false);
events.ScheduleEvent(EVENT_INTRO_END, 2s +500ms);
break;
case EVENT_INTRO_END:
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false);
pInstance->HandleGameObject(pInstance->GetGuidData(GO_FRONT_DOOR), false);
events.ScheduleEvent(EVENT_INTRO_END_SET, 10s);
events.ScheduleEvent(EVENT_INTRO_END_SET, 3s);
break;
case EVENT_INTRO_END_SET:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
pLichKing->SetVisible(false);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->SetVisible(false);
me->SetVisible(false);
if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
{
pLoralen->UpdatePosition(5369.71289f, 2083.6330f, 707.695129f, 0.188739f, true);
pLoralen->StopMovingOnCurrentPos();
pLoralen->SetVisible(true);
pLoralen->KillSelf(pLoralen);
}
pInstance->SetData(DATA_INTRO, DONE);
break;
}
@@ -1391,6 +1614,10 @@ enum eFightEvents
{
EVENT_EMPTY = 0,
EVENT_LK_SAY_AGGRO,
EVENT_LK_BATTLE_1,
EVENT_LK_BATTLE_2,
EVENT_LK_BATTLE_3,
EVENT_LK_BATTLE_4,
EVENT_JAINA_IMMOBILIZE_LK,
EVENT_SYLVANAS_IMMOBILIZE_JUMP,
EVENT_SYLVANAS_DARK_BINDING,
@@ -1444,7 +1671,6 @@ public:
events.Reset();
events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s);
}
void DoAction(int32 a) override
{
if (a == ACTION_START_LK_FIGHT_REAL)
@@ -1463,7 +1689,6 @@ public:
}
else
me->RemoveAura(SPELL_REMORSELESS_WINTER);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2)))
c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED);
}
@@ -1480,9 +1705,10 @@ public:
{
Talk(SAY_LK_IW_1);
me->SetOrientation(4.15f);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_ICE_WALL_TARGET)))
if (Creature* icewall = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_ICE_WALL_TARGET)))
{
me->CastSpell(c, SPELL_SUMMON_ICE_WALL, false);
me->SetFacingToObject(icewall);
me->CastSpell(icewall, SPELL_SUMMON_ICE_WALL, false);
events.ScheduleEvent(EVENT_LK_REMORSELESS_WINTER, 4s);
}
}
@@ -1496,6 +1722,7 @@ public:
void JustSummoned(Creature* s) override
{
++reqKillCount;
if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100))
events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s);
@@ -1583,7 +1810,7 @@ public:
me->CastSpell((Unit*)nullptr, SPELL_FURY_OF_FROSTMOURNE, false);
}
break;
case EVENT_LK_START_FOLLOWING: /// @todo: LK Moves too fast at the begining and too slow after and the leaders (Sylvana/Jaina) should be running instead of walking.
case EVENT_LK_START_FOLLOWING:
{
me->SetSpeed(MOVE_RUN, 9.0f / 7.0f);
Movement::PointsArray path;
@@ -1703,6 +1930,7 @@ public:
pInstance = me->GetInstanceScript();
if (!pInstance)
me->IsAIEnabled = false;
}
InstanceScript* pInstance;
@@ -1714,13 +1942,16 @@ public:
currentStopPoint = 0;
events.Reset();
}
void DoAction(int32 actionId) override
{
switch(actionId)
{
case ACTION_START_INTRO:
events.ScheduleEvent(EVENT_LK_SAY_AGGRO, 0ms);
events.ScheduleEvent(EVENT_LK_BATTLE_1, 2s +500ms);
events.ScheduleEvent(EVENT_LK_BATTLE_2, 3s);
events.ScheduleEvent(me->GetEntry() == NPC_JAINA_PART2 ? EVENT_JAINA_IMMOBILIZE_LK : EVENT_SYLVANAS_IMMOBILIZE_JUMP, 9s);
break;
case ACTION_START_LK_FIGHT_REAL:
events.ScheduleEvent(EVENT_START_RUN, 0ms);
@@ -1741,8 +1972,11 @@ public:
void MoveToNextStopPoint()
{
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->InterruptNonMeleeSpells(true);
me->SetSheath(SHEATH_STATE_MELEE);
++currentStopPoint;
me->SetWalk(false);
Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
for (uint8 i = WP_STOP[currentStopPoint - 1] + (currentStopPoint == 1 ? 0 : 1); i <= WP_STOP[currentStopPoint]; ++i)
@@ -1762,43 +1996,72 @@ public:
switch(events.ExecuteEvent())
{
case EVENT_LK_SAY_AGGRO:
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
c->AI()->Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_LK_AGGRO_ALLY : SAY_LK_AGGRO_HORDE);
events.ScheduleEvent(me->GetEntry() == NPC_JAINA_PART2 ? EVENT_JAINA_IMMOBILIZE_LK : EVENT_SYLVANAS_IMMOBILIZE_JUMP, 12s);
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
me->Attack(lkboss, true),
lkboss->AI()->Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_LK_AGGRO_ALLY : SAY_LK_AGGRO_HORDE);
}
break;
case EVENT_LK_BATTLE_1:
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
lkboss->CastSpell(lkboss, SPELL_SOUL_REAPER, false);
}
break;
case EVENT_LK_BATTLE_2:
//horda
if (Creature* leader = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2)))
{
leader->CastSpell(leader, SPELL_EVASION, true);
}
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
lkboss->SetFacingToObject(me);
}
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT);
me->SetFacingToObject(lkboss);
}
break;
case EVENT_JAINA_IMMOBILIZE_LK:
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY_SPELL_OMNI);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->CastSpell(c, SPELL_JAINA_ICE_PRISON, false);
me->CastSpell(lkboss, SPELL_JAINA_ICE_PRISON, false);
events.ScheduleEvent(EVENT_SAY_LEAVE, 5s);
}
break;
case EVENT_SYLVANAS_IMMOBILIZE_JUMP:
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->AttackStop();
me->SetSheath(SHEATH_STATE_MELEE);
lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY_SPELL_OMNI);
lkboss->CastSpell(me, SPELL_BLIDING_RETREAT, false);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->KnockbackFrom(c->GetPositionX(), c->GetPositionY(), 10.0f, 3.0f);
events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 1500ms);
me->KnockbackFrom(lkboss->GetPositionX(), lkboss->GetPositionY(), 34.3f, 4.0f);
events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 2s +500ms);
}
break;
case EVENT_SYLVANAS_DARK_BINDING:
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
me->CastSpell(c, SPELL_SYLVANAS_DARK_BINDING, false);
events.ScheduleEvent(EVENT_SAY_LEAVE, 3500ms);
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
me->CastSpell(lkboss, SPELL_SYLVANAS_DARK_BINDING, false);
events.ScheduleEvent(EVENT_SAY_LEAVE, 2s);
break;
case EVENT_SAY_LEAVE:
{
Map::PlayerList const& pl = pInstance->instance->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* p = itr->GetSource())
p->KilledMonsterCredit(me->GetEntry()); // for quest
p->KilledMonsterCredit(me->GetEntry()); //for quest
Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_AGGRO : SAY_SYLVANA_AGGRO);
me->SetSheath(SHEATH_STATE_MELEE);
me->SetWalk(false);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->GetMotionMaster()->MovePoint(0, LeaderEscapePos);
events.ScheduleEvent(EVENT_ADD_GOSSIP, 8s);
events.ScheduleEvent(EVENT_ADD_GOSSIP, 7s);
}
break;
case EVENT_ADD_GOSSIP:
@@ -1811,12 +2074,12 @@ public:
pInstance->SetData(ACTION_START_LK_FIGHT, 1);
me->setActive(true);
MoveToNextStopPoint();
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
c->setActive(true);
c->SetInCombatWithZone();
c->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING);
c->AI()->DoAction(ACTION_START_LK_FIGHT_REAL);
lkboss->setActive(true);
lkboss->SetInCombatWithZone();
lkboss->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING);
lkboss->AI()->DoAction(ACTION_START_LK_FIGHT_REAL);
}
}
break;
@@ -1855,6 +2118,7 @@ public:
Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_ESCAPE_01 : SAY_SYLVANA_ESCAPE_01);
break;
}
DoMeleeAttackIfReady();
}
};
};
@@ -1898,8 +2162,8 @@ public:
{
me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
}
};
@@ -1967,8 +2231,10 @@ public:
{
me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
}
}
};
@@ -2023,8 +2289,9 @@ public:
}
if (me->GetVictim() && me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim()) && !me->HasUnitState(UNIT_STATE_CASTING))
{
me->CastSpell(me->GetVictim(), 40505, false);
}
DoMeleeAttackIfReady();
}
@@ -2032,8 +2299,10 @@ public:
{
me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
{
lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
}
}
};
@@ -2057,8 +2326,10 @@ public:
PreventDefaultAction();
if (Unit* caster = GetCaster())
if (Creature* c = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 1))
{
c->CastSpell((Unit*)nullptr, 70021, true);
}
}
void Register() override
{
@@ -50,6 +50,7 @@ enum Data
ACTION_STOP_LK_FIGHT,
ACTION_DELETE_ICE_WALL,
DATA_WAVE_NUMBER,
DATA_LK_BATTLE,// in progress
};
enum Creatures
@@ -84,6 +85,7 @@ enum Creatures
NPC_SKY_REAVER_KORM_BLACKSKAR = 30824,
NPC_ALTAR_BUNNY = 37704,
NPC_QUEL_DELAR = 37158,
};
enum GameObjects
@@ -263,8 +265,14 @@ enum hMisc
SPELL_HOR_START_QUEST_ALLY = 71351,
SPELL_HOR_START_QUEST_HORDE = 71542,
SPELL_SHADOWMOURNE_VISUAL = 72523,
SPELL_ARCANE_CAST_VISUAL = 65633,
SPELL_UTHER_DESPAWN = 70693, //Sniffed
SPELL_WELL_OF_SOULS_VISUAL = 72630,
SPELL_SUMMON_SOULS = 72711, //Sniffed Sylvanas
//Battle of LK
SPELL_BLIDING_RETREAT = 70199, //Sniffed LK
SPELL_SOUL_REAPER = 69410, //Sniffed LK
SPELL_EVASION = 70190, //Sniffed Sylvanas
// Frostsworn General
EVENT_ACTIVATE_REFLECTIONS = 1,
@@ -311,17 +319,23 @@ const uint32 allowedCompositions[8][5] =
};
const Position CenterPos = {5309.459473f, 2006.478516f, 711.595459f, 0.0f};
const Position SpawnPos = {5262.540527f, 1949.693726f, 707.695007f, 0.808736f}; // Jaina/Sylvanas Beginning Position
const Position LoralenFollowPos = {5283.234863f, 1990.946777f, 707.695679f, 0.929097f};
const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne
const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f};
const Position SpawnPos = {5263.22412f, 1950.95544f, 707.695862f, 0.808736f}; // Jaina/Sylvanas Beginning Position
const Position LoralenMidleFollowPos = {5274.25634f, 1976.04760f, 707.694763f, 0.929097f}; // Sniffed
const Position LoralenFollowPos = {5283.29296f, 1992.43078f, 707.694763f, 0.549238f}; // Sniffed
const Position LoralenFollowLk1 = {5292.94921f, 2008.25451f, 707.695801f, 1.047967f}; // Sniffed
const Position LoralenFollowLk2 = {5298.94335f, 2016.37097f, 707.695801f, 0.694538f}; // Sniffed
const Position LoralenFollowLk3 = {5336.94044f, 2040.21814f, 707.695801f, 0.439284f}; // Sniffed
const Position LoralenFollowLkFinal = {5361.96777f, 2065.68310f, 707.693848f, 0.831989f}; // Sniffed
const Position LoralenDeadPos = {5369.71289f, 2083.6330f, 707.695129f, 0.188739f}; // Sniffed
const Position MoveThronePos = {5306.98535f, 1998.10302f, 709.341187f, 1.277278f}; // Jaina/Sylvanas walks to throne
const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f}; // Uther starting position
const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f};
const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne
const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away
const Position LichKingMoveMidlelThronePos = {5333.48437f, 2032.02648f, 707.695679f, 3.973301f}; // Lich King moves and hits Uther [sniff]
const Position LichKingMoveThronePos = {5312.79638f, 2010.07141f, 709.3942183f, 3.973301f}; // Lich King walks to throne [sniff]
const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away [sniff]
const Position FalricMovePos = {5284.161133f, 2030.691650f, 709.319336f, 5.489386f};
const Position MarwynMovePos = {5335.330078f, 1982.376221f, 709.319580f, 2.339942f};
const Position SylvanasFightPos = {5557.508301f, 2263.920654f, 733.011230f, 3.624075f};
const Position LeaderEscapePos = {5577.654785f, 2235.347412f, 733.011230f, 2.359576f};
const Position LeaderEscapePos = {5576.80566f, 2235.55004f, 733.012268f, 2.782125f}; //Sniff
const Position ShipMasterSummonPos = {5262.773926f, 1669.980103f, 715.000000f, 0.000000f};
const Position WalkCaveInPos = {5267.594238f, 1678.750000f, 784.302856f, 1.041739f};
const Position AllyPortalPos = {5205.015625f, 1605.680298f, 806.444458f, 0.884375f};
@@ -230,6 +230,7 @@ public:
{
case NPC_SYLVANAS_PART1:
creature->SetVisible(false);
creature->SetSpeed(MOVE_RUN, 1.1);
NPC_LeaderIntroGUID = creature->GetGUID();
if (TeamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1);
@@ -296,12 +297,8 @@ public:
creature->SetVisible(false);
if (!(EncounterMask & (1 << DATA_LK_INTRO)))
{
creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT);
if (TeamIdInInstance != TEAM_ALLIANCE)
{
creature->StopMoving();
creature->SetFacingTo(creature->GetAngle(&SylvanasFightPos));
}
creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); //the fight cannot be in the form of an emote, it is causing bugs
creature->CastSpell(creature, SPELL_SOUL_REAPER, true);
}
else if (!(EncounterMask & (1 << DATA_LICH_KING)))
creature->AddAura(TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING, creature);
@@ -316,22 +313,20 @@ public:
if (!creature->IsAlive())
creature->Respawn();
NPC_LeaderGUID = creature->GetGUID();
creature->SetWalk(false);
creature->SetSheath(SHEATH_STATE_MELEE);
if (TeamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2);
creature->SetWalk(false);
creature->SetHealth(creature->GetMaxHealth() / 20);
if (!(EncounterMask & (1 << DATA_FROSTSWORN_GENERAL)))
creature->SetVisible(false);
if (!(EncounterMask & (1 << DATA_LK_INTRO)))
{
creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, TeamIdInInstance == TEAM_ALLIANCE ? EMOTE_ONESHOT_ATTACK2HTIGHT : EMOTE_ONESHOT_ATTACK1H);
creature->SetSheath(SHEATH_STATE_MELEE);
creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, TeamIdInInstance == TEAM_ALLIANCE ? EMOTE_ONESHOT_ATTACK2HTIGHT : EMOTE_ONESHOT_ATTACK1H); //the fight cannot be in the form of an emote, it is causing bugs.
creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
creature->CastSpell(creature, TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_BARRIER : SPELL_SYLVANAS_CLOAK_OF_DARKNESS, true);
if (TeamIdInInstance != TEAM_ALLIANCE)
{
creature->UpdatePosition(SylvanasFightPos, true);
creature->StopMovingOnCurrentPos();
}
}
else if (!(EncounterMask & (1 << DATA_LICH_KING)))
{
@@ -346,6 +341,7 @@ public:
creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true);
creature->StopMovingOnCurrentPos();
}
creature->SetSheath(SHEATH_STATE_MELEE);
creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
break;
case NPC_ICE_WALL_TARGET:
@@ -444,8 +440,13 @@ public:
if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID))
{
c->SetVisible(true);
c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
c->SetReactState(REACT_AGGRESSIVE);
}
if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID))
{
c->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
}
WaveNumber = 0;
DoUpdateWorldState(WORLD_STATE_HOR_COUNTER, 0);
@@ -712,7 +713,6 @@ public:
case GO_FRONT_DOOR:
return GO_FrontDoorGUID;
}
return ObjectGuid::Empty;
}
@@ -772,7 +772,6 @@ public:
++ur;
}
}
if (bFinished5Waves)
{
for (; WaveNumber < 4; ++WaveNumber)
@@ -860,9 +859,7 @@ public:
num_to_activate = 3;
else if (WaveNumber <= 4)
num_to_activate = 4;
reqKillCount += num_to_activate;
for (uint8 i = 0; i < num_to_activate; ++i)
{
uint32 entry = chosenComposition[WaveNumber - (WaveNumber > 5 ? 2 : 1)][i];
@@ -910,7 +907,6 @@ public:
c->StopMovingOnCurrentPos();
}
memset(&TrashActive, 0, sizeof(TrashActive));
if (Creature* falric = instance->GetCreature(NPC_FalricGUID))
falric->AI()->EnterEvadeMode();
if (Creature* marwyn = instance->GetCreature(NPC_MarwynGUID))
@@ -1014,7 +1010,6 @@ public:
if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn))
a->SetDuration(8000);
}
pMarwyn->AI()->Talk(EMOTE_MARWYN_INTRO_SPIRIT);
}
++ResumeFirstEventStep;
@@ -1035,7 +1030,6 @@ public:
}
}
}
SetData(ACTION_SHOW_TRASH, 1);
ResumeFirstEventStep = 0;
ResumeFirstEventTimer = 0;
@@ -1057,7 +1051,6 @@ public:
else
ResumeFirstEventTimer -= diff;
}
if (outroStep)
{
if (outroTimer <= diff)
@@ -1153,7 +1146,6 @@ public:
if (StairsPos[index][i].GetPositionX())
if (GameObject* go = leader->SummonGameObject(TeamIdInInstance == TEAM_ALLIANCE ? GO_STAIRS_ALLIANCE : GO_STAIRS_HORDE, StairsPos[index][i].GetPositionX(), StairsPos[index][i].GetPositionY(), StairsPos[index][i].GetPositionZ(), StairsPos[index][i].GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 86400, false))
go->SetGameObjectFlag(GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE);
//Position pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyPortalPos : HordePortalPos;
//leader->SummonGameObject(GO_PORTAL_TO_DALARAN, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 86400);
//pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyChestPos : HordeChestPos;
@@ -1169,6 +1161,7 @@ public:
{
c->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
c->GetMotionMaster()->MovePoint(0, WalkCaveInPos);
c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); // need gossip ID 10931
}
++outroStep;
outroTimer = 6000;