TrinityCore
halls_of_reflection.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "halls_of_reflection.h"
19#include "Creature.h"
20#include "EventProcessor.h"
21#include "InstanceScript.h"
22#include "MotionMaster.h"
23#include "MoveSplineInit.h"
24#include "ObjectAccessor.h"
25#include "ObjectGuid.h"
26#include "Player.h"
27#include "ScriptedCreature.h"
28#include "ScriptedGossip.h"
29#include "ScriptMgr.h"
30#include "SpellInfo.h"
31#include "SpellScript.h"
32#include "TemporarySummon.h"
33#include "Transport.h"
34#include "Unit.h"
35
36enum Text
37{
50
60
77
83
92
95
97
108
111
114
116{
121
141
157
169
171
190
195
200
202{
205
207
211
216
218{
219 // Misc
224 SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
226
227 // Jaina, Sylvanas
228 SPELL_CAST_VISUAL = 65633, // wrong
231 SPELL_JAINA_ICE_BARRIER = 69787, // Jaina Ice Barrier
232 SPELL_JAINA_ICE_PRISON = 69708, // Jaina Ice Prison
234 SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188, // Sylvanas Cloak of Darkness
235 SPELL_SYLVANAS_DARK_BINDING = 70194, // Sylvanas Dark Binding
237 SPELL_SYLVANAS_BLINDING_RETREAT = 70199, // Sylvanas Blinding Retreat
238
239 // Lich King
240 SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
241 SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
242 SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of Frostmourne
246 SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning
247 SPELL_PAIN_AND_SUFFERING = 74115, // Lich King Pain and Suffering
248 SPELL_STUN_BREAK_JAINA = 69764, // Lich King visual spell, another Stun Break is 69763, should remove the stun effect
250 SPELL_HARVEST_SOUL = 69866, // Lich King Harvest Soul
251
252 // Koreln, Loralen
254
255 // Raging Ghoul
258
259 // Risen Witch Doctor
264
265 // Lumbering Abomination
267 SPELL_VOMIT_SPRAY = 70176
269
271{
275
277{
278 { 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room
279 { 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route
280 { 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking
281 { 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall
282 { 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall
283 { 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall
284 { 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall
285 { 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed)
286 { 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed)
287};
288
289constexpr Position LichKingMoveAwayPos = { 5400.069824f, 2102.7131689f, 707.69525f, 0.843803f }; // Lich King walks away
290constexpr Position LichKingFirstSummon = { 5600.076172f, 2192.270996f, 731.750488f, 4.330935f }; // Lich King First summons
291//constexpr Position JainaSylvanasShadowThroneDoor = { 5577.243f, 2235.852f, 733.0128f, 2.209562f }; // Jaina/Sylvanas move to door
292constexpr Position LichKingFinalPos = { 5283.742188f, 1706.335693f, 783.293518f, 4.138510f }; // Lich King Final Pos
293
294// sniffed
296{
297 { 5253.061f, 1953.616f, 707.6948f, 0.8377581f },
298 { 5283.226f, 1992.300f, 707.7445f, 0.8377581f },
299 { 5360.711f, 2064.797f, 707.6948f, 0.0f }
300};
301
303{
304 { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
305 { 5263.2f, 1950.96f, 707.6948f, 0.8028514f }, // 1 - Move to Door
306 { 5306.82f, 1998.17f, 709.341f, 1.239184f }, // 2 - Move to Frostmourne
307};
308
310{
311 { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
312 { 5265.89f, 1952.98f, 707.6978f, 0.0f }, // 1 - Move to Door
313 { 5306.95f, 1998.49f, 709.3414f, 1.277278f } // 2 - Move to Frostmourne
314};
315
316constexpr Position UtherSpawnPos = { 5307.814f, 2003.168f, 709.4244f, 4.537856f };
317
319{
320 { 5362.463f, 2062.693f, 707.7781f, 3.944444f }, // 0 - Spawn
321 { 5332.83f, 2031.24f, 707.6948f, 0.0f }, // 1 - Door
322 { 5312.93f, 2010.24f, 709.34f, 0.0f }, // 2 - Move to Frostmourne
323 { 5319.028f, 2016.662f, 707.6948f, 0.0f }, // 3 - Move back
324 { 5332.285f, 2030.832f, 707.6948f, 0.0f }, // 4 - Move back 2
325 { 5355.488f, 2055.149f, 707.6907f, 0.0f } // 5 - Move back 3
326};
327
329{
330 { 5276.583f, 2037.45f, 709.4025f, 5.532694f }, // 0 - Spawn
331 { 5283.95f, 2030.53f, 709.3191f, 0.0f } // 1 - Intro
332};
333
335{
336 { 5342.232f, 1975.696f, 709.4025f, 2.391101f }, // 0 - Spawn
337 { 5335.01f, 1982.37f, 709.3191f, 0.0f } // 1 - Intro
338};
339
340constexpr Position SylvanasShadowThroneDoorPosition = { 5576.79f, 2235.73f, 733.0029f, 2.687807f };
341
343{
344 { 5547.833f, 2083.701f, 731.4332f, 1.029744f }, // 1st Icewall
345 { 5503.213f, 1969.547f, 737.0245f, 1.27409f }, // 2nd Icewall
346 { 5439.976f, 1879.005f, 752.7048f, 1.064651f }, // 3rd Icewall
347 { 5318.289f, 1749.184f, 771.9423f, 0.8726646f } // 4th Icewall
348};
349
351{
352 public:
353 npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { }
354
356 {
358 {
360 }
361
362 bool OnGossipHello(Player* player) override
363 {
364 // override default gossip
366 {
367 ClearGossipMenuFor(player);
368 return true;
369 }
370
371 // load default gossip
372 return false;
373 }
374
375 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
376 {
377 ClearGossipMenuFor(player);
378
379 switch (gossipListId)
380 {
381 case 0:
382 CloseGossipMenuFor(player);
385 break;
386 case 1:
387 CloseGossipMenuFor(player);
390 break;
391 default:
392 break;
393 }
394 return false;
395 }
396
397 void Reset() override
398 {
399 _events.Reset();
400
403
407 }
408
409 void UpdateAI(uint32 diff) override
410 {
411 _events.Update(diff);
412
413 switch (_events.ExecuteEvent())
414 {
417 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[0]);
418
420 {
424 }
425 else
426 {
430 }
431 break;
435 else
438 break;
441 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
442 // Begining of intro is differents between factions as the speech sequence and timers are differents.
444 {
447 }
448 else
449 {
452 }
453 break;
454 // A2 Intro Events
455 case EVENT_INTRO_A2_1:
458 break;
459 case EVENT_INTRO_A2_2:
462 break;
463 case EVENT_INTRO_A2_3:
468 break;
469 case EVENT_INTRO_A2_4:
471 _utherGUID = uther->GetGUID();
473 break;
474 case EVENT_INTRO_A2_5:
476 uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
478 break;
479 case EVENT_INTRO_A2_6:
482 break;
483 case EVENT_INTRO_A2_7:
485 uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
487 break;
488 case EVENT_INTRO_A2_8:
491 break;
492 case EVENT_INTRO_A2_9:
494 uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
496 break;
500 break;
503 uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
505 break;
509 break;
512 uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
514 break;
518 break;
521 uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
523 break;
526 uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
528 break;
532 break;
535 {
536 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
537 uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
538 }
540 break;
544 break;
545 // H2 Intro Events
546 case EVENT_INTRO_H2_1:
549 break;
550 case EVENT_INTRO_H2_2:
553 break;
554 case EVENT_INTRO_H2_3:
560 break;
561 case EVENT_INTRO_H2_4:
562 // spawn UTHER during speach 2
564 _utherGUID = uther->GetGUID();
566 break;
567 case EVENT_INTRO_H2_5:
569 uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
571 break;
572 case EVENT_INTRO_H2_6:
575 break;
576 case EVENT_INTRO_H2_7:
578 uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
580 break;
581 case EVENT_INTRO_H2_8:
584 break;
585 case EVENT_INTRO_H2_9:
587 uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
589 break;
593 break;
596 uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
598 break;
602 break;
605 {
606 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
607 uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
608 }
610 break;
613 uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
615 break;
619 break;
620 // Remaining Intro Events common for both faction
621 case EVENT_INTRO_LK_1:
622 // Spawn LK in front of door, and make him move to the sword.
624 {
625 lichking->SetWalk(true);
626 lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
627 _lichkingGUID = lichking->GetGUID();
630 }
632 {
633 uther->SetEmoteState(EMOTE_STATE_COWER);
635 uther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
636 else
637 uther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
638 }
640 break;
641 case EVENT_INTRO_LK_2:
643 lichking->AI()->Talk(SAY_LK_INTRO_1);
645 break;
646 case EVENT_INTRO_LK_3:
647 // The Lich King banishes Uther to the abyss.
649 {
650 uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
651 uther->DespawnOrUnsummon(5s);
653 }
655 break;
656 case EVENT_INTRO_LK_4:
657 // He steps forward and removes the runeblade from the heap of skulls.
659 {
661 frostmourne->SetLootState(GO_JUST_DEACTIVATED);
662 lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);
663 lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);
664 }
666 break;
667 case EVENT_INTRO_LK_5:
669 lichking->AI()->Talk(SAY_LK_INTRO_2);
671 break;
672 case EVENT_INTRO_LK_6:
673 // summon Falric and Marwyn. then go back to the door
675 {
676 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
677 falric->SetVisible(true);
678 }
680 {
681 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
682 marwyn->SetVisible(true);
683 }
685 {
686 lichking->AI()->Talk(SAY_LK_INTRO_3);
687 lichking->SetWalk(true);
688 lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
689 }
692 break;
693 case EVENT_INTRO_LK_7:
695 {
696 marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
697 marwyn->SetWalk(true);
698 marwyn->GetMotionMaster()->MovePoint(0, MarwynPosition[1]);
699 }
701 break;
702 case EVENT_INTRO_LK_8:
704 {
705 falric->AI()->Talk(SAY_FALRIC_INTRO_1);
706 falric->SetWalk(true);
707 falric->GetMotionMaster()->MovePoint(0, FalricPosition[1]);
708 }
710 break;
711 case EVENT_INTRO_LK_9:
713 falric->AI()->Talk(SAY_FALRIC_INTRO_2);
714 _instance->ProcessEvent(nullptr, EVENT_SPAWN_WAVES, nullptr);
716 break;
720 else
725 korelnOrLoralen->GetMotionMaster()->MovePoint(1, KorelnOrLoralenPos[2]);
727 break;
730 {
732 lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END);
733 else
734 lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END);
735 }
737 break;
738 case EVENT_INTRO_END:
742 {
743 lichking->DespawnOrUnsummon(5s);
745 }
746 me->DespawnOrUnsummon(10s);
748 break;
749 case EVENT_SKIP_INTRO:
752 else
754
756 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
757
759 {
760 lichking->SetWalk(true);
761 lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
762 lichking->SetReactState(REACT_PASSIVE);
763 _lichkingGUID = lichking->GetGUID();
766 }
768 break;
771 break;
774 break;
777 korelnOrLoralen->CastSpell(korelnOrLoralen, SPELL_FEIGN_DEATH);
778 break;
779 default:
780 break;
781 }
782 }
783
784 private:
789 };
790
791 CreatureAI* GetAI(Creature* creature) const override
792 {
793 return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_intro_horAI>(creature);
794 }
795};
796
798{
799 public:
800 explicit HoRGameObjectDeleteDelayEvent(Unit* owner, ObjectGuid gameObjectGUID) : _owner(owner), _gameObjectGUID(gameObjectGUID) { }
801
803 {
805 go->Delete();
806 }
807
808 bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
809 {
811 return true;
812 }
813
814 void Abort(uint64 /*execTime*/) override
815 {
817 }
818
819 private:
822};
823
825{
826 public:
827 npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
828
830 {
832 _instance(creature->GetInstanceScript()), _icewall(0), _prefight(false), _invincibility(true) { }
833
834 void Reset() override
835 {
836 _events.Reset();
837 _icewall = 0;
839 }
840
841 void JustDied(Unit* /*killer*/) override
842 {
844 lichking->AI()->EnterEvadeMode(); // event failed
845 }
846
847 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
848 {
849 if (damage >= me->GetHealth() && _invincibility)
850 damage = me->GetHealth() - 1;
851 }
852
853 void DoAction(int32 actionId) override
854 {
855 switch (actionId)
856 {
858 if (_prefight)
859 return;
860 _prefight = true;
862 break;
864 ++_icewall;
865 if (_icewall < 4)
867 else
869 break;
872 break;
875 break;
876 default:
877 break;
878 }
879 }
880
881 bool OnGossipHello(Player* player) override
882 {
883 // override default gossip
885 {
887 player->SendPreparedGossip(me);
888 return true;
889 }
890
891 // load default gossip
892 return false;
893 }
894
895 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
896 {
897 ClearGossipMenuFor(player);
898
899 switch (gossipListId)
900 {
901 case 0:
902 CloseGossipMenuFor(player);
905 break;
906 default:
907 break;
908 }
909 return false;
910 }
911
913 {
916 else
918
921
923 wallTarget->DespawnOrUnsummon();
924 }
925
927 {
928 if (_icewall < 4)
929 {
931 {
932 lichking->StopMoving();
934 lichking->CastSpell(wallTarget, SPELL_SUMMON_ICE_WALL);
935
936 lichking->AI()->SetData(DATA_ICEWALL, _icewall);
937 }
938 }
939 }
940
942 {
943 if (_icewall < 4)
945
947 me->SetFacingToObject(wallTarget);
948
951 else
953 }
954
955 void MovementInform(uint32 type, uint32 pointId) override
956 {
957 if (type != POINT_MOTION_TYPE)
958 return;
959
960 switch (pointId)
961 {
963 if (me->GetEntry() == NPC_JAINA_ESCAPE)
965 else
970 break;
973 break;
974 case POINT_TRAP:
977 me->SetFacingToObject(lichking);
978 break;
979 default:
980 break;
981 }
982 }
983
985 {
987 if (ref->GetVictim()->GetGUID() != except)
988 ref->ClearThreat();
989 }
990
991 void UpdateAI(uint32 diff) override
992 {
993 _events.Update(diff);
994
995 while (uint32 event = _events.ExecuteEvent())
996 {
997 switch (event)
998 {
999 case EVENT_ESCAPE:
1002 else
1004
1006 {
1007 me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true);
1008 lichking->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
1009 lichking->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
1010 AttackStart(lichking);
1011 lichking->AI()->AttackStart(me);
1012 }
1015 break;
1016 case EVENT_ESCAPE_1:
1018 {
1020 lichking->AI()->Talk(SAY_LK_ESCAPE_1);
1021 else
1022 lichking->AI()->Talk(SAY_LK_ESCAPE_2);
1024 }
1025 break;
1026 case EVENT_ESCAPE_2:
1027 me->AttackStop();
1028 me->StopMoving();
1030
1033 else
1035
1037 {
1038 lichking->SetReactState(REACT_PASSIVE);
1039 lichking->SetUnitFlag(UNIT_FLAG_PACIFIED);
1040 }
1041
1043 break;
1044 case EVENT_ESCAPE_3:
1048 break;
1049 case EVENT_ESCAPE_4:
1052 else
1055
1057 {
1058 lichking->SetImmuneToPC(true);
1059 lichking->RemoveAllAttackers();
1060
1061 DeleteAllFromThreatList(lichking, me->GetGUID());
1062 }
1063
1065 break;
1066 case EVENT_ESCAPE_5:
1068 break;
1069 case EVENT_ESCAPE_6:
1071 {
1072 lichking->RemoveUnitFlag(UNIT_FLAG_PACIFIED);
1073 lichking->SetImmuneToPC(false);
1074
1076 {
1077 lichking->CastSpell(lichking, SPELL_STUN_BREAK_JAINA);
1078 lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICE_PRISON);
1079 }
1080 else
1081 {
1082 lichking->CastSpell(lichking, SPELL_STUN_BREAK_SYLVANAS);
1083 lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARK_BINDING);
1084 }
1085 }
1086 _invincibility = false;
1089 break;
1090 case EVENT_ESCAPE_7:
1092 lichking->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
1095 break;
1096 case EVENT_ESCAPE_8:
1098 lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
1100 break;
1101 case EVENT_ESCAPE_9:
1104 break;
1105 case EVENT_ESCAPE_10:
1108 lichking->GetMotionMaster()->MovePoint(1, LichKingFirstSummon);
1110 break;
1111 case EVENT_ESCAPE_11:
1112 SummonIceWall();
1114 break;
1115 case EVENT_ESCAPE_12:
1117 lichking->CastSpell(lichking, SPELL_PAIN_AND_SUFFERING, true);
1118
1120 break;
1121 case EVENT_ESCAPE_13: // ICEWALL BROKEN
1123
1124 if (_icewall && _icewall < 4)
1127 break;
1128 case EVENT_ESCAPE_14:
1129 SummonIceWall();
1130 break;
1131 case EVENT_ESCAPE_15: // FINAL PART
1133
1135
1137 {
1138 lichking->GetMotionMaster()->MovePoint(2, LichKingFinalPos);
1139 lichking->RemoveAurasDueToSpell(SPELL_REMORSELESS_WINTER);
1140 }
1142 break;
1143 case EVENT_ESCAPE_16:
1148 gunship->EnableMovement(true);
1150 break;
1151 case EVENT_ESCAPE_17:
1154 else
1158 break;
1159 default:
1160 break;
1161 }
1162 }
1163 }
1164
1165 private:
1168 uint32 _icewall; // icewall number
1171 };
1172
1173 CreatureAI* GetAI(Creature* creature) const override
1174 {
1175 return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature);
1176 }
1177};
1178
1180{
1181 public:
1182 npc_the_lich_king_escape_hor() : CreatureScript("npc_the_lich_king_escape_hor") { }
1183
1185 {
1187 {
1190 _summonsCount = 0;
1191 _icewall = 0;
1192 _despawn = false;
1193 }
1194
1195 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1196 {
1197 if (damage >= me->GetHealth())
1198 damage = me->GetHealth() - 1;
1199 }
1200
1201 void MovementInform(uint32 type, uint32 pointId) override
1202 {
1203 if (type == POINT_MOTION_TYPE)
1204 {
1205 switch (pointId)
1206 {
1207 case 1:
1209 me->GetMotionMaster()->MoveChase(target);
1210 break;
1211 case 2:
1213
1215 DoCast(target, SPELL_HARVEST_SOUL);
1216
1218 gunship->EnableMovement(true);
1219 break;
1220 default:
1221 break;
1222 }
1223 }
1224 }
1225
1226 void JustSummoned(Creature* /*summon*/) override
1227 {
1228 ++_summonsCount;
1229 }
1230
1231 void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
1232 {
1233 // should never happen
1234 if (!_summonsCount)
1235 return;
1236
1237 --_summonsCount;
1238
1239 // All summons dead and no summon events scheduled
1240 if (!_summonsCount && _events.Empty())
1241 {
1243 jainaOrSylvanas->AI()->DoAction(ACTION_WALL_BROKEN);
1244 }
1245 }
1246
1247 void KilledUnit(Unit* who) override
1248 {
1249 if (who->GetTypeId() == TYPEID_PLAYER)
1251 }
1252
1253 void SetData(uint32 type, uint32 data) override
1254 {
1255 if (type != DATA_ICEWALL)
1256 return;
1257
1258 _icewall = data;
1259
1260 switch (_icewall)
1261 {
1262 case 0: // 6 Ghouls, 1 Witch Doctor
1268 break;
1269 case 1: // 6 Ghouls, 2 Witch Doctor, 1 Lumbering Abomination
1275 break;
1276 case 2: // 6 Ghouls, 2 Witch Doctor, 2 Lumbering Abomination
1283 break;
1284 case 3: // 12 Ghouls, 4 Witch Doctor, 3 Lumbering Abomination
1295 break;
1296 default:
1297 break;
1298 }
1299 }
1300
1301 void EnterEvadeMode(EvadeReason /*why*/) override
1302 {
1303 if (_despawn)
1304 return;
1305
1307 me->StopMoving();
1310 me->DespawnOrUnsummon(12s);
1311 _despawn = true;
1312 }
1313
1314 void UpdateAI(uint32 diff) override
1315 {
1316 if (!SelectVictim())
1317 return;
1318
1319 _events.Update(diff);
1320
1322 return;
1323
1324 while (uint32 event = _events.ExecuteEvent())
1325 {
1326 switch (event)
1327 {
1329 me->StopMoving();
1332 break;
1334 me->StopMoving();
1337 break;
1340 break;
1344 break;
1345 default:
1346 break;
1347 }
1348 }
1349 }
1350
1351 private:
1353 {
1354 if (!me->IsInCombat())
1355 return false;
1356
1358 {
1359 if (Unit* victim = me->SelectVictim())
1360 if (!me->HasSpellFocus() && victim != me->GetVictim())
1361 AttackStart(victim);
1362 return me->GetVictim() != nullptr;
1363 }
1365 {
1367 return false;
1368 }
1369
1370 return true;
1371 }
1372
1378 };
1379
1380 CreatureAI* GetAI(Creature* creature) const override
1381 {
1382 return GetHallsOfReflectionAI<npc_the_lich_king_escape_horAI>(creature);
1383 }
1384};
1385
1387{
1388 // Ghostly Priest
1393
1394 // Phantom Mage
1401
1402 // Phantom Hallucination (same as phantom mage + HALLUCINATION_2 when dies)
1404
1405 // Shadowy Mercenary
1410
1411 // Spectral Footman
1415
1416 // Tortured Rifleman
1420 SPELL_ICE_SHOT = 72268
1422
1424{
1426
1427 // Ghostly Priest
1432
1433 // Phantom Mage
1439
1440 // Shadowy Mercenary
1445
1446 // Spectral Footman
1450
1451 // Tortured Rifleman
1457
1459{
1461 _instance(creature->GetInstanceScript()), InternalWaveId(0) { }
1462
1463 void Reset() override
1464 {
1466 _events.Reset();
1467 }
1468
1469 void EnterEvadeMode(EvadeReason /*why*/) override
1470 {
1473 }
1474
1475 void SetData(uint32 type, uint32 value) override
1476 {
1477 if (type)
1478 return;
1479
1480 InternalWaveId = value;
1481 }
1482
1483 uint32 GetData(uint32 type) const override
1484 {
1485 if (type)
1486 return 0;
1487
1488 return InternalWaveId;
1489 }
1490
1491protected:
1495};
1496
1498{
1499 public:
1500 npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
1501
1503 {
1505
1506 void JustEngagedWith(Unit* /*who*/) override
1507 {
1512 }
1513
1514 void UpdateAI(uint32 diff) override
1515 {
1516 if (!UpdateVictim())
1517 return;
1518
1519 _events.Update(diff);
1520
1522 return;
1523
1524 switch (_events.ExecuteEvent())
1525 {
1527 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1530 break;
1532 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f, true))
1535 break;
1537 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true))
1538 DoCast(target, SPELL_COWER_IN_FEAR);
1540 break;
1541 case EVENT_DARK_MENDING:
1542 // find an ally with missing HP
1543 if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
1544 {
1545 DoCast(target, SPELL_DARK_MENDING);
1547 }
1548 else
1549 {
1550 // no friendly unit with missing hp. re-check in just 5 sec.
1552 }
1553 break;
1554 default:
1555 break;
1556 }
1557 }
1558 };
1559
1560 CreatureAI* GetAI(Creature* creature) const override
1561 {
1562 return GetHallsOfReflectionAI<npc_ghostly_priestAI>(creature);
1563 }
1564};
1565
1567{
1568 public:
1569 npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
1570
1572 {
1574
1575 void EnterEvadeMode(EvadeReason why) override
1576 {
1579 }
1580
1581 void JustEngagedWith(Unit* /*who*/) override
1582 {
1588 }
1589
1590 void UpdateAI(uint32 diff) override
1591 {
1592 if (!UpdateVictim())
1593 return;
1594
1595 _events.Update(diff);
1596
1598 return;
1599
1600 switch (_events.ExecuteEvent())
1601 {
1602 case EVENT_FIREBALL:
1603 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1604 DoCast(target, SPELL_FIREBALL);
1606 break;
1607 case EVENT_FLAMESTRIKE:
1608 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1609 DoCast(target, SPELL_FLAMESTRIKE);
1611 break;
1612 case EVENT_FROSTBOLT:
1613 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1614 DoCast(target, SPELL_FROSTBOLT);
1616 break;
1619 DoCast(target, SPELL_CHAINS_OF_ICE);
1621 break;
1623 // removing any dots on mage or else the invisibility spell will break duration
1624 me->RemoveAllAuras();
1626 break;
1627 default:
1628 break;
1629 }
1630 }
1631 };
1632
1633 CreatureAI* GetAI(Creature* creature) const override
1634 {
1635 return GetHallsOfReflectionAI<npc_phantom_mageAI>(creature);
1636 }
1637};
1638
1640{
1641 public:
1642 npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
1643
1645 {
1647
1648 void Reset() override
1649 {
1651 }
1652
1653 void EnterEvadeMode(EvadeReason why) override
1654 {
1657 }
1658
1659 void JustDied(Unit* /*killer*/) override
1660 {
1662 }
1663 };
1664
1665 CreatureAI* GetAI(Creature* creature) const override
1666 {
1667 return GetHallsOfReflectionAI<npc_phantom_hallucinationAI>(creature);
1668 }
1669};
1670
1672{
1673 public:
1674 npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
1675
1677 {
1679
1680 void JustEngagedWith(Unit* /*who*/) override
1681 {
1686 }
1687
1688 void UpdateAI(uint32 diff) override
1689 {
1690 if (!UpdateVictim())
1691 return;
1692
1693 _events.Update(diff);
1694
1696 return;
1697
1698 switch (_events.ExecuteEvent())
1699 {
1700 case EVENT_SHADOW_STEP:
1701 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
1702 DoCast(target, SPELL_SHADOW_STEP);
1704 break;
1708 break;
1710 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1713 break;
1714 case EVENT_KIDNEY_SHOT:
1717 break;
1718 default:
1719 break;
1720 }
1721 }
1722 };
1723
1724 CreatureAI* GetAI(Creature* creature) const override
1725 {
1726 return GetHallsOfReflectionAI<npc_shadowy_mercenaryAI>(creature);
1727 }
1728};
1729
1731{
1732 public:
1733 npc_spectral_footman() : CreatureScript("npc_spectral_footman") { }
1734
1736 {
1738
1739 void JustEngagedWith(Unit* /*who*/) override
1740 {
1744 }
1745
1746 void UpdateAI(uint32 diff) override
1747 {
1748 if (!UpdateVictim())
1749 return;
1750
1751 _events.Update(diff);
1752
1754 return;
1755
1756 switch (_events.ExecuteEvent())
1757 {
1761 break;
1762 case EVENT_SHIELD_BASH:
1765 break;
1769 break;
1770 default:
1771 break;
1772 }
1773 }
1774 };
1775
1776 CreatureAI* GetAI(Creature* creature) const override
1777 {
1778 return GetHallsOfReflectionAI<npc_spectral_footmanAI>(creature);
1779 }
1780};
1781
1783{
1784 public:
1785 npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
1786
1788 {
1790
1791 void JustEngagedWith(Unit* /*who*/) override
1792 {
1797 }
1798
1799 void UpdateAI(uint32 diff) override
1800 {
1801 if (!UpdateVictim())
1802 return;
1803
1804 _events.Update(diff);
1805
1807 return;
1808
1809 switch (_events.ExecuteEvent())
1810 {
1811 case EVENT_SHOOT:
1812 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1813 DoCast(target, SPELL_SHOOT);
1815 break;
1816 case EVENT_CURSED_ARROW:
1817 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1818 DoCast(target, SPELL_CURSED_ARROW);
1820 break;
1821 case EVENT_FROST_TRAP:
1824 break;
1825 case EVENT_ICE_SHOT:
1826 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1827 DoCast(target, SPELL_ICE_SHOT);
1829 break;
1830 default:
1831 break;
1832 }
1833 }
1834 };
1835
1836 CreatureAI* GetAI(Creature* creature) const override
1837 {
1838 return GetHallsOfReflectionAI<npc_tortured_riflemanAI>(creature);
1839 }
1840};
1841
1843{
1844 // General
1848
1851
1856
1857 // Reflection
1859
1861 SPELL_SPIRIT_BURST = 69900
1863
1865{
1866 public:
1867 npc_frostsworn_general() : CreatureScript("npc_frostsworn_general") { }
1868
1870 {
1872 {
1873 _instance = creature->GetInstanceScript();
1874 }
1875
1876 void Reset() override
1877 {
1878 _events.Reset();
1880 }
1881
1882 void JustDied(Unit* /*killer*/) override
1883 {
1884 Talk(SAY_DEATH);
1885 _events.Reset();
1887 }
1888
1889 void JustEngagedWith(Unit* /*victim*/) override
1890 {
1891 Talk(SAY_AGGRO);
1897 }
1898
1899 void UpdateAI(uint32 diff) override
1900 {
1901 if (!UpdateVictim())
1902 return;
1903
1904 _events.Update(diff);
1905
1907 return;
1908
1909 while (uint32 event = _events.ExecuteEvent())
1910 {
1911 switch (event)
1912 {
1913 case EVENT_SHIELD:
1914 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true))
1915 DoCast(target, SPELL_SHIELD_THROWN);
1917 break;
1918 case EVENT_SPIKE:
1919 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true))
1920 DoCast(target, SPELL_SPIKE);
1922 break;
1923 case EVENT_CLONE:
1924 SummonClones();
1926 break;
1927 default:
1928 break;
1929 }
1930 }
1931 }
1932
1934 {
1935 std::list<Unit*> playerList;
1936 SelectTargetList(playerList, 5, SelectTargetMethod::MaxThreat, 0, 0.0f, true);
1937 for (Unit* target : playerList)
1938 {
1940 {
1941 reflection->SetImmuneToPC(false);
1942 target->CastSpell(reflection, SPELL_CLONE, true);
1943 target->CastSpell(reflection, SPELL_GHOST_VISUAL, true);
1944 reflection->AI()->AttackStart(target);
1945 }
1946 }
1947 }
1948
1949 private:
1952 };
1953
1954 CreatureAI* GetAI(Creature* creature) const override
1955 {
1956 return GetHallsOfReflectionAI<npc_frostsworn_generalAI>(creature);
1957 }
1958};
1959
1961{
1962 public:
1963 npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
1964
1966 {
1968
1969 void Reset() override
1970 {
1971 _events.Reset();
1972 }
1973
1974 void JustEngagedWith(Unit* /*victim*/) override
1975 {
1977 }
1978
1979 void JustDied(Unit* /*killer*/) override
1980 {
1982 }
1983
1984 void UpdateAI(uint32 diff) override
1985 {
1986 if (!UpdateVictim())
1987 return;
1988
1989 _events.Update(diff);
1990
1992 return;
1993
1994 switch (_events.ExecuteEvent())
1995 {
1997 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 8.0f, true))
2000 break;
2001 default:
2002 break;
2003 }
2004 }
2005
2006 private:
2008 };
2009
2010 CreatureAI* GetAI(Creature* creature) const override
2011 {
2012 return GetHallsOfReflectionAI<npc_spiritual_reflectionAI>(creature);
2013 }
2014};
2015
2016// 5689
2018{
2019 public:
2020 at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { }
2021
2022 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
2023 {
2024 if (player->IsGameMaster())
2025 return true;
2026
2027 InstanceScript* _instance = player->GetInstanceScript();
2028
2029 if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
2031
2034 {
2036 _instance->SetGuidData(DATA_QUEL_DELAR_INVOKER, player->GetGUID());
2037 }
2038
2039 return true;
2040 }
2041};
2042
2044{
2045 public:
2046 at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { }
2047
2048 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
2049 {
2050 if (player->IsGameMaster())
2051 return true;
2052
2053 InstanceScript* _instance = player->GetInstanceScript();
2054
2055 if (_instance->GetData(DATA_WAVE_COUNT))
2056 return true;
2057
2058 if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN) != DONE)
2059 {
2060 _instance->ProcessEvent(nullptr, EVENT_SPAWN_WAVES, nullptr);
2061
2062 if (Creature* falric = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_FALRIC)))
2063 {
2064 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
2065 falric->SetVisible(true);
2066 }
2067 if (Creature* marwyn = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_MARWYN)))
2068 {
2069 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
2070 marwyn->SetVisible(true);
2071 }
2072 }
2073 return true;
2074 }
2075};
2076
2077// 5740
2079{
2080 public:
2081 at_hor_impenetrable_door() : AreaTriggerScript("at_hor_impenetrable_door") { }
2082
2083 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
2084 {
2085 if (player->IsGameMaster())
2086 return true;
2087
2088 InstanceScript* _instance = player->GetInstanceScript();
2089 if (_instance->GetBossState(DATA_MARWYN) == DONE)
2090 return true;
2091
2093 return false;
2094 }
2095};
2096
2097// 5605
2099{
2100 public:
2101 at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { }
2102
2103 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
2104 {
2105 if (player->IsGameMaster())
2106 return true;
2107
2108 InstanceScript* _instance = player->GetInstanceScript();
2109
2112
2113 return true;
2114 }
2115};
2116
2118{
2119 // Raging Ghoul
2121
2122 // Risen Witch Doctor
2126
2127 // Lumbering Abomination
2131
2133{
2134 public:
2135 explicit HoRStartMovementEvent(Creature* owner) : _owner(owner) { }
2136
2137 bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
2138 {
2140 if (Unit* target = _owner->AI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
2141 _owner->AI()->AttackStart(target);
2142 return true;
2143 }
2144
2145 private:
2147};
2148
2150{
2151 npc_escape_event_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
2152
2153 void Reset() override
2154 {
2155 _events.Reset();
2156 }
2157
2158 void UpdateAI(uint32 /*diff*/) override
2159 {
2162 }
2163
2164 void IsSummonedBy(WorldObject* /*summoner*/) override
2165 {
2168 {
2169 me->SetImmuneToPC(false);
2170 me->SetInCombatWith(leader);
2171 leader->SetInCombatWith(me);
2172 AddThreat(leader, 0.0f);
2173 }
2174 }
2175
2176protected:
2179};
2180
2182{
2183 public:
2184 npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
2185
2187 {
2189
2190 void Reset() override
2191 {
2194 }
2195
2196 void IsSummonedBy(WorldObject* summoner) override
2197 {
2202
2204 }
2205
2206 void UpdateAI(uint32 diff) override
2207 {
2209
2210 if (!UpdateVictim())
2211 return;
2212
2213 _events.Update(diff);
2214
2216 return;
2217
2218 switch (_events.ExecuteEvent())
2219 {
2221 if (Unit* victim = me->GetVictim())
2222 {
2223 if (me->IsInRange(victim, 5.0f, 30.0f))
2224 {
2225 DoCast(victim, SPELL_GHOUL_JUMP);
2226 return;
2227 }
2228 }
2230 break;
2231 default:
2232 break;
2233 }
2234 }
2235 };
2236
2237 CreatureAI* GetAI(Creature* creature) const override
2238 {
2239 return GetHallsOfReflectionAI<npc_raging_ghoulAI>(creature);
2240 }
2241};
2242
2244{
2245 public:
2246 npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
2247
2249 {
2251
2252 void Reset() override
2253 {
2258 }
2259
2260 void IsSummonedBy(WorldObject* summoner) override
2261 {
2266
2268 }
2269
2270 void UpdateAI(uint32 diff) override
2271 {
2273
2274 if (!UpdateVictim())
2275 return;
2276
2277 _events.Update(diff);
2278
2280 return;
2281
2282 switch (_events.ExecuteEvent())
2283 {
2285 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
2286 DoCast(target, SPELL_CURSE_OF_DOOM);
2288 break;
2290 if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, 20.0f, true))
2291 DoCast(target, SPELL_SHADOW_BOLT);
2293 break;
2295 if (SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
2298 break;
2299 default:
2300 break;
2301 }
2302 }
2303 };
2304
2305 CreatureAI* GetAI(Creature* creature) const override
2306 {
2307 return GetHallsOfReflectionAI<npc_risen_witch_doctorAI>(creature);
2308 }
2309};
2310
2312{
2313 public:
2314 npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
2315
2317 {
2319
2320 void Reset() override
2321 {
2325 }
2326
2327 void UpdateAI(uint32 diff) override
2328 {
2330
2331 if (!UpdateVictim())
2332 return;
2333
2334 _events.Update(diff);
2335
2337 return;
2338
2339 switch (_events.ExecuteEvent())
2340 {
2344 break;
2348 break;
2349 default:
2350 break;
2351 }
2352 }
2353 };
2354
2355 CreatureAI* GetAI(Creature* creature) const override
2356 {
2357 return GetHallsOfReflectionAI<npc_lumbering_abominationAI>(creature);
2358 }
2359};
2360
2362{
2365
2379
2386
2389
2391{
2396
2399
2408
2411
2413{
2415 SPELL_QUEL_DELAR_WILL = 70698
2417
2418constexpr Position QuelDelarCenterPos = { 5309.259f, 2006.390f, 718.046f, 0.0f };
2419constexpr Position QuelDelarSummonPos = { 5298.473f, 1994.852f, 709.424f, 3.979351f };
2421{
2422 { 5292.870f, 1998.950f, 718.046f, 0.0f },
2423 { 5295.819f, 1991.912f, 707.707f, 0.0f },
2424 { 5295.301f, 1989.782f, 708.696f, 0.0f }
2425};
2426
2428{
2429 { 5336.830f, 1981.700f, 709.319f, 0.0f },
2430 { 5314.350f, 1993.440f, 707.726f, 0.0f }
2431};
2432
2434{
2435 public:
2436 npc_uther_quel_delar() : CreatureScript("npc_uther_quel_delar") { }
2437
2439 {
2441 {
2443 }
2444
2445 void Reset() override
2446 {
2447 // Prevent to break Uther in intro event during instance encounter
2449 return;
2450
2451 _events.Reset();
2453 }
2454
2455 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
2456 {
2457 if (damage >= me->GetHealth())
2458 damage = me->GetHealth() - 1;
2459 }
2460
2461 void DoAction(int32 action) override
2462 {
2463 switch (action)
2464 {
2468 break;
2469 case ACTION_UTHER_OUTRO:
2471 break;
2472 default:
2473 break;
2474 }
2475 }
2476
2477 void MovementInform(uint32 /*type*/, uint32 pointId) override
2478 {
2479 switch (pointId)
2480 {
2481 case 1:
2483 break;
2484 default:
2485 break;
2486 }
2487 }
2488
2489 void UpdateAI(uint32 diff) override
2490 {
2491 // Prevent to break Uther in intro event during instance encounter
2493 return;
2494
2495 _events.Update(diff);
2496
2497 while (uint32 eventId = _events.ExecuteEvent())
2498 {
2499 switch (eventId)
2500 {
2501 case EVENT_UTHER_1:
2503 break;
2504 case EVENT_UTHER_2:
2507 bunny->CastSpell(target, SPELL_QUEL_DELAR_WILL, true);
2509 break;
2510 case EVENT_UTHER_3:
2513 break;
2514 case EVENT_UTHER_4:
2517 break;
2518 case EVENT_UTHER_5:
2520 break;
2521 case EVENT_UTHER_6:
2522 me->SetWalk(true);
2525 break;
2526 case EVENT_UTHER_7:
2529 break;
2530 case EVENT_UTHER_8:
2533 break;
2534 case EVENT_UTHER_9:
2537 break;
2538 case EVENT_UTHER_10:
2541 break;
2542 case EVENT_UTHER_11:
2544 me->DespawnOrUnsummon(3s);
2546 break;
2547 case EVENT_UTHER_FACING:
2549 me->SetFacingToObject(bunny);
2551 break;
2552 case EVENT_UTHER_KNEEL:
2554 break;
2555 default:
2556 break;
2557 }
2558 }
2559 }
2560
2561 private:
2564 };
2565
2566 CreatureAI* GetAI(Creature* creature) const override
2567 {
2568 return GetHallsOfReflectionAI<npc_uther_quel_delarAI>(creature);
2569 }
2570};
2571
2573{
2574 public:
2575 npc_quel_delar_sword() : CreatureScript("npc_quel_delar_sword") { }
2576
2578 {
2580 {
2583 _intro = true;
2584 }
2585
2586 void Reset() override
2587 {
2588 _events.Reset();
2589 me->SetSpeedRate(MOVE_FLIGHT, 4.5f);
2591 if (_intro)
2593 else
2594 me->SetImmuneToAll(false);
2595 }
2596
2597 void JustEngagedWith(Unit* /*victim*/) override
2598 {
2602 }
2603
2604 void JustDied(Unit* /*killer*/) override
2605 {
2607 uther->AI()->DoAction(ACTION_UTHER_OUTRO);
2608 }
2609
2610 void MovementInform(uint32 type, uint32 pointId) override
2611 {
2612 if (type != EFFECT_MOTION_TYPE)
2613 return;
2614
2615 switch (pointId)
2616 {
2617 case POINT_TAKE_OFF:
2619 break;
2620 default:
2621 break;
2622 }
2623 }
2624
2625 void UpdateAI(uint32 diff) override
2626 {
2627 _events.Update(diff);
2628
2630 return;
2631
2632 if (!UpdateVictim())
2633 {
2634 while (uint32 eventId = _events.ExecuteEvent())
2635 {
2636 switch (eventId)
2637 {
2640 bunny->AI()->Talk(SAY_FROSTMOURNE_BUNNY);
2641 _intro = false;
2643 break;
2646 break;
2648 {
2651 break;
2652 }
2654 me->StopMoving();
2655 me->GetMotionMaster()->Clear();
2658 break;
2662 me->SetImmuneToAll(false);
2663 break;
2664 default:
2665 break;
2666 }
2667 }
2668 }
2669 else
2670 {
2671 while (uint32 eventId = _events.ExecuteEvent())
2672 {
2673 switch (eventId)
2674 {
2678 break;
2682 break;
2686 break;
2687 default:
2688 break;
2689 }
2690 }
2691 }
2692 }
2693
2694 private:
2698 };
2699
2700 CreatureAI* GetAI(Creature* creature) const override
2701 {
2702 return GetHallsOfReflectionAI<npc_quel_delar_swordAI>(creature);
2703 }
2704};
2705
2706// 5660
2708{
2709 public:
2710 at_hor_uther_quel_delar_start() : AreaTriggerScript("at_hor_uther_quel_delar_start") { }
2711
2712 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
2713 {
2714 if (player->IsGameMaster())
2715 return true;
2716
2717 InstanceScript* _instance = player->GetInstanceScript();
2718
2719 if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS)
2720 if (Creature* uther = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_UTHER_QUEL_DELAR)))
2721 uther->AI()->DoAction(ACTION_UTHER_START_SCREAM);
2722
2723 return true;
2724 }
2725};
2726
2727// 72900 - Start Halls of Reflection Quest AE
2729{
2730 public:
2731 spell_hor_start_halls_of_reflection_quest_ae() : SpellScriptLoader("spell_hor_start_halls_of_reflection_quest_ae") { }
2732
2734 {
2735 void StartQuests(SpellEffIndex /*effIndex*/)
2736 {
2737 if (Player* target = GetHitPlayer())
2738 {
2739 // CanTakeQuest and CanAddQuest checks done in spell effect execution
2740 if (target->GetTeam() == ALLIANCE)
2741 target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_A, true);
2742 else
2743 target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_H, true);
2744 }
2745 }
2746
2747 void Register() override
2748 {
2750 }
2751 };
2752
2753 SpellScript* GetSpellScript() const override
2754 {
2756 }
2757};
2758
2759// 70190 - Evasion
2761{
2762 public:
2763 spell_hor_evasion() : SpellScriptLoader("spell_hor_evasion") { }
2764
2766 {
2767 bool Load() override
2768 {
2769 return GetCaster()->GetTypeId() == TYPEID_UNIT;
2770 }
2771
2773 {
2775 Position pos(*target);
2777
2778 // prevent evasion outside the room
2779 if (pos.IsInDist2d(&home, 15.0f))
2780 return;
2781
2782 float angle = pos.GetAbsoluteAngle(&home);
2783 float dist = GetEffectInfo().CalcRadius(GetCaster());
2784 target->MovePosition(pos, dist, angle);
2785
2786 dest.Relocate(pos);
2787 }
2788
2789 void Register() override
2790 {
2792 }
2793 };
2794
2795 SpellScript* GetSpellScript() const override
2796 {
2797 return new spell_hor_evasion_SpellScript();
2798 }
2799};
2800
2801// 70017 - Gunship Cannon Fire
2803{
2804 public:
2805 spell_hor_gunship_cannon_fire() : SpellScriptLoader("spell_hor_gunship_cannon_fire") { }
2806
2808 {
2809 void HandlePeriodic(AuraEffect const* /*aurEff*/)
2810 {
2811 if (!urand(0, 2))
2812 {
2815 else
2817 }
2818 }
2819
2820 void Register() override
2821 {
2823 }
2824 };
2825
2826 AuraScript* GetAuraScript() const override
2827 {
2829 }
2830};
2831
2832// 70698 - Quel'Delar's Will
2834{
2835 bool Validate(SpellInfo const* spellInfo) override
2836 {
2837 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
2838 }
2839
2841 {
2842 PreventHitDefaultEffect(effIndex);
2843
2844 // dummy spell consumes reagent, don't ignore it
2846 }
2847
2848 void Register() override
2849 {
2851 }
2852};
2853
2855{
2856 new at_hor_intro_start();
2864 new npc_ghostly_priest();
2865 new npc_phantom_mage();
2872 new npc_raging_ghoul();
2878 new spell_hor_evasion();
2881}
First const & RAND(First const &first, Second const &second, Rest const &... rest)
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
@ GO_JUST_DEACTIVATED
Definition: GameObject.h:159
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition: ObjectDefines.h:66
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
void ClearGossipMenuFor(Player *player)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_DEST_TARGET_RADIUS
@ EMOTE_ONESHOT_NO
@ EMOTE_STATE_COWER
@ EMOTE_ONESHOT_EMERGE
@ EMOTE_ONESHOT_ROAR
@ EMOTE_STATE_KNEEL
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_ATTACK_ME
@ SPELL_EFFECT_FORCE_CAST
@ IMMUNITY_STATE
@ IMMUNITY_EFFECT
@ ALLIANCE
@ HORDE
@ SPELL_AURA_MOD_TAUNT
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore power and reagent cost.
Definition: SpellDefines.h:249
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellDestinationTargetSelectFn(F, I, N)
Definition: SpellScript.h:874
EvadeReason
Definition: UnitAICommon.h:30
@ MOVE_FLIGHT
Definition: UnitDefines.h:123
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:161
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ SPELL_WELL_OF_SOULS
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
Unit * GetTarget() const
std::unordered_map< ObjectGuid, CombatReference * > const & GetPvECombatRefs() const
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:373
bool HasReactState(ReactStates state) const
Definition: Creature.h:162
void SetDisplayFromModel(uint32 modelIdx)
Definition: Creature.cpp:3413
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetImmuneToAll(bool apply) override
Definition: Creature.h:167
Unit * SelectVictim()
Definition: Creature.cpp:1211
CreatureAI * AI() const
Definition: Creature.h:214
bool HasSpellFocus(Spell const *focusSpell=nullptr) const override
Definition: Creature.cpp:3481
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
bool Empty() const
Definition: EventMap.h:84
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void Reset()
Definition: EventMap.cpp:21
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
HoRGameObjectDeleteDelayEvent(Unit *owner, ObjectGuid gameObjectGUID)
bool Execute(uint64, uint32) override
bool Execute(uint64, uint32) override
HoRStartMovementEvent(Creature *owner)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MoveTakeoff(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveLand(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void SendPreparedGossip(WorldObject *source)
Definition: Player.cpp:14137
bool IsGameMaster() const
Definition: Player.h:1178
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
void PrepareGossipMenu(WorldObject *source, uint32 menuId, bool showQuests=false)
Definition: Player.cpp:14036
float CalcRadius(WorldObject *caster=nullptr, SpellTargetIndex targetIndex=SpellTargetIndex::TargetA, Spell *=nullptr) const
Definition: SpellInfo.cpp:673
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Definition: SpellScript.h:873
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
WorldObject * GetExplTargetWorldObject() const
std::vector< ThreatReference * > GetModifiableThreatList()
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
void SelectTargetList(std::list< Unit * > &targetList, uint32 num, SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:84
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetHealth(uint64 val)
Definition: Unit.cpp:9346
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
void SetInCombatWith(Unit *enemy, bool addSecondUnitSuppressed=false)
Definition: Unit.h:1045
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
void StopMoving()
Definition: Unit.cpp:10049
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
uint64 GetHealth() const
Definition: Unit.h:776
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
Unit * GetVictim() const
Definition: Unit.h:715
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition: Unit.cpp:8525
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAllAuras()
Definition: Unit.cpp:4242
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
CombatManager & GetCombatManager()
Definition: Unit.h:1023
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
bool IsInCombat() const
Definition: Unit.h:1043
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
Unit * GetOwner() const
Definition: Object.cpp:2229
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition: Object.cpp:1238
EventProcessor m_Events
Definition: Object.h:777
void MovePosition(Position &pos, float dist, float angle)
Definition: Object.cpp:3436
virtual void DoAction(uint32 actionId, WorldObject *source=nullptr, WorldObject *target=nullptr)
Definition: ZoneScript.h:96
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
virtual void SetGuidData(uint32, ObjectGuid)
Definition: ZoneScript.h:84
virtual void ProcessEvent(WorldObject *, uint32, WorldObject *)
Definition: ZoneScript.h:95
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
void HandleReagent(SpellEffIndex effIndex)
bool Validate(SpellInfo const *spellInfo) override
@ DATA_TEAM_IN_INSTANCE
@ GOSSIP_MENU_JAINA_FINAL
@ GOSSIP_MENU_SYLVANAS_FINAL
constexpr Position UtherSpawnPos
@ EVENT_LUMBERING_ABOMINATION_CLEAVE
@ EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY
@ EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY
@ EVENT_RAGING_GHOUL_JUMP
@ EVENT_RISEN_WITCH_DOCTOR_CURSE
@ EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT
constexpr Position JainaIntroPosition[]
@ SOUND_LK_SLAY_2
@ SOUND_LK_FURY_OF_FROSTMOURNE
@ POINT_SHADOW_THRONE_DOOR
@ SOUND_LK_SLAY_1
@ ACTION_START_INTRO
@ POINT_ATTACK_ICEWALL
@ ACTION_SKIP_INTRO
@ JAINA_SYLVANAS_MAX_HEALTH
void AddSC_halls_of_reflection()
constexpr Position SylvanasIntroPosition[]
@ EVENT_CURSED_ARROW
@ EVENT_SHIELD_BASH
@ EVENT_KIDNEY_SHOT
@ EVENT_FIREBALL
@ EVENT_FROST_TRAP
@ EVENT_SHADOW_WORD_PAIN
@ EVENT_DEADLY_POISON
@ EVENT_ENVENOMED_DAGGER_THROW
@ EVENT_FLAMESTRIKE
@ EVENT_TRASH_NONE
@ EVENT_SPECTRAL_STRIKE
@ EVENT_DARK_MENDING
@ EVENT_HALLUCINATION
@ EVENT_CIRCLE_OF_DESTRUCTION
@ EVENT_ICE_SHOT
@ EVENT_TORTURED_ENRAGE
@ EVENT_CHAINS_OF_ICE
@ EVENT_COWER_IN_FEAR
@ EVENT_FROSTBOLT
@ EVENT_SHADOW_STEP
@ SPELL_SHADOW_BOLT_VOLLEY
@ SPELL_PAIN_AND_SUFFERING
@ SPELL_CLEAVE
@ SPELL_TAKE_FROSTMOURNE
@ SPELL_UTHER_DESPAWN
@ SPELL_FROSTMOURNE_VISUAL
@ SPELL_JAINA_ICE_PRISON
@ SPELL_SUMMON_LUMBERING_ABOMINATION
@ SPELL_SUMMON_RISEN_WITCH_DOCTOR
@ SPELL_SUMMON_SOULS
@ SPELL_BOSS_SPAWN_AURA
@ SPELL_JAINA_DESTROY_ICE_WALL
@ SPELL_SUMMON_ICE_WALL
@ SPELL_FROSTMOURNE_SOUNDS
@ SPELL_CURSE_OF_DOOM
@ SPELL_SYLVANAS_CLOAK_OF_DARKNESS
@ SPELL_FEIGN_DEATH
@ SPELL_SHADOW_BOLT
@ SPELL_SOUL_REAPER
@ SPELL_HARVEST_SOUL
@ SPELL_RISEN_WITCH_DOCTOR_SPAWN
@ SPELL_SYLVANAS_BLINDING_RETREAT
@ SPELL_RAISE_DEAD
@ SPELL_GHOUL_JUMP
@ SPELL_VOMIT_SPRAY
@ SPELL_STUN_BREAK_JAINA
@ SPELL_REMORSELESS_WINTER
@ SPELL_TAUNT_ARTHAS
@ SPELL_FURY_OF_FROSTMOURNE
@ SPELL_CAST_VISUAL
@ SPELL_SYLVANAS_DESTROY_ICE_WALL
@ SPELL_STUN_BREAK_SYLVANAS
@ SPELL_SYLVANAS_DARK_BINDING
@ SPELL_RAGING_GHOUL_SPAWN
@ SPELL_JAINA_ICE_BARRIER
@ SPELL_FROSTMOURNE_DESPAWN
constexpr Position FalricPosition[]
constexpr Position MarwynPosition[]
constexpr Position UtherQuelDelarMovement[]
constexpr Position LichKingMoveAwayPos
@ SAY_FROSTMOURNE_BUNNY
@ SPELL_QUEL_DELAR_WILL
@ SPELL_COWER_IN_FEAR
@ SPELL_SHIELD_BASH
@ AURA_HALLUCINATION
@ SPELL_FROSTBOLT
@ SPELL_ICE_SHOT
@ SPELL_FLAMESTRIKE
@ SPELL_CURSED_ARROW
@ SPELL_SPECTRAL_STRIKE
@ SPELL_DARK_MENDING
@ SPELL_CIRCLE_OF_DESTRUCTION
@ SPELL_ENVENOMED_DAGGER_THROW
@ SPELL_TORTURED_ENRAGE
@ SPELL_HALLUCINATION
@ SPELL_SHADOW_WORD_PAIN
@ SPELL_FROST_TRAP
@ SPELL_DEADLY_POISON
@ SPELL_FIREBALL
@ SPELL_KIDNEY_SHOT
@ SPELL_HALLUCINATION_2
@ SPELL_SHADOW_STEP
@ SPELL_CHAINS_OF_ICE
constexpr Position LichKingIntroPosition[]
@ SAY_LK_ESCAPE_WINTER
@ SAY_UTHER_INTRO_A2_4
@ SAY_LK_INTRO_2
@ SAY_UTHER_INTRO_H2_6
@ SAY_JAINA_SYLVANAS_ESCAPE_5
@ SAY_JAINA_INTRO_4
@ SAY_UTHER_INTRO_H2_4
@ SAY_UTHER_INTRO_A2_2
@ SAY_MARWYN_INTRO_1
@ SAY_SYLVANAS_INTRO_3
@ SAY_LK_JAINA_INTRO_END
@ SAY_JAINA_INTRO_5
@ SAY_JAINA_INTRO_10
@ SAY_JAINA_ESCAPE_10
@ SAY_JAINA_INTRO_9
@ SAY_LK_ESCAPE_ICEWALL_SUMMONED_1
@ SAY_UTHER_INTRO_H2_5
@ SAY_JAINA_INTRO_END
@ SAY_UTHER_INTRO_H2_3
@ SAY_SYLVANAS_INTRO_4
@ SAY_LK_ESCAPE_ICEWALL_SUMMONED_4
@ SAY_FALRIC_INTRO_1
@ SAY_UTHER_INTRO_A2_5
@ SAY_JAINA_INTRO_6
@ SAY_LK_ESCAPE_HARVEST_SOUL
@ SAY_SYLVANAS_INTRO_8
@ SAY_UTHER_INTRO_A2_8
@ SAY_LK_ESCAPE_ICEWALL_SUMMONED_3
@ SAY_SYLVANAS_ESCAPE_9
@ SAY_LK_ESCAPE_ICEWALL_SUMMONED_2
@ SAY_JAINA_SYLVANAS_ESCAPE_7
@ SAY_UTHER_INTRO_A2_7
@ SAY_JAINA_INTRO_2
@ SAY_LK_ESCAPE_2
@ SAY_JAINA_INTRO_1
@ SAY_UTHER_INTRO_A2_1
@ SAY_LK_SYLVANAS_INTRO_END
@ SAY_JAINA_INTRO_8
@ SAY_LK_INTRO_1
@ SAY_UTHER_INTRO_A2_6
@ SAY_LK_INTRO_3
@ SAY_LK_ESCAPE_ABOMINATION
@ SAY_FALRIC_INTRO_2
@ SAY_JAINA_SYLVANAS_ESCAPE_3
@ SAY_UTHER_INTRO_A2_3
@ SAY_JAINA_SYLVANAS_ESCAPE_6
@ SAY_UTHER_INTRO_A2_9
@ SAY_UTHER_INTRO_H2_2
@ SAY_JAINA_SYLVANAS_ESCAPE_8
@ SAY_UTHER_INTRO_H2_7
@ SAY_SYLVANAS_INTRO_END
@ SAY_SYLVANAS_INTRO_5
@ SAY_LK_ESCAPE_GHOULS
@ SAY_SYLVANAS_INTRO_2
@ SAY_JAINA_SYLVANAS_ESCAPE_4
@ SAY_JAINA_ESCAPE_9
@ SAY_JAINA_INTRO_11
@ SAY_JAINA_SYLVANAS_ESCAPE_1
@ SAY_UTHER_INTRO_H2_1
@ SAY_SYLVANAS_INTRO_6
@ SAY_JAINA_INTRO_7
@ SAY_LK_ESCAPE_1
@ SAY_SYLVANAS_INTRO_7
@ SAY_JAINA_INTRO_3
@ SAY_SYLVANAS_INTRO_1
@ SAY_JAINA_SYLVANAS_ESCAPE_2
constexpr Position QuelDelarCenterPos
constexpr Position QuelDelarMovement[]
@ EVENT_UTHER_KNEEL
@ EVENT_UTHER_10
@ EVENT_UTHER_11
@ SAY_UTHER_QUEL_DELAR_6
@ SAY_UTHER_QUEL_DELAR_1
@ ACTION_UTHER_START_SCREAM
@ SAY_UTHER_QUEL_DELAR_2
@ SAY_UTHER_QUEL_DELAR_5
@ SAY_UTHER_QUEL_DELAR_3
@ EVENT_UTHER_FACING
@ SAY_UTHER_QUEL_DELAR_4
@ SPELL_ESSENCE_OF_CAPTURED_1
@ ACTION_UTHER_OUTRO
constexpr Position LichKingFirstSummon
constexpr Position LichKingFinalPos
constexpr Position NpcJainaOrSylvanasEscapeRoute[]
constexpr Position QuelDelarSummonPos
constexpr Position KorelnOrLoralenPos[]
constexpr Position SylvanasShadowThroneDoorPosition
constexpr Position IceWallTargetPosition[]
@ EVENT_ESCAPE_16
@ EVENT_INTRO_H2_4
@ EVENT_ESCAPE_6
@ EVENT_ESCAPE_15
@ EVENT_ESCAPE_3
@ EVENT_INTRO_A2_14
@ EVENT_INTRO_A2_18
@ EVENT_INTRO_H2_14
@ EVENT_INTRO_LK_2
@ EVENT_REMORSELESS_WINTER
@ EVENT_ESCAPE_17
@ EVENT_INTRO_LK_9
@ EVENT_INTRO_LK_4
@ EVENT_INTRO_A2_12
@ EVENT_INTRO_H2_15
@ EVENT_INTRO_A2_11
@ EVENT_INTRO_A2_3
@ EVENT_INTRO_A2_8
@ EVENT_ESCAPE_12
@ EVENT_START_INTRO
@ EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION
@ EVENT_ESCAPE_2
@ EVENT_INTRO_H2_1
@ EVENT_INTRO_H2_2
@ EVENT_INTRO_A2_1
@ EVENT_INTRO_LK_8
@ EVENT_WALK_INTRO1
@ EVENT_ESCAPE_7
@ EVENT_ESCAPE_4
@ EVENT_OPEN_IMPENETRABLE_DOOR
@ EVENT_INTRO_A2_15
@ EVENT_CLOSE_IMPENETRABLE_DOOR
@ EVENT_ESCAPE_SUMMON_WITCH_DOCTOR
@ EVENT_INTRO_H2_13
@ EVENT_INTRO_A2_9
@ EVENT_INTRO_LK_1
@ EVENT_INTRO_LK_5
@ EVENT_ESCAPE_14
@ EVENT_INTRO_H2_9
@ EVENT_INTRO_LK_10
@ EVENT_INTRO_END
@ EVENT_INTRO_H2_11
@ EVENT_INTRO_A2_16
@ EVENT_INTRO_A2_4
@ EVENT_ESCAPE_9
@ EVENT_INTRO_A2_5
@ EVENT_ESCAPE
@ EVENT_WALK_INTRO2
@ EVENT_ESCAPE_10
@ EVENT_INTRO_H2_10
@ EVENT_KORELN_LORALEN_DEATH
@ EVENT_SKIP_INTRO
@ EVENT_INTRO_A2_17
@ EVENT_ESCAPE_1
@ EVENT_INTRO_LK_11
@ EVENT_ESCAPE_11
@ EVENT_INTRO_LK_7
@ EVENT_ESCAPE_13
@ EVENT_ESCAPE_SUMMON_GHOULS
@ EVENT_INTRO_H2_8
@ EVENT_INTRO_LK_3
@ EVENT_INTRO_H2_6
@ EVENT_ESCAPE_5
@ EVENT_INTRO_A2_13
@ EVENT_INTRO_A2_6
@ EVENT_INTRO_A2_2
@ EVENT_INTRO_A2_10
@ EVENT_INTRO_A2_19
@ EVENT_INTRO_A2_7
@ EVENT_INTRO_LK_6
@ EVENT_INTRO_H2_12
@ EVENT_INTRO_H2_5
@ EVENT_INTRO_H2_3
@ EVENT_ESCAPE_8
@ EVENT_INTRO_H2_7
@ SPELL_SPIRIT_BURST
@ SPELL_GHOST_VISUAL
@ EVENT_BALEFUL_STRIKE
@ SPELL_BALEFUL_STRIKE
@ SPELL_SHIELD_THROWN
@ SPELL_WHIRLWIND_VISUAL
@ EVENT_QUEL_DELAR_HEROIC_STRIKE
@ EVENT_QUEL_DELAR_FLIGHT_INIT
@ EVENT_QUEL_DELAR_BLADESTORM
@ POINT_TAKE_OFF
@ EVENT_QUEL_DELAR_FLIGHT
@ EVENT_QUEL_DELAR_FIGHT
@ SPELL_HEROIC_STRIKE
@ EVENT_QUEL_DELAR_WHIRLWIND
@ EVENT_QUEL_DELAR_INIT
@ SPELL_BLADESTORM
@ EVENT_QUEL_DELAR_LAND
@ NPC_QUEL_DELAR
@ SAY_QUEL_DELAR_SWORD
@ SPELL_WHIRLWIND
@ DATA_GUNSHIP
@ DATA_FROSTSWORN_GENERAL
@ DATA_INTRO_EVENT
@ DATA_KORELN_LORALEN
@ DATA_ICEWALL_TARGET
@ DATA_QUEL_DELAR_INVOKER
@ DATA_QUEL_DELAR_EVENT
@ DATA_UTHER_QUEL_DELAR
@ DATA_ESCAPE_LEADER
@ DATA_WAVE_COUNT
@ DATA_ICEWALL
@ DATA_MARWYN
@ DATA_FALRIC
@ DATA_FROSTMOURNE
@ DATA_FROSTMOURNE_ALTAR_BUNNY
@ DATA_IMPENETRABLE_DOOR
@ DATA_THE_LICH_KING_ESCAPE
@ EVENT_SPAWN_WAVES
@ QUEST_HALLS_OF_REFLECTION_HORDE
@ QUEST_HALLS_OF_REFLECTION_ALLIANCE
@ ACHIEV_NOT_RETREATING_EVENT
@ SPELL_CREDIT_FINDING_SYLVANAS
@ SPELL_QUEL_DELAR_COMPULSION
@ SPELL_CREDIT_FINDING_JAINA
@ SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE
@ SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE
@ SPELL_START_HALLS_OF_REFLECTION_QUEST_H
@ SPELL_CREDIT_ESCAPING_ARTHAS
@ SPELL_START_HALLS_OF_REFLECTION_QUEST_A
@ ACTION_GUNSHIP_ARRIVAL_2
@ ACTION_START_PREFIGHT
@ ACTION_GUNSHIP_ARRIVAL
@ ACTION_WALL_BROKEN
@ NPC_THE_LICH_KING_INTRO
@ NPC_JAINA_ESCAPE
@ NPC_REFLECTION
@ NPC_GUNSHIP_CANNON_HORDE
@ NPC_ICE_WALL_TARGET
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Transport * GetTransport(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
@ NPC_UTHER
Definition: npc_arthas.cpp:45
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr bool IsInDist2d(float x, float y, float dist) const
Definition: Position.h:140
float GetAbsoluteAngle(float x, float y) const
Definition: Position.h:125
constexpr float GetOrientation() const
Definition: Position.h:79
T const & DUNGEON_MODE(T const &normal5, T const &heroic10) const
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void Relocate(Position const &pos)
Definition: Spell.cpp:111
void UpdateAI(uint32) override
npc_escape_event_trash(Creature *creature)
void IsSummonedBy(WorldObject *) override
npc_gauntlet_trash(Creature *creature)
void EnterEvadeMode(EvadeReason) override
uint32 GetData(uint32 type) const override
InstanceScript * _instance
void SetData(uint32 type, uint32 value) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void EnterEvadeMode(EvadeReason why) override
void MovementInform(uint32 type, uint32 pointId) override
void IsSummonedBy(WorldObject *summoner) override
void IsSummonedBy(WorldObject *summoner) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32, uint32 pointId) override