Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
halls_of_reflection.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "ScriptedGossip.h"
9#include "Player.h"
10#include "halls_of_reflection.h"
11
12enum Text
13{
26
37
47
57
74
80
92
95
97};
98
100{
105
125
141
153
155
172 //EVENT_ESCAPE_16,
184
187};
188
199
201{
202 SPELL_CAST_VISUAL = 65633, // Jaina/Sylavana
203 SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
209 SPELL_JAINA_ICEBARRIER = 69787, // Jaina Ice Barrier
210 SPELL_JAINA_ICEPRISON = 69708, // Jaina Ice Prison
211 SPELL_SYLVANAS_CLOAKOFDARKNESS = 70188, // Sylvanas Cloak of Darkness
212 SPELL_SYLVANAS_DARKBINDING = 70194, // Sylvanas Dark Binding
213 SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
214 SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
215 SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of FrostMourne
218 SPELL_SYLVANAS_JUMP = 68339, // Sylvanas Jump
223 SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning
224
225 // Raging Ghoul
228
229 // Witch Doctor
233
234 // Lumbering Abomination
237};
238
240{
241 {5283.234863f, 1990.946777f, 707.695679f, 0.929097f}, // 2 Loralen Follows
242 {5408.031250f, 2102.918213f, 707.695251f, 0.792756f}, // 9 Sylvanas Follows
243 {5401.866699f, 2110.837402f, 707.695251f, 0.800610f}, // 10 Loralen follows
244};
245
247{
248 {5601.217285f, 2207.652832f, 731.541931f, 5.223304f}, // leave the throne room
249 {5607.224375f, 2173.913330f, 731.126038f, 2.608723f}, // adjust route
250 {5583.427246f, 2138.784180f, 731.150391f, 4.260901f}, // stop for talking
251 {5560.281738f, 2104.025635f, 731.410889f, 4.058383f}, // attack the first icewall
252 {5510.990723f, 2000.772217f, 734.716064f, 3.973213f}, // attack the second icewall
253 {5452.641113f, 1905.762329f, 746.530579f, 4.118834f}, // attack the third icewall
254 {5338.126953f, 1768.429810f, 767.237244f, 3.855189f}, // attack the fourth icewall
255 {5257.712402f, 1669.379395f, 784.300110f, 0.908373f}, // face the Lich king
256 {5261.191895f, 1681.901611f, 784.285278f, 4.410465f}, // final position
257};
258
260{
261 {5547.833f, 2083.701f,731.4332f,4.24115f}, // first icewall
262 {5503.213f, 1969.547f,737.0245f,4.293779f},// second icewall
263 {5439.976f, 1879.005f,752.7048f,4.207591f},// third icewall
264 {5318.289f, 1749.184f,771.9423f,4.054276f},// fourth icewall
265};
266
267const Position IntroPos = {5265.89f, 1952.98f, 707.6978f, 0.0f}; // Jaina/Sylvanas Intro Start Position
268const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne
269const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f};
270const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f};
271const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne
272const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away
273const Position LichKingSpawnPos2 = {5552.733398f, 2262.718506f, 733.011047f, 4.009696f}; // Lich King Spawn Position 2
274const Position LichKingFirstSummon = {5600.076172f, 2192.270996f, 731.750488f, 4.330935f}; // Lich King First summons
275const Position JainaShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Jaina Spawn Position 2
276const Position SylvanasShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Sylvanas Spawn Position 2
277const Position FalricStartPos = {5283.878906f, 2030.459595f, 709.319641f, 5.506670f}; // Falric start position
278const Position MarwynStartPos = {5334.979980f, 1982.399536f, 709.320129f, 2.347014f}; // Marwyn start position
279const Position LichKingFinalPos = {5283.742188f, 1706.335693f, 783.293518f, 4.138510f}; // Lich King Final Pos
280const Position ChestPos = {5246.187500f, 1649.079468f, 784.301758f, 0.901268f}; // Chest position
281const Position FinalPortalPos = {5270.634277f ,1639.101196f, 784.303040f, 1.682743f}; // Final portal position
282
284{
285 public:
286 npc_jaina_or_sylvanas_hor() : CreatureScript("npc_jaina_or_sylvanas_hor") { }
287
288 // AI of Part1
290 {
292 {
293 _instance = me->GetInstanceScript();
294 }
295
299
301
302 void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) OVERRIDE
303 {
304 player->PlayerTalkClass->ClearMenus();
305 switch (action)
306 {
307 case 0:
308 player->CLOSE_GOSSIP_MENU();
309 _events.ScheduleEvent(EVENT_START_INTRO, 1000);
311 break;
312 case 1:
313 player->CLOSE_GOSSIP_MENU();
314 _events.ScheduleEvent(EVENT_SKIP_INTRO, 1000);
316 break;
317 }
318 }
319
321 {
322 _events.Reset();
323
324 _utherGUID = 0;
325 _lichkingGUID = 0;
326
328 me->SetStandState(UNIT_STAND_STATE_STAND);
329 _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
330 }
331
333 {
334 _events.Update(diff);
335
336 switch (_events.ExecuteEvent())
337 {
339 me->GetMotionMaster()->MovePoint(0, IntroPos);
341 {
343 _events.ScheduleEvent(EVENT_WALK_INTRO2, 7000);
344 }
345 else
346 {
348 _events.ScheduleEvent(EVENT_WALK_INTRO2, 9000);
349 }
350 break;
354 else
357 break;
359 me->GetMotionMaster()->MovePoint(0, MoveThronePos);
360 // Begining of intro is differents between fActions as the speech sequence and timers are differents.
362 _events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
363 else
364 _events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
365 break;
366 // A2 Intro Events
367 case EVENT_INTRO_A2_1:
369 _events.ScheduleEvent(EVENT_INTRO_A2_2, 7000);
370 break;
371 case EVENT_INTRO_A2_2:
373 _events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
374 break;
375 case EVENT_INTRO_A2_3:
376 me->CastSpell(me, SPELL_CAST_VISUAL, false);
377 me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
378 _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true);
379 _events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
380 break;
381 case EVENT_INTRO_A2_4:
383 {
384 uther->GetMotionMaster()->MoveIdle();
385 _utherGUID = uther->GetGUID();
386 }
387 _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
388 break;
389 case EVENT_INTRO_A2_5:
391 uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
392 _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
393 break;
394 case EVENT_INTRO_A2_6:
396 _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
397 break;
398 case EVENT_INTRO_A2_7:
400 uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
401 _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
402 break;
403 case EVENT_INTRO_A2_8:
405 _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
406 break;
407 case EVENT_INTRO_A2_9:
409 uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
410 _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
411 break;
414 _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
415 break;
418 uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
419 _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
420 break;
423 _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
424 break;
427 uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
428 _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
429 break;
432 _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
433 break;
436 uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
437 _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
438 break;
441 uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
442 _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
443 break;
446 _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
447 break;
450 {
451 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
452 uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
453 }
454 _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
455 break;
458 _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
459 break;
460 // H2 Intro Events
461 case EVENT_INTRO_H2_1:
463 _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
464 break;
465 case EVENT_INTRO_H2_2:
467 _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
468 break;
469 case EVENT_INTRO_H2_3:
471 me->CastSpell(me, SPELL_CAST_VISUAL, false);
472 me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
473 _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true);
474 _events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
475 break;
476 case EVENT_INTRO_H2_4:
477 // spawn UTHER during speach 2
479 {
480 uther->GetMotionMaster()->MoveIdle();
481 _utherGUID = uther->GetGUID();
482 }
483 _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
484 break;
485 case EVENT_INTRO_H2_5:
487 uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
488 _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
489 break;
490 case EVENT_INTRO_H2_6:
492 _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
493 break;
494 case EVENT_INTRO_H2_7:
496 uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
497 _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
498 break;
499 case EVENT_INTRO_H2_8:
501 _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
502 break;
503 case EVENT_INTRO_H2_9:
505 uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
506 _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
507 break;
510 _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
511 break;
514 uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
515 _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
516 break;
519 _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
520 break;
523 {
524 uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
525 uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
526 }
527 _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
528 break;
531 uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
532 _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
533 break;
536 _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
537 break;
538 // Remaining Intro Events common for both faction
539 case EVENT_INTRO_LK_1:
540 // Spawn LK in front of door, and make him move to the sword.
542 {
543 lichking->SetWalk(true);
544 lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
545 _lichkingGUID = lichking->GetGUID();
546 _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
547 _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
548 }
550 {
551 uther->SetUInt32Value(UNIT_FIELD_NPC_EMOTESTATE, EMOTE_STATE_COWER);
553 uther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
554 else
555 uther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
556 }
557 _events.ScheduleEvent(EVENT_INTRO_LK_2, 10000);
558 break;
559 case EVENT_INTRO_LK_2:
561 lichking->AI()->Talk(SAY_LK_INTRO_1);
562 _events.ScheduleEvent(EVENT_INTRO_LK_3, 1000);
563 break;
564 case EVENT_INTRO_LK_3:
565 // The Lich King banishes Uther to the abyss.
567 {
568 uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
569 uther->DespawnOrUnsummon(5000);
570 _utherGUID = 0;
571 }
572 _events.ScheduleEvent(EVENT_INTRO_LK_4, 9000);
573 break;
574 case EVENT_INTRO_LK_4:
575 // He steps forward and removes the runeblade from the heap of skulls.
577 {
578 if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE)))
579 frostmourne->SetPhaseMask(2, true);
580 lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);
581 lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);
582 }
583 _events.ScheduleEvent(EVENT_INTRO_LK_5, 8000);
584 break;
585 case EVENT_INTRO_LK_5:
587 lichking->AI()->Talk(SAY_LK_INTRO_2);
588 _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000);
589 break;
590 case EVENT_INTRO_LK_6:
591 // summon Falric and Marwyn. then go back to the door
593 {
594 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
595 falric->SetVisible(true);
596 }
598 {
599 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
600 marwyn->SetVisible(true);
601 }
603 {
604 lichking->AI()->Talk(SAY_LK_INTRO_3);
605 lichking->SetWalk(true);
606 lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
607 }
608 _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
609 _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000);
610 break;
611 case EVENT_INTRO_LK_7:
613 {
614 marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
615 marwyn->SetWalk(true);
616 marwyn->GetMotionMaster()->MovePoint(0, MarwynStartPos);
617 }
618 _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
619 break;
620 case EVENT_INTRO_LK_8:
622 {
623 falric->AI()->Talk(SAY_FALRIC_INTRO_1);
624 falric->SetWalk(true);
625 falric->GetMotionMaster()->MovePoint(0, FalricStartPos);
626 }
627 _events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
628 break;
629 case EVENT_INTRO_LK_9:
631 falric->AI()->Talk(SAY_FALRIC_INTRO_2);
632 _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
633 _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000);
634 break;
638 else
640 me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
642 _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
643 break;
646 {
648 lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END);
649 else
650 lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END);
651 }
652 _events.ScheduleEvent(EVENT_INTRO_END, 5000);
653 break;
654 case EVENT_INTRO_END:
655 if (_instance)
657 // Loralen or Koreln disappearAndDie()
659 {
660 lichking->DespawnOrUnsummon(5000);
661 _lichkingGUID = 0;
662 }
663 me->DespawnOrUnsummon(10000);
664 _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000);
665 break;
666 case EVENT_SKIP_INTRO:
667 me->GetMotionMaster()->MovePoint(0, MoveThronePos);
670 {
671 lichking->SetWalk(true);
672 lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
673 lichking->SetReactState(REACT_PASSIVE);
674 _lichkingGUID = lichking->GetGUID();
675 _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
676 _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
677 }
678 _events.ScheduleEvent(EVENT_INTRO_LK_4, 15000);
679 break;
682 _instance->HandleGameObject(0, true, gate);
683 break;
686 _instance->HandleGameObject(0, false, gate);
687 break;
688 }
689 }
690 };
691
693 {
695 }
696};
697
699{
700 public:
701 npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
702
703 // AI of Part2
705 {
707 _instance(creature->GetInstanceScript()), _lichkingGUID(0), _walltargetGUID(0),
709 {
710 }
711
716 uint32 _icewall; // icewall number
717
719
721 {
722 _events.Reset();
724 lichking->DespawnOrUnsummon(1);
725 _lichkingGUID = 0;
726 _walltargetGUID = 0;
727 _icewallGUID = 0;
728 _icewall = 0;
729 _events.ScheduleEvent(EVENT_ESCAPE, 0);
730 }
731
732 void JustDied(Unit* /*Killer*/) OVERRIDE
733 {
735 }
736
737 void DoAction(int32 actionId) OVERRIDE
738 {
739 switch (actionId)
740 {
741 case ACTION_START_ESCAPING: // called by InstanceScript when we need to start the escaping event
742 _events.ScheduleEvent(EVENT_ESCAPE_1, 1000);
743 break;
745 _icewall++;
746 if (_icewall != 4)
747 _events.ScheduleEvent(EVENT_ESCAPE_17, 3000);
748 else
749 _events.ScheduleEvent(EVENT_ESCAPE_23, 3000);
750 break;
751 }
752 }
753
754 void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) OVERRIDE
755 {
756 player->PlayerTalkClass->ClearMenus();
757 switch (action)
758 {
759 case 0:
760 player->CLOSE_GOSSIP_MENU();
762 _events.ScheduleEvent(EVENT_ESCAPE_7, 0);
763 break;
764 }
765 }
766
768 {
770 me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL);
771 else
772 me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL);
773
774 _instance->HandleGameObject(_icewallGUID, true);
775
777 wallTarget->DespawnOrUnsummon();
778 }
779
781 {
782 _events.Update(diff);
783
784 while (uint32 event = _events.ExecuteEvent())
785 {
786 switch (event)
787 {
788 case EVENT_ESCAPE:
790 {
791 me->Attack(lichking, true);
792 lichking->Attack(me, true);
793 me->SetReactState(REACT_PASSIVE);
794 lichking->SetReactState(REACT_PASSIVE);
795 _lichkingGUID = lichking->GetGUID();
798 else
800 }
801 me->SetHealth(252000);
802 break;
803 case EVENT_ESCAPE_1:
806 {
808 lichking->AI()->Talk(SAY_LK_ESCAPE_1);
809 else
810 lichking->AI()->Talk(SAY_LK_ESCAPE_2);
811 _events.ScheduleEvent(EVENT_ESCAPE_2, 8000);
812 }
813 break;
814 case EVENT_ESCAPE_2:
817 else
819 _events.ScheduleEvent(EVENT_ESCAPE_3, 1000);
820 break;
821 case EVENT_ESCAPE_3:
824 else
826 _events.ScheduleEvent(EVENT_ESCAPE_4, 2000);
827 break;
828 case EVENT_ESCAPE_4:
831 else
833 _events.ScheduleEvent(EVENT_ESCAPE_5, 2000);
834 break;
835 case EVENT_ESCAPE_5:
837 lichking->CombatStop();
838 me->GetMotionMaster()->MovePoint(0, JainaShadowThroneDoor);
840 me->RemoveAurasDueToSpell(SPELL_JAINA_ICEBARRIER);
841 else
842 me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAKOFDARKNESS);
843 _events.ScheduleEvent(EVENT_ESCAPE_6, 5000);
844 break;
845 case EVENT_ESCAPE_6:
847 break;
848 case EVENT_ESCAPE_7:
850 {
852 lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICEPRISON);
853 else
854 lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARKBINDING);
855 }
856 _events.ScheduleEvent(EVENT_ESCAPE_8, 1000);
857 break;
858 case EVENT_ESCAPE_8:
860 lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR);
861 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
862 _events.ScheduleEvent(EVENT_ESCAPE_9, 3000);
863 break;
864 case EVENT_ESCAPE_9:
866 lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
867 _events.ScheduleEvent(EVENT_ESCAPE_10, 1000);
868 break;
869 case EVENT_ESCAPE_10:
870 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]);
871 _events.ScheduleEvent(EVENT_ESCAPE_11, 5000);
872 break;
873 case EVENT_ESCAPE_11:
874 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]);
876 lichking->GetMotionMaster()->MovePoint(0, LichKingFirstSummon);
877 _events.ScheduleEvent(EVENT_ESCAPE_12, 6000);
878 break;
879 case EVENT_ESCAPE_12:
881 {
882 lichking->AI()->Talk(SAY_LK_ESCAPE_3);
883 lichking->AI()->DoCast(me, SPELL_RAISE_DEAD);
884 lichking->Attack(me, true);
885 }
886 _events.ScheduleEvent(EVENT_ESCAPE_13, 4000);
887 break;
888 case EVENT_ESCAPE_13:
890 {
891 lichking->AI()->DoCast(lichking, SPELL_REMORSELESS_WINTER, true);
892 lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
893 lichking->GetMotionMaster()->MoveIdle();
894 lichking->GetMotionMaster()->MoveChase(me);
895 }
896 if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[0], TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, 720000))
897 {
898 _walltargetGUID = walltarget->GetGUID();
899 walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
901 me->Attack(walltarget, false);
902 }
903 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[3]);
904 _events.ScheduleEvent(EVENT_ESCAPE_14, 8000);
905 break;
906 case EVENT_ESCAPE_14:
908 {
909 if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
910 {
911 _icewallGUID = icewall->GetGUID();
913 _instance->HandleGameObject(0, false, icewall);
916 else
918 }
919 }
920 _events.ScheduleEvent(EVENT_ESCAPE_15, 1000);
921 break;
922 case EVENT_ESCAPE_15:
924 {
925 lichking->GetMotionMaster()->MoveIdle();
926 lichking->GetMotionMaster()->MoveChase(me);
927 lichking->SetReactState(REACT_PASSIVE);
928 }
931 else
933 break;
934 case EVENT_ESCAPE_17:// ICEWALL BROKEN
935 me->GetMotionMaster()->MoveIdle();
937 {
938 lichking->StopMoving();
939 lichking->AI()->Talk(SAY_LK_ESCAPE_3);
940 lichking->AI()->DoCast(me, SPELL_RAISE_DEAD);
941 }
942
944
945 if (_icewall && _icewall < 4)
946 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]);
947 _events.ScheduleEvent(EVENT_ESCAPE_18, 2000);
948 break;
949 case EVENT_ESCAPE_18:
951 {
952 lichking->GetMotionMaster()->MoveIdle();
953 lichking->GetMotionMaster()->MoveChase(me);
954 }
955 _events.ScheduleEvent(EVENT_ESCAPE_19, 6000);
956 break;
957 case EVENT_ESCAPE_19:
959 {
960 if (_icewall && _icewall < 4)
961 lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
962 lichking->GetMotionMaster()->MoveIdle();
963 lichking->GetMotionMaster()->MoveChase(me);
964 lichking->SetReactState(REACT_PASSIVE);
965 lichking->Attack(me, true);
966 }
967 if (_icewall < 4)
968 {
969 if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall], TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, 720000))
970 {
971 _walltargetGUID = walltarget->GetGUID();
972 walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
974 me->Attack(walltarget, false);
975 }
976 }
977 _events.ScheduleEvent(EVENT_ESCAPE_20, 3000);
978 break;
979 case EVENT_ESCAPE_20:
981 {
982 if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
983 {
984 _icewallGUID = icewall->GetGUID();
985 _instance->HandleGameObject(0, false, icewall);
988 {
989 if (_icewall == 1)
991 else if (_icewall == 2)
993 else if (_icewall == 3)
995 }
996 else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
997 {
998 if (_icewall == 1)
1000 else if (_icewall == 2)
1002 else if (_icewall == 3)
1004 }
1005 }
1006 }
1008 {
1009 if (_icewall && _icewall < 3)
1010 lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
1011 else
1012 lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
1013 }
1014 if (_icewall == 3)
1015 _events.ScheduleEvent(EVENT_ESCAPE_21, 16000); // last wall, really far
1016 else
1017 _events.ScheduleEvent(EVENT_ESCAPE_21, 9000);
1018 break;
1019 case EVENT_ESCAPE_21:
1020 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
1022 else
1024
1026 {
1027 if (_icewall == 1)
1028 lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
1029 else if (_icewall > 1 && _icewall < 4)
1030 {
1031 lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
1032 _events.ScheduleEvent(EVENT_ESCAPE_22, 1000);
1033 }
1034 }
1035 break;
1036 case EVENT_ESCAPE_22:
1038 {
1039 if (_icewall >= 2 && _icewall < 4)
1040 lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
1041 }
1042 break;
1043 case EVENT_ESCAPE_23: // FINAL PART
1045
1046 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
1048 else
1050
1052 {
1053 lichking->GetMotionMaster()->MovePoint(0, LichKingFinalPos);
1054 lichking->AI()->Talk(SAY_LK_ESCAPE_11);
1055 }
1056 me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[8]);
1057 _events.ScheduleEvent(EVENT_ESCAPE_24, 10000);
1058 break;
1059 case EVENT_ESCAPE_24:
1060 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
1062 else
1064 _events.ScheduleEvent(EVENT_ESCAPE_25, 5000);
1065 break;
1066 case EVENT_ESCAPE_25:
1068 cave->SetGoState(GOState::GO_STATE_READY);
1069 _events.ScheduleEvent(EVENT_ESCAPE_26, 4000);
1070 break;
1071 case EVENT_ESCAPE_26:
1072 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
1074 else
1076 _events.ScheduleEvent(EVENT_ESCAPE_27, 4000);
1077 break;
1078 case EVENT_ESCAPE_27:
1079 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
1080 me->SummonGameObject(GO_CAPTAIN_CHEST_1, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
1081 else
1082 me->SummonGameObject(GO_CAPTAIN_CHEST_3, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
1083 me->SummonGameObject(GO_PORTAL, FinalPortalPos.GetPositionX(), FinalPortalPos.GetPositionY(), FinalPortalPos.GetPositionZ(), FinalPortalPos.GetOrientation(), 0, 0, 0, 0, 720000);
1085 lichking->DespawnOrUnsummon(1);
1086 break;
1087 }
1088 }
1089 }
1090 };
1091
1096};
1097
1099{
1100 // Ghostly Priest
1105
1106 // Phantom Mage
1112
1113 // Phantom Hallucination (same as phantom mage + HALLUCINATION_2 when dies)
1115
1116 // Shadowy Mercenary
1121
1122 // Spectral Footman
1126
1127 // Tortured Rifleman
1132};
1133
1168
1170{
1172 _instance(creature->GetInstanceScript())
1173 {
1174 }
1175
1177 {
1178 me->CastSpell(me, SPELL_WELL_OF_SOULS, true);
1179 _events.Reset();
1180 }
1181
1183 {
1184 if (_instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
1186 }
1187
1188 void SetData(uint32 type, uint32 value) OVERRIDE
1189 {
1190 if (type)
1191 return;
1192
1193 InternalWaveId = value;
1194 }
1195
1197 {
1198 if (type)
1199 return 0;
1200
1201 return InternalWaveId;
1202 }
1203
1204protected:
1208};
1209
1211{
1212public:
1213 npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
1214
1216 {
1218 {
1219 }
1220
1222 {
1223 _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
1224 _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
1225 _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
1226 _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
1227 }
1228
1230 {
1231 if (!UpdateVictim())
1232 return;
1233
1234 _events.Update(diff);
1235
1236 if (me->HasUnitState(UNIT_STATE_CASTING))
1237 return;
1238
1239 switch (_events.ExecuteEvent())
1240 {
1242 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1244 _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
1245 break;
1247 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1249 _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
1250 break;
1252 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1253 DoCast(target, SPELL_COWER_IN_FEAR);
1254 _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
1255 break;
1256 case EVENT_DARK_MENDING:
1257 // find an ally with missing HP
1258 if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
1259 {
1260 DoCast(target, SPELL_DARK_MENDING);
1261 _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
1262 }
1263 else
1264 {
1265 // no friendly unit with missing hp. re-check in just 5 sec.
1266 _events.ScheduleEvent(EVENT_DARK_MENDING, 5000);
1267 }
1268 break;
1269 }
1270
1272 }
1273 };
1274
1276 {
1277 return new npc_ghostly_priestAI(creature);
1278 }
1279};
1280
1282{
1283public:
1284 npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
1285
1287 {
1289 {
1290 }
1291
1293 {
1294 _events.ScheduleEvent(EVENT_FIREBALL, 3000);
1295 _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
1296 _events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
1297 _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
1298 _events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
1299 }
1300
1302 {
1303 if (!UpdateVictim())
1304 return;
1305
1306 _events.Update(diff);
1307
1308 if (me->HasUnitState(UNIT_STATE_CASTING))
1309 return;
1310
1311 switch (_events.ExecuteEvent())
1312 {
1313 case EVENT_FIREBALL:
1314 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1315 DoCast(target, SPELL_FIREBALL);
1316 _events.ScheduleEvent(EVENT_FIREBALL, 15000);
1317 break;
1318 case EVENT_FLAMESTRIKE:
1320 _events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
1321 break;
1322 case EVENT_FROSTBOLT:
1323 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1324 DoCast(target, SPELL_FROSTBOLT);
1325 _events.ScheduleEvent(EVENT_FROSTBOLT, 15000);
1326 break;
1328 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1329 DoCast(target, SPELL_CHAINS_OF_ICE);
1330 _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
1331 break;
1334 break;
1335 }
1336
1338 }
1339 };
1340
1342 {
1343 return new npc_phantom_mageAI(creature);
1344 }
1345};
1346
1348{
1349public:
1350 npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
1351
1361
1363 {
1364 return new npc_phantom_hallucinationAI(creature);
1365 }
1366};
1367
1369{
1370public:
1371 npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
1372
1374 {
1376 {
1377 }
1378
1380 {
1381 _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
1382 _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
1383 _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
1384 _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
1385 }
1386
1388 {
1389 if (!UpdateVictim())
1390 return;
1391
1392 _events.Update(diff);
1393
1394 if (me->HasUnitState(UNIT_STATE_CASTING))
1395 return;
1396
1397 switch (_events.ExecuteEvent())
1398 {
1399 case EVENT_SHADOW_STEP:
1401 _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
1402 break;
1405 _events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
1406 break;
1408 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1410 _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
1411 break;
1412 case EVENT_KIDNEY_SHOT:
1414 _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
1415 break;
1416 }
1417
1419 }
1420 };
1421
1423 {
1424 return new npc_shadowy_mercenaryAI(creature);
1425 }
1426};
1427
1429{
1430public:
1431 npc_spectral_footman() : CreatureScript("npc_spectral_footman") { }
1432
1434 {
1436 {
1437 }
1438
1440 {
1441 _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
1442 _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
1443 _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
1444 }
1445
1447 {
1448 if (!UpdateVictim())
1449 return;
1450
1451 _events.Update(diff);
1452
1453 if (me->HasUnitState(UNIT_STATE_CASTING))
1454 return;
1455
1456 switch (_events.ExecuteEvent())
1457 {
1460 _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
1461 break;
1462 case EVENT_SHIELD_BASH:
1464 _events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
1465 break;
1468 _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
1469 break;
1470 }
1471
1473 }
1474 };
1475
1477 {
1478 return new npc_spectral_footmanAI(creature);
1479 }
1480};
1481
1483{
1484public:
1485 npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
1486
1488 {
1490 {
1491 }
1492
1494 {
1495 _events.ScheduleEvent(EVENT_SHOOT, 1);
1496 _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000);
1497 _events.ScheduleEvent(EVENT_FROST_TRAP, 10000);
1498 _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
1499 }
1500
1502 {
1503 if (!UpdateVictim())
1504 return;
1505
1506 _events.Update(diff);
1507
1508 if (me->HasUnitState(UNIT_STATE_CASTING))
1509 return;
1510
1511 switch (_events.ExecuteEvent())
1512 {
1513 case EVENT_SHOOT:
1514 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1515 DoCast(target, SPELL_SHOOT);
1516 _events.ScheduleEvent(EVENT_SHOOT, 2000);
1517 break;
1518 case EVENT_CURSED_ARROW:
1519 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1520 DoCast(target, SPELL_CURSED_ARROW);
1521 _events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
1522 break;
1523 case EVENT_FROST_TRAP:
1525 _events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
1526 break;
1527 case EVENT_ICE_SHOT:
1528 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
1529 DoCast(target, SPELL_ICE_SHOT);
1530 _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
1531 break;
1532 }
1534 }
1535 };
1536
1538 {
1539 return new npc_tortured_riflemanAI(creature);
1540 }
1541};
1542
1543
1545{
1546 //General
1550
1553
1554 SPELL_SHIELD_THROWN = 69222, // 73076 on hc
1555 SPELL_SPIKE = 69184, // 70399 on hc
1558
1559 // Reflection
1561
1562 SPELL_BALEFUL_STRIKE = 69933, // 70400 on hc
1563 SPELL_SPIRIT_BURST = 69900, // 73046 on hc
1564};
1565
1567{
1568public:
1569 npc_frostworn_general() : CreatureScript("npc_frostworn_general") { }
1570
1572 {
1574 {
1575 _instance = me->GetInstanceScript();
1576 Reset();
1577 }
1578
1581
1583 {
1584 _events.Reset();
1586 }
1587
1588 void JustDied(Unit* /*killer*/) OVERRIDE
1589 {
1590 Talk(SAY_DEATH);
1592 }
1593
1594 void EnterCombat(Unit* /*victim*/) OVERRIDE
1595 {
1596 Talk(SAY_AGGRO);
1597 _events.ScheduleEvent(EVENT_SHIELD, 5000);
1598 _events.ScheduleEvent(EVENT_SPIKE, 14000);
1599 _events.ScheduleEvent(EVENT_CLONE, 22000);
1601 }
1602
1604 {
1605 if (!UpdateVictim())
1606 return;
1607
1608 _events.Update(diff);
1609
1610 if (me->HasUnitState(UNIT_STATE_CASTING))
1611 return;
1612
1613 while (uint32 event = _events.ExecuteEvent())
1614 {
1615 switch (event)
1616 {
1617 case EVENT_SHIELD:
1618 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
1619 DoCast(target, SPELL_SHIELD_THROWN);
1620 _events.ScheduleEvent(EVENT_SHIELD, std::rand() % 12000 + 8000);
1621 break;
1622 case EVENT_SPIKE:
1623 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
1624 DoCast(target, SPELL_SPIKE);
1625 _events.ScheduleEvent(EVENT_SPIKE, std::rand() % 20000 + 15000);
1626 break;
1627 case EVENT_CLONE:
1628 SummonClones();
1629 _events.ScheduleEvent(EVENT_CLONE, 60000);
1630 break;
1631 }
1632 }
1634 }
1635
1637 {
1638 std::list<Unit *> playerList;
1639 SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true);
1640 for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
1641 {
1642 Unit* temp = (*itr);
1643 Creature* reflection = me->SummonCreature(NPC_REFLECTION, temp->GetPositionX(), temp->GetPositionY(), temp->GetPositionZ(), temp->GetOrientation(), TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
1644 reflection->SetName(temp->GetName());
1645 temp->CastSpell(reflection, SPELL_CLONE_NAME, true);
1646 temp->CastSpell(reflection, SPELL_CLONE_MODEL, true);
1647 reflection->setFaction(me->getFaction());
1648 reflection->AI()->AttackStart(temp);
1649 }
1650 }
1651 };
1652
1654 {
1655 return new npc_frostworn_generalAI(creature);
1656 }
1657};
1658
1660{
1661public:
1662 npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
1663
1665 {
1667 {
1668 Reset();
1669 }
1670
1672
1674 {
1675 _events.Reset();
1676 }
1677
1678 void EnterCombat(Unit* /*victim*/) OVERRIDE
1679 {
1680 _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
1681 }
1682
1683 void JustDied(Unit* killer) OVERRIDE
1684 {
1685 DoCast(killer, SPELL_SPIRIT_BURST);
1686 }
1687
1689 {
1690 if (!UpdateVictim())
1691 return;
1692
1693 _events.Update(diff);
1694
1695 if (me->HasUnitState(UNIT_STATE_CASTING))
1696 return;
1697
1698 switch (_events.ExecuteEvent())
1699 {
1701 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
1703 _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, std::rand() % 8000 + 3000);
1704 }
1705
1707 }
1708 };
1709
1711 {
1712 return new npc_spiritual_reflectionAI(creature);
1713 }
1714};
1715
1717{
1718public:
1719 at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { }
1720
1721 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) OVERRIDE
1722 {
1723 InstanceScript* _instance = player->GetInstanceScript();
1724
1725 if (player->IsGameMaster())
1726 return true;
1727
1728 if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
1730
1731 return true;
1732 }
1733};
1734
1736{
1737public:
1738 at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { }
1739
1740 bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) OVERRIDE
1741 {
1742 InstanceScript* _instance = player->GetInstanceScript();
1743
1744 if (player->IsGameMaster())
1745 return true;
1746
1747 if (_instance->GetData(DATA_WAVE_COUNT))
1748 return true;
1749
1750 if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN_EVENT) != DONE)
1751 {
1752 _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
1753
1754 if (Creature* falric = player->GetCreature(*player, _instance->GetData64(DATA_FALRIC_EVENT)))
1755 {
1756 falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
1757 falric->SetVisible(true);
1758 }
1759 if (Creature* marwyn = player->GetCreature(*player, _instance->GetData64(DATA_MARWYN_EVENT)))
1760 {
1761 marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
1762 marwyn->SetVisible(true);
1763 }
1764 }
1765 return true;
1766 }
1767};
1768
1770{
1771public:
1772 at_shadow_throne() : AreaTriggerScript("at_shadow_throne") { }
1773
1774 bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE
1775 {
1776 InstanceScript* _instance = player->GetInstanceScript();
1777
1778 if (player->IsGameMaster())
1779 return true;
1780
1781 if (_instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
1783
1784 return true;
1785 }
1786};
1787
1789{
1790public:
1791 npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
1792
1794 {
1796 {
1797 _instance = me->GetInstanceScript();
1798 }
1799
1805
1807 {
1808 _emergeTimer = 4000;
1809 _doEmerge = false;
1810 _doJump = false;
1812 _instance->SetData(DATA_SUMMONS, 1);
1813 }
1814
1816 {
1818 DoZoneInCombat(me, 100.00f);
1819 }
1820
1821 void JustDied(Unit* /*killer*/) OVERRIDE
1822 {
1823 if (_instance)
1824 _instance->SetData(DATA_SUMMONS, 0);
1825 }
1826
1828 {
1829 if (!who)
1830 return;
1831
1832 if (!_doEmerge)
1833 return;
1834
1836 }
1837
1839 {
1840 if (!_instance)
1841 return;
1842
1843 if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
1844 {
1847
1848 if (_doEmerge != true)
1849 {
1850 if (_emergeTimer < diff)
1851 {
1852 _doEmerge = true;
1853 if (leader)
1854 {
1855 DoResetThreat();
1856 me->GetMotionMaster()->MoveIdle();
1857 me->GetMotionMaster()->MoveChase(leader);
1858 }
1859 }
1860 else
1861 _emergeTimer -= diff;
1862 }
1863
1864 if (me->Attack(leader,true))/*(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f))*/
1865 {
1866 if (!_doJump && me->IsWithinDistInMap(leader, 30.0f) && !me->IsWithinDistInMap(leader, 5.0f))
1867 {
1868 _doJump = true;
1869 DoCast(leader, SPELL_GHOUL_JUMP);
1870 }
1871 }
1872 }
1873 else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
1874 me->DespawnOrUnsummon();
1876 }
1877 };
1878
1880 {
1881 return new npc_raging_ghoulAI(creature);
1882 }
1883};
1884
1886{
1887public:
1888 npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
1889
1891 {
1893 {
1894 _instance = me->GetInstanceScript();
1895 }
1896
1904
1906 {
1907 _emergeTimer = 5000;
1908 _boltTimer = 6000;
1909 _boltVolleyTimer = 15000;
1910 _curseTimer = 7000;
1911 _doEmerge = false;
1912 if (_instance)
1913 if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
1914 _instance->SetData(DATA_SUMMONS, 1);
1915 }
1916
1918 {
1920 DoZoneInCombat(me, 100.00f);
1921 }
1922
1923 void JustDied(Unit* /*killer*/) OVERRIDE
1924 {
1925 if (_instance)
1926 _instance->SetData(DATA_SUMMONS, 0);
1927 }
1928
1930 {
1931 if (!who)
1932 return;
1933
1934 if (_doEmerge == false)
1935 return;
1936
1938 }
1939
1941 {
1942 if (!_instance)
1943 return;
1944
1945 if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
1946 {
1947 if (_doEmerge != true)
1948 {
1949 if (_emergeTimer < diff)
1950 {
1951 _doEmerge = true;
1953
1955 {
1956 DoResetThreat();
1957 me->GetMotionMaster()->MoveIdle();
1958 me->GetMotionMaster()->MoveChase(leader);
1959 }
1960 }
1961 else
1962 _emergeTimer -= diff;
1963 }
1964
1965 if (_curseTimer < diff)
1966 {
1967 if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM))
1969 _curseTimer = std::rand() % 15000 + 10000;
1970 }
1971 else
1972 _curseTimer -= diff;
1973
1974 if (_boltTimer < diff)
1975 {
1977 DoCast(target, SPELL_SHADOW_BOLT);
1978 _boltTimer = std::rand() % 3000 + 2000;
1979 }
1980 else
1981 _boltTimer -= diff;
1982
1983 if (_boltVolleyTimer < diff)
1984 {
1987 _boltVolleyTimer = std::rand() % 22000 + 15000;
1988 }
1989 else
1990 _boltVolleyTimer -= diff;
1991 }
1992 else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
1993 me->DespawnOrUnsummon();
1995 }
1996 };
1997
1999 {
2000 return new npc_risen_witch_doctorAI(creature);
2001 }
2002};
2003
2004
2006{
2007public:
2008 npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
2009
2011 {
2013 {
2014 _instance = me->GetInstanceScript();
2015 }
2016
2022
2024 {
2025 _doWalk = false;
2026 _vomitTimer = 15000;
2027 _strikeTimer = 6000;
2028 if (_instance)
2029 if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
2030 _instance->SetData(DATA_SUMMONS, 1);
2031 }
2032
2034 {
2036 DoZoneInCombat(me, 100.00f);
2037 }
2038
2040 {
2041 if (!_instance)
2042 return;
2043
2044 if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
2045 {
2046 if (_doWalk != true)
2047 {
2048 _doWalk = true;
2051 {
2052 DoResetThreat();
2053 me->GetMotionMaster()->MoveIdle();
2054 me->GetMotionMaster()->MoveChase(leader);
2055 }
2056 }
2057 if (_strikeTimer < diff)
2058 {
2060 DoCast(target, SPELL_ABON_STRIKE);
2061 _strikeTimer = std::rand() % 9000 + 7000;
2062 }
2063 else
2064 _strikeTimer -= diff;
2065
2066 if (_vomitTimer < diff)
2067 {
2069 DoCast(target, SPELL_VOMIT_SPRAY);
2070 _vomitTimer = std::rand() % 20000 + 15000;
2071 }
2072 else
2073 _vomitTimer -= diff;
2074 }
2075 else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
2076 me->DespawnOrUnsummon();
2078 }
2079
2080 void JustDied(Unit* /*killer*/) OVERRIDE
2081 {
2082 if (_instance)
2083 _instance->SetData(DATA_SUMMONS, 0);
2084 }
2085 };
2086
2088 {
2089 return new npc_lumbering_abominationAI(creature);
2090 }
2091};
2092
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_STATE_READY
Definition GameObject.h:577
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:75
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition Object.h:71
@ EMOTE_ONESHOT_NO
@ EMOTE_STATE_COWER
@ TEXT_EMOTE_ROAR
@ ALLIANCE
@ HORDE
@ GO_FLAG_INTERACT_COND
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ UNIT_NPC_FLAG_QUESTGIVER
Definition Unit.h:688
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_TOPAGGRO
Definition UnitAI.h:24
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ GAMEOBJECT_FIELD_FLAGS
@ SPELL_FROSTBOLT
@ SPELL_FIREBALL
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_WELL_OF_SOULS
@ SPELL_SHADOW_BOLT
@ EVENT_START_INTRO
@ SPELL_SHADOW_BOLT_VOLLEY
@ EVENT_FIREBALL
@ EVENT_SHADOW_WORD_PAIN
AreaTriggerScript(const char *name)
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
EncounterState GetBossState(uint32 id) const
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static GameObject * GetGameObject(WorldObject const &u, uint64 guid)
void SelectTargetList(std::list< Unit * > &targetList, uint32 num, SelectAggroTarget targetType, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:71
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:16
Definition Unit.h:1367
void setFaction(uint32 faction)
Definition Unit.h:1699
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
GameObject * FindNearestGameObject(uint32 entry, float range) const
Definition Object.cpp:2810
void SetName(std::string const &newname)
Definition Object.h:665
std::string const & GetName() const
Definition Object.h:664
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:36
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
virtual void ProcessEvent(WorldObject *, uint32)
Definition ZoneScript.h:39
virtual uint64 GetData64(uint32) const
Definition ZoneScript.h:32
bool OnTrigger(Player *player, AreaTriggerEntry const *) OVERRIDE
bool OnTrigger(Player *player, AreaTriggerEntry const *) OVERRIDE
bool OnTrigger(Player *player, const AreaTriggerEntry *) 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
@ SAY_JAINA_INTRO_4
@ SAY_SYLVANAS_INTRO_3
@ SAY_JAINA_INTRO_5
@ SAY_SYLVANAS_INTRO_4
@ SAY_JAINA_INTRO_6
@ SAY_JAINA_INTRO_2
@ SAY_JAINA_INTRO_1
@ SAY_JAINA_INTRO_8
@ SAY_SYLVANAS_INTRO_5
@ SAY_SYLVANAS_INTRO_2
@ SAY_SYLVANAS_INTRO_6
@ SAY_JAINA_INTRO_7
@ SAY_JAINA_INTRO_3
@ SAY_SYLVANAS_INTRO_1
@ DATA_TEAM_IN_INSTANCE
const Position MoveThronePos
const Position FalricStartPos
const Position LichKingMoveAwayPos
const Position HallsofReflectionLocs[]
@ QUEST_WRATH_OF_THE_LICH_KING_H2
@ ACTION_START_INTRO
@ QUEST_DELIVRANCE_FROM_THE_PIT_H2
@ QUEST_WRATH_OF_THE_LICH_KING_A2
@ ACTION_SKIP_INTRO
@ QUEST_DELIVRANCE_FROM_THE_PIT_A2
const Position LichKingMoveThronePos
void AddSC_halls_of_reflection()
const Position LichKingFinalPos
@ SPELL_SPIRIT_BURST
@ EVENT_BALEFUL_STRIKE
@ SPELL_BALEFUL_STRIKE
@ SPELL_CLONE_MODEL
@ SPELL_SHIELD_THROWN
@ 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
@ SPELL_SHADOW_BOLT_VOLLEY
@ SPELL_ABON_STRIKE
@ SPELL_TAKE_FROSTMOURNE
@ SPELL_UTHER_DESPAWN
@ SPELL_SUMMON_RISE_WITCH_DOCTOR
@ SPELL_FROSTMOURNE_VISUAL
@ SPELL_SUMMON_LUMBERING_ABOMINATION
@ SPELL_SYLVANAS_JUMP
@ SPELL_BOSS_SPAWN_AURA
@ SPELL_JAINA_ICEPRISON
@ SPELL_JAINA_DESTROY_ICE_WALL
@ SPELL_SYLVANAS_DARKBINDING
@ SPELL_SUMMON_ICE_WALL
@ SPELL_EMERGE_VISUAL
@ SPELL_FROSTMOURNE_SOUNDS
@ SPELL_COURSE_OF_DOOM
@ SPELL_SHADOW_BOLT
@ SPELL_SOUL_REAPER
@ SPELL_HARVEST_SOUL
@ SPELL_JAINA_ICEBARRIER
@ SPELL_RAISE_DEAD
@ SPELL_GHOUL_JUMP
@ SPELL_VOMIT_SPRAY
@ SPELL_REMORSELESS_WINTER
@ SPELL_SYLVANAS_CLOAKOFDARKNESS
@ SPELL_FURY_OF_FROSTMOURNE
@ SPELL_CAST_VISUAL
@ SPELL_SYLVANAS_DESTROY_ICE_WALL
@ SPELL_FROSTMOURNE_DESPAWN
const Position SylvanasShadowThroneDoor
const Position IceWalls[]
const Position NpcJainaOrSylvanasEscapeRoute[]
@ SPELL_COWER_IN_FEAR
@ SPELL_SHIELD_BASH
@ 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
const Position LichKingSpawnPos
const Position ChestPos
const Position JainaShadowThroneDoor
@ SAY_SYLVANAS_ESCAPE_6
@ SAY_UTHER_INTRO_A2_4
@ SAY_SYLVANAS_ESCAPE_4
@ SAY_LK_INTRO_2
@ SAY_UTHER_INTRO_H2_6
@ SAY_JAINA_INTRO_4
@ SAY_UTHER_INTRO_H2_4
@ SAY_UTHER_INTRO_A2_2
@ SAY_MARWYN_INTRO_1
@ SAY_JAINA_ESCAPE_7
@ SAY_SYLVANAS_INTRO_3
@ SAY_LK_JAINA_INTRO_END
@ SAY_LK_ESCAPE_10
@ SAY_LK_ESCAPE_3
@ SAY_JAINA_INTRO_5
@ SAY_JAINA_INTRO_10
@ SAY_JAINA_ESCAPE_10
@ SAY_JAINA_INTRO_9
@ SAY_JAINA_ESCAPE_4
@ SAY_SYLVANAS_ESCAPE_1
@ SAY_UTHER_INTRO_H2_5
@ SAY_JAINA_INTRO_END
@ SAY_UTHER_INTRO_H2_3
@ SAY_SYLVANAS_INTRO_4
@ SAY_LK_ESCAPE_5
@ SAY_FALRIC_INTRO_1
@ SAY_UTHER_INTRO_A2_5
@ SAY_SYLVANAS_ESCAPE_8
@ SAY_JAINA_INTRO_6
@ SAY_JAINA_ESCAPE_6
@ SAY_SYLVANAS_INTRO_8
@ SAY_UTHER_INTRO_A2_8
@ SAY_JAINA_ESCAPE_3
@ SAY_SYLVANAS_ESCAPE_9
@ SAY_JAINA_ESCAPE_1
@ SAY_UTHER_INTRO_A2_7
@ SAY_JAINA_INTRO_2
@ SAY_LK_ESCAPE_2
@ SAY_JAINA_INTRO_1
@ SAY_SYLVANAS_ESCAPE_5
@ SAY_UTHER_INTRO_A2_1
@ SAY_LK_ESCAPE_6
@ SAY_LK_SYLVANAS_INTRO_END
@ SAY_SYLVANAS_ESCAPE_7
@ SAY_JAINA_INTRO_8
@ SAY_LK_INTRO_1
@ SAY_UTHER_INTRO_A2_6
@ SAY_LK_INTRO_3
@ SAY_LK_ESCAPE_11
@ SAY_FALRIC_INTRO_2
@ SAY_UTHER_INTRO_A2_3
@ SAY_JAINA_ESCAPE_2
@ SAY_UTHER_INTRO_A2_9
@ SAY_UTHER_INTRO_H2_2
@ SAY_JAINA_ESCAPE_8
@ SAY_UTHER_INTRO_H2_7
@ SAY_SYLVANAS_INTRO_END
@ SAY_SYLVANAS_INTRO_5
@ SAY_SYLVANAS_ESCAPE_3
@ SAY_SYLVANAS_INTRO_2
@ SAY_SYLVANAS_ESCAPE_2
@ SAY_JAINA_ESCAPE_9
@ SAY_JAINA_INTRO_11
@ SAY_UTHER_INTRO_H2_1
@ SAY_SYLVANAS_INTRO_6
@ SAY_JAINA_INTRO_7
@ SAY_JAINA_ESCAPE_5
@ SAY_LK_ESCAPE_1
@ SAY_SYLVANAS_INTRO_7
@ SAY_JAINA_INTRO_3
@ SAY_LK_ESCAPE_9
@ SAY_SYLVANAS_INTRO_1
@ SAY_LK_ESCAPE_8
@ SAY_LK_ESCAPE_4
@ SAY_LK_ESCAPE_7
const Position LichKingFirstSummon
const Position MarwynStartPos
const Position IntroPos
const Position FinalPortalPos
const Position UtherSpawnPos
@ EVENT_ESCAPE_22
@ EVENT_INTRO_H2_4
@ EVENT_ESCAPE_21
@ EVENT_ESCAPE_15
@ EVENT_ESCAPE_20
@ EVENT_ESCAPE_19
@ EVENT_INTRO_A2_14
@ EVENT_INTRO_A2_18
@ EVENT_INTRO_H2_14
@ EVENT_INTRO_LK_2
@ EVENT_ESCAPE_17
@ EVENT_INTRO_LK_9
@ EVENT_INTRO_LK_4
@ EVENT_INTRO_A2_12
@ EVENT_INTRO_H2_15
@ EVENT_ESCAPE_25
@ EVENT_INTRO_A2_11
@ EVENT_INTRO_A2_3
@ EVENT_INTRO_A2_8
@ EVENT_ESCAPE_12
@ EVENT_START_INTRO
@ EVENT_OPEN_FROSTWORN_DOOR
@ EVENT_INTRO_H2_1
@ EVENT_INTRO_H2_2
@ EVENT_INTRO_A2_1
@ EVENT_INTRO_LK_8
@ EVENT_WALK_INTRO1
@ EVENT_INTRO_A2_15
@ EVENT_INTRO_H2_13
@ EVENT_INTRO_A2_9
@ EVENT_INTRO_LK_1
@ EVENT_CLOSE_FROSTWORN_DOOR
@ 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_ESCAPE_23
@ EVENT_INTRO_A2_4
@ EVENT_INTRO_A2_5
@ EVENT_WALK_INTRO2
@ EVENT_ESCAPE_10
@ EVENT_INTRO_H2_10
@ EVENT_ESCAPE_26
@ EVENT_SKIP_INTRO
@ EVENT_INTRO_A2_17
@ EVENT_ESCAPE_24
@ EVENT_INTRO_LK_11
@ EVENT_ESCAPE_11
@ EVENT_INTRO_LK_7
@ EVENT_ESCAPE_13
@ EVENT_ESCAPE_18
@ 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_ESCAPE_27
@ EVENT_INTRO_H2_7
const Position LichKingSpawnPos2
@ GO_CAPTAIN_CHEST_1
@ GO_PORTAL
@ GO_ICE_WALL
@ GO_CAPTAIN_CHEST_3
@ ACTION_START_ESCAPING
@ ACTION_WALL_BROKEN
@ NPC_LICH_KING_PART1
@ NPC_REFLECTION
@ NPC_LICH_KING_PART2
@ NPC_ICE_WALL
AI * GetHallsOfReflectionAI(Creature *creature)
@ EVENT_SPAWN_WAVES
@ DATA_MARWYN_EVENT
@ DATA_INTRO_EVENT
@ DATA_FROSWORN_EVENT
@ DATA_ESCAPE_EVENT
@ DATA_ESCAPE_LEADER
@ DATA_SUMMONS
@ DATA_FALRIC_EVENT
@ DATA_WAVE_COUNT
@ DATA_CAVE_IN
@ DATA_FROSTMOURNE
@ DATA_FROSTWORN_DOOR
float GetPositionZ() const
Definition Object.h:330
float GetOrientation() const
Definition Object.h:331
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
Creature * me
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
ScriptedAI(Creature *creature)
const T & DUNGEON_MODE(const T &normal5, const T &heroic5) const
void AttackStart(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
uint32 GetData(uint32 type) const OVERRIDE
void SetData(uint32 type, uint32 value) OVERRIDE
npc_gauntlet_trash(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void sGossipSelect(Player *player, uint32, uint32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void sGossipSelect(Player *player, uint32, uint32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
@ SPELL_SHIELD_BASH
Definition zulfarrak.cpp:43