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_2,
EVENT_PRE_INTRO_3, EVENT_PRE_INTRO_3,
EVENT_TALK_LEADER_1,
EVENT_EMOTE_LEADER_1,
EVENT_START_INTRO, EVENT_START_INTRO,
EVENT_SKIP_INTRO, EVENT_SKIP_INTRO,
EVENT_LORALEN_MOVE_1,
EVENT_LORALEN_MOVE_2,
EVENT_INTRO_A2_1, EVENT_INTRO_A2_1,
EVENT_INTRO_A2_2, EVENT_INTRO_A2_2,
@@ -51,7 +56,10 @@ enum Events
EVENT_INTRO_H2_1, EVENT_INTRO_H2_1,
EVENT_INTRO_H2_2, EVENT_INTRO_H2_2,
EVENT_INTRO_H2_2_1,
EVENT_INTRO_H2_3, EVENT_INTRO_H2_3,
EVENT_INTRO_H2_3_1,
EVENT_INTRO_H2_3_2,
EVENT_INTRO_H2_4, EVENT_INTRO_H2_4,
EVENT_INTRO_H2_5, EVENT_INTRO_H2_5,
EVENT_INTRO_H2_6, EVENT_INTRO_H2_6,
@@ -65,20 +73,31 @@ enum Events
EVENT_INTRO_H2_14, EVENT_INTRO_H2_14,
EVENT_INTRO_H2_15, EVENT_INTRO_H2_15,
//BATTLE SYLVANAS X LK//
BATTLE_SYLVANAS_PART1,
EVENT_INTRO_LK_1, EVENT_INTRO_LK_1,
EVENT_INTRO_LK_1_1,
EVENT_INTRO_LK_1_2, EVENT_INTRO_LK_1_2,
EVENT_INTRO_LK_1_3, EVENT_INTRO_LK_1_3,
EVENT_INTRO_LK_2, EVENT_INTRO_LK_2,
EVENT_INTRO_LK_2_1,
EVENT_INTRO_LK_3, EVENT_INTRO_LK_3,
EVENT_INTRO_LK_4, EVENT_INTRO_LK_4,
EVENT_INTRO_LK_4_2, EVENT_INTRO_LK_4_2,
EVENT_INTRO_LK_4_3, EVENT_INTRO_LK_4_3,
EVENT_INTRO_LK_5, EVENT_INTRO_LK_5,
EVENT_INTRO_LK_5_1,
EVENT_INTRO_LK_5_2, EVENT_INTRO_LK_5_2,
EVENT_INTRO_LK_5_3,
EVENT_INTRO_LK_6, EVENT_INTRO_LK_6,
EVENT_INTRO_LK_7, EVENT_INTRO_LK_7,
EVENT_INTRO_LK_8, EVENT_INTRO_LK_8,
EVENT_INTRO_LK_9, 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,
EVENT_INTRO_END_SET, EVENT_INTRO_END_SET,
@@ -92,6 +111,18 @@ enum Gossips
GOSSIP_OPTION_START = 0, GOSSIP_OPTION_START = 0,
GOSSIP_OPTION_START_SKIP = 1, 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 class npc_hor_leader : public CreatureScript
{ {
@@ -198,7 +229,9 @@ public:
first = false; first = false;
events.ScheduleEvent(EVENT_PRE_INTRO_1, 10s); events.ScheduleEvent(EVENT_PRE_INTRO_1, 10s);
events.ScheduleEvent(EVENT_PRE_INTRO_2, 11s); 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 void UpdateAI(uint32 diff) override
{ {
events.Update(diff); events.Update(diff);
switch(events.ExecuteEvent()) switch (events.ExecuteEvent())
{ {
case EVENT_PRE_INTRO_1: case EVENT_PRE_INTRO_1:
if (pInstance) if (pInstance)
{ {
me->SetSheath(SHEATH_STATE_MELEE);
me->SetVisible(true); me->SetVisible(true);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->SetVisible(true);
} }
break; break;
case EVENT_PRE_INTRO_2: case EVENT_PRE_INTRO_2:
if (me->GetEntry() == NPC_JAINA_PART1) if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_1); Talk(SAY_JAINA_INTRO_1);
}
me->GetMotionMaster()->MovePoint(0, SpawnPos); me->GetMotionMaster()->MovePoint(0, SpawnPos);
break; 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: case EVENT_PRE_INTRO_3:
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); 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->SetSheath(SHEATH_STATE_MELEE);
me->SetFacingTo(0.89f);
break; break;
case EVENT_START_INTRO: case EVENT_START_INTRO:
shortver = false; shortver = false;
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->GetMotionMaster()->MovePoint(0, MoveThronePos); me->GetMotionMaster()->MovePoint(0, MoveThronePos);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->GetMotionMaster()->MovePoint(0, LoralenFollowPos); {
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. // Begining of intro is differents between factions as the speech sequence and timers are differents.
if (me->GetEntry() == NPC_JAINA_PART1) if (me->GetEntry() == NPC_JAINA_PART1)
{
events.ScheduleEvent(EVENT_INTRO_A2_1, 10s); events.ScheduleEvent(EVENT_INTRO_A2_1, 10s);
}
else 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; break;
case EVENT_SKIP_INTRO: case EVENT_SKIP_INTRO:
shortver = true; shortver = true;
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, (me->GetEntry() == NPC_JAINA_PART1 ? EMOTE_STATE_READY2H : EMOTE_STATE_READY1H)); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, (me->GetEntry() == NPC_JAINA_PART1 ? EMOTE_STATE_READY2H : EMOTE_STATE_READY1H));
me->GetMotionMaster()->MovePoint(0, MoveThronePos); me->GetMotionMaster()->MovePoint(0, MoveThronePos);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
c->GetMotionMaster()->MovePoint(0, LoralenFollowPos); {
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
}
events.ScheduleEvent(EVENT_INTRO_LK_1, 0ms); events.ScheduleEvent(EVENT_INTRO_LK_1, 0ms);
break; break;
@@ -272,7 +328,7 @@ public:
case EVENT_INTRO_A2_3: case EVENT_INTRO_A2_3:
pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true); pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true);
me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, 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); events.ScheduleEvent(EVENT_INTRO_A2_4, 10s);
break; break;
case EVENT_INTRO_A2_4: case EVENT_INTRO_A2_4:
@@ -287,8 +343,10 @@ public:
break; break;
case EVENT_INTRO_A2_5: case EVENT_INTRO_A2_5:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_1); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
events.ScheduleEvent(EVENT_INTRO_A2_6, 3s); events.ScheduleEvent(EVENT_INTRO_A2_6, 3s);
}
break; break;
case EVENT_INTRO_A2_6: case EVENT_INTRO_A2_6:
Talk(SAY_JAINA_INTRO_5); Talk(SAY_JAINA_INTRO_5);
@@ -296,7 +354,9 @@ public:
break; break;
case EVENT_INTRO_A2_7: case EVENT_INTRO_A2_7:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_2); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
}
events.ScheduleEvent(EVENT_INTRO_A2_8, 6500ms); events.ScheduleEvent(EVENT_INTRO_A2_8, 6500ms);
break; break;
case EVENT_INTRO_A2_8: case EVENT_INTRO_A2_8:
@@ -305,7 +365,9 @@ public:
break; break;
case EVENT_INTRO_A2_9: case EVENT_INTRO_A2_9:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_3); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
}
events.ScheduleEvent(EVENT_INTRO_A2_10, 9s); events.ScheduleEvent(EVENT_INTRO_A2_10, 9s);
break; break;
case EVENT_INTRO_A2_10: case EVENT_INTRO_A2_10:
@@ -314,7 +376,9 @@ public:
break; break;
case EVENT_INTRO_A2_11: case EVENT_INTRO_A2_11:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_4); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
}
events.ScheduleEvent(EVENT_INTRO_A2_12, 11s); events.ScheduleEvent(EVENT_INTRO_A2_12, 11s);
break; break;
case EVENT_INTRO_A2_12: case EVENT_INTRO_A2_12:
@@ -323,7 +387,9 @@ public:
break; break;
case EVENT_INTRO_A2_13: case EVENT_INTRO_A2_13:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_5); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
}
events.ScheduleEvent(EVENT_INTRO_A2_14, 12s + 500ms); events.ScheduleEvent(EVENT_INTRO_A2_14, 12s + 500ms);
break; break;
case EVENT_INTRO_A2_14: case EVENT_INTRO_A2_14:
@@ -332,7 +398,9 @@ public:
break; break;
case EVENT_INTRO_A2_15: case EVENT_INTRO_A2_15:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_6); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
}
events.ScheduleEvent(EVENT_INTRO_A2_16, 24s); events.ScheduleEvent(EVENT_INTRO_A2_16, 24s);
break; break;
case EVENT_INTRO_A2_16: case EVENT_INTRO_A2_16:
@@ -347,7 +415,7 @@ public:
case EVENT_INTRO_A2_18: case EVENT_INTRO_A2_18:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) 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); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
} }
events.ScheduleEvent(EVENT_INTRO_A2_19, 11s); events.ScheduleEvent(EVENT_INTRO_A2_19, 11s);
@@ -358,77 +426,131 @@ public:
break; break;
// H2 Intro Events // H2 Intro Events
case EVENT_INTRO_H2_2: case EVENT_LORALEN_MOVE_1:
Talk(SAY_SYLVANAS_INTRO_2); if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
events.ScheduleEvent(EVENT_INTRO_H2_3, 6s); {
pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos);
}
break; 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); 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); pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true);
me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true); events.ScheduleEvent(EVENT_INTRO_H2_3_2, 3s);
me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false); break;
events.ScheduleEvent(EVENT_INTRO_H2_4, 6s);
case EVENT_INTRO_H2_3_2:
me->RemoveAurasDueToSpell(SPELL_SUMMON_SOULS);
events.ScheduleEvent(EVENT_INTRO_H2_4, 2s);
break; break;
case EVENT_INTRO_H2_4: case EVENT_INTRO_H2_4:
if (Creature* pUther = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_UTHER)))
{ {
pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
pUther->SetVisible(true); pUther->SetVisible(true);
if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther)) if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther))
{
a->SetDuration(8000); a->SetDuration(8000);
} }
events.ScheduleEvent(EVENT_INTRO_H2_5, 2s); }
events.ScheduleEvent(EVENT_INTRO_H2_5, 7s);
break; break;
case EVENT_INTRO_H2_5: case EVENT_INTRO_H2_5:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_1); pUther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
}
events.ScheduleEvent(EVENT_INTRO_H2_6, 11s); events.ScheduleEvent(EVENT_INTRO_H2_6, 11s);
break; break;
case EVENT_INTRO_H2_6: case EVENT_INTRO_H2_6:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_4); Talk(SAY_SYLVANAS_INTRO_4);
events.ScheduleEvent(EVENT_INTRO_H2_7, 3s); events.ScheduleEvent(EVENT_INTRO_H2_7, 2s + 500ms);
break; break;
case EVENT_INTRO_H2_7: case EVENT_INTRO_H2_7:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_2); pUther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
events.ScheduleEvent(EVENT_INTRO_H2_8, 6s); }
events.ScheduleEvent(EVENT_INTRO_H2_8, 9s);//
break; break;
case EVENT_INTRO_H2_8: case EVENT_INTRO_H2_8:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_5); Talk(SAY_SYLVANAS_INTRO_5);
events.ScheduleEvent(EVENT_INTRO_H2_9, 5s); events.ScheduleEvent(EVENT_INTRO_H2_9, 5s);
break; break;
case EVENT_INTRO_H2_9: case EVENT_INTRO_H2_9:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_3); pUther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
events.ScheduleEvent(EVENT_INTRO_H2_10, 19s); }
events.ScheduleEvent(EVENT_INTRO_H2_10, 20s);
break; break;
case EVENT_INTRO_H2_10: case EVENT_INTRO_H2_10:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
Talk(SAY_SYLVANAS_INTRO_6); Talk(SAY_SYLVANAS_INTRO_6);
events.ScheduleEvent(EVENT_INTRO_H2_11, 1500ms); events.ScheduleEvent(EVENT_INTRO_H2_11, 3s);
break; break;
case EVENT_INTRO_H2_11: case EVENT_INTRO_H2_11:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_4); 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; break;
case EVENT_INTRO_H2_12: case EVENT_INTRO_H2_12:
me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
Talk(SAY_SYLVANAS_INTRO_7); Talk(SAY_SYLVANAS_INTRO_7);
events.ScheduleEvent(EVENT_INTRO_H2_13, 2s); events.ScheduleEvent(EVENT_INTRO_H2_13, 3s + 500ms);
break; break;
case EVENT_INTRO_H2_13: case EVENT_INTRO_H2_13:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) 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); pUther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
} }
events.ScheduleEvent(EVENT_INTRO_H2_14, 12s); events.ScheduleEvent(EVENT_INTRO_H2_14, 12s + 500ms);
break; break;
case EVENT_INTRO_H2_14: case EVENT_INTRO_H2_14:
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_6); pUther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
}
events.ScheduleEvent(EVENT_INTRO_H2_15, 8s); events.ScheduleEvent(EVENT_INTRO_H2_15, 8s);
break; break;
case EVENT_INTRO_H2_15: case EVENT_INTRO_H2_15:
me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
Talk(SAY_SYLVANAS_INTRO_8); Talk(SAY_SYLVANAS_INTRO_8);
events.ScheduleEvent(EVENT_INTRO_LK_1, 2s); events.ScheduleEvent(EVENT_INTRO_LK_1, 2s);
break; break;
@@ -437,29 +559,46 @@ public:
case EVENT_INTRO_LK_1: case EVENT_INTRO_LK_1:
if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_EVENT))) if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{ {
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true);
pLichKing->SetVisible(true); pLichKing->SetVisible(true);
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, false);
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveMidlelThronePos, false);
} }
if (!shortver) if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{ {
pUther->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
if (me->GetEntry() == NPC_JAINA_PART1) if (me->GetEntry() == NPC_JAINA_PART1)
pUther->AI()->Talk(SAY_UTHER_INTRO_A2_9); pUther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
else else
pUther->AI()->Talk(SAY_UTHER_INTRO_H2_7); 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_1_1, 9s);
events.ScheduleEvent(EVENT_INTRO_LK_2, 11s); 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; break;
case EVENT_INTRO_LK_1_2: case EVENT_INTRO_LK_1_2:
if (!shortver) if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER);
pUther->SetFacingTo(0.89f);
}
break; break;
case EVENT_INTRO_LK_1_3: case EVENT_INTRO_LK_1_3:
@@ -469,20 +608,38 @@ public:
case EVENT_INTRO_LK_2: case EVENT_INTRO_LK_2:
if (!shortver) if (!shortver)
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) 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); events.ScheduleEvent(EVENT_INTRO_LK_3, 2s);
break; break;
case EVENT_INTRO_LK_3: case EVENT_INTRO_LK_3:
if (!shortver) if (!shortver)
if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER)))
{
pUther->SetVisible(false); pUther->SetVisible(false);
events.ScheduleEvent(EVENT_INTRO_LK_4, 4s); }
events.ScheduleEvent(EVENT_INTRO_LK_4, 6s);
break; break;
case EVENT_INTRO_LK_4: case EVENT_INTRO_LK_4:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION);
pLichKing->AI()->Talk(SAY_LK_INTRO_2); pLichKing->AI()->Talk(SAY_LK_INTRO_2);
}
events.ScheduleEvent(EVENT_INTRO_LK_4_2, 10s); events.ScheduleEvent(EVENT_INTRO_LK_4_2, 10s);
break; break;
@@ -527,66 +684,132 @@ public:
a->SetDuration(8000); 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))) if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
pLichKing->AI()->Talk(SAY_LK_INTRO_3); pLichKing->AI()->Talk(SAY_LK_INTRO_3);
}
events.ScheduleEvent(EVENT_INTRO_LK_5_2, 5s);
events.ScheduleEvent(EVENT_INTRO_LK_6, 8s);
break; break;
case EVENT_INTRO_LK_5_2: case EVENT_INTRO_LK_5_2:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT)))
{
pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); 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; break;
case EVENT_INTRO_LK_6: case EVENT_INTRO_LK_6:
if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC)))
{
pFalric->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
pFalric->AI()->Talk(SAY_FALRIC_INTRO_1); pFalric->AI()->Talk(SAY_FALRIC_INTRO_1);
}
events.ScheduleEvent(EVENT_INTRO_LK_7, 2s); events.ScheduleEvent(EVENT_INTRO_LK_7, 2s);
break; break;
case EVENT_INTRO_LK_7: case EVENT_INTRO_LK_7:
if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN))) if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN)))
{
pMarwyn->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
pMarwyn->AI()->Talk(SAY_MARWYN_INTRO_1); pMarwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
}
events.ScheduleEvent(EVENT_INTRO_LK_8, 2s); events.ScheduleEvent(EVENT_INTRO_LK_8, 3s);
break; break;
case EVENT_INTRO_LK_8: case EVENT_INTRO_LK_8:
if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC)))
{
pFalric->AI()->Talk(SAY_FALRIC_INTRO_2); pFalric->AI()->Talk(SAY_FALRIC_INTRO_2);
pInstance->SetData(ACTION_SHOW_TRASH, 1); pInstance->SetData(ACTION_SHOW_TRASH, 1);
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true);
}
events.ScheduleEvent(EVENT_INTRO_LK_9, 5s); events.ScheduleEvent(EVENT_INTRO_LK_9, 6s);
break; break;
case EVENT_INTRO_LK_9: case EVENT_INTRO_LK_9:
if (me->GetEntry() == NPC_JAINA_PART1) if (me->GetEntry() == NPC_JAINA_PART1)
{
Talk(SAY_JAINA_INTRO_END); Talk(SAY_JAINA_INTRO_END);
}
else else
{
Talk(SAY_SYLVANAS_INTRO_END); Talk(SAY_SYLVANAS_INTRO_END);
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) }
c->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
events.ScheduleEvent(EVENT_INTRO_END, 14s); {
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; break;
case EVENT_INTRO_END: case EVENT_INTRO_END:
pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false); pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false);
pInstance->HandleGameObject(pInstance->GetGuidData(GO_FRONT_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; break;
case EVENT_INTRO_END_SET: case EVENT_INTRO_END_SET:
if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN)))
pLichKing->SetVisible(false); {
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) pLoralen->UpdatePosition(5369.71289f, 2083.6330f, 707.695129f, 0.188739f, true);
c->SetVisible(false); pLoralen->StopMovingOnCurrentPos();
me->SetVisible(false); pLoralen->SetVisible(true);
pLoralen->KillSelf(pLoralen);
}
pInstance->SetData(DATA_INTRO, DONE); pInstance->SetData(DATA_INTRO, DONE);
break; break;
} }
@@ -1391,6 +1614,10 @@ enum eFightEvents
{ {
EVENT_EMPTY = 0, EVENT_EMPTY = 0,
EVENT_LK_SAY_AGGRO, 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_JAINA_IMMOBILIZE_LK,
EVENT_SYLVANAS_IMMOBILIZE_JUMP, EVENT_SYLVANAS_IMMOBILIZE_JUMP,
EVENT_SYLVANAS_DARK_BINDING, EVENT_SYLVANAS_DARK_BINDING,
@@ -1444,7 +1671,6 @@ public:
events.Reset(); events.Reset();
events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s); events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s);
} }
void DoAction(int32 a) override void DoAction(int32 a) override
{ {
if (a == ACTION_START_LK_FIGHT_REAL) if (a == ACTION_START_LK_FIGHT_REAL)
@@ -1463,7 +1689,6 @@ public:
} }
else else
me->RemoveAura(SPELL_REMORSELESS_WINTER); me->RemoveAura(SPELL_REMORSELESS_WINTER);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2))) if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2)))
c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED); c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED);
} }
@@ -1480,9 +1705,10 @@ public:
{ {
Talk(SAY_LK_IW_1); Talk(SAY_LK_IW_1);
me->SetOrientation(4.15f); 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); events.ScheduleEvent(EVENT_LK_REMORSELESS_WINTER, 4s);
} }
} }
@@ -1496,6 +1722,7 @@ public:
void JustSummoned(Creature* s) override void JustSummoned(Creature* s) override
{ {
++reqKillCount; ++reqKillCount;
if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100)) if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100))
events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s); events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s);
@@ -1583,7 +1810,7 @@ public:
me->CastSpell((Unit*)nullptr, SPELL_FURY_OF_FROSTMOURNE, false); me->CastSpell((Unit*)nullptr, SPELL_FURY_OF_FROSTMOURNE, false);
} }
break; 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); me->SetSpeed(MOVE_RUN, 9.0f / 7.0f);
Movement::PointsArray path; Movement::PointsArray path;
@@ -1703,6 +1930,7 @@ public:
pInstance = me->GetInstanceScript(); pInstance = me->GetInstanceScript();
if (!pInstance) if (!pInstance)
me->IsAIEnabled = false; me->IsAIEnabled = false;
} }
InstanceScript* pInstance; InstanceScript* pInstance;
@@ -1714,13 +1942,16 @@ public:
currentStopPoint = 0; currentStopPoint = 0;
events.Reset(); events.Reset();
} }
void DoAction(int32 actionId) override void DoAction(int32 actionId) override
{ {
switch(actionId) switch(actionId)
{ {
case ACTION_START_INTRO: case ACTION_START_INTRO:
events.ScheduleEvent(EVENT_LK_SAY_AGGRO, 0ms); 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; break;
case ACTION_START_LK_FIGHT_REAL: case ACTION_START_LK_FIGHT_REAL:
events.ScheduleEvent(EVENT_START_RUN, 0ms); events.ScheduleEvent(EVENT_START_RUN, 0ms);
@@ -1741,8 +1972,11 @@ public:
void MoveToNextStopPoint() void MoveToNextStopPoint()
{ {
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->InterruptNonMeleeSpells(true); me->InterruptNonMeleeSpells(true);
me->SetSheath(SHEATH_STATE_MELEE);
++currentStopPoint; ++currentStopPoint;
me->SetWalk(false);
Movement::PointsArray path; Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); 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) for (uint8 i = WP_STOP[currentStopPoint - 1] + (currentStopPoint == 1 ? 0 : 1); i <= WP_STOP[currentStopPoint]; ++i)
@@ -1762,43 +1996,72 @@ public:
switch(events.ExecuteEvent()) switch(events.ExecuteEvent())
{ {
case EVENT_LK_SAY_AGGRO: case EVENT_LK_SAY_AGGRO:
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->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); 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; break;
case EVENT_JAINA_IMMOBILIZE_LK: 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->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); events.ScheduleEvent(EVENT_SAY_LEAVE, 5s);
} }
break; break;
case EVENT_SYLVANAS_IMMOBILIZE_JUMP: 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->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
me->KnockbackFrom(c->GetPositionX(), c->GetPositionY(), 10.0f, 3.0f); me->KnockbackFrom(lkboss->GetPositionX(), lkboss->GetPositionY(), 34.3f, 4.0f);
events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 1500ms); events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 2s +500ms);
} }
break; break;
case EVENT_SYLVANAS_DARK_BINDING: case EVENT_SYLVANAS_DARK_BINDING:
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
me->CastSpell(c, SPELL_SYLVANAS_DARK_BINDING, false); me->CastSpell(lkboss, SPELL_SYLVANAS_DARK_BINDING, false);
events.ScheduleEvent(EVENT_SAY_LEAVE, 3500ms); events.ScheduleEvent(EVENT_SAY_LEAVE, 2s);
break; break;
case EVENT_SAY_LEAVE: case EVENT_SAY_LEAVE:
{ {
Map::PlayerList const& pl = pInstance->instance->GetPlayers(); Map::PlayerList const& pl = pInstance->instance->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* p = itr->GetSource()) 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); 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); me->GetMotionMaster()->MovePoint(0, LeaderEscapePos);
events.ScheduleEvent(EVENT_ADD_GOSSIP, 8s); events.ScheduleEvent(EVENT_ADD_GOSSIP, 7s);
} }
break; break;
case EVENT_ADD_GOSSIP: case EVENT_ADD_GOSSIP:
@@ -1811,12 +2074,12 @@ public:
pInstance->SetData(ACTION_START_LK_FIGHT, 1); pInstance->SetData(ACTION_START_LK_FIGHT, 1);
me->setActive(true); me->setActive(true);
MoveToNextStopPoint(); 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); lkboss->setActive(true);
c->SetInCombatWithZone(); lkboss->SetInCombatWithZone();
c->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING); lkboss->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING);
c->AI()->DoAction(ACTION_START_LK_FIGHT_REAL); lkboss->AI()->DoAction(ACTION_START_LK_FIGHT_REAL);
} }
} }
break; break;
@@ -1855,6 +2118,7 @@ public:
Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_ESCAPE_01 : SAY_SYLVANA_ESCAPE_01); Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_ESCAPE_01 : SAY_SYLVANA_ESCAPE_01);
break; break;
} }
DoMeleeAttackIfReady();
} }
}; };
}; };
@@ -1898,8 +2162,8 @@ public:
{ {
me->SetCorpseDelay(10); me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
} }
}; };
@@ -1967,8 +2231,10 @@ public:
{ {
me->SetCorpseDelay(10); me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); {
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)) if (me->GetVictim() && me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim()) && !me->HasUnitState(UNIT_STATE_CASTING))
{
me->CastSpell(me->GetVictim(), 40505, false); me->CastSpell(me->GetVictim(), 40505, false);
}
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -2032,8 +2299,10 @@ public:
{ {
me->SetCorpseDelay(10); me->SetCorpseDelay(10);
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* pInstance = me->GetInstanceScript())
if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS)))
lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); {
lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
}
} }
}; };
@@ -2057,8 +2326,10 @@ public:
PreventDefaultAction(); PreventDefaultAction();
if (Unit* caster = GetCaster()) 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)) 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); c->CastSpell((Unit*)nullptr, 70021, true);
} }
}
void Register() override void Register() override
{ {
@@ -50,6 +50,7 @@ enum Data
ACTION_STOP_LK_FIGHT, ACTION_STOP_LK_FIGHT,
ACTION_DELETE_ICE_WALL, ACTION_DELETE_ICE_WALL,
DATA_WAVE_NUMBER, DATA_WAVE_NUMBER,
DATA_LK_BATTLE,// in progress
}; };
enum Creatures enum Creatures
@@ -84,6 +85,7 @@ enum Creatures
NPC_SKY_REAVER_KORM_BLACKSKAR = 30824, NPC_SKY_REAVER_KORM_BLACKSKAR = 30824,
NPC_ALTAR_BUNNY = 37704, NPC_ALTAR_BUNNY = 37704,
NPC_QUEL_DELAR = 37158, NPC_QUEL_DELAR = 37158,
}; };
enum GameObjects enum GameObjects
@@ -263,8 +265,14 @@ enum hMisc
SPELL_HOR_START_QUEST_ALLY = 71351, SPELL_HOR_START_QUEST_ALLY = 71351,
SPELL_HOR_START_QUEST_HORDE = 71542, SPELL_HOR_START_QUEST_HORDE = 71542,
SPELL_SHADOWMOURNE_VISUAL = 72523, SPELL_SHADOWMOURNE_VISUAL = 72523,
SPELL_ARCANE_CAST_VISUAL = 65633, SPELL_UTHER_DESPAWN = 70693, //Sniffed
SPELL_WELL_OF_SOULS_VISUAL = 72630, 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 // Frostsworn General
EVENT_ACTIVATE_REFLECTIONS = 1, 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 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 SpawnPos = {5263.22412f, 1950.95544f, 707.695862f, 0.808736f}; // Jaina/Sylvanas Beginning Position
const Position LoralenFollowPos = {5283.234863f, 1990.946777f, 707.695679f, 0.929097f}; const Position LoralenMidleFollowPos = {5274.25634f, 1976.04760f, 707.694763f, 0.929097f}; // Sniffed
const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne const Position LoralenFollowPos = {5283.29296f, 1992.43078f, 707.694763f, 0.549238f}; // Sniffed
const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f}; 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 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 LichKingMoveMidlelThronePos = {5333.48437f, 2032.02648f, 707.695679f, 3.973301f}; // Lich King moves and hits Uther [sniff]
const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away 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 FalricMovePos = {5284.161133f, 2030.691650f, 709.319336f, 5.489386f};
const Position MarwynMovePos = {5335.330078f, 1982.376221f, 709.319580f, 2.339942f}; 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 = {5576.80566f, 2235.55004f, 733.012268f, 2.782125f}; //Sniff
const Position LeaderEscapePos = {5577.654785f, 2235.347412f, 733.011230f, 2.359576f};
const Position ShipMasterSummonPos = {5262.773926f, 1669.980103f, 715.000000f, 0.000000f}; const Position ShipMasterSummonPos = {5262.773926f, 1669.980103f, 715.000000f, 0.000000f};
const Position WalkCaveInPos = {5267.594238f, 1678.750000f, 784.302856f, 1.041739f}; const Position WalkCaveInPos = {5267.594238f, 1678.750000f, 784.302856f, 1.041739f};
const Position AllyPortalPos = {5205.015625f, 1605.680298f, 806.444458f, 0.884375f}; const Position AllyPortalPos = {5205.015625f, 1605.680298f, 806.444458f, 0.884375f};
@@ -230,6 +230,7 @@ public:
{ {
case NPC_SYLVANAS_PART1: case NPC_SYLVANAS_PART1:
creature->SetVisible(false); creature->SetVisible(false);
creature->SetSpeed(MOVE_RUN, 1.1);
NPC_LeaderIntroGUID = creature->GetGUID(); NPC_LeaderIntroGUID = creature->GetGUID();
if (TeamIdInInstance == TEAM_ALLIANCE) if (TeamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART1); creature->UpdateEntry(NPC_JAINA_PART1);
@@ -296,12 +297,8 @@ public:
creature->SetVisible(false); creature->SetVisible(false);
if (!(EncounterMask & (1 << DATA_LK_INTRO))) if (!(EncounterMask & (1 << DATA_LK_INTRO)))
{ {
creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); //the fight cannot be in the form of an emote, it is causing bugs
if (TeamIdInInstance != TEAM_ALLIANCE) creature->CastSpell(creature, SPELL_SOUL_REAPER, true);
{
creature->StopMoving();
creature->SetFacingTo(creature->GetAngle(&SylvanasFightPos));
}
} }
else if (!(EncounterMask & (1 << DATA_LICH_KING))) else if (!(EncounterMask & (1 << DATA_LICH_KING)))
creature->AddAura(TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING, creature); creature->AddAura(TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING, creature);
@@ -316,22 +313,20 @@ public:
if (!creature->IsAlive()) if (!creature->IsAlive())
creature->Respawn(); creature->Respawn();
NPC_LeaderGUID = creature->GetGUID(); NPC_LeaderGUID = creature->GetGUID();
creature->SetWalk(false);
creature->SetSheath(SHEATH_STATE_MELEE);
if (TeamIdInInstance == TEAM_ALLIANCE) if (TeamIdInInstance == TEAM_ALLIANCE)
creature->UpdateEntry(NPC_JAINA_PART2); creature->UpdateEntry(NPC_JAINA_PART2);
creature->SetWalk(false);
creature->SetHealth(creature->GetMaxHealth() / 20); creature->SetHealth(creature->GetMaxHealth() / 20);
if (!(EncounterMask & (1 << DATA_FROSTSWORN_GENERAL))) if (!(EncounterMask & (1 << DATA_FROSTSWORN_GENERAL)))
creature->SetVisible(false); creature->SetVisible(false);
if (!(EncounterMask & (1 << DATA_LK_INTRO))) 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->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); 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))) else if (!(EncounterMask & (1 << DATA_LICH_KING)))
{ {
@@ -346,6 +341,7 @@ public:
creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true); creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true);
creature->StopMovingOnCurrentPos(); creature->StopMovingOnCurrentPos();
} }
creature->SetSheath(SHEATH_STATE_MELEE);
creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
break; break;
case NPC_ICE_WALL_TARGET: case NPC_ICE_WALL_TARGET:
@@ -444,8 +440,13 @@ public:
if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID)) if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID))
{ {
c->SetVisible(true); c->SetVisible(true);
c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
c->SetReactState(REACT_AGGRESSIVE); c->SetReactState(REACT_AGGRESSIVE);
} }
if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID))
{
c->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
}
WaveNumber = 0; WaveNumber = 0;
DoUpdateWorldState(WORLD_STATE_HOR_COUNTER, 0); DoUpdateWorldState(WORLD_STATE_HOR_COUNTER, 0);
@@ -712,7 +713,6 @@ public:
case GO_FRONT_DOOR: case GO_FRONT_DOOR:
return GO_FrontDoorGUID; return GO_FrontDoorGUID;
} }
return ObjectGuid::Empty; return ObjectGuid::Empty;
} }
@@ -772,7 +772,6 @@ public:
++ur; ++ur;
} }
} }
if (bFinished5Waves) if (bFinished5Waves)
{ {
for (; WaveNumber < 4; ++WaveNumber) for (; WaveNumber < 4; ++WaveNumber)
@@ -860,9 +859,7 @@ public:
num_to_activate = 3; num_to_activate = 3;
else if (WaveNumber <= 4) else if (WaveNumber <= 4)
num_to_activate = 4; num_to_activate = 4;
reqKillCount += num_to_activate; reqKillCount += num_to_activate;
for (uint8 i = 0; i < num_to_activate; ++i) for (uint8 i = 0; i < num_to_activate; ++i)
{ {
uint32 entry = chosenComposition[WaveNumber - (WaveNumber > 5 ? 2 : 1)][i]; uint32 entry = chosenComposition[WaveNumber - (WaveNumber > 5 ? 2 : 1)][i];
@@ -910,7 +907,6 @@ public:
c->StopMovingOnCurrentPos(); c->StopMovingOnCurrentPos();
} }
memset(&TrashActive, 0, sizeof(TrashActive)); memset(&TrashActive, 0, sizeof(TrashActive));
if (Creature* falric = instance->GetCreature(NPC_FalricGUID)) if (Creature* falric = instance->GetCreature(NPC_FalricGUID))
falric->AI()->EnterEvadeMode(); falric->AI()->EnterEvadeMode();
if (Creature* marwyn = instance->GetCreature(NPC_MarwynGUID)) if (Creature* marwyn = instance->GetCreature(NPC_MarwynGUID))
@@ -1014,7 +1010,6 @@ public:
if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn)) if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn))
a->SetDuration(8000); a->SetDuration(8000);
} }
pMarwyn->AI()->Talk(EMOTE_MARWYN_INTRO_SPIRIT); pMarwyn->AI()->Talk(EMOTE_MARWYN_INTRO_SPIRIT);
} }
++ResumeFirstEventStep; ++ResumeFirstEventStep;
@@ -1035,7 +1030,6 @@ public:
} }
} }
} }
SetData(ACTION_SHOW_TRASH, 1); SetData(ACTION_SHOW_TRASH, 1);
ResumeFirstEventStep = 0; ResumeFirstEventStep = 0;
ResumeFirstEventTimer = 0; ResumeFirstEventTimer = 0;
@@ -1057,7 +1051,6 @@ public:
else else
ResumeFirstEventTimer -= diff; ResumeFirstEventTimer -= diff;
} }
if (outroStep) if (outroStep)
{ {
if (outroTimer <= diff) if (outroTimer <= diff)
@@ -1153,7 +1146,6 @@ public:
if (StairsPos[index][i].GetPositionX()) 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)) 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); go->SetGameObjectFlag(GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE);
//Position pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyPortalPos : HordePortalPos; //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); //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; //pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyChestPos : HordeChestPos;
@@ -1169,6 +1161,7 @@ public:
{ {
c->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); c->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
c->GetMotionMaster()->MovePoint(0, WalkCaveInPos); c->GetMotionMaster()->MovePoint(0, WalkCaveInPos);
c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); // need gossip ID 10931
} }
++outroStep; ++outroStep;
outroTimer = 6000; outroTimer = 6000;