Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
icecrown_citadel.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#include "ObjectMgr.h"
6#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "ScriptedEscortAI.h"
9#include "PassiveAI.h"
10#include "Cell.h"
11#include "CellImpl.h"
12#include "GridNotifiers.h"
13#include "GridNotifiersImpl.h"
14#include "SpellAuraEffects.h"
15#include "SmartAI.h"
16#include "icecrown_citadel.h"
17
18// Weekly quest support
19// * Deprogramming (DONE)
20// * Securing the Ramparts (DONE)
21// * Residue Rendezvous (DONE)
22// * Blood Quickening (DONE)
23// * Respite for a Tormented Soul
24
26{
27 // Highlord Tirion Fordring (at Light's Hammer)
34
35 // The Lich King (at Light's Hammer)
41
42 // Highlord Bolvar Fordragon (at Light's Hammer)
44
45 // High Overlord Saurfang (at Light's Hammer)
50
51 // Muradin Bronzebeard (at Light's Hammer)
55
56 // Deathbound Ward
58
59 // Rotting Frost Giant
61
62 // Sister Svalna
63 SAY_SVALNA_KILL_CAPTAIN = 1, // happens when she kills a captain
65 SAY_SVALNA_CAPTAIN_DEATH = 5, // happens when a captain resurrected by her dies
69
70 SAY_CROK_INTRO_1 = 0, // Ready your arms, my Argent Brothers. The Vrykul will protect the Frost Queen with their lives.
71 SAY_ARNATH_INTRO_2 = 5, // Even dying here beats spending another day collecting reagents for that madman, Finklestein.
72 SAY_CROK_INTRO_3 = 1, // Enough idle banter! Our champions have arrived - support them as we push our way through the hall!
73 SAY_SVALNA_EVENT_START = 0, // You may have once fought beside me, Crok, but now you are nothing more than a traitor. Come, your second death approaches!
74 SAY_CROK_COMBAT_WP_0 = 2, // Draw them back to us, and we'll assist you.
75 SAY_CROK_COMBAT_WP_1 = 3, // Quickly, push on!
76 SAY_CROK_FINAL_WP = 4, // Her reinforcements will arrive shortly, we must bring her down quickly!
77 SAY_SVALNA_RESURRECT_CAPTAINS = 2, // Foolish Crok. You brought my reinforcements with you. Arise, Argent Champions, and serve the Lich King in death!
78 SAY_CROK_COMBAT_SVALNA = 5, // I'll draw her attacks. Return our brothers to their graves, then help me bring her down!
79 SAY_SVALNA_AGGRO = 3, // Come, Scourgebane. I'll show the master which of us is truly worthy of the title of "Champion"!
88};
89
91{
92 // Rotting Frost Giant
97 SPELL_STOMP = 64652,
99
100 // Frost Freeze Trap
102
103 // Alchemist Adrianna
106
107 // Crok Scourgebane
111
112 // Sister Svalna
120
121 // Captain Arnath
129
130 // Captain Brandon
135
136 // Captain Grondel
141
142 // Captain Rupert
149
150 // Invisible Stalker (Float, Uninteractible, LargeAOI)
152};
153
154// Helper defines
155// Captain Arnath
156#define SPELL_FLASH_HEAL (IsUndead ? SPELL_FLASH_HEAL_UNDEAD : SPELL_FLASH_HEAL_NORMAL)
157#define SPELL_POWER_WORD_SHIELD (IsUndead ? SPELL_POWER_WORD_SHIELD_UNDEAD : SPELL_POWER_WORD_SHIELD_NORMAL)
158#define SPELL_SMITE (IsUndead ? SPELL_SMITE_UNDEAD : SPELL_SMITE_NORMAL)
159
160// Captain Rupert
161#define SPELL_FEL_IRON_BOMB (IsUndead ? SPELL_FEL_IRON_BOMB_UNDEAD : SPELL_FEL_IRON_BOMB_NORMAL)
162#define SPELL_MACHINE_GUN (IsUndead ? SPELL_MACHINE_GUN_UNDEAD : SPELL_MACHINE_GUN_NORMAL)
163#define SPELL_ROCKET_LAUNCH (IsUndead ? SPELL_ROCKET_LAUNCH_UNDEAD : SPELL_ROCKET_LAUNCH_NORMAL)
164
166{
167 // Highlord Tirion Fordring (at Light's Hammer)
168 // The Lich King (at Light's Hammer)
169 // Highlord Bolvar Fordragon (at Light's Hammer)
170 // High Overlord Saurfang (at Light's Hammer)
171 // Muradin Bronzebeard (at Light's Hammer)
196
197 // Rotting Frost Giant
201
202 // Frost Freeze Trap
204
205 // Crok Scourgebane
211
212 // Sister Svalna
219
220 // Captain Arnath
225
226 // Captain Brandon
231
232 // Captain Grondel
237
238 // Captain Rupert
242
243 // Invisible Stalker (Float, Uninteractible, LargeAOI)
245};
246
251
261
269
271{
273};
274
276{
277 public:
278 FrostwingVrykulSearcher(Creature const* source, float range) : _source(source), _range(range) { }
279
280 bool operator()(Unit* unit)
281 {
282 if (!unit->IsAlive())
283 return false;
284
285 switch (unit->GetEntry())
286 {
292 break;
293 default:
294 return false;
295 }
296
297 if (!unit->IsWithinDist(_source, _range, false))
298 return false;
299
300 return true;
301 }
302
303 private:
305 float _range;
306};
307
309{
310 public:
311 void operator()(Creature* creature)
312 {
313 switch (creature->GetOriginalEntry())
314 {
320 break;
326 creature->AI()->DoAction(ACTION_RESET_EVENT);
327 break;
329 creature->AI()->DoAction(ACTION_RESET_EVENT);
330 // return, this creature is never dead if event is reset
331 return;
332 default:
333 return;
334 }
335
336 uint32 corpseDelay = creature->GetCorpseDelay();
337 uint32 respawnDelay = creature->GetRespawnDelay();
338 creature->SetCorpseDelay(1);
339 creature->SetRespawnDelay(2);
340
341 if (CreatureData const* data = creature->GetCreatureData())
342 creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation);
343 creature->DespawnOrUnsummon();
344
345 creature->SetCorpseDelay(corpseDelay);
346 creature->SetRespawnDelay(respawnDelay);
347 }
348};
349
351{
352 public:
353 explicit CaptainSurviveTalk(Creature const& owner) : _owner(owner) { }
354
355 bool Execute(uint64 /*currTime*/, uint32 /*diff*/)
356 {
358 return true;
359 }
360
361 private:
363};
364
365// at Light's Hammer
367{
368 public:
369 npc_highlord_tirion_fordring_lh() : CreatureScript("npc_highlord_tirion_fordring_lh") { }
370
372 {
373 npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
374 {
375 }
376
378 {
379 _events.Reset();
380 _theLichKing = 0;
382 _factionNPC = 0;
383 _damnedKills = 0;
384 }
385
386 // IMPORTANT NOTE: This is triggered from per-GUID scripts
387 // of The Damned SAI
388 void SetData(uint32 type, uint32 data) OVERRIDE
389 {
390 if (type == DATA_DAMNED_KILLS && data == 1)
391 {
392 if (++_damnedKills == 2)
393 {
394 if (Creature* theLichKing = me->FindNearestCreature(NPC_THE_LICH_KING_LH, 150.0f))
395 {
396 if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f))
397 {
398 if (Creature* factionNPC = me->FindNearestCreature(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? NPC_SE_HIGH_OVERLORD_SAURFANG : NPC_SE_MURADIN_BRONZEBEARD, 50.0f))
399 {
400 me->setActive(true);
401 _theLichKing = theLichKing->GetGUID();
402 theLichKing->setActive(true);
403 _bolvarFordragon = bolvarFordragon->GetGUID();
404 bolvarFordragon->setActive(true);
405 _factionNPC = factionNPC->GetGUID();
406 factionNPC->setActive(true);
407 }
408 }
409 }
410
412 return;
413
415 _events.ScheduleEvent(EVENT_TIRION_INTRO_2, 4000);
416 _events.ScheduleEvent(EVENT_TIRION_INTRO_3, 14000);
417 _events.ScheduleEvent(EVENT_TIRION_INTRO_4, 18000);
418 _events.ScheduleEvent(EVENT_TIRION_INTRO_5, 31000);
419 _events.ScheduleEvent(EVENT_LK_INTRO_1, 35000);
420 _events.ScheduleEvent(EVENT_TIRION_INTRO_6, 51000);
421 _events.ScheduleEvent(EVENT_LK_INTRO_2, 58000);
422 _events.ScheduleEvent(EVENT_LK_INTRO_3, 74000);
423 _events.ScheduleEvent(EVENT_LK_INTRO_4, 86000);
424 _events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 100000);
425 _events.ScheduleEvent(EVENT_LK_INTRO_5, 108000);
426
427 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
428 {
429 _events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 120000);
430 _events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 129000);
431 _events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 139000);
432 _events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 150000);
433 _events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 162000);
434 _events.ScheduleEvent(EVENT_SAURFANG_RUN, 170000);
435 }
436 else
437 {
438 _events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 120000);
439 _events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 124000);
440 _events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 127000);
441 _events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 136000);
442 _events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 144000);
443 _events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 151000);
444 _events.ScheduleEvent(EVENT_MURADIN_RUN, 157000);
445 }
446 }
447 }
448 }
449
451 {
452 if (_damnedKills != 2)
453 return;
454
455 _events.Update(diff);
456
457 while (uint32 eventId = _events.ExecuteEvent())
458 {
459 switch (eventId)
460 {
462 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
463 break;
466 break;
468 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
469 break;
472 break;
473 case EVENT_LK_INTRO_1:
474 me->HandleEmoteCommand(EMOTE_ONESHOT_POINT_NO_SHEATHE);
476 theLichKing->AI()->Talk(SAY_LK_INTRO_1);
477 break;
480 break;
481 case EVENT_LK_INTRO_2:
483 theLichKing->AI()->Talk(SAY_LK_INTRO_2);
484 break;
485 case EVENT_LK_INTRO_3:
487 theLichKing->AI()->Talk(SAY_LK_INTRO_3);
488 break;
489 case EVENT_LK_INTRO_4:
491 theLichKing->AI()->Talk(SAY_LK_INTRO_4);
492 break;
495 {
496 bolvarFordragon->AI()->Talk(SAY_BOLVAR_INTRO_1);
497 bolvarFordragon->setActive(false);
498 }
499 break;
500 case EVENT_LK_INTRO_5:
502 {
503 theLichKing->AI()->Talk(SAY_LK_INTRO_5);
504 theLichKing->setActive(false);
505 }
506 break;
509 saurfang->AI()->Talk(SAY_SAURFANG_INTRO_1);
510 break;
513 break;
516 saurfang->AI()->Talk(SAY_SAURFANG_INTRO_2);
517 break;
520 saurfang->AI()->Talk(SAY_SAURFANG_INTRO_3);
521 break;
524 saurfang->AI()->Talk(SAY_SAURFANG_INTRO_4);
525 break;
529 factionNPC->GetMotionMaster()->MovePath(factionNPC->GetDBTableGUIDLow()*10, false);
530 me->setActive(false);
531 _damnedKills = 3;
532 break;
535 muradin->AI()->Talk(SAY_MURADIN_INTRO_1);
536 break;
539 muradin->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
540 break;
543 muradin->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
544 break;
547 break;
550 muradin->AI()->Talk(SAY_MURADIN_INTRO_2);
551 break;
554 muradin->AI()->Talk(SAY_MURADIN_INTRO_3);
555 break;
556 default:
557 break;
558 }
559 }
560 }
561
562 private:
569 };
570
572 {
574 }
575};
576
578{
579 public:
580 npc_rotting_frost_giant() : CreatureScript("npc_rotting_frost_giant") { }
581
583 {
585 {
586 }
587
589 {
590 _events.Reset();
591 _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
592 _events.ScheduleEvent(EVENT_STOMP, std::rand() % 8000 + 5000);
593 _events.ScheduleEvent(EVENT_ARCTIC_BREATH, std::rand() % 15000 + 10000);
594 }
595
596 void JustDied(Unit* /*killer*/) OVERRIDE
597 {
598 _events.Reset();
599 }
600
602 {
603 if (!UpdateVictim())
604 return;
605
606 _events.Update(diff);
607
608 if (me->HasUnitState(UNIT_STATE_CASTING))
609 return;
610
611 while (uint32 eventId = _events.ExecuteEvent())
612 {
613 switch (eventId)
614 {
616 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
617 {
619 DoCast(target, SPELL_DEATH_PLAGUE);
620 }
621 _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
622 break;
623 case EVENT_STOMP:
625 _events.ScheduleEvent(EVENT_STOMP, std::rand() % 18000 + 15000);
626 break;
629 _events.ScheduleEvent(EVENT_ARCTIC_BREATH, std::rand() % 33000 + 26000);
630 break;
631 default:
632 break;
633 }
634 }
635
637 }
638
639 private:
641 };
642
644 {
646 }
647};
648
650{
651 public:
652 npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { }
653
655 {
657 {
658 SetCombatMovement(false);
659 }
660
662 {
663 switch (action)
664 {
665 case 1000:
666 case 11000:
667 _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action));
668 break;
669 default:
670 break;
671 }
672 }
673
675 {
676 _events.Update(diff);
677
678 if (_events.ExecuteEvent() == EVENT_ACTIVATE_TRAP)
679 {
681 _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000);
682 }
683 }
684
685 private:
687 };
688
690 {
692 }
693};
694
696{
697 public:
698 npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { }
699
700 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
701 {
702 if (!creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25))
703 if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE))
704 creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false);
705 return false;
706 }
707};
708
710{
711 public:
712 boss_sister_svalna() : CreatureScript("boss_sister_svalna") { }
713
715 {
717 _isEventInProgress(false)
718 {
719 }
720
722 {
723 if (!me->isDead())
724 Reset();
725
726 me->SetReactState(REACT_PASSIVE);
727 }
728
730 {
731 _Reset();
732 me->SetReactState(REACT_DEFENSIVE);
733 _isEventInProgress = false;
734 }
735
736 void JustDied(Unit* /*killer*/) OVERRIDE
737 {
738 _JustDied();
740
741 uint64 delay = 1;
742 for (uint32 i = 0; i < 4; ++i)
743 {
744 if (Creature* crusader = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CAPTAIN_ARNATH + i)))
745 {
746 if (crusader->IsAlive() && crusader->GetEntry() == crusader->GetCreatureData()->id)
747 {
748 crusader->m_Events.AddEvent(new CaptainSurviveTalk(*crusader), crusader->m_Events.CalculateTime(delay));
749 delay += 6000;
750 }
751 }
752 }
753 }
754
755 void EnterCombat(Unit* /*attacker*/) OVERRIDE
756 {
757 _EnterCombat();
759 crok->AI()->Talk(SAY_CROK_COMBAT_SVALNA);
760 events.ScheduleEvent(EVENT_SVALNA_COMBAT, 9000);
761 events.ScheduleEvent(EVENT_IMPALING_SPEAR, std::rand() % 50000 + 40000);
762 events.ScheduleEvent(EVENT_AETHER_SHIELD, std::rand() % 110000 + 100000);
763 }
764
766 {
767 switch (victim->GetTypeId())
768 {
771 break;
773 switch (victim->GetEntry())
774 {
780 break;
781 default:
782 break;
783 }
784 break;
785 default:
786 break;
787 }
788 }
789
791 {
793 me->SetReactState(REACT_PASSIVE);
794 me->SetDisableGravity(false);
795 me->SetHover(false);
796 }
797
799 {
800 switch (action)
801 {
803 me->CastCustomSpell(SPELL_CARESS_OF_DEATH, SPELLVALUE_MAX_TARGETS, 1, me, true);
804 break;
806 me->setActive(true);
807 _isEventInProgress = true;
809 events.ScheduleEvent(EVENT_SVALNA_START, 25000);
810 break;
812 events.ScheduleEvent(EVENT_SVALNA_RESURRECT, 7000);
813 break;
816 break;
818 me->setActive(false);
819 Reset();
820 break;
821 default:
822 break;
823 }
824 }
825
826 void SpellHit(Unit* caster, SpellInfo const* spell) OVERRIDE
827 {
828 if (spell->Id == SPELL_HURL_SPEAR && me->HasAura(SPELL_AETHER_SHIELD))
829 {
830 me->RemoveAurasDueToSpell(SPELL_AETHER_SHIELD);
832 }
833 }
834
836 {
837 if (type != EFFECT_MOTION_TYPE || id != POINT_LAND)
838 return;
839
840 _isEventInProgress = false;
841 me->setActive(false);
843 me->SetDisableGravity(false);
844 me->SetHover(false);
845 }
846
847 void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE
848 {
849 switch (spell->Id)
850 {
852 me->Kill(target);
853 break;
855 if (TempSummon* summon = target->SummonCreature(NPC_IMPALING_SPEAR, *target))
856 {
857 Talk(EMOTE_SVALNA_IMPALE, target);
858 summon->CastCustomSpell(VEHICLE_SPELL_RIDE_HARDCODED, SPELLVALUE_BASE_POINT0, 1, target, false);
860 }
861 break;
862 default:
863 break;
864 }
865 }
866
868 {
870 return;
871
872 events.Update(diff);
873
874 if (me->HasUnitState(UNIT_STATE_CASTING))
875 return;
876
877 while (uint32 eventId = events.ExecuteEvent())
878 {
879 switch (eventId)
880 {
883 break;
886 me->CastSpell(me, SPELL_REVIVE_CHAMPION, false);
887 break;
889 me->SetReactState(REACT_DEFENSIVE);
891 break;
893 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_IMPALING_SPEAR))
894 {
897 }
898 events.ScheduleEvent(EVENT_IMPALING_SPEAR, std::rand() % 25000 + 20000);
899 break;
900 default:
901 break;
902 }
903 }
904
906 }
907
908 private:
910 };
911
913 {
915 }
916};
917
919{
920 public:
921 npc_crok_scourgebane() : CreatureScript("npc_crok_scourgebane") { }
922
924 {
926 _instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()),
927 _corpseDelay(creature->GetCorpseDelay())
928 {
929 SetDespawnAtEnd(false);
930 SetDespawnAtFar(false);
931 _isEventActive = false;
932 _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE;
934 }
935
937 {
938 _events.Reset();
939 _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, std::rand() % 12500 + 7500);
940 _events.ScheduleEvent(EVENT_DEATH_STRIKE, std::rand() % 30000 + 25000);
941 me->SetReactState(REACT_DEFENSIVE);
943 _wipeCheckTimer = 1000;
944 }
945
947 {
948 if (action == ACTION_START_GAUNTLET)
949 {
950 if (_isEventDone || !me->IsAlive())
951 return;
952
953 _isEventActive = true;
954 _isEventDone = true;
955 // Load Grid with Sister Svalna
956 me->GetMap()->LoadGrid(4356.71f, 2484.33f);
958 svalna->AI()->DoAction(ACTION_START_GAUNTLET);
960 _events.ScheduleEvent(EVENT_ARNATH_INTRO_2, 7000);
961 _events.ScheduleEvent(EVENT_CROK_INTRO_3, 14000);
962 _events.ScheduleEvent(EVENT_START_PATHING, 37000);
963 me->setActive(true);
964 for (uint32 i = 0; i < 4; ++i)
965 if (Creature* crusader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_CAPTAIN_ARNATH + i)))
966 crusader->AI()->DoAction(ACTION_START_GAUNTLET);
967 }
968 else if (action == ACTION_RESET_EVENT)
969 {
970 _isEventActive = false;
971 _isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE;
972 me->setActive(false);
973 _aliveTrash.clear();
974 _currentWPid = 0;
975 }
976 }
977
978 void SetGUID(uint64 guid, int32 type/* = 0*/) OVERRIDE
979 {
980 if (type == ACTION_VRYKUL_DEATH)
981 {
982 _aliveTrash.erase(guid);
983 if (_aliveTrash.empty())
984 {
985 SetEscortPaused(false);
986 if (_currentWPid == 4 && _isEventActive)
987 {
988 _isEventActive = false;
989 me->setActive(false);
992 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
993 }
994 }
995 }
996 }
997
999 {
1000 switch (waypointId)
1001 {
1002 // pause pathing until trash pack is cleared
1003 case 0:
1005 if (!_aliveTrash.empty())
1006 SetEscortPaused(true);
1007 break;
1008 case 1:
1010 if (!_aliveTrash.empty())
1011 SetEscortPaused(true);
1012 break;
1013 case 4:
1014 if (_aliveTrash.empty() && _isEventActive)
1015 {
1016 _isEventActive = false;
1017 me->setActive(false);
1020 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
1021 }
1022 break;
1023 default:
1024 break;
1025 }
1026 }
1027
1029 {
1030 _currentWPid = waypointId;
1031 switch (waypointId)
1032 {
1033 case 0:
1034 case 1:
1035 case 4:
1036 {
1037 // get spawns by home position
1038 float minY = 2600.0f;
1039 float maxY = 2650.0f;
1040 if (waypointId == 1)
1041 {
1042 minY -= 50.0f;
1043 maxY -= 50.0f;
1044 // at waypoints 1 and 2 she kills one captain
1046 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
1047 }
1048 else if (waypointId == 4)
1049 {
1050 minY -= 100.0f;
1051 maxY -= 100.0f;
1052 }
1053
1054 // get all nearby vrykul
1055 std::list<Creature*> temp;
1056 FrostwingVrykulSearcher check(me, 80.0f);
1058 me->VisitNearbyGridObject(80.0f, searcher);
1059
1060 _aliveTrash.clear();
1061 for (std::list<Creature*>::iterator itr = temp.begin(); itr != temp.end(); ++itr)
1062 if ((*itr)->GetHomePosition().GetPositionY() < maxY && (*itr)->GetHomePosition().GetPositionY() > minY)
1063 _aliveTrash.insert((*itr)->GetGUID());
1064 break;
1065 }
1066 // at waypoints 1 and 2 she kills one captain
1067 case 2:
1069 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
1070 break;
1071 default:
1072 break;
1073 }
1074 }
1075
1076 void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
1077 {
1078 // check wipe
1079 if (!_wipeCheckTimer)
1080 {
1081 _wipeCheckTimer = 1000;
1082 Player* player = NULL;
1085 me->VisitNearbyWorldObject(60.0f, searcher);
1086 // wipe
1087 if (!player)
1088 {
1089 damage *= 100;
1090 if (damage >= me->GetHealth())
1091 {
1094 me->VisitNearbyGridObject(333.0f, worker);
1096 }
1097 return;
1098 }
1099 }
1100
1101 if (HealthBelowPct(10))
1102 {
1104 {
1106 if (_isEventActive)
1108 else
1110 }
1111
1112 damage = 0;
1114 _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
1115 }
1116 }
1117
1119 {
1120 if (_wipeCheckTimer <= diff)
1121 _wipeCheckTimer = 0;
1122 else
1123 _wipeCheckTimer -= diff;
1124
1125 if (!UpdateVictim() && !_isEventActive)
1126 return;
1127
1128 _events.Update(diff);
1129
1130 if (me->HasUnitState(UNIT_STATE_CASTING))
1131 return;
1132
1133 while (uint32 eventId = _events.ExecuteEvent())
1134 {
1135 switch (eventId)
1136 {
1139 arnath->AI()->Talk(SAY_ARNATH_INTRO_2);
1140 break;
1141 case EVENT_CROK_INTRO_3:
1143 break;
1145 Start(true, true);
1146 break;
1149 _events.ScheduleEvent(EVENT_SCOURGE_STRIKE, std::rand() % 14000 + 10000);
1150 break;
1151 case EVENT_DEATH_STRIKE:
1152 if (HealthBelowPct(20))
1154 _events.ScheduleEvent(EVENT_DEATH_STRIKE, std::rand() % 10000 + 5000);
1155 break;
1156 case EVENT_HEALTH_CHECK:
1157 if (HealthAbovePct(15))
1158 {
1159 me->RemoveAurasDueToSpell(SPELL_ICEBOUND_ARMOR);
1161 }
1162 else
1163 {
1164 me->DealHeal(me, me->CountPctFromMaxHealth(5));
1165 _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
1166 }
1167 break;
1168 default:
1169 break;
1170 }
1171 }
1172
1174 }
1175
1176 bool CanAIAttack(Unit const* target) const OVERRIDE
1177 {
1178 // do not see targets inside Frostwing Halls when we are not there
1179 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
1180 }
1181
1182 private:
1184 std::set<uint64> _aliveTrash;
1193 };
1194
1196 {
1198 }
1199};
1200
1202{
1203 public:
1204 npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), _firstDeath(true)
1205 {
1208 IsUndead = false;
1209 }
1210
1211 void JustDied(Unit* /*killer*/) OVERRIDE
1212 {
1213 if (_firstDeath)
1214 {
1215 _firstDeath = false;
1217 }
1218 else
1220 }
1221
1223 {
1224 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
1226 }
1227
1229 {
1230 if (action == ACTION_START_GAUNTLET)
1231 {
1233 {
1234 me->SetReactState(REACT_DEFENSIVE);
1235 FollowAngle = me->GetAngle(crok) + me->GetOrientation();
1236 FollowDist = me->GetDistance2d(crok);
1237 me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE);
1238 }
1239
1240 me->setActive(true);
1241 }
1242 else if (action == ACTION_RESET_EVENT)
1243 {
1244 _firstDeath = true;
1245 }
1246 }
1247
1248 void EnterCombat(Unit* /*target*/) OVERRIDE
1249 {
1250 me->SetHomePosition(*me);
1251 if (IsUndead)
1253 }
1254
1255 bool CanAIAttack(Unit const* target) const OVERRIDE
1256 {
1257 // do not see targets inside Frostwing Halls when we are not there
1258 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
1259 }
1260
1262 {
1263 // not yet following
1264 if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_IDLE) != CHASE_MOTION_TYPE || IsUndead)
1265 {
1267 return;
1268 }
1269
1270 if (!_EnterEvadeMode())
1271 return;
1272
1273 if (!me->GetVehicle())
1274 {
1275 me->GetMotionMaster()->Clear(false);
1277 me->GetMotionMaster()->MoveFollow(crok, FollowDist, FollowAngle, MOTION_SLOT_IDLE);
1278 }
1279
1280 Reset();
1281 }
1282
1283 void SpellHit(Unit* /*caster*/, SpellInfo const* spell) OVERRIDE
1284 {
1285 if (spell->Id == SPELL_REVIVE_CHAMPION && !IsUndead)
1286 {
1287 IsUndead = true;
1288 me->setDeathState(DeathState::JUST_RESPAWNED);
1289 uint32 newEntry = 0;
1290 switch (me->GetEntry())
1291 {
1292 case NPC_CAPTAIN_ARNATH:
1293 newEntry = NPC_CAPTAIN_ARNATH_UNDEAD;
1294 break;
1296 newEntry = NPC_CAPTAIN_BRANDON_UNDEAD;
1297 break;
1299 newEntry = NPC_CAPTAIN_GRONDEL_UNDEAD;
1300 break;
1301 case NPC_CAPTAIN_RUPERT:
1302 newEntry = NPC_CAPTAIN_RUPERT_UNDEAD;
1303 break;
1304 default:
1305 return;
1306 }
1307
1309 me->UpdateEntry(newEntry, instance->GetData(DATA_TEAM_IN_INSTANCE), me->GetCreatureData());
1310 DoCast(me, SPELL_UNDEATH, true);
1311 }
1312 }
1313
1314 protected:
1320
1321 private:
1323};
1324
1326{
1327 public:
1328 npc_captain_arnath() : CreatureScript("npc_captain_arnath") { }
1329
1331 {
1333 {
1334 }
1335
1337 {
1338 Events.Reset();
1339 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, std::rand() % 7000 + 4000);
1340 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, std::rand() % 14000 + 8000);
1341 Events.ScheduleEvent(EVENT_ARNATH_SMITE, std::rand() % 6000 + 3000);
1342 if (Is25ManRaid() && IsUndead)
1343 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, std::rand() % 27000 + 22000);
1344 }
1345
1347 {
1348 if (!UpdateVictim())
1349 return;
1350
1351 Events.Update(diff);
1352
1353 if (me->HasUnitState(UNIT_STATE_CASTING))
1354 return;
1355
1356 while (uint32 eventId = Events.ExecuteEvent())
1357 {
1358 switch (eventId)
1359 {
1361 if (Creature* target = FindFriendlyCreature())
1362 DoCast(target, SPELL_FLASH_HEAL);
1363 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, std::rand() % 9000 + 6000);
1364 break;
1366 {
1367 std::list<Creature*> targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD);
1369 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, std::rand() % 20000 + 15000);
1370 break;
1371 }
1372 case EVENT_ARNATH_SMITE:
1374 Events.ScheduleEvent(EVENT_ARNATH_SMITE, std::rand() % 7000 + 4000);
1375 break;
1377 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
1378 DoCast(target, SPELL_DOMINATE_MIND);
1379 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, std::rand() % 37000 + 28000);
1380 break;
1381 default:
1382 break;
1383 }
1384 }
1385
1387 }
1388
1389 private:
1391 {
1392 Creature* target = NULL;
1393 Skyfire::MostHPMissingInRange u_check(me, 60.0f, 0);
1395 me->VisitNearbyGridObject(60.0f, searcher);
1396 return target;
1397 }
1398 };
1399
1401 {
1403 }
1404};
1405
1407{
1408 public:
1409 npc_captain_brandon() : CreatureScript("npc_captain_brandon") { }
1410
1412 {
1414 {
1415 }
1416
1418 {
1419 Events.Reset();
1420 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, std::rand() % 10000 + 6000);
1421 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500);
1422 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, std::rand() % 13000 + 8000);
1423 if (IsUndead)
1424 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, std::rand() % 30000 + 25000);
1425 }
1426
1428 {
1429 if (!UpdateVictim())
1430 return;
1431
1432 Events.Update(diff);
1433
1434 if (me->HasUnitState(UNIT_STATE_CASTING))
1435 return;
1436
1437 while (uint32 eventId = Events.ExecuteEvent())
1438 {
1439 switch (eventId)
1440 {
1443 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, std::rand() % 12000 + 6000);
1444 break;
1446 if (HealthBelowPct(20))
1448 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500);
1449 break;
1452 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, std::rand() % 13000 + 8000);
1453 break;
1455 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
1457 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, std::rand() % 60000 + 45000);
1458 break;
1459 default:
1460 break;
1461 }
1462 }
1463
1465 }
1466 };
1467
1469 {
1471 }
1472};
1473
1475{
1476 public:
1477 npc_captain_grondel() : CreatureScript("npc_captain_grondel") { }
1478
1480 {
1482 {
1483 }
1484
1486 {
1487 Events.Reset();
1488 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500);
1489 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, std::rand() % 14000 + 8000);
1490 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, std::rand() % 12000 + 3000);
1491 if (IsUndead)
1492 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, std::rand() % 17000 + 12000);
1493 }
1494
1496 {
1497 if (!UpdateVictim())
1498 return;
1499
1500 Events.Update(diff);
1501
1502 if (me->HasUnitState(UNIT_STATE_CASTING))
1503 return;
1504
1505 while (uint32 eventId = Events.ExecuteEvent())
1506 {
1507 switch (eventId)
1508 {
1511 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500);
1512 break;
1515 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, std::rand() % 15000 + 10000);
1516 break;
1519 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, std::rand() % 17000 + 5000);
1520 break;
1522 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
1523 DoCast(target, SPELL_CONFLAGRATION);
1524 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, std::rand() % 15000 + 10000);
1525 break;
1526 default:
1527 break;
1528 }
1529 }
1530
1532 }
1533 };
1534
1536 {
1538 }
1539};
1540
1542{
1543 public:
1544 npc_captain_rupert() : CreatureScript("npc_captain_rupert") { }
1545
1547 {
1549 {
1550 }
1551
1553 {
1554 Events.Reset();
1555 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, std::rand() % 20000 + 15000);
1556 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, std::rand() % 30000 + 25000);
1557 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, std::rand() % 15000 + 10000);
1558 }
1559
1561 {
1562 if (!UpdateVictim())
1563 return;
1564
1565 Events.Update(diff);
1566
1567 if (me->HasUnitState(UNIT_STATE_CASTING))
1568 return;
1569
1570 while (uint32 eventId = Events.ExecuteEvent())
1571 {
1572 switch (eventId)
1573 {
1575 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
1576 DoCast(target, SPELL_FEL_IRON_BOMB);
1577 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, std::rand() % 20000 + 15000);
1578 break;
1580 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
1581 DoCast(target, SPELL_MACHINE_GUN);
1582 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, std::rand() % 30000 + 25000);
1583 break;
1585 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
1586 DoCast(target, SPELL_ROCKET_LAUNCH);
1587 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, std::rand() % 15000 + 10000);
1588 break;
1589 default:
1590 break;
1591 }
1592 }
1593
1595 }
1596 };
1597
1599 {
1601 }
1602};
1603
1605{
1606 public:
1607 npc_frostwing_vrykul() : CreatureScript("npc_frostwing_vrykul") { }
1608
1610 {
1612 {
1613 }
1614
1615 bool CanAIAttack(Unit const* target) const OVERRIDE
1616 {
1617 // do not see targets inside Frostwing Halls when we are not there
1618 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && SmartAI::CanAIAttack(target);
1619 }
1620 };
1621
1623 {
1624 return new npc_frostwing_vrykulAI(creature);
1625 }
1626};
1627
1629{
1630 public:
1631 npc_impaling_spear() : CreatureScript("npc_impaling_spear") { }
1632
1634 {
1636 {
1637 }
1638
1640 {
1641 me->SetReactState(REACT_PASSIVE);
1642 _vehicleCheckTimer = 500;
1643 }
1644
1646 {
1647 if (_vehicleCheckTimer <= diff)
1648 {
1649 _vehicleCheckTimer = 500;
1650 if (!me->GetVehicle())
1651 me->DespawnOrUnsummon(100);
1652 }
1653 else
1654 _vehicleCheckTimer -= diff;
1655 }
1656
1658 };
1659
1661 {
1662 return new npc_impaling_spearAI(creature);
1663 }
1664};
1665
1667{
1668 public:
1669 npc_arthas_teleport_visual() : CreatureScript("npc_arthas_teleport_visual") { }
1670
1672 {
1673 npc_arthas_teleport_visualAI(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript())
1674 {
1675 }
1676
1678 {
1679 _events.Reset();
1680 if (_instance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE &&
1681 _instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE &&
1682 _instance->GetBossState(DATA_SINDRAGOSA) == DONE)
1683 _events.ScheduleEvent(EVENT_SOUL_MISSILE, std::rand() % 6000 + 1000);
1684 }
1685
1687 {
1688 if (_events.Empty())
1689 return;
1690
1691 _events.Update(diff);
1692
1693 if (_events.ExecuteEvent() == EVENT_SOUL_MISSILE)
1694 {
1696 _events.ScheduleEvent(EVENT_SOUL_MISSILE, std::rand() % 7000 + 5000);
1697 }
1698 }
1699
1700 private:
1703 };
1704
1706 {
1707 // Distance from the center of the spire
1708 if (creature->GetExactDist2d(4357.052f, 2769.421f) < 100.0f && creature->GetHomePosition().GetPositionZ() < 315.0f)
1710
1711 // Default to no script
1712 return NULL;
1713 }
1714};
1715
1717{
1718 public:
1719 spell_icc_stoneform() : SpellScriptLoader("spell_icc_stoneform") { }
1720
1722 {
1724
1725 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1726 {
1727 if (Creature* target = GetTarget()->ToCreature())
1728 {
1729 target->SetReactState(REACT_PASSIVE);
1732 }
1733 }
1734
1735 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1736 {
1737 if (Creature* target = GetTarget()->ToCreature())
1738 {
1739 target->SetReactState(REACT_AGGRESSIVE);
1741 target->SetUInt32Value(UNIT_FIELD_NPC_EMOTESTATE, 0);
1742 }
1743 }
1744
1750 };
1751
1753 {
1754 return new spell_icc_stoneform_AuraScript();
1755 }
1756};
1757
1759{
1760 public:
1761 spell_icc_sprit_alarm() : SpellScriptLoader("spell_icc_sprit_alarm") { }
1762
1764 {
1766
1768 {
1769 PreventHitDefaultEffect(effIndex);
1770 uint32 trapId = 0;
1771 switch (GetSpellInfo()->Effects[effIndex].MiscValue)
1772 {
1774 trapId = GO_SPIRIT_ALARM_1;
1775 break;
1777 trapId = GO_SPIRIT_ALARM_2;
1778 break;
1780 trapId = GO_SPIRIT_ALARM_3;
1781 break;
1783 trapId = GO_SPIRIT_ALARM_4;
1784 break;
1785 default:
1786 return;
1787 }
1788
1789 if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f))
1790 trap->SetRespawnTime(trap->GetGOInfo()->trap.autoCloseTime);
1791
1792 std::list<Creature*> wards;
1795 for (std::list<Creature*>::iterator itr = wards.begin(); itr != wards.end(); ++itr)
1796 {
1797 if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM))
1798 {
1799 (*itr)->AI()->Talk(SAY_TRAP_ACTIVATE);
1800 (*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM);
1801 if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
1802 (*itr)->AI()->AttackStart(target);
1803 break;
1804 }
1805 }
1806 }
1807
1812 };
1813
1818};
1819
1821{
1822 public:
1823 explicit DeathPlagueTargetSelector(Unit* caster) : _caster(caster) { }
1824
1825 bool operator()(WorldObject* object) const
1826 {
1827 if (object == _caster)
1828 return true;
1829
1830 if (object->GetTypeId() != TypeID::TYPEID_PLAYER)
1831 return true;
1832
1834 return true;
1835
1836 return false;
1837 }
1838
1839 private:
1841};
1842
1844{
1845 public:
1846 spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { }
1847
1849 {
1851
1853 {
1854 _failed = false;
1855 return true;
1856 }
1857
1858 // First effect
1859 void CountTargets(std::list<WorldObject*>& targets)
1860 {
1861 targets.remove(GetCaster());
1862 _failed = targets.empty();
1863 }
1864
1865 // Second effect
1866 void FilterTargets(std::list<WorldObject*>& targets)
1867 {
1868 // Select valid targets for jump
1869 targets.remove_if(DeathPlagueTargetSelector(GetCaster()));
1870 if (!targets.empty())
1871 {
1873 targets.clear();
1874 targets.push_back(target);
1875 }
1876
1877 targets.push_back(GetCaster());
1878 }
1879
1881 {
1882 PreventHitDefaultEffect(effIndex);
1883 if (GetHitUnit() != GetCaster())
1885 else if (_failed)
1887 }
1888
1895
1897 };
1898
1903};
1904
1937
1939{
1940 public:
1941 bool operator()(WorldObject* object) const
1942 {
1943 if (Unit* unit = object->ToUnit())
1944 return unit->IsAlive();
1945 return true;
1946 }
1947};
1948
1950{
1951 public:
1952 spell_svalna_revive_champion() : SpellScriptLoader("spell_svalna_revive_champion") { }
1953
1955 {
1957
1958 void RemoveAliveTarget(std::list<WorldObject*>& targets)
1959 {
1960 targets.remove_if(AliveCheck());
1962 }
1963
1964 void Land(SpellEffIndex /*effIndex*/)
1965 {
1966 Creature* caster = GetCaster()->ToCreature();
1967 if (!caster)
1968 return;
1969
1970 Position pos;
1971 caster->GetPosition(&pos);
1972 caster->GetNearPosition(pos, 5.0f, 0.0f);
1973 //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f);
1974 //pos.m_positionZ += 0.05f;
1975 caster->SetHomePosition(pos);
1976 caster->GetMotionMaster()->MoveLand(POINT_LAND, pos);
1977 }
1978
1984 };
1985
1990};
1991
1993{
1994 public:
1995 spell_svalna_remove_spear() : SpellScriptLoader("spell_svalna_remove_spear") { }
1996
1998 {
2000
2002 {
2003 PreventHitDefaultEffect(effIndex);
2004 if (Creature* target = GetHitCreature())
2005 {
2006 if (Unit* vehicle = target->GetVehicleBase())
2007 vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR);
2008 target->DespawnOrUnsummon(1);
2009 }
2010 }
2011
2016 };
2017
2022};
2023
2025{
2026 public:
2027 spell_icc_soul_missile() : SpellScriptLoader("spell_icc_soul_missile") { }
2028
2030 {
2032
2034 {
2035 static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f};
2036 const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
2037 }
2038
2043 };
2044
2049};
2050
2052{
2053 public:
2054 at_icc_saurfang_portal() : AreaTriggerScript("at_icc_saurfang_portal") { }
2055
2056 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) OVERRIDE
2057 {
2058 InstanceScript* instance = player->GetInstanceScript();
2059 if (!instance || instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
2060 return true;
2061
2062 player->TeleportTo(631, 4126.35f, 2769.23f, 350.963f, 0.0f);
2063
2064 if (instance->GetData(DATA_COLDFLAME_JETS) == NOT_STARTED)
2065 {
2066 // Process relocation now, to preload the grid and initialize traps
2067 player->GetMap()->PlayerRelocation(player, 4126.35f, 2769.23f, 350.963f, 0.0f);
2068
2070 std::list<Creature*> traps;
2072 traps.sort(Skyfire::ObjectDistanceOrderPred(player));
2073 bool instant = false;
2074 for (std::list<Creature*>::iterator itr = traps.begin(); itr != traps.end(); ++itr)
2075 {
2076 (*itr)->AI()->DoAction(instant ? 1000 : 11000);
2077 instant = !instant;
2078 }
2079 }
2080
2081 return true;
2082 }
2083};
2084
2086{
2087 public:
2088 at_icc_shutdown_traps() : AreaTriggerScript("at_icc_shutdown_traps") { }
2089
2090 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) OVERRIDE
2091 {
2092 if (InstanceScript* instance = player->GetInstanceScript())
2093 instance->SetData(DATA_COLDFLAME_JETS, DONE);
2094 return true;
2095 }
2096};
2097
2099{
2100 public:
2101 at_icc_start_blood_quickening() : AreaTriggerScript("at_icc_start_blood_quickening") { }
2102
2103 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) OVERRIDE
2104 {
2105 if (InstanceScript* instance = player->GetInstanceScript())
2106 if (instance->GetData(DATA_BLOOD_QUICKENING_STATE) == NOT_STARTED)
2107 instance->SetData(DATA_BLOOD_QUICKENING_STATE, IN_PROGRESS);
2108 return true;
2109 }
2110};
2111
2113{
2114 public:
2115 at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { }
2116
2117 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) OVERRIDE
2118 {
2119 if (InstanceScript* instance = player->GetInstanceScript())
2120 if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_CROK_SCOURGEBANE)))
2121 crok->AI()->DoAction(ACTION_START_GAUNTLET);
2122 return true;
2123 }
2124};
2125
Actions
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
std::uint16_t uint16
Definition Define.h:78
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ MOTION_SLOT_IDLE
@ CHASE_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TYPEID_UNIT
Definition Object.h:54
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:58
#define PET_FOLLOW_DIST
Definition PetDefines.h:57
void GetCreatureListWithEntryInGrid(std::list< Creature * > &list, WorldObject *source, uint32 entry, float maxSearchRange)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ EMOTE_ONESHOT_POINT_NO_SHEATHE
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_ONESHOT_TALK
@ EMOTE_STATE_CUSTOM_SPELL_02
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
@ SPELL_EFFECT_QUEST_COMPLETE
@ TARGET_UNIT_SRC_AREA_ALLY
@ TARGET_UNIT_DEST_AREA_ENTRY
@ HORDE
@ SPELL_AURA_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define SpellCastFn(F)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELLVALUE_MAX_TARGETS
Definition Unit.h:118
@ SPELLVALUE_BASE_POINT0
Definition Unit.h:114
@ JUST_RESPAWNED
Definition Unit.h:507
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_DEFENSIVE
Definition Unit.h:1157
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_IMMUNE_TO_NPC
Definition Unit.h:634
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FLAG2_ALLOW_ENEMY_INTERACT
Definition Unit.h:676
@ UNIT_FLAG2_UNK1
Definition Unit.h:664
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS2
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ VEHICLE_SPELL_RIDE_HARDCODED
@ SPELL_CHARGE
@ SPELL_JUDGEMENT_OF_COMMAND
@ SPELL_CRUSADER_STRIKE
@ SPELL_MORTAL_STRIKE
@ SPELL_ARCTIC_BREATH
@ EVENT_ARCTIC_BREATH
@ EVENT_STOMP
@ SPELL_CONFLAGRATION
@ SAY_TIRION_INTRO_2
@ SAY_TIRION_INTRO_1
@ SPELL_STOMP
Definition chapter5.cpp:158
@ SPELL_DEATH_STRIKE
Definition chapter5.cpp:122
bool operator()(WorldObject *object) const
AreaTriggerScript(const char *name)
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectApplyHandler > OnEffectApply
InstanceScript *const instance
void _JustReachedHome()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
CaptainSurviveTalk(Creature const &owner)
bool Execute(uint64, uint32)
Creature const & _owner
CreatureAI(Creature *creature)
Definition CreatureAI.h:69
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
bool _EnterEvadeMode()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:56
virtual void EnterEvadeMode()
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:626
uint32 GetOriginalEntry() const
Definition Creature.h:655
void DespawnOrUnsummon(uint32 msTimeToDespawn=0)
void SetRespawnDelay(uint32 delay)
Definition Creature.h:603
void SetPosition(float x, float y, float z, float o)
CreatureData const * GetCreatureData() const
Definition Creature.h:525
uint32 GetRespawnDelay() const
Definition Creature.h:602
void SetCorpseDelay(uint32 delay)
Definition Creature.h:450
uint32 GetCorpseDelay() const
Definition Creature.h:451
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
bool operator()(WorldObject *object) const
void operator()(Creature *creature)
FrostwingVrykulSearcher(Creature const *source, float range)
EncounterState GetBossState(uint32 id) const
void MoveLand(uint32 id, Position const &pos)
NullCreatureAI(Creature *c)
Definition PassiveAI.cpp:12
static Creature * GetCreature(WorldObject const &u, uint64 guid)
TypeID GetTypeId() const
Definition Object.h:131
uint32 GetEntry() const
Definition Object.h:125
Creature * ToCreature()
Definition Object.h:207
Unit * ToUnit()
Definition Object.h:210
SmartAI(Creature *c)
Definition SmartAI.cpp:21
bool CanAIAttack(const Unit *who) const OVERRIDE
Definition SmartAI.cpp:482
Creature * GetHitCreature()
WorldLocation const * GetExplTargetDest()
SpellInfo const * GetSpellInfo()
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > OnCast
Unit * GetHitUnit()
int32 GetEffectValue()
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
SpellScriptLoader(const char *name)
virtual void DoAction(int32)
Definition UnitAI.h:126
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
Definition Unit.h:1367
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)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Unit * GetVehicleBase() const
Definition Unit.cpp:7203
MotionMaster * GetMotionMaster()
Definition Unit.h:2605
bool IsAlive() const
Definition Unit.h:2032
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void GetCreatureListWithEntryInGrid(std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
Definition Object.cpp:2841
void GetNearPosition(Position &pos, float dist, float angle)
Definition Object.cpp:3076
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1730
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition Object.cpp:2703
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:36
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
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
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_icc_soul_missile_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_icc_sprit_alarm_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_icc_stoneform_AuraScript)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_svalna_remove_spear_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_svalna_revive_champion_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
@ DATA_TEAM_IN_INSTANCE
@ SAY_LK_INTRO_2
@ SAY_LK_INTRO_1
@ SAY_LK_INTRO_3
@ DATA_DAMNED_KILLS
@ ACTION_RESET_EVENT
@ ACTION_CAPTAIN_DIES
@ ACTION_RESURRECT_CAPTAINS
@ ACTION_START_GAUNTLET
@ ACTION_KILL_CAPTAIN
#define SPELL_ROCKET_LAUNCH
@ SPELL_STOMP
@ SPELL_SCOURGE_STRIKE
@ SPELL_ROCKET_LAUNCH_NORMAL
@ SPELL_SMITE_NORMAL
@ SPELL_HARVEST_BLIGHT_SPECIMEN
@ SPELL_DOMINATE_MIND
@ SPELL_FEL_IRON_BOMB_NORMAL
@ SPELL_DEATH_STRIKE
@ SPELL_COLDFLAME_JETS
@ SPELL_JUDGEMENT_OF_COMMAND
@ SPELL_FLASH_HEAL_NORMAL
@ SPELL_CHARGE
@ SPELL_HARVEST_BLIGHT_SPECIMEN25
@ SPELL_CARESS_OF_DEATH
@ SPELL_CONFLAGRATION
@ SPELL_HURL_SPEAR
@ SPELL_RECENTLY_INFECTED
@ SPELL_DEATH_PLAGUE
@ SPELL_IMPALING_SPEAR_KILL
@ SPELL_CRUSADER_STRIKE
@ SPELL_MORTAL_STRIKE
@ SPELL_POWER_WORD_SHIELD_NORMAL
@ SPELL_FLASH_HEAL_UNDEAD
@ SPELL_DIVINE_SHIELD
@ SPELL_POWER_WORD_SHIELD_UNDEAD
@ SPELL_SUNDER_ARMOR
@ SPELL_AETHER_SHIELD
@ SPELL_SMITE_UNDEAD
@ SPELL_HAMMER_OF_BETRAYAL
@ SPELL_UNDEATH
@ SPELL_FEL_IRON_BOMB_UNDEAD
@ SPELL_DEATH_PLAGUE_KILL
@ SPELL_ROCKET_LAUNCH_UNDEAD
@ SPELL_SOUL_MISSILE
@ SPELL_ARCTIC_BREATH
@ SPELL_ICEBOUND_ARMOR
@ SPELL_REVIVE_CHAMPION
@ SPELL_DEATH_PLAGUE_AURA
@ SPELL_MACHINE_GUN_NORMAL
@ SPELL_IMPALING_SPEAR
@ SPELL_MACHINE_GUN_UNDEAD
#define SPELL_FLASH_HEAL
#define SPELL_FEL_IRON_BOMB
#define SPELL_SMITE
void AddSC_icecrown_citadel()
@ EVENT_SCOURGE_STRIKE
@ EVENT_LK_INTRO_4
@ EVENT_RUPERT_FEL_IRON_BOMB
@ EVENT_MURADIN_INTRO_5
@ EVENT_SVALNA_COMBAT
@ EVENT_BRANDON_CRUSADER_STRIKE
@ EVENT_SAURFANG_INTRO_2
@ EVENT_GRONDEL_MORTAL_STRIKE
@ EVENT_TIRION_INTRO_A_7
@ EVENT_TIRION_INTRO_2
@ EVENT_SAURFANG_RUN
@ EVENT_SVALNA_RESURRECT
@ EVENT_TIRION_INTRO_H_7
@ EVENT_SAURFANG_INTRO_4
@ EVENT_ARNATH_SMITE
@ EVENT_LK_INTRO_1
@ EVENT_ACTIVATE_TRAP
@ EVENT_ARNATH_DOMINATE_MIND
@ EVENT_MURADIN_INTRO_3
@ EVENT_MURADIN_INTRO_2
@ EVENT_GRONDEL_SUNDER_ARMOR
@ EVENT_CROK_INTRO_3
@ EVENT_MURADIN_RUN
@ EVENT_ARNATH_INTRO_2
@ EVENT_BOLVAR_INTRO_1
@ EVENT_MURADIN_INTRO_1
@ EVENT_LK_INTRO_5
@ EVENT_RUPERT_ROCKET_LAUNCH
@ EVENT_BRANDON_JUDGEMENT_OF_COMMAND
@ EVENT_DEATH_STRIKE
@ EVENT_BRANDON_HAMMER_OF_BETRAYAL
@ EVENT_ARNATH_PW_SHIELD
@ EVENT_LK_INTRO_2
@ EVENT_GRONDEL_CONFLAGRATION
@ EVENT_STOMP
@ EVENT_TIRION_INTRO_6
@ EVENT_AETHER_SHIELD
@ EVENT_TIRION_INTRO_3
@ EVENT_START_PATHING
@ EVENT_IMPALING_SPEAR
@ EVENT_RUPERT_MACHINE_GUN
@ EVENT_SAURFANG_INTRO_3
@ EVENT_SOUL_MISSILE
@ EVENT_HEALTH_CHECK
@ EVENT_MURADIN_INTRO_4
@ EVENT_BRANDON_DIVINE_SHIELD
@ EVENT_LK_INTRO_3
@ EVENT_TIRION_INTRO_5
@ EVENT_ARCTIC_BREATH
@ EVENT_ARNATH_FLASH_HEAL
@ EVENT_SAURFANG_INTRO_1
@ EVENT_SVALNA_START
@ EVENT_TIRION_INTRO_4
@ EVENT_GRONDEL_CHARGE_CHECK
@ EVENT_DEATH_PLAGUE
@ POINT_LAND
#define SPELL_POWER_WORD_SHIELD
@ SAY_LK_INTRO_2
@ EMOTE_SVALNA_IMPALE
@ SAY_SVALNA_CAPTAIN_DEATH
@ SAY_CROK_COMBAT_SVALNA
@ SAY_SAURFANG_INTRO_4
@ SAY_TIRION_INTRO_H_5
@ EMOTE_DEATH_PLAGUE_WARNING
@ SAY_CROK_INTRO_1
@ SAY_CROK_WEAKENING_SVALNA
@ SAY_SVALNA_AGGRO
@ SAY_MURADIN_INTRO_2
@ SAY_TRAP_ACTIVATE
@ SAY_SAURFANG_INTRO_3
@ SAY_TIRION_INTRO_A_5
@ SAY_MURADIN_INTRO_3
@ SAY_TIRION_INTRO_4
@ SAY_CROK_WEAKENING_GAUNTLET
@ SAY_CROK_INTRO_3
@ SAY_CROK_COMBAT_WP_1
@ SAY_ARNATH_INTRO_2
@ SAY_SAURFANG_INTRO_1
@ SAY_CAPTAIN_SECOND_DEATH
@ SAY_SAURFANG_INTRO_2
@ SAY_SVALNA_KILL_CAPTAIN
@ SAY_LK_INTRO_1
@ SAY_SVALNA_RESURRECT_CAPTAINS
@ SAY_LK_INTRO_3
@ SAY_SVALNA_EVENT_START
@ SAY_TIRION_INTRO_3
@ SAY_CROK_COMBAT_WP_0
@ SAY_SVALNA_DEATH
@ SAY_SVALNA_KILL
@ SAY_MURADIN_INTRO_1
@ SAY_CROK_FINAL_WP
@ SAY_CAPTAIN_DEATH
@ SAY_CROK_DEATH
@ SAY_LK_INTRO_4
@ SAY_CAPTAIN_SURVIVE_TALK
@ SAY_TIRION_INTRO_2
@ SAY_CAPTAIN_RESURRECTED
@ SAY_TIRION_INTRO_1
@ SAY_BOLVAR_INTRO_1
@ SAY_CAPTAIN_KILL
@ EMOTE_SVALNA_BROKEN_SHIELD
@ SAY_LK_INTRO_5
@ EVENT_AWAKEN_WARD_4
@ EVENT_AWAKEN_WARD_1
@ EVENT_AWAKEN_WARD_3
@ EVENT_AWAKEN_WARD_2
#define SPELL_MACHINE_GUN
@ NPC_IMPALING_SPEAR
@ NPC_CAPTAIN_BRANDON
@ NPC_CAPTAIN_GRONDEL_UNDEAD
@ NPC_YMIRJAR_BATTLE_MAIDEN
@ NPC_CAPTAIN_BRANDON_UNDEAD
@ NPC_CAPTAIN_ARNATH_UNDEAD
@ NPC_FROST_FREEZE_TRAP
@ NPC_YMIRJAR_WARLORD
@ NPC_CAPTAIN_RUPERT
@ NPC_HIGHLORD_BOLVAR_FORDRAGON_LH
@ NPC_CAPTAIN_RUPERT_UNDEAD
@ NPC_YMIRJAR_HUNTRESS
@ NPC_SE_HIGH_OVERLORD_SAURFANG
@ NPC_CROK_SCOURGEBANE
@ NPC_SISTER_SVALNA
@ NPC_THE_LICH_KING_LH
@ NPC_YMIRJAR_FROSTBINDER
@ NPC_CAPTAIN_GRONDEL
@ NPC_SE_MURADIN_BRONZEBEARD
@ NPC_CAPTAIN_ARNATH
@ NPC_DEATHBOUND_WARD
CreatureAI * GetIcecrownCitadelAI(Creature *creature)
@ ACTION_VRYKUL_DEATH
@ SPELL_GREEN_BLIGHT_RESIDUE
@ SPELL_ORANGE_BLIGHT_RESIDUE
@ SPELL_STONEFORM
@ GO_SPIRIT_ALARM_1
@ GO_SPIRIT_ALARM_3
@ GO_SPIRIT_ALARM_2
@ GO_SPIRIT_ALARM_4
@ DATA_DEATHBRINGER_SAURFANG
@ DATA_SISTER_SVALNA
@ DATA_CROK_SCOURGEBANE
@ DATA_SINDRAGOSA
@ DATA_BLOOD_QUICKENING_STATE
@ DATA_COLDFLAME_JETS
@ DATA_BLOOD_QUEEN_LANA_THEL
@ DATA_PROFESSOR_PUTRICIDE
@ DATA_CAPTAIN_ARNATH
void RandomResizeList(std::list< T > &list, uint32 size)
Definition Containers.h:19
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
@ NPC_YMIRJAR_DEATHBRINGER
void GetPosition(float &x, float &y) const
Definition Object.h:333
void Reset() OVERRIDE
void SetCombatMovement(bool allowMovement)
Creature * me
bool HealthAbovePct(uint32 pct) const
bool HealthBelowPct(uint32 pct) const
std::list< Creature * > DoFindFriendlyMissingBuff(float range, uint32 spellId)
ScriptedAI(Creature *creature)
bool Is25ManRaid() const
void MovementInform(uint32 type, uint32 id) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHitTarget(Unit *target, SpellInfo const *spell) OVERRIDE
void SpellHit(Unit *caster, SpellInfo const *spell) OVERRIDE
void SpellHit(Unit *, SpellInfo const *spell) OVERRIDE
void KilledUnit(Unit *victim) OVERRIDE
void EnterEvadeMode() OVERRIDE
npc_argent_captainAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void JustDied(Unit *) OVERRIDE
void DoAction(int32 action) OVERRIDE
bool CanAIAttack(Unit const *target) const 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 SetGUID(uint64 guid, int32 type) OVERRIDE
void UpdateEscortAI(uint32 const diff) OVERRIDE
bool CanAIAttack(Unit const *target) const OVERRIDE
void WaypointReached(uint32 waypointId) OVERRIDE
void WaypointStart(uint32 waypointId) OVERRIDE
void DamageTaken(Unit *, uint32 &damage) OVERRIDE
void SetDespawnAtFar(bool despawn)
npc_escortAI(Creature *creature)
void SetDespawnAtEnd(bool despawn)
void SetEscortPaused(bool on)
void Start(bool isActiveAttacker=true, bool run=false, uint64 playerGUID=0, Quest const *quest=NULL, bool instantRespawn=false, bool canLoopPath=false, bool resetWaypoints=true)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
bool CanAIAttack(Unit const *target) const 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 ==================