TrinityCore
Loading...
Searching...
No Matches
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 "Spell.h"
31#include "SpellInfo.h"
32#include "SpellScript.h"
33#include "TemporarySummon.h"
34#include "Transport.h"
35#include "Unit.h"
36
37enum Text
38{
51
61
78
84
93
96
98
109
112
115
117{
122
142
158
170
172
191
196
201
217
219{
220 // Misc
225 SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
227
228 // Jaina, Sylvanas
229 SPELL_CAST_VISUAL = 65633, // wrong
232 SPELL_JAINA_ICE_BARRIER = 69787, // Jaina Ice Barrier
233 SPELL_JAINA_ICE_PRISON = 69708, // Jaina Ice Prison
235 SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188, // Sylvanas Cloak of Darkness
236 SPELL_SYLVANAS_DARK_BINDING = 70194, // Sylvanas Dark Binding
238 SPELL_SYLVANAS_BLINDING_RETREAT = 70199, // Sylvanas Blinding Retreat
239
240 // Lich King
241 SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
242 SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
243 SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of Frostmourne
247 SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning
248 SPELL_PAIN_AND_SUFFERING = 74115, // Lich King Pain and Suffering
249 SPELL_STUN_BREAK_JAINA = 69764, // Lich King visual spell, another Stun Break is 69763, should remove the stun effect
251 SPELL_HARVEST_SOUL = 69866, // Lich King Harvest Soul
252
253 // Koreln, Loralen
255
256 // Raging Ghoul
259
260 // Risen Witch Doctor
265
266 // Lumbering Abomination
268 SPELL_VOMIT_SPRAY = 70176
270
276
278{
279 { 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room
280 { 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route
281 { 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking
282 { 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall
283 { 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall
284 { 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall
285 { 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall
286 { 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed)
287 { 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed)
288};
289
290Position const LichKingMoveAwayPos = { 5400.069824f, 2102.7131689f, 707.69525f, 0.843803f }; // Lich King walks away
291Position const LichKingFirstSummon = { 5600.076172f, 2192.270996f, 731.750488f, 4.330935f }; // Lich King First summons
292Position const JainaSylvanasShadowThroneDoor = { 5577.243f, 2235.852f, 733.0128f, 2.209562f }; // Jaina/Sylvanas move to door
293Position const LichKingFinalPos = { 5283.742188f, 1706.335693f, 783.293518f, 4.138510f }; // Lich King Final Pos
294
295// sniffed
297{
298 { 5253.061f, 1953.616f, 707.6948f, 0.8377581f },
299 { 5283.226f, 1992.300f, 707.7445f, 0.8377581f },
300 { 5360.711f, 2064.797f, 707.6948f, 0.0f }
301};
302
304{
305 { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
306 { 5263.2f, 1950.96f, 707.6948f, 0.8028514f }, // 1 - Move to Door
307 { 5306.82f, 1998.17f, 709.341f, 1.239184f }, // 2 - Move to Frostmourne
308};
309
311{
312 { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
313 { 5265.89f, 1952.98f, 707.6978f, 0.0f }, // 1 - Move to Door
314 { 5306.95f, 1998.49f, 709.3414f, 1.277278f } // 2 - Move to Frostmourne
315};
316
317Position const UtherSpawnPos = { 5307.814f, 2003.168f, 709.4244f, 4.537856f };
318
320{
321 { 5362.463f, 2062.693f, 707.7781f, 3.944444f }, // 0 - Spawn
322 { 5332.83f, 2031.24f, 707.6948f, 0.0f }, // 1 - Door
323 { 5312.93f, 2010.24f, 709.34f, 0.0f }, // 2 - Move to Frostmourne
324 { 5319.028f, 2016.662f, 707.6948f, 0.0f }, // 3 - Move back
325 { 5332.285f, 2030.832f, 707.6948f, 0.0f }, // 4 - Move back 2
326 { 5355.488f, 2055.149f, 707.6907f, 0.0f } // 5 - Move back 3
327};
328
330{
331 { 5276.583f, 2037.45f, 709.4025f, 5.532694f }, // 0 - Spawn
332 { 5283.95f, 2030.53f, 709.3191f, 0.0f } // 1 - Intro
333};
334
336{
337 { 5342.232f, 1975.696f, 709.4025f, 2.391101f }, // 0 - Spawn
338 { 5335.01f, 1982.37f, 709.3191f, 0.0f } // 1 - Intro
339};
340
341Position const SylvanasShadowThroneDoorPosition = { 5576.79f, 2235.73f, 733.0029f, 2.687807f };
342
344{
345 { 5547.833f, 2083.701f, 731.4332f, 1.029744f }, // 1st Icewall
346 { 5503.213f, 1969.547f, 737.0245f, 1.27409f }, // 2nd Icewall
347 { 5439.976f, 1879.005f, 752.7048f, 1.064651f }, // 3rd Icewall
348 { 5318.289f, 1749.184f, 771.9423f, 0.8726646f } // 4th Icewall
349};
350
352{
353 public:
354 npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { }
355
357 {
362
363 bool OnGossipHello(Player* player) override
364 {
365 // override default gossip
367 {
368 ClearGossipMenuFor(player);
369 return true;
370 }
371
372 // load default gossip
373 return false;
374 }
375
376 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
377 {
378 ClearGossipMenuFor(player);
379
380 switch (gossipListId)
381 {
382 case 0:
386 break;
387 case 1:
391 break;
392 default:
393 break;
394 }
395 return false;
396 }
397
409
410 void UpdateAI(uint32 diff) override
411 {
412 _events.Update(diff);
413
414 switch (_events.ExecuteEvent())
415 {
418 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[0]);
419
421 {
425 }
426 else
427 {
431 }
432 break;
436 else
439 break;
442 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
443 // Begining of intro is differents between factions as the speech sequence and timers are differents.
445 {
448 }
449 else
450 {
453 }
454 break;
455 // A2 Intro Events
456 case EVENT_INTRO_A2_1:
459 break;
460 case EVENT_INTRO_A2_2:
463 break;
464 case EVENT_INTRO_A2_3:
469 break;
470 case EVENT_INTRO_A2_4:
472 _utherGUID = uther->GetGUID();
474 break;
475 case EVENT_INTRO_A2_5:
477 uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
479 break;
480 case EVENT_INTRO_A2_6:
483 break;
484 case EVENT_INTRO_A2_7:
486 uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
488 break;
489 case EVENT_INTRO_A2_8:
492 break;
493 case EVENT_INTRO_A2_9:
495 uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
497 break;
501 break;
504 uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
506 break;
510 break;
513 uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
515 break;
519 break;
522 uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
524 break;
527 uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
529 break;
533 break;
536 {
537 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
538 uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
539 }
541 break;
545 break;
546 // H2 Intro Events
547 case EVENT_INTRO_H2_1:
550 break;
551 case EVENT_INTRO_H2_2:
554 break;
555 case EVENT_INTRO_H2_3:
561 break;
562 case EVENT_INTRO_H2_4:
563 // spawn UTHER during speach 2
565 _utherGUID = uther->GetGUID();
567 break;
568 case EVENT_INTRO_H2_5:
570 uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
572 break;
573 case EVENT_INTRO_H2_6:
576 break;
577 case EVENT_INTRO_H2_7:
579 uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
581 break;
582 case EVENT_INTRO_H2_8:
585 break;
586 case EVENT_INTRO_H2_9:
588 uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
590 break;
594 break;
597 uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
599 break;
603 break;
606 {
607 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
608 uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
609 }
611 break;
614 uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
616 break;
620 break;
621 // Remaining Intro Events common for both faction
622 case EVENT_INTRO_LK_1:
623 // Spawn LK in front of door, and make him move to the sword.
625 {
626 lichking->SetWalk(true);
627 lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
628 _lichkingGUID = lichking->GetGUID();
631 }
633 {
634 uther->SetEmoteState(EMOTE_STATE_COWER);
636 uther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
637 else
638 uther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
639 }
641 break;
642 case EVENT_INTRO_LK_2:
644 lichking->AI()->Talk(SAY_LK_INTRO_1);
646 break;
647 case EVENT_INTRO_LK_3:
648 // The Lich King banishes Uther to the abyss.
650 {
651 uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
652 uther->DespawnOrUnsummon(5s);
654 }
656 break;
657 case EVENT_INTRO_LK_4:
658 // He steps forward and removes the runeblade from the heap of skulls.
660 {
662 frostmourne->SetPhaseMask(2, true);
663 lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);
664 lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);
665 }
667 break;
668 case EVENT_INTRO_LK_5:
670 lichking->AI()->Talk(SAY_LK_INTRO_2);
672 break;
673 case EVENT_INTRO_LK_6:
674 // summon Falric and Marwyn. then go back to the door
676 {
677 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
678 falric->SetVisible(true);
679 }
681 {
682 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
683 marwyn->SetVisible(true);
684 }
686 {
687 lichking->AI()->Talk(SAY_LK_INTRO_3);
688 lichking->SetWalk(true);
689 lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
690 }
693 break;
694 case EVENT_INTRO_LK_7:
696 {
697 marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
698 marwyn->SetWalk(true);
699 marwyn->GetMotionMaster()->MovePoint(0, MarwynPosition[1]);
700 }
702 break;
703 case EVENT_INTRO_LK_8:
705 {
706 falric->AI()->Talk(SAY_FALRIC_INTRO_1);
707 falric->SetWalk(true);
708 falric->GetMotionMaster()->MovePoint(0, FalricPosition[1]);
709 }
711 break;
712 case EVENT_INTRO_LK_9:
714 falric->AI()->Talk(SAY_FALRIC_INTRO_2);
717 break;
721 else
726 korelnOrLoralen->GetMotionMaster()->MovePoint(1, KorelnOrLoralenPos[2]);
728 break;
731 {
733 lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END);
734 else
735 lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END);
736 }
738 break;
739 case EVENT_INTRO_END:
743 {
744 lichking->DespawnOrUnsummon(5s);
746 }
747 me->DespawnOrUnsummon(10s);
749 break;
750 case EVENT_SKIP_INTRO:
753 else
755
757 korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
758
760 {
761 lichking->SetWalk(true);
762 lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
763 lichking->SetReactState(REACT_PASSIVE);
764 _lichkingGUID = lichking->GetGUID();
767 }
769 break;
772 break;
775 break;
778 korelnOrLoralen->CastSpell(korelnOrLoralen, SPELL_FEIGN_DEATH);
779 break;
780 default:
781 break;
782 }
783 }
784
785 private:
790 };
791
792 CreatureAI* GetAI(Creature* creature) const override
793 {
794 return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_intro_horAI>(creature);
795 }
796};
797
799{
800 public:
801 explicit HoRGameObjectDeleteDelayEvent(Unit* owner, ObjectGuid gameObjectGUID) : _owner(owner), _gameObjectGUID(gameObjectGUID) { }
802
804 {
806 go->Delete();
807 }
808
809 bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
810 {
812 return true;
813 }
814
815 void Abort(uint64 /*execTime*/) override
816 {
818 }
819
820 private:
823};
824
826{
827 public:
828 npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
829
831 {
833 _instance(creature->GetInstanceScript()), _icewall(0), _prefight(false), _invincibility(true) { }
834
842
843 void JustDied(Unit* /*killer*/) override
844 {
846 lichking->AI()->EnterEvadeMode(); // event failed
847 }
848
849 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
850 {
851 if (damage >= me->GetHealth() && _invincibility)
852 damage = me->GetHealth() - 1;
853 }
854
855 void DoAction(int32 actionId) override
856 {
857 switch (actionId)
858 {
860 if (_prefight)
861 return;
862 _prefight = true;
864 break;
866 ++_icewall;
867 if (_icewall < 4)
869 else
871 break;
874 break;
877 break;
878 default:
879 break;
880 }
881 }
882
883 bool OnGossipHello(Player* player) override
884 {
885 // override default gossip
887 {
889 player->SendPreparedGossip(me);
890 return true;
891 }
892
893 // load default gossip
894 return false;
895 }
896
897 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
898 {
899 ClearGossipMenuFor(player);
900
901 switch (gossipListId)
902 {
903 case 0:
907 break;
908 default:
909 break;
910 }
911 return false;
912 }
913
927
929 {
930 if (_icewall < 4)
931 {
933 {
934 lichking->StopMoving();
936 lichking->CastSpell(wallTarget, SPELL_SUMMON_ICE_WALL);
937
938 lichking->AI()->SetData(DATA_ICEWALL, _icewall);
939 }
940 }
941 }
942
956
957 void MovementInform(uint32 type, uint32 pointId) override
958 {
959 if (type != POINT_MOTION_TYPE)
960 return;
961
962 switch (pointId)
963 {
965 if (me->GetEntry() == NPC_JAINA_ESCAPE)
967 else
972 break;
975 break;
976 case POINT_TRAP:
979 me->SetFacingToObject(lichking);
980 break;
981 default:
982 break;
983 }
984 }
985
987 {
989 if (ref->GetVictim()->GetGUID() != except)
990 ref->ClearThreat();
991 }
992
993 void UpdateAI(uint32 diff) override
994 {
995 _events.Update(diff);
996
997 while (uint32 event = _events.ExecuteEvent())
998 {
999 switch (event)
1000 {
1001 case EVENT_ESCAPE:
1004 else
1006
1008 {
1009 me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true);
1010 lichking->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
1011 lichking->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
1012 AttackStart(lichking);
1013 lichking->AI()->AttackStart(me);
1014 }
1017 break;
1018 case EVENT_ESCAPE_1:
1020 {
1022 lichking->AI()->Talk(SAY_LK_ESCAPE_1);
1023 else
1024 lichking->AI()->Talk(SAY_LK_ESCAPE_2);
1026 }
1027 break;
1028 case EVENT_ESCAPE_2:
1029 me->AttackStop();
1030 me->StopMoving();
1032
1035 else
1037
1039 {
1040 lichking->SetReactState(REACT_PASSIVE);
1041 lichking->SetUnitFlag(UNIT_FLAG_PACIFIED);
1042 }
1043
1045 break;
1046 case EVENT_ESCAPE_3:
1050 break;
1051 case EVENT_ESCAPE_4:
1054 else
1057
1059 {
1060 lichking->SetImmuneToPC(true);
1061 lichking->RemoveAllAttackers();
1062
1063 DeleteAllFromThreatList(lichking, me->GetGUID());
1064 }
1065
1067 break;
1068 case EVENT_ESCAPE_5:
1070 break;
1071 case EVENT_ESCAPE_6:
1073 {
1074 lichking->RemoveUnitFlag(UNIT_FLAG_PACIFIED);
1075 lichking->SetImmuneToPC(false);
1076
1078 {
1079 lichking->CastSpell(lichking, SPELL_STUN_BREAK_JAINA);
1080 lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICE_PRISON);
1081 }
1082 else
1083 {
1084 lichking->CastSpell(lichking, SPELL_STUN_BREAK_SYLVANAS);
1085 lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARK_BINDING);
1086 }
1087 }
1088 _invincibility = false;
1091 break;
1092 case EVENT_ESCAPE_7:
1094 lichking->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
1097 break;
1098 case EVENT_ESCAPE_8:
1100 lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
1102 break;
1103 case EVENT_ESCAPE_9:
1106 break;
1107 case EVENT_ESCAPE_10:
1110 lichking->GetMotionMaster()->MovePoint(1, LichKingFirstSummon);
1112 break;
1113 case EVENT_ESCAPE_11:
1114 SummonIceWall();
1116 break;
1117 case EVENT_ESCAPE_12:
1119 lichking->CastSpell(lichking, SPELL_PAIN_AND_SUFFERING, true);
1120
1122 break;
1123 case EVENT_ESCAPE_13: // ICEWALL BROKEN
1125
1126 if (_icewall && _icewall < 4)
1129 break;
1130 case EVENT_ESCAPE_14:
1131 SummonIceWall();
1132 break;
1133 case EVENT_ESCAPE_15: // FINAL PART
1135
1137
1139 {
1140 lichking->GetMotionMaster()->MovePoint(2, LichKingFinalPos);
1141 lichking->RemoveAurasDueToSpell(SPELL_REMORSELESS_WINTER);
1142 }
1144 break;
1145 case EVENT_ESCAPE_16:
1150 gunship->EnableMovement(true);
1152 break;
1153 case EVENT_ESCAPE_17:
1156 else
1160 break;
1161 default:
1162 break;
1163 }
1164 }
1165
1167 }
1168
1169 private:
1172 uint32 _icewall; // icewall number
1175 };
1176
1177 CreatureAI* GetAI(Creature* creature) const override
1178 {
1179 return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature);
1180 }
1181};
1182
1184{
1185 public:
1186 npc_the_lich_king_escape_hor() : CreatureScript("npc_the_lich_king_escape_hor") { }
1187
1189 {
1198
1199 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1200 {
1201 if (damage >= me->GetHealth())
1202 damage = me->GetHealth() - 1;
1203 }
1204
1205 void MovementInform(uint32 type, uint32 pointId) override
1206 {
1207 if (type == POINT_MOTION_TYPE)
1208 {
1209 switch (pointId)
1210 {
1211 case 1:
1213 me->GetMotionMaster()->MoveChase(target);
1214 break;
1215 case 2:
1217
1219 DoCast(target, SPELL_HARVEST_SOUL);
1220
1222 gunship->EnableMovement(true);
1223 break;
1224 default:
1225 break;
1226 }
1227 }
1228 }
1229
1230 void JustSummoned(Creature* /*summon*/) override
1231 {
1232 ++_summonsCount;
1233 }
1234
1235 void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
1236 {
1237 // should never happen
1238 if (!_summonsCount)
1239 return;
1240
1241 --_summonsCount;
1242
1243 // All summons dead and no summon events scheduled
1244 if (!_summonsCount && _events.Empty())
1245 {
1247 jainaOrSylvanas->AI()->DoAction(ACTION_WALL_BROKEN);
1248 }
1249 }
1250
1251 void KilledUnit(Unit* who) override
1252 {
1253 if (who->GetTypeId() == TYPEID_PLAYER)
1255 }
1256
1257 void SetData(uint32 type, uint32 data) override
1258 {
1259 if (type != DATA_ICEWALL)
1260 return;
1261
1262 _icewall = data;
1263
1264 switch (_icewall)
1265 {
1266 case 0: // 6 Ghouls, 1 Witch Doctor
1272 break;
1273 case 1: // 6 Ghouls, 2 Witch Doctor, 1 Lumbering Abomination
1279 break;
1280 case 2: // 6 Ghouls, 2 Witch Doctor, 2 Lumbering Abomination
1287 break;
1288 case 3: // 12 Ghouls, 4 Witch Doctor, 3 Lumbering Abomination
1299 break;
1300 default:
1301 break;
1302 }
1303 }
1304
1305 void EnterEvadeMode(EvadeReason /*why*/) override
1306 {
1307 if (_despawn)
1308 return;
1309
1311 me->StopMoving();
1314 me->DespawnOrUnsummon(12s);
1315 _despawn = true;
1316 }
1317
1318 void UpdateAI(uint32 diff) override
1319 {
1320 if (!SelectVictim())
1321 return;
1322
1323 _events.Update(diff);
1324
1326 return;
1327
1328 while (uint32 event = _events.ExecuteEvent())
1329 {
1330 switch (event)
1331 {
1333 me->StopMoving();
1336 break;
1338 me->StopMoving();
1341 break;
1344 break;
1348 break;
1349 default:
1350 break;
1351 }
1352 }
1353
1355 }
1356
1357 private:
1359 {
1360 if (!me->IsInCombat())
1361 return false;
1362
1364 {
1365 if (Unit* victim = me->SelectVictim())
1366 if (!me->HasSpellFocus() && victim != me->GetVictim())
1367 AttackStart(victim);
1368 return me->GetVictim() != nullptr;
1369 }
1371 {
1373 return false;
1374 }
1375
1376 return true;
1377 }
1378
1384 };
1385
1386 CreatureAI* GetAI(Creature* creature) const override
1387 {
1388 return GetHallsOfReflectionAI<npc_the_lich_king_escape_horAI>(creature);
1389 }
1390};
1391
1393{
1394 // Ghostly Priest
1399
1400 // Phantom Mage
1407
1408 // Phantom Hallucination (same as phantom mage + HALLUCINATION_2 when dies)
1410
1411 // Shadowy Mercenary
1416
1417 // Spectral Footman
1421
1422 // Tortured Rifleman
1426 SPELL_ICE_SHOT = 72268
1428
1463
1465{
1467 _instance(creature->GetInstanceScript()), InternalWaveId(0) { }
1468
1469 void Reset() override
1470 {
1472 _events.Reset();
1473 }
1474
1480
1481 void SetData(uint32 type, uint32 value) override
1482 {
1483 if (type)
1484 return;
1485
1486 InternalWaveId = value;
1487 }
1488
1489 uint32 GetData(uint32 type) const override
1490 {
1491 if (type)
1492 return 0;
1493
1494 return InternalWaveId;
1495 }
1496
1497protected:
1501};
1502
1504{
1505 public:
1506 npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
1507
1509 {
1511
1519
1520 void UpdateAI(uint32 diff) override
1521 {
1522 if (!UpdateVictim())
1523 return;
1524
1525 _events.Update(diff);
1526
1528 return;
1529
1530 switch (_events.ExecuteEvent())
1531 {
1533 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1536 break;
1538 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f, true))
1541 break;
1543 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true))
1544 DoCast(target, SPELL_COWER_IN_FEAR);
1546 break;
1547 case EVENT_DARK_MENDING:
1548 // find an ally with missing HP
1549 if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
1550 {
1551 DoCast(target, SPELL_DARK_MENDING);
1553 }
1554 else
1555 {
1556 // no friendly unit with missing hp. re-check in just 5 sec.
1558 }
1559 break;
1560 default:
1561 break;
1562 }
1563
1565 }
1566 };
1567
1568 CreatureAI* GetAI(Creature* creature) const override
1569 {
1570 return GetHallsOfReflectionAI<npc_ghostly_priestAI>(creature);
1571 }
1572};
1573
1575{
1576 public:
1577 npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
1578
1580 {
1582
1583 void EnterEvadeMode(EvadeReason why) override
1584 {
1587 }
1588
1597
1598 void UpdateAI(uint32 diff) override
1599 {
1600 if (!UpdateVictim())
1601 return;
1602
1603 _events.Update(diff);
1604
1606 return;
1607
1608 switch (_events.ExecuteEvent())
1609 {
1610 case EVENT_FIREBALL:
1611 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1612 DoCast(target, SPELL_FIREBALL);
1614 break;
1615 case EVENT_FLAMESTRIKE:
1616 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1617 DoCast(target, SPELL_FLAMESTRIKE);
1619 break;
1620 case EVENT_FROSTBOLT:
1621 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1622 DoCast(target, SPELL_FROSTBOLT);
1624 break;
1627 DoCast(target, SPELL_CHAINS_OF_ICE);
1629 break;
1631 // removing any dots on mage or else the invisibility spell will break duration
1632 me->RemoveAllAuras();
1634 break;
1635 default:
1636 break;
1637 }
1638
1640 }
1641 };
1642
1643 CreatureAI* GetAI(Creature* creature) const override
1644 {
1645 return GetHallsOfReflectionAI<npc_phantom_mageAI>(creature);
1646 }
1647};
1648
1650{
1651 public:
1652 npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
1653
1655 {
1657
1658 void Reset() override
1659 {
1661 }
1662
1668
1669 void JustDied(Unit* /*killer*/) override
1670 {
1672 }
1673 };
1674
1675 CreatureAI* GetAI(Creature* creature) const override
1676 {
1677 return GetHallsOfReflectionAI<npc_phantom_hallucinationAI>(creature);
1678 }
1679};
1680
1682{
1683 public:
1684 npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
1685
1687 {
1689
1697
1698 void UpdateAI(uint32 diff) override
1699 {
1700 if (!UpdateVictim())
1701 return;
1702
1703 _events.Update(diff);
1704
1706 return;
1707
1708 switch (_events.ExecuteEvent())
1709 {
1710 case EVENT_SHADOW_STEP:
1711 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
1712 DoCast(target, SPELL_SHADOW_STEP);
1714 break;
1718 break;
1720 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1723 break;
1724 case EVENT_KIDNEY_SHOT:
1727 break;
1728 default:
1729 break;
1730 }
1731
1733 }
1734 };
1735
1736 CreatureAI* GetAI(Creature* creature) const override
1737 {
1738 return GetHallsOfReflectionAI<npc_shadowy_mercenaryAI>(creature);
1739 }
1740};
1741
1743{
1744 public:
1745 npc_spectral_footman() : CreatureScript("npc_spectral_footman") { }
1746
1748 {
1750
1757
1758 void UpdateAI(uint32 diff) override
1759 {
1760 if (!UpdateVictim())
1761 return;
1762
1763 _events.Update(diff);
1764
1766 return;
1767
1768 switch (_events.ExecuteEvent())
1769 {
1773 break;
1774 case EVENT_SHIELD_BASH:
1777 break;
1781 break;
1782 default:
1783 break;
1784 }
1785
1787 }
1788 };
1789
1790 CreatureAI* GetAI(Creature* creature) const override
1791 {
1792 return GetHallsOfReflectionAI<npc_spectral_footmanAI>(creature);
1793 }
1794};
1795
1797{
1798 public:
1799 npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
1800
1802 {
1804
1812
1813 void UpdateAI(uint32 diff) override
1814 {
1815 if (!UpdateVictim())
1816 return;
1817
1818 _events.Update(diff);
1819
1821 return;
1822
1823 switch (_events.ExecuteEvent())
1824 {
1825 case EVENT_SHOOT:
1826 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1827 DoCast(target, SPELL_SHOOT);
1829 break;
1830 case EVENT_CURSED_ARROW:
1831 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1832 DoCast(target, SPELL_CURSED_ARROW);
1834 break;
1835 case EVENT_FROST_TRAP:
1838 break;
1839 case EVENT_ICE_SHOT:
1840 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
1841 DoCast(target, SPELL_ICE_SHOT);
1843 break;
1844 default:
1845 break;
1846 }
1847
1849 }
1850 };
1851
1852 CreatureAI* GetAI(Creature* creature) const override
1853 {
1854 return GetHallsOfReflectionAI<npc_tortured_riflemanAI>(creature);
1855 }
1856};
1857
1859{
1860 // General
1864
1867
1872
1873 // Reflection
1875
1877 SPELL_SPIRIT_BURST = 69900
1879
1881{
1882 public:
1883 npc_frostsworn_general() : CreatureScript("npc_frostsworn_general") { }
1884
1886 {
1888 {
1889 _instance = creature->GetInstanceScript();
1890 }
1891
1892 void Reset() override
1893 {
1894 _events.Reset();
1896 }
1897
1898 void JustDied(Unit* /*killer*/) override
1899 {
1900 Talk(SAY_DEATH);
1901 _events.Reset();
1903 }
1904
1914
1915 void UpdateAI(uint32 diff) override
1916 {
1917 if (!UpdateVictim())
1918 return;
1919
1920 _events.Update(diff);
1921
1923 return;
1924
1925 while (uint32 event = _events.ExecuteEvent())
1926 {
1927 switch (event)
1928 {
1929 case EVENT_SHIELD:
1930 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true))
1931 DoCast(target, SPELL_SHIELD_THROWN);
1933 break;
1934 case EVENT_SPIKE:
1935 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true))
1936 DoCast(target, SPELL_SPIKE);
1938 break;
1939 case EVENT_CLONE:
1940 SummonClones();
1942 break;
1943 default:
1944 break;
1945 }
1946 }
1948 }
1949
1951 {
1952 std::list<Unit*> playerList;
1953 SelectTargetList(playerList, 5, SelectTargetMethod::MaxThreat, 0, 0.0f, true);
1954 for (Unit* target : playerList)
1955 {
1957 {
1958 reflection->SetImmuneToPC(false);
1959 target->CastSpell(reflection, SPELL_CLONE, true);
1960 target->CastSpell(reflection, SPELL_GHOST_VISUAL, true);
1961 reflection->AI()->AttackStart(target);
1962 }
1963 }
1964 }
1965
1966 private:
1969 };
1970
1971 CreatureAI* GetAI(Creature* creature) const override
1972 {
1973 return GetHallsOfReflectionAI<npc_frostsworn_generalAI>(creature);
1974 }
1975};
1976
1978{
1979 public:
1980 npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
1981
1983 {
1985
1986 void Reset() override
1987 {
1988 _events.Reset();
1989 }
1990
1991 void JustEngagedWith(Unit* /*victim*/) override
1992 {
1994 }
1995
1996 void JustDied(Unit* /*killer*/) override
1997 {
1999 }
2000
2001 void UpdateAI(uint32 diff) override
2002 {
2003 if (!UpdateVictim())
2004 return;
2005
2006 _events.Update(diff);
2007
2009 return;
2010
2011 switch (_events.ExecuteEvent())
2012 {
2014 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 8.0f, true))
2017 break;
2018 default:
2019 break;
2020 }
2021
2023 }
2024
2025 private:
2027 };
2028
2029 CreatureAI* GetAI(Creature* creature) const override
2030 {
2031 return GetHallsOfReflectionAI<npc_spiritual_reflectionAI>(creature);
2032 }
2033};
2034
2035// 5689
2037{
2038 public:
2039 at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { }
2040
2041 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
2042 {
2043 if (player->IsGameMaster())
2044 return true;
2045
2046 InstanceScript* _instance = player->GetInstanceScript();
2047
2048 if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
2050
2053 {
2055 _instance->SetGuidData(DATA_QUEL_DELAR_INVOKER, player->GetGUID());
2056 }
2057
2058 return true;
2059 }
2060};
2061
2063{
2064 public:
2065 at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { }
2066
2067 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
2068 {
2069 if (player->IsGameMaster())
2070 return true;
2071
2072 InstanceScript* _instance = player->GetInstanceScript();
2073
2074 if (_instance->GetData(DATA_WAVE_COUNT))
2075 return true;
2076
2077 if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN) != DONE)
2078 {
2079 _instance->ProcessEvent(nullptr, EVENT_SPAWN_WAVES);
2080
2081 if (Creature* falric = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_FALRIC)))
2082 {
2083 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
2084 falric->SetVisible(true);
2085 }
2086 if (Creature* marwyn = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_MARWYN)))
2087 {
2088 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
2089 marwyn->SetVisible(true);
2090 }
2091 }
2092 return true;
2093 }
2094};
2095
2096// 5740
2098{
2099 public:
2100 at_hor_impenetrable_door() : AreaTriggerScript("at_hor_impenetrable_door") { }
2101
2102 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
2103 {
2104 if (player->IsGameMaster())
2105 return true;
2106
2107 InstanceScript* _instance = player->GetInstanceScript();
2108 if (_instance->GetBossState(DATA_MARWYN) == DONE)
2109 return true;
2110
2112 return false;
2113 }
2114};
2115
2116// 5605
2118{
2119 public:
2120 at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { }
2121
2122 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
2123 {
2124 if (player->IsGameMaster())
2125 return true;
2126
2127 InstanceScript* _instance = player->GetInstanceScript();
2128
2131
2132 return true;
2133 }
2134};
2135
2150
2152{
2153 npc_escape_event_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
2154
2155 void Reset() override
2156 {
2157 _events.Reset();
2158 }
2159
2165
2166 void IsSummonedBy(WorldObject* /*summoner*/) override
2167 {
2170 {
2171 me->SetImmuneToPC(false);
2172 me->SetInCombatWith(leader);
2173 leader->SetInCombatWith(me);
2174 AddThreat(leader, 0.0f);
2175 }
2176 }
2177
2178protected:
2181};
2182
2184{
2185 public:
2186 npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
2187
2189 {
2191
2192 void Reset() override
2193 {
2196 }
2197
2207
2208 void UpdateAI(uint32 diff) override
2209 {
2211
2212 if (!UpdateVictim())
2213 return;
2214
2215 _events.Update(diff);
2216
2218 return;
2219
2220 switch (_events.ExecuteEvent())
2221 {
2223 if (Unit* victim = me->GetVictim())
2224 {
2225 if (me->IsInRange(victim, 5.0f, 30.0f))
2226 {
2227 DoCast(victim, SPELL_GHOUL_JUMP);
2228 return;
2229 }
2230 }
2232 break;
2233 default:
2234 break;
2235 }
2236
2238 }
2239 };
2240
2241 CreatureAI* GetAI(Creature* creature) const override
2242 {
2243 return GetHallsOfReflectionAI<npc_raging_ghoulAI>(creature);
2244 }
2245};
2246
2248{
2249 public:
2250 npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
2251
2253 {
2255
2263
2273
2274 void UpdateAI(uint32 diff) override
2275 {
2277
2278 if (!UpdateVictim())
2279 return;
2280
2281 _events.Update(diff);
2282
2284 return;
2285
2286 switch (_events.ExecuteEvent())
2287 {
2289 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
2290 DoCast(target, SPELL_CURSE_OF_DOOM);
2292 break;
2294 if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, 20.0f, true))
2295 DoCast(target, SPELL_SHADOW_BOLT);
2297 break;
2299 if (SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
2302 break;
2303 default:
2304 break;
2305 }
2306
2308 }
2309 };
2310
2311 CreatureAI* GetAI(Creature* creature) const override
2312 {
2313 return GetHallsOfReflectionAI<npc_risen_witch_doctorAI>(creature);
2314 }
2315};
2316
2318{
2319 public:
2320 npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
2321
2323 {
2325
2332
2333 void UpdateAI(uint32 diff) override
2334 {
2336
2337 if (!UpdateVictim())
2338 return;
2339
2340 _events.Update(diff);
2341
2343 return;
2344
2345 switch (_events.ExecuteEvent())
2346 {
2350 break;
2354 break;
2355 default:
2356 break;
2357 }
2358
2360 }
2361 };
2362
2363 CreatureAI* GetAI(Creature* creature) const override
2364 {
2365 return GetHallsOfReflectionAI<npc_lumbering_abominationAI>(creature);
2366 }
2367};
2368
2397
2419
2425
2426Position const QuelDelarCenterPos = { 5309.259f, 2006.390f, 718.046f, 0.0f };
2427Position const QuelDelarSummonPos = { 5298.473f, 1994.852f, 709.424f, 3.979351f };
2429{
2430 { 5292.870f, 1998.950f, 718.046f, 0.0f },
2431 { 5295.819f, 1991.912f, 707.707f, 0.0f },
2432 { 5295.301f, 1989.782f, 708.696f, 0.0f }
2433};
2434
2436{
2437 { 5336.830f, 1981.700f, 709.319f, 0.0f },
2438 { 5314.350f, 1993.440f, 707.726f, 0.0f }
2439};
2440
2442{
2443 public:
2444 npc_uther_quel_delar() : CreatureScript("npc_uther_quel_delar") { }
2445
2447 {
2449 {
2451 }
2452
2453 void Reset() override
2454 {
2455 // Prevent to break Uther in intro event during instance encounter
2457 return;
2458
2459 _events.Reset();
2461 }
2462
2463 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
2464 {
2465 if (damage >= me->GetHealth())
2466 damage = me->GetHealth() - 1;
2467 }
2468
2469 void DoAction(int32 action) override
2470 {
2471 switch (action)
2472 {
2476 break;
2477 case ACTION_UTHER_OUTRO:
2479 break;
2480 default:
2481 break;
2482 }
2483 }
2484
2485 void MovementInform(uint32 /*type*/, uint32 pointId) override
2486 {
2487 switch (pointId)
2488 {
2489 case 1:
2491 break;
2492 default:
2493 break;
2494 }
2495 }
2496
2497 void UpdateAI(uint32 diff) override
2498 {
2499 // Prevent to break Uther in intro event during instance encounter
2501 return;
2502
2503 _events.Update(diff);
2504
2505 while (uint32 eventId = _events.ExecuteEvent())
2506 {
2507 switch (eventId)
2508 {
2509 case EVENT_UTHER_1:
2511 break;
2512 case EVENT_UTHER_2:
2515 bunny->CastSpell(target, SPELL_QUEL_DELAR_WILL, true);
2517 break;
2518 case EVENT_UTHER_3:
2521 break;
2522 case EVENT_UTHER_4:
2525 break;
2526 case EVENT_UTHER_5:
2528 break;
2529 case EVENT_UTHER_6:
2530 me->SetWalk(true);
2533 break;
2534 case EVENT_UTHER_7:
2537 break;
2538 case EVENT_UTHER_8:
2541 break;
2542 case EVENT_UTHER_9:
2545 break;
2546 case EVENT_UTHER_10:
2549 break;
2550 case EVENT_UTHER_11:
2552 me->DespawnOrUnsummon(3s);
2554 break;
2555 case EVENT_UTHER_FACING:
2557 me->SetFacingToObject(bunny);
2559 break;
2560 case EVENT_UTHER_KNEEL:
2562 break;
2563 default:
2564 break;
2565 }
2566 }
2567 }
2568
2569 private:
2572 };
2573
2574 CreatureAI* GetAI(Creature* creature) const override
2575 {
2576 return GetHallsOfReflectionAI<npc_uther_quel_delarAI>(creature);
2577 }
2578};
2579
2581{
2582 public:
2583 npc_quel_delar_sword() : CreatureScript("npc_quel_delar_sword") { }
2584
2586 {
2588 {
2591 _intro = true;
2592 }
2593
2594 void Reset() override
2595 {
2596 _events.Reset();
2597 me->SetSpeedRate(MOVE_FLIGHT, 4.5f);
2599 if (_intro)
2601 else
2602 me->SetImmuneToAll(false);
2603 }
2604
2611
2612 void JustDied(Unit* /*killer*/) override
2613 {
2615 uther->AI()->DoAction(ACTION_UTHER_OUTRO);
2616 }
2617
2618 void MovementInform(uint32 type, uint32 pointId) override
2619 {
2620 if (type != EFFECT_MOTION_TYPE)
2621 return;
2622
2623 switch (pointId)
2624 {
2625 case POINT_TAKE_OFF:
2627 break;
2628 default:
2629 break;
2630 }
2631 }
2632
2633 void UpdateAI(uint32 diff) override
2634 {
2635 _events.Update(diff);
2636
2638 return;
2639
2640 if (!UpdateVictim())
2641 {
2642 while (uint32 eventId = _events.ExecuteEvent())
2643 {
2644 switch (eventId)
2645 {
2648 bunny->AI()->Talk(SAY_FROSTMOURNE_BUNNY);
2649 _intro = false;
2651 break;
2654 break;
2656 {
2659 break;
2660 }
2662 me->StopMoving();
2663 me->GetMotionMaster()->Clear();
2666 break;
2670 me->SetImmuneToAll(false);
2671 break;
2672 default:
2673 break;
2674 }
2675 }
2676 }
2677 else
2678 {
2679 while (uint32 eventId = _events.ExecuteEvent())
2680 {
2681 switch (eventId)
2682 {
2686 break;
2690 break;
2694 break;
2695 default:
2696 break;
2697 }
2698 }
2699
2701 }
2702 }
2703
2704 private:
2708 };
2709
2710 CreatureAI* GetAI(Creature* creature) const override
2711 {
2712 return GetHallsOfReflectionAI<npc_quel_delar_swordAI>(creature);
2713 }
2714};
2715
2716// 5660
2718{
2719 public:
2720 at_hor_uther_quel_delar_start() : AreaTriggerScript("at_hor_uther_quel_delar_start") { }
2721
2722 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
2723 {
2724 if (player->IsGameMaster())
2725 return true;
2726
2727 InstanceScript* _instance = player->GetInstanceScript();
2728
2729 if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS)
2730 if (Creature* uther = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_UTHER_QUEL_DELAR)))
2731 uther->AI()->DoAction(ACTION_UTHER_START_SCREAM);
2732
2733 return true;
2734 }
2735};
2736
2737// 72900 - Start Halls of Reflection Quest AE
2739{
2740 public:
2741 spell_hor_start_halls_of_reflection_quest_ae() : SpellScriptLoader("spell_hor_start_halls_of_reflection_quest_ae") { }
2742
2744 {
2746
2747 void StartQuests(SpellEffIndex /*effIndex*/)
2748 {
2749 if (Player* target = GetHitPlayer())
2750 {
2751 // CanTakeQuest and CanAddQuest checks done in spell effect execution
2752 if (target->GetTeam() == ALLIANCE)
2753 target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_A, true);
2754 else
2755 target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_H, true);
2756 }
2757 }
2758
2763 };
2764
2769};
2770
2771// 70190 - Evasion
2773{
2774 public:
2775 spell_hor_evasion() : SpellScriptLoader("spell_hor_evasion") { }
2776
2778 {
2780
2781 bool Load() override
2782 {
2783 return GetCaster()->GetTypeId() == TYPEID_UNIT;
2784 }
2785
2787 {
2789 Position pos(*target);
2791
2792 // prevent evasion outside the room
2793 if (pos.IsInDist2d(&home, 15.0f))
2794 return;
2795
2796 float angle = pos.GetAbsoluteAngle(&home);
2797 float dist = GetEffectInfo().CalcRadius(GetCaster());
2798 target->MovePosition(pos, dist, angle);
2799
2800 dest.Relocate(pos);
2801 }
2802
2807 };
2808
2809 SpellScript* GetSpellScript() const override
2810 {
2811 return new spell_hor_evasion_SpellScript();
2812 }
2813};
2814
2815// 70017 - Gunship Cannon Fire
2847
2848// 70698 - Quel'Delar's Will
2850{
2852
2853 bool Validate(SpellInfo const* spellInfo) override
2854 {
2855 return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
2856 }
2857
2859 {
2860 PreventHitDefaultEffect(effIndex);
2861
2862 // dummy spell consumes reagent, don't ignore it
2864 }
2865
2870};
2871
First const & RAND(First const &first, Second const &second, Rest const &... rest)
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:122
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint32_t uint32
Definition Define.h:133
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
@ TYPEID_UNIT
Definition ObjectGuid.h:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Spells
Definition PlayerAI.cpp:32
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:107
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
void ClearGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_ATTACK_ME
@ SPELL_EFFECT_FORCE_CAST
@ TARGET_DEST_TARGET_RADIUS
@ EMOTE_ONESHOT_NO
@ EMOTE_STATE_COWER
@ EMOTE_ONESHOT_EMERGE
@ EMOTE_ONESHOT_ROAR
@ EMOTE_STATE_KNEEL
@ IMMUNITY_STATE
@ IMMUNITY_EFFECT
@ ALLIANCE
@ HORDE
@ SPELL_AURA_MOD_TAUNT
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore Spell and Category cooldowns.
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellDestinationTargetSelectFn(F, I, N)
@ REACT_PASSIVE
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:34
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
@ MOVE_FLIGHT
@ UNIT_FLAG_PACIFIED
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
@ SPELL_WELL_OF_SOULS
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
std::unordered_map< ObjectGuid, CombatReference * > const & GetPvECombatRefs() const
@ EVADE_REASON_OTHER
Definition CreatureAI.h:98
void DoZoneInCombat(Creature *creature=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetDisplayId(uint32 modelId) override
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:295
bool HasReactState(ReactStates state) const
Definition Creature.h:121
void SetReactState(ReactStates st)
Definition Creature.h:119
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:186
void SetImmuneToAll(bool apply) override
Definition Creature.h:126
Unit * SelectVictim()
bool HasSpellFocus(Spell const *focusSpell=nullptr) const override
void Update(uint32 time)
Definition EventMap.h:67
bool Empty() const
Definition EventMap.h:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
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
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 DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveTakeoff(uint32 id, Position const &pos, Optional< float > velocity={})
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount)
void MoveLand(uint32 id, Position const &pos, Optional< float > velocity={})
void Clear()
Definition ObjectGuid.h:150
static Creature * ToCreature(Object *o)
Definition Object.h:186
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SendCloseGossip()
void SendPreparedGossip(WorldObject *source)
Definition Player.cpp:14052
bool IsGameMaster() const
Definition Player.h:998
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15642
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition Player.cpp:13886
PlayerMenu * PlayerTalkClass
Definition Player.h:1969
float CalcRadius(WorldObject *caster=nullptr, Spell *=nullptr) const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
WorldObject * GetExplTargetWorldObject() const
std::vector< ThreatReference * > GetModifiableThreatList()
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
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:101
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
ThreatManager & GetThreatManager()
Definition Unit.h:1155
void SetInCombatWith(Unit *enemy, bool addSecondUnitSuppressed=false)
Definition Unit.h:1146
void StopMoving(bool force=false)
Definition Unit.cpp:10312
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
void SetHealth(uint32 val)
Definition Unit.cpp:9361
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13259
uint32 GetHealth() const
Definition Unit.h:913
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
Unit * GetVictim() const
Definition Unit.h:859
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
void SetStandState(UnitStandStateType state)
Definition Unit.cpp:10363
void RemoveAllAuras()
Definition Unit.cpp:4157
CombatManager & GetCombatManager()
Definition Unit.h:1130
bool AttackStop()
Definition Unit.cpp:5645
bool IsInCombat() const
Definition Unit.h:1144
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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:1992
Unit * GetOwner() const
Definition Object.cpp:2180
bool IsInRange(WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
Definition Object.cpp:1283
EventProcessor m_Events
Definition Object.h:591
void MovePosition(Position &pos, float dist, float angle)
Definition Object.cpp:3277
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
virtual void ProcessEvent(WorldObject *, uint32)
Definition ZoneScript.h:58
virtual void SetGuidData(uint32, ObjectGuid)
Definition ZoneScript.h:49
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
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
PrepareSpellScript(spell_hor_evasion_SpellScript)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
PrepareSpellScript(spell_hor_quel_delars_will)
void HandleReagent(SpellEffIndex effIndex)
bool Validate(SpellInfo const *spellInfo) override
@ DATA_TEAM_IN_INSTANCE
Position const MarwynPosition[]
Position const LichKingFinalPos
@ GOSSIP_MENU_JAINA_FINAL
@ GOSSIP_MENU_SYLVANAS_FINAL
Position const JainaIntroPosition[]
Position const KorelnOrLoralenPos[]
@ 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
Position const UtherQuelDelarMovement[]
Position const QuelDelarMovement[]
Position const UtherSpawnPos
Position const LichKingFirstSummon
Position const LichKingMoveAwayPos
@ 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()
@ EVENT_CURSED_ARROW
@ EVENT_SHIELD_BASH
@ EVENT_KIDNEY_SHOT
@ EVENT_SHADOW_WORD_PAIN
@ EVENT_DEADLY_POISON
@ EVENT_ENVENOMED_DAGGER_THROW
@ EVENT_FLAMESTRIKE
@ EVENT_SPECTRAL_STRIKE
@ EVENT_DARK_MENDING
@ EVENT_HALLUCINATION
@ EVENT_CIRCLE_OF_DESTRUCTION
@ EVENT_TORTURED_ENRAGE
@ EVENT_CHAINS_OF_ICE
@ EVENT_COWER_IN_FEAR
@ EVENT_SHADOW_STEP
Position const SylvanasShadowThroneDoorPosition
@ SPELL_SHADOW_BOLT_VOLLEY
@ SPELL_PAIN_AND_SUFFERING
@ 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
Position const QuelDelarSummonPos
Position const NpcJainaOrSylvanasEscapeRoute[]
Position const QuelDelarCenterPos
@ SAY_FROSTMOURNE_BUNNY
@ SPELL_QUEL_DELAR_WILL
Position const JainaSylvanasShadowThroneDoor
@ SPELL_COWER_IN_FEAR
@ SPELL_SHIELD_BASH
@ AURA_HALLUCINATION
@ 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_DEADLY_POISON
@ SPELL_KIDNEY_SHOT
@ SPELL_HALLUCINATION_2
@ SPELL_SHADOW_STEP
@ SPELL_CHAINS_OF_ICE
@ 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
@ EVENT_UTHER_KNEEL
@ 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
Position const LichKingIntroPosition[]
Position const IceWallTargetPosition[]
Position const FalricPosition[]
Position const SylvanasIntroPosition[]
@ EVENT_ESCAPE_16
@ EVENT_INTRO_H2_4
@ EVENT_ESCAPE_15
@ 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_INTRO_H2_1
@ EVENT_INTRO_H2_2
@ EVENT_INTRO_A2_1
@ EVENT_INTRO_LK_8
@ EVENT_WALK_INTRO1
@ 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_INTRO_A2_5
@ EVENT_WALK_INTRO2
@ EVENT_ESCAPE_10
@ EVENT_INTRO_H2_10
@ EVENT_KORELN_LORALEN_DEATH
@ EVENT_SKIP_INTRO
@ EVENT_INTRO_A2_17
@ 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_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_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
@ EVENT_QUEL_DELAR_FLIGHT
@ EVENT_QUEL_DELAR_FIGHT
@ SPELL_HEROIC_STRIKE
@ EVENT_QUEL_DELAR_WHIRLWIND
@ EVENT_QUEL_DELAR_INIT
@ EVENT_QUEL_DELAR_LAND
@ SAY_QUEL_DELAR_SWORD
@ 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
bool IsInDist2d(float x, float y, float dist) const
Definition Position.h:145
float GetOrientation() const
Definition Position.h:82
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
T const & DUNGEON_MODE(T const &normal5, T const &heroic10) const
void AttackStart(Unit *) override
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void SetAggressiveStateAfter(Milliseconds timer, Creature *who=nullptr, bool startCombat=true, Creature *summoner=nullptr, StartCombatArgs const &combatArgs={ })
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void Relocate(Position const &pos)
Definition Spell.cpp:99
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
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