TrinityCore
Loading...
Searching...
No Matches
boss_sister_svalna.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "icecrown_citadel.h"
19#include "CellImpl.h"
20#include "Containers.h"
21#include "GridNotifiersImpl.h"
22#include "InstanceScript.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "ScriptedEscortAI.h"
26#include "ScriptMgr.h"
27#include "SpellScript.h"
28#include "TemporarySummon.h"
29#include "VehicleDefines.h"
30
32{
33 SAY_SVALNA_KILL_CAPTAIN = 1, // happens when she kills a captain
35 SAY_SVALNA_CAPTAIN_DEATH = 5, // happens when a captain resurrected by her dies
39
40 SAY_CROK_INTRO_1 = 0, // Ready your arms, my Argent Brothers. The Vrykul will protect the Frost Queen with their lives.
41 SAY_ARNATH_INTRO_2 = 5, // Even dying here beats spending another day collecting reagents for that madman, Finklestein.
42 SAY_CROK_INTRO_3 = 1, // Enough idle banter! Our champions have arrived - support them as we push our way through the hall!
43 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!
44 SAY_CROK_COMBAT_WP_0 = 2, // Draw them back to us, and we'll assist you.
45 SAY_CROK_COMBAT_WP_1 = 3, // Quickly, push on!
46 SAY_CROK_FINAL_WP = 4, // Her reinforcements will arrive shortly, we must bring her down quickly!
47 SAY_SVALNA_RESURRECT_CAPTAINS = 2, // Foolish Crok. You brought my reinforcements with you. Arise, Argent Champions, and serve the Lich King in death!
48 SAY_CROK_COMBAT_SVALNA = 5, // I'll draw her attacks. Return our brothers to their graves, then help me bring her down!
49 SAY_SVALNA_AGGRO = 3, // Come, Scourgebane. I'll show the master which of us is truly worthy of the title of "Champion"!
58};
59
61{
62 // Crok Scourgebane
66
67 // Sister Svalna
76
77 // Captain Arnath
85
86 // Captain Brandon
91
92 // Captain Grondel
93 SPELL_CHARGE = 71553,
97
98 // Captain Rupert
105
106 // Ymirjar Vrykuls
127
184
193
198
200{
201 NPC_YMIRJAR_WARHAWK = 38154
203
204// Helper defines
205// Captain Arnath
206#define SPELL_FLASH_HEAL (IsUndead ? SPELL_FLASH_HEAL_UNDEAD : SPELL_FLASH_HEAL_NORMAL)
207#define SPELL_POWER_WORD_SHIELD (IsUndead ? SPELL_POWER_WORD_SHIELD_UNDEAD : SPELL_POWER_WORD_SHIELD_NORMAL)
208#define SPELL_SMITE (IsUndead ? SPELL_SMITE_UNDEAD : SPELL_SMITE_NORMAL)
209
210// Captain Rupert
211#define SPELL_FEL_IRON_BOMB (IsUndead ? SPELL_FEL_IRON_BOMB_UNDEAD : SPELL_FEL_IRON_BOMB_NORMAL)
212#define SPELL_MACHINE_GUN (IsUndead ? SPELL_MACHINE_GUN_UNDEAD : SPELL_MACHINE_GUN_NORMAL)
213#define SPELL_ROCKET_LAUNCH (IsUndead ? SPELL_ROCKET_LAUNCH_UNDEAD : SPELL_ROCKET_LAUNCH_NORMAL)
214
216{
217public:
218 FrostwingVrykulSearcher(Creature const* source, float range) : _source(source), _range(range) { }
219
220 bool operator()(Unit* unit)
221 {
222 if (!unit->IsAlive())
223 return false;
224
225 switch (unit->GetEntry())
226 {
232 break;
233 default:
234 return false;
235 }
236
237 if (!unit->IsWithinDist(_source, _range, false))
238 return false;
239
240 return true;
241 }
242
243private:
245 float _range;
246};
247
249{
250public:
251 void operator()(Creature* creature)
252 {
253 switch (creature->GetOriginalEntry())
254 {
260 break;
266 creature->AI()->DoAction(ACTION_RESET_EVENT);
267 break;
269 creature->AI()->DoAction(ACTION_RESET_EVENT);
270 // return, this creature is never dead if event is reset
271 return;
272 default:
273 return;
274 }
275
276 uint32 corpseDelay = creature->GetCorpseDelay();
277 uint32 respawnDelay = creature->GetRespawnDelay();
278 creature->SetCorpseDelay(1);
279 creature->SetRespawnDelay(2);
280
281 if (CreatureData const* data = creature->GetCreatureData())
282 creature->UpdatePosition(data->spawnPoint);
283
284 creature->DespawnOrUnsummon();
285 creature->SetCorpseDelay(corpseDelay);
286 creature->SetRespawnDelay(respawnDelay);
287 }
288};
289
291{
292public:
293 explicit CaptainSurviveTalk(Creature const* owner) : _owner(owner) { }
294
295 bool Execute(uint64 /*currTime*/, uint32 /*diff*/) override
296 {
298 return true;
299 }
300
301private:
303};
304
305// 37126 - Sister Svalna
307{
309
310 void InitializeAI() override
311 {
312 if (!me->isDead())
313 Reset();
314
316 }
317
318 void Reset() override
319 {
320 _Reset();
322 _isEventInProgress = false;
323 }
324
325 void JustDied(Unit* /*killer*/) override
326 {
327 _JustDied();
329
330 Milliseconds delay = 1ms;
331 for (uint8 itr = 0; itr < 4; ++itr)
332 {
334 {
335 if (crusader->IsAlive() && crusader->GetEntry() == crusader->GetCreatureData()->id)
336 {
337 crusader->m_Events.AddEvent(new CaptainSurviveTalk(crusader), crusader->m_Events.CalculateTime(delay));
338 delay += 6s;
339 }
340 }
341 }
342 }
343
354
355 void KilledUnit(Unit* victim) override
356 {
357 switch (victim->GetTypeId())
358 {
359 case TYPEID_PLAYER:
361 break;
362 case TYPEID_UNIT:
363 switch (victim->GetEntry())
364 {
370 break;
371 default:
372 break;
373 }
374 break;
375 default:
376 break;
377 }
378 }
379
380 void JustReachedHome() override
381 {
384 me->SetDisableGravity(false);
385 me->SetHover(false);
386 }
387
388 void DoAction(int32 action) override
389 {
390 switch (action)
391 {
394 break;
396 if (me->IsAlive())
397 {
398 me->setActive(true);
399 me->SetFarVisible(true);
400 _isEventInProgress = true;
401 me->SetImmuneToAll(true);
403 }
404 break;
407 break;
410 break;
412 me->setActive(false);
413 me->SetFarVisible(false);
414 Reset();
415 break;
416 default:
417 break;
418 }
419 }
420
421 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
422 {
423 if (spellInfo->Id == SPELL_HURL_SPEAR && me->HasAura(SPELL_AETHER_SHIELD))
424 {
427 }
428 }
429
430 void MovementInform(uint32 type, uint32 id) override
431 {
432 if (type != EFFECT_MOTION_TYPE || id != POINT_SVALNA_LAND)
433 return;
434
435 _isEventInProgress = false;
436 me->setActive(false);
437 me->SetFarVisible(false);
438 me->SetImmuneToAll(false);
439 me->SetDisableGravity(false);
440 me->SetHover(false);
441 }
442
443 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
444 {
445 Unit* unitTarget = target->ToUnit();
446 if (!unitTarget)
447 return;
448
449 switch (spellInfo->Id)
450 {
452 Unit::Kill(me, unitTarget);
453 break;
455 if (TempSummon* summon = unitTarget->SummonCreature(NPC_IMPALING_SPEAR, *unitTarget))
456 {
457 Talk(EMOTE_SVALNA_IMPALE, unitTarget);
459 args.AddSpellBP0(1);
460 summon->CastSpell(target, VEHICLE_SPELL_RIDE_HARDCODED, args);
461 summon->SetInteractionAllowedWhileHostile(true);
462 }
463 break;
464 default:
465 break;
466 }
467 }
468
469 void UpdateAI(uint32 diff) override
470 {
472 return;
473
474 events.Update(diff);
475
477 return;
478
479 while (uint32 eventId = events.ExecuteEvent())
480 {
481 switch (eventId)
482 {
485 break;
489 break;
493 break;
495 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true, true, -SPELL_IMPALING_SPEAR))
496 {
499 }
501 break;
502 default:
503 break;
504 }
505
507 return;
508 }
509 }
510
511private:
513};
514
515static constexpr uint32 PATH_ESCORT_CROK_SCOURGEBANE = 297034;
516
517// 37129 - Crok Scourgebane
519{
520 npc_crok_scourgebane(Creature* creature) : EscortAI(creature), _instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()), _corpseDelay(creature->GetCorpseDelay())
521 {
522 Initialize();
523 SetDespawnAtEnd(false);
524 SetDespawnAtFar(false);
525 _isEventActive = false;
527 _currentWPid = 0;
528 }
529
531 {
533 _wipeCheckTimer = 1000;
534 }
535
536 void Reset() override
537 {
538 _events.Reset();
542 Initialize();
543 }
544
545 void DoAction(int32 action) override
546 {
547 if (action == ACTION_START_GAUNTLET)
548 {
549 if (_isEventDone || !me->IsAlive())
550 return;
551
552 _isEventActive = true;
553 _isEventDone = true;
554
555 // Load Grid with Sister Svalna
556 me->GetMap()->LoadGrid(4356.71f, 2484.33f);
557
559 svalna->AI()->DoAction(ACTION_START_GAUNTLET);
560
565 me->setActive(true);
566 me->SetFarVisible(true);
567
568 for (uint32 itr = 0; itr < 4; ++itr)
570 crusader->AI()->DoAction(ACTION_START_GAUNTLET);
571 }
572 else if (action == ACTION_RESET_EVENT)
573 {
574 _isEventActive = false;
576 me->setActive(false);
577 me->SetFarVisible(false);
578 _aliveTrash.clear();
579 _currentWPid = 0;
580 }
581 }
582
583 void SetGUID(ObjectGuid const& guid, int32 id) override
584 {
585 if (id == ACTION_VRYKUL_DEATH)
586 {
587 _aliveTrash.erase(guid);
588 if (_aliveTrash.empty())
589 {
590 SetEscortPaused(false);
591 if (_currentWPid == 4 && _isEventActive)
592 {
593 _isEventActive = false;
594 me->setActive(false);
595 me->SetFarVisible(false);
598 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
599 }
600 }
601 }
602 }
603
604 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
605 {
606 switch (waypointId)
607 {
608 case 0: // pause pathing until trash pack is cleared
609 me->SetImmuneToNPC(false);
611 if (!_aliveTrash.empty())
612 SetEscortPaused(true);
613 break;
614 case 1:
616 if (!_aliveTrash.empty())
617 SetEscortPaused(true);
618 break;
619 case 4:
620 if (_aliveTrash.empty() && _isEventActive)
621 {
622 _isEventActive = false;
623 me->setActive(false);
624 me->SetFarVisible(false);
627 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
628 }
629 break;
630 default:
631 break;
632 }
633 }
634
635 void WaypointStarted(uint32 waypointId, uint32 /*pathId*/) override
636 {
637 _currentWPid = waypointId;
638 switch (waypointId)
639 {
640 case 0:
641 case 1:
642 case 4:
643 {
644 // get spawns by home position
645 float minY = 2600.0f;
646 float maxY = 2650.0f;
647 if (waypointId == 1)
648 {
649 minY -= 50.0f;
650 maxY -= 50.0f;
651 // at waypoints 1 and 2 she kills one captain
653 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
654 }
655 else if (waypointId == 4)
656 {
657 minY -= 100.0f;
658 maxY -= 100.0f;
659 }
660
661 // get all nearby vrykul
662 std::list<Creature*> temp;
663 FrostwingVrykulSearcher check(me, 80.0f);
665 Cell::VisitGridObjects(me, searcher, 80.0f);
666
667 _aliveTrash.clear();
668 for (auto itr = temp.begin(); itr != temp.end(); ++itr)
669 if ((*itr)->GetHomePosition().GetPositionY() < maxY && (*itr)->GetHomePosition().GetPositionY() > minY)
670 _aliveTrash.insert((*itr)->GetGUID());
671 break;
672 }
673 // at waypoints 1 and 2 she kills one captain
674 case 2:
676 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
677 break;
678 default:
679 break;
680 }
681 }
682
683 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
684 {
685 // check wipe
686 if (!_wipeCheckTimer)
687 {
688 _wipeCheckTimer = 1000;
689 Player* player = nullptr;
691 Trinity::PlayerSearcher searcher(me, player, check);
692 Cell::VisitWorldObjects(me, searcher, 60.0f);
693 // wipe
694 if (!player)
695 {
696 damage *= 100;
697 if (damage >= me->GetHealth())
698 {
701 Cell::VisitGridObjects(me, worker, 333.0f);
703 }
704 return;
705 }
706 }
707
708 if (HealthBelowPct(10))
709 {
711 {
713 if (_isEventActive)
715 else
717 }
718
719 damage = 0;
722 }
723 }
724
725 void UpdateEscortAI(uint32 diff) override
726 {
727 if (_wipeCheckTimer <= diff)
728 _wipeCheckTimer = 0;
729 else
730 _wipeCheckTimer -= diff;
731
732 if (!UpdateVictim() && !_isEventActive)
733 return;
734
735 _events.Update(diff);
736
738 return;
739
740 while (uint32 eventId = _events.ExecuteEvent())
741 {
742 switch (eventId)
743 {
746 arnath->AI()->Talk(SAY_ARNATH_INTRO_2);
747 break;
750 break;
753 Start(true);
754 break;
758 break;
760 if (HealthBelowPct(20))
763 break;
765 if (HealthAbovePct(15))
766 {
769 }
770 else
771 {
772 // looks totally hacky to me
775 }
776 break;
777 default:
778 break;
779 }
780 }
781 }
782
783 bool CanAIAttack(Unit const* target) const override
784 {
785 // do not see targets inside Frostwing Halls when we are not there
786 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
787 }
788
789private:
800};
801
803{
804public:
805 npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), _firstDeath(true)
806 {
809 IsUndead = false;
810 }
811
812 void JustDied(Unit* /*killer*/) override
813 {
814 if (_firstDeath)
815 {
816 _firstDeath = false;
818 }
819 else
821 }
822
823 void KilledUnit(Unit* victim) override
824 {
825 if (victim->GetTypeId() == TYPEID_PLAYER)
827 }
828
829 void DoAction(int32 action) override
830 {
831 if (action == ACTION_START_GAUNTLET)
832 {
834 {
837 FollowDist = me->GetDistance2d(crok);
839 }
840
841 me->setActive(true);
842 me->SetFarVisible(true);
843 }
844 else if (action == ACTION_RESET_EVENT)
845 {
846 _firstDeath = true;
847 }
848 }
849
850 void JustEngagedWith(Unit* /*target*/) override
851 {
853 if (IsUndead)
855 }
856
857 bool CanAIAttack(Unit const* target) const override
858 {
859 // do not see targets inside Frostwing Halls when we are not there
860 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
861 }
862
863 void EnterEvadeMode(EvadeReason why) override
864 {
865 // not yet following
867 {
869 return;
870 }
871
872 if (!_EnterEvadeMode(why))
873 return;
874
875 if (!me->GetVehicle())
876 {
880 }
881
882 Reset();
883 }
884
885 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
886 {
887 if (spellInfo->Id == SPELL_REVIVE_CHAMPION && !IsUndead)
888 {
889 IsUndead = true;
891 uint32 newEntry = 0;
892 switch (me->GetEntry())
893 {
895 newEntry = NPC_CAPTAIN_ARNATH_UNDEAD;
896 break;
899 break;
902 break;
904 newEntry = NPC_CAPTAIN_RUPERT_UNDEAD;
905 break;
906 default:
907 return;
908 }
909
911 me->UpdateEntry(newEntry, me->GetCreatureData());
913 }
914 }
915
916protected:
922
923private:
925};
926
927// 37122 - Captain Arnath
929{
931 {
932 }
933
934 void Reset() override
935 {
936 Events.Reset();
937 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 4s, 7s);
938 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 8s, 14s);
939 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 3s, 6s);
940 if (Is25ManRaid() && IsUndead)
941 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 22s, 27s);
942 }
943
944 void UpdateAI(uint32 diff) override
945 {
946 if (!UpdateVictim())
947 return;
948
949 Events.Update(diff);
950
952 return;
953
954 while (uint32 eventId = Events.ExecuteEvent())
955 {
956 switch (eventId)
957 {
959 if (Creature* target = FindFriendlyCreature())
960 DoCast(target, SPELL_FLASH_HEAL);
961 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 6s, 9s);
962 break;
964 {
965 std::list<Creature*> targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD);
966 if (!targets.empty())
968 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 15s, 20s);
969 break;
970 }
973 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 4s, 7s);
974 break;
976 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
978 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 28s, 37s);
979 break;
980 default:
981 break;
982 }
983
985 return;
986 }
987 }
988
989private:
991 {
992 Creature* target = nullptr;
993 Trinity::MostHPMissingInRange u_check(me, 60.0f, 0);
995 Cell::VisitGridObjects(me, searcher, 60.0f);
996 return target;
997 }
998};
999
1000// 37123 - Captain Brandon
1002{
1004 {
1005 }
1006
1007 void Reset() override
1008 {
1009 Events.Reset();
1010 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 10s);
1011 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1012 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1013 if (IsUndead)
1014 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 25s, 30s);
1015 }
1016
1017 void UpdateAI(uint32 diff) override
1018 {
1019 if (!UpdateVictim())
1020 return;
1021
1022 Events.Update(diff);
1023
1025 return;
1026
1027 while (uint32 eventId = Events.ExecuteEvent())
1028 {
1029 switch (eventId)
1030 {
1033 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 12s);
1034 break;
1036 if (HealthBelowPct(20))
1038 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1039 break;
1042 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1043 break;
1045 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
1047 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 45s, 60s);
1048 break;
1049 default:
1050 break;
1051 }
1052
1054 return;
1055 }
1056 }
1057};
1058
1059// 37124 - Captain Grondel
1061{
1063 {
1064 }
1065
1066 void Reset() override
1067 {
1068 Events.Reset();
1069 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1070 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 8s, 14s);
1071 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 3s, 12s);
1072 if (IsUndead)
1073 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 12s, 17s);
1074 }
1075
1076 void UpdateAI(uint32 diff) override
1077 {
1078 if (!UpdateVictim())
1079 return;
1080
1081 Events.Update(diff);
1082
1084 return;
1085
1086 while (uint32 eventId = Events.ExecuteEvent())
1087 {
1088 switch (eventId)
1089 {
1092 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1093 break;
1096 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 10s, 15s);
1097 break;
1100 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 5s, 17s);
1101 break;
1103 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
1104 DoCast(target, SPELL_CONFLAGRATION);
1105 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 10s, 15s);
1106 break;
1107 default:
1108 break;
1109 }
1110
1112 return;
1113 }
1114 }
1115};
1116
1117// 37125 - Captain Rupert
1119{
1121 {
1122 }
1123
1124 void Reset() override
1125 {
1126 Events.Reset();
1127 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1128 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1129 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1130 }
1131
1132 void UpdateAI(uint32 diff) override
1133 {
1134 if (!UpdateVictim())
1135 return;
1136
1137 Events.Update(diff);
1138
1140 return;
1141
1142 while (uint32 eventId = Events.ExecuteEvent())
1143 {
1144 switch (eventId)
1145 {
1148 DoCast(target, SPELL_FEL_IRON_BOMB);
1149 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1150 break;
1153 DoCast(target, SPELL_MACHINE_GUN);
1154 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1155 break;
1158 DoCast(target, SPELL_ROCKET_LAUNCH);
1159 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1160 break;
1161 default:
1162 break;
1163 }
1164
1166 return;
1167 }
1168 }
1169};
1170
1171/* 37127 - Ymirjar Frostbinder
1172 37132 - Ymirjar Battle-Maiden
1173 37133 - Ymirjar Warlord
1174 37134 - Ymirjar Huntress
1175 38125 - Ymirjar Deathbringer */
1177{
1179 {
1180 }
1181
1182 void Reset() override
1183 {
1184 _events.Reset();
1185 _OOCevents.Reset();
1187
1188 if (!me->IsAlive())
1189 return;
1190
1191 switch (me->GetEntry())
1192 {
1195 [[fallthrough]];
1198 break;
1200 if (Is25ManRaid())
1202 break;
1203 default:
1204 break;
1205 }
1206 }
1207
1208 void JustDied(Unit* /*killer*/) override
1209 {
1212 }
1213
1214 void JustSummoned(Creature* summon) override
1215 {
1216 if (summon->GetEntry() == NPC_YMIRJAR_WARHAWK)
1218
1219 _summons.Summon(summon);
1220
1221 if (me->IsEngaged())
1222 DoZoneInCombat(summon);
1223 }
1224
1225 void SummonedCreatureDespawn(Creature* summon) override
1226 {
1227 _summons.Despawn(summon);
1228 }
1229
1230 void JustEngagedWith(Unit* who) override
1231 {
1232 if (!who)
1233 return;
1234
1236
1237 switch (me->GetEntry())
1238 {
1243 break;
1247 break;
1250 break;
1256 break;
1262 break;
1263 default:
1264 break;
1265 }
1266 }
1267
1268 void UpdateAI(uint32 diff) override
1269 {
1270 if (!UpdateVictim())
1271 {
1272 _OOCevents.Update(diff);
1273
1275 return;
1276
1277 while (uint32 eventId = _OOCevents.ExecuteEvent())
1278 {
1279 switch (eventId)
1280 {
1283 _OOCevents.Repeat(40s, 60s);
1284 break;
1285 default:
1286 break;
1287 }
1288
1290 return;
1291 }
1292 return;
1293 }
1294
1295 _events.Update(diff);
1296
1298 return;
1299
1300 while (uint32 eventId = _events.ExecuteEvent())
1301 {
1302 switch (eventId)
1303 {
1306 _events.Repeat(10s, 20s);
1307 break;
1309 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true))
1310 DoCast(target, SPELL_TWISTED_WINDS);
1311 _events.Repeat(10s, 20s);
1312 break;
1315 _events.Repeat(2s, 4s);
1316 break;
1319 _events.Repeat(10s, 20s);
1320 break;
1323 _events.Repeat(6s, 12s);
1324 break;
1327 _events.Repeat(20s, 30s);
1328 break;
1330 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1331 DoCast(target, SPELL_ICE_TRAP);
1332 _events.Repeat(15s, 20s);
1333 break;
1335 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
1336 DoCast(target, SPELL_VOLLEY);
1337 _events.Repeat(10s, 20s);
1338 break;
1341 _events.Repeat(2s);
1342 break;
1345 _events.Repeat(5s, 8s);
1346 break;
1349 _events.Repeat(10s, 20s);
1350 break;
1352 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1353 DoCast(target, SPELL_BANISH);
1354 _events.Repeat(10s, 20s);
1355 break;
1358 _events.DelayEvents(2s);
1359 _events.Repeat(90s);
1360 break;
1361 default:
1362 break;
1363 }
1364
1366 return;
1367 }
1368 }
1369
1370private:
1374};
1375
1376// 38248 - Impaling Spear
1378{
1380 {
1381 Initialize();
1382 }
1383
1385 {
1386 _vehicleCheckTimer = 500;
1387 }
1388
1389 void Reset() override
1390 {
1392 Initialize();
1393 }
1394
1395 void UpdateAI(uint32 diff) override
1396 {
1397 if (_vehicleCheckTimer <= diff)
1398 {
1399 _vehicleCheckTimer = 500;
1400 if (!me->GetVehicle())
1401 me->DespawnOrUnsummon(100ms);
1402 }
1403 else
1404 _vehicleCheckTimer -= diff;
1405 }
1406
1407private:
1409};
1410
1412{
1413public:
1414 bool operator()(WorldObject* object) const
1415 {
1416 if (Unit* unit = object->ToUnit())
1417 return unit->IsAlive();
1418 return true;
1419 }
1420};
1421
1422// 70053 - Revive Champion
1424{
1425 void RemoveAliveTarget(std::list<WorldObject*>& targets)
1426 {
1427 targets.remove_if(ICCSvalnaAliveCheck());
1429 }
1430
1431 void Land(SpellEffIndex /*effIndex*/)
1432 {
1433 Creature* caster = GetCaster()->ToCreature();
1434 if (!caster)
1435 return;
1436
1437 Position pos = caster->GetNearPosition(5.0f, 0.0f);
1438 //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f);
1439 //pos.m_positionZ += 0.05f;
1440 caster->SetHomePosition(pos);
1442 }
1443
1449};
1450
1451// 71462 - Remove Spear
1453{
1455 {
1456 PreventHitDefaultEffect(effIndex);
1457 if (Creature* target = GetHitCreature())
1458 {
1459 if (Unit* vehicle = target->GetVehicleBase())
1460 vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR);
1461 target->DespawnOrUnsummon(1ms);
1462 }
1463 }
1464
1469};
1470
1472{
1473public:
1474 at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { }
1475
1476 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
1477 {
1478 if (InstanceScript* instance = player->GetInstanceScript())
1479 if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CROK_SCOURGEBANE)))
1480 crok->AI()->DoAction(ACTION_START_GAUNTLET);
1481 return true;
1482 }
1483};
1484
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ DONE
@ MOTION_SLOT_DEFAULT
@ FOLLOW_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_UNIT
Definition ObjectGuid.h:43
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:432
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:99
#define PET_FOLLOW_DIST
Definition PetDefines.h:98
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1382
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_DEST_AREA_ENTRY
@ SPELLVALUE_MAX_TARGETS
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
EvadeReason
@ REACT_DEFENSIVE
@ REACT_PASSIVE
DamageEffectType
@ JUST_RESPAWNED
Definition Unit.h:270
@ UNIT_STATE_CASTING
Definition Unit.h:290
@ VEHICLE_SPELL_RIDE_HARDCODED
@ NPC_YMIRJAR_WARHAWK
#define SPELL_ROCKET_LAUNCH
@ POINT_SVALNA_LAND
void AddSC_boss_sister_svalna()
#define SPELL_FLASH_HEAL
#define SPELL_FEL_IRON_BOMB
static constexpr uint32 PATH_ESCORT_CROK_SCOURGEBANE
@ EMOTE_SVALNA_IMPALE
@ SAY_SVALNA_CAPTAIN_DEATH
@ SAY_CROK_COMBAT_SVALNA
@ SAY_CROK_INTRO_1
@ SAY_CROK_WEAKENING_SVALNA
@ SAY_SVALNA_AGGRO
@ SAY_CROK_WEAKENING_GAUNTLET
@ SAY_CROK_INTRO_3
@ SAY_CROK_COMBAT_WP_1
@ SAY_ARNATH_INTRO_2
@ SAY_CAPTAIN_SECOND_DEATH
@ SAY_SVALNA_KILL_CAPTAIN
@ SAY_SVALNA_RESURRECT_CAPTAINS
@ SAY_SVALNA_EVENT_START
@ SAY_CROK_COMBAT_WP_0
@ SAY_SVALNA_DEATH
@ SAY_SVALNA_KILL
@ SAY_CROK_FINAL_WP
@ SAY_CAPTAIN_DEATH
@ SAY_CROK_DEATH
@ SAY_CAPTAIN_SURVIVE_TALK
@ SAY_CAPTAIN_RESURRECTED
@ SAY_CAPTAIN_KILL
@ EMOTE_SVALNA_BROKEN_SHIELD
#define SPELL_SMITE
@ SPELL_SCOURGE_STRIKE
@ SPELL_ROCKET_LAUNCH_NORMAL
@ SPELL_DEATH_EMBRACE
@ SPELL_SMITE_NORMAL
@ SPELL_ADRENALINE_RUSH
@ SPELL_DOMINATE_MIND
@ SPELL_FEL_IRON_BOMB_NORMAL
@ SPELL_DEATH_STRIKE
@ SPELL_JUDGEMENT_OF_COMMAND
@ SPELL_DIVINE_SURGE
@ SPELL_FLASH_HEAL_NORMAL
@ SPELL_CHARGE
@ SPELL_CARESS_OF_DEATH
@ SPELL_CONFLAGRATION
@ SPELL_AWAKEN_YMIRJAR_FALLEN
@ SPELL_ICE_TRAP
@ SPELL_HURL_SPEAR
@ SPELL_ARCTIC_CHILL
@ SPELL_IMPALING_SPEAR_KILL
@ SPELL_TWISTED_WINDS
@ SPELL_YMIRJAR_SHADOW_BOLT
@ SPELL_CRUSADER_STRIKE
@ SPELL_MORTAL_STRIKE
@ SPELL_SPIRIT_STREAM
@ SPELL_YMIRJAR_SHOOT
@ SPELL_RAPID_SHOT
@ SPELL_POWER_WORD_SHIELD_NORMAL
@ SPELL_FLASH_HEAL_UNDEAD
@ SPELL_BARBARIC_STRIKE
@ SPELL_DIVINE_SHIELD
@ SPELL_POWER_WORD_SHIELD_UNDEAD
@ SPELL_SUNDER_ARMOR
@ SPELL_AETHER_SHIELD
@ SPELL_SMITE_UNDEAD
@ SPELL_SUMMON_WARHAWK
@ SPELL_HAMMER_OF_BETRAYAL
@ SPELL_FROZEN_ORB_MISSILE
@ SPELL_UNDEATH
@ SPELL_FEL_IRON_BOMB_UNDEAD
@ SPELL_ROCKET_LAUNCH_UNDEAD
@ SPELL_ICEBOUND_ARMOR
@ SPELL_REVIVE_CHAMPION
@ SPELL_WARLORDS_PRESENCE
@ SPELL_FROZEN_ORB_CAST
@ SPELL_SUMMON_YMIRJAR
@ SPELL_MACHINE_GUN_NORMAL
@ SPELL_IMPALING_SPEAR
@ SPELL_MACHINE_GUN_UNDEAD
@ SPELL_WHIRLWIND
#define SPELL_POWER_WORD_SHIELD
@ EVENT_SCOURGE_STRIKE
@ EVENT_RUPERT_FEL_IRON_BOMB
@ EVENT_SVALNA_COMBAT
@ EVENT_BRANDON_CRUSADER_STRIKE
@ EVENT_GRONDEL_MORTAL_STRIKE
@ EVENT_YMIRJAR_VOLLEY
@ EVENT_SVALNA_RESURRECT
@ EVENT_ARNATH_SMITE
@ EVENT_ARNATH_DOMINATE_MIND
@ EVENT_YMIRJAR_BARBARIC_STRIKE
@ EVENT_GRONDEL_SUNDER_ARMOR
@ EVENT_YMIRJAR_TWISTED_WINDS
@ EVENT_CROK_INTRO_3
@ EVENT_YMIRJAR_SHOOT
@ EVENT_ARNATH_INTRO_2
@ EVENT_YMIRJAR_BANISH
@ EVENT_YMIRJAR_DEATH_EMBRACE
@ EVENT_RUPERT_ROCKET_LAUNCH
@ EVENT_BRANDON_JUDGEMENT_OF_COMMAND
@ EVENT_YMIRJAR_WHIRLWIND
@ EVENT_DEATH_STRIKE
@ EVENT_BRANDON_HAMMER_OF_BETRAYAL
@ EVENT_YMIRJAR_ICE_TRAP
@ EVENT_ARNATH_PW_SHIELD
@ EVENT_GRONDEL_CONFLAGRATION
@ EVENT_AETHER_SHIELD
@ EVENT_START_PATHING
@ EVENT_IMPALING_SPEAR
@ EVENT_YMIRJAR_SPIRIT_STREAM
@ EVENT_YMIRJAR_ADRENALINE_RUSH
@ EVENT_RUPERT_MACHINE_GUN
@ EVENT_YMIRJAR_RAPID_SHOT
@ EVENT_HEALTH_CHECK
@ EVENT_BRANDON_DIVINE_SHIELD
@ EVENT_YMIRJAR_FROZEN_ORB
@ EVENT_YMIRJAR_SHADOW_BOLT
@ EVENT_ARNATH_FLASH_HEAL
@ EVENT_SVALNA_START
@ EVENT_GRONDEL_CHARGE_CHECK
@ EVENT_YMIRJAR_SUMMON
@ ACTION_RESET_EVENT
@ ACTION_CAPTAIN_DIES
@ ACTION_RESURRECT_CAPTAINS
@ ACTION_START_GAUNTLET
@ ACTION_KILL_CAPTAIN
#define SPELL_MACHINE_GUN
TypeID GetTypeId() const
Definition BaseEntity.h:166
InstanceScript *const instance
void _JustReachedHome()
void JustEngagedWith(Unit *who) override
EventMap events
bool Execute(uint64, uint32) override
CaptainSurviveTalk(Creature const *owner)
void DoZoneInCombat()
Definition CreatureAI.h:169
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:394
void setDeathState(DeathState s) override
uint32 GetOriginalEntry() const
Definition Creature.h:426
bool IsEngaged() const override
void SetReactState(ReactStates st)
Definition Creature.h:180
void SetRespawnDelay(uint32 delay)
Definition Creature.h:368
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition Creature.cpp:591
CreatureData const * GetCreatureData() const
Definition Creature.h:275
uint32 GetRespawnDelay() const
Definition Creature.h:367
void SetImmuneToNPC(bool apply) override
Definition Creature.h:193
uint32 GetCorpseDelay() const
Definition Creature.h:124
void SetImmuneToAll(bool apply) override
Definition Creature.h:187
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:118
CreatureAI * AI() const
Definition Creature.h:235
void Update(uint32 time)
Definition EventMap.h:77
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
EventId ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
void operator()(Creature *creature)
FrostwingVrykulSearcher(Creature const *source, float range)
bool operator()(WorldObject *object) const
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
void LoadGrid(float x, float y)
Definition Map.cpp:370
MovementGeneratorType GetCurrentMovementGeneratorType() const
void MoveFollow(Unit *target, float dist, Optional< ChaseAngle > angle={}, Optional< Milliseconds > duration={}, bool ignoreTargetWalk=false, MovementSlot slot=MOTION_SLOT_ACTIVE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MoveLand(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
Unit * ToUnit()
Definition Object.h:116
uint32 const Id
Definition SpellInfo.h:328
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
virtual void Reset()
Definition UnitAI.h:64
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
Vehicle * GetVehicle() const
Definition Unit.h:1800
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:809
int64 ModifyHealth(int64 val)
Definition Unit.cpp:8618
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3253
Unit * GetVehicleBase() const
Definition Unit.cpp:12206
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
bool SetHover(bool enable, bool updateAnimTier=true)
Definition Unit.cpp:13656
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:12344
bool IsAlive() const
Definition Unit.h:1205
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:13123
uint64 GetHealth() const
Definition Unit.h:800
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
bool SetDisableGravity(bool disable, bool updateAnimTier=true, bool updatePlayHoverAnim=true)
Definition Unit.cpp:13440
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.cpp:11311
bool isDead() const
Definition Unit.h:1207
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1403
void setActive(bool isActiveObject)
Definition Object.cpp:274
Position GetNearPosition(float dist, float angle)
Definition Object.cpp:2760
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:448
void SetFarVisible(bool on)
Definition Object.cpp:325
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:494
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
void HandleScript(SpellEffIndex effIndex)
void RemoveAliveTarget(std::list< WorldObject * > &targets)
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ ACTION_VRYKUL_DEATH
@ DATA_SISTER_SVALNA
@ DATA_CROK_SCOURGEBANE
@ DATA_CAPTAIN_ARNATH
@ NPC_IMPALING_SPEAR
@ NPC_CAPTAIN_BRANDON
@ NPC_CAPTAIN_GRONDEL_UNDEAD
@ NPC_YMIRJAR_BATTLE_MAIDEN
@ NPC_CAPTAIN_BRANDON_UNDEAD
@ NPC_CAPTAIN_ARNATH_UNDEAD
@ NPC_YMIRJAR_WARLORD
@ NPC_CAPTAIN_RUPERT
@ NPC_CAPTAIN_RUPERT_UNDEAD
@ NPC_YMIRJAR_HUNTRESS
@ NPC_CROK_SCOURGEBANE
@ NPC_SISTER_SVALNA
@ NPC_YMIRJAR_FROSTBINDER
@ NPC_CAPTAIN_GRONDEL
@ NPC_CAPTAIN_ARNATH
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
@ NPC_YMIRJAR_DEATHBRINGER
CastSpellExtraArgs & AddSpellBP0(SpellEffectValue val)
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:150
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:140
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
void SetDespawnAtFar(bool despawn)
void SetDespawnAtEnd(bool despawn)
void LoadPath(uint32 pathId)
void SetEscortPaused(bool on)
constexpr float GetPositionY() const
Definition Position.h:88
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:136
constexpr float GetOrientation() const
Definition Position.h:90
bool HealthAbovePct(uint32 pct) const
bool HealthBelowPct(uint32 pct) const
std::list< Creature * > DoFindFriendlyMissingBuff(float range, uint32 spellId)
bool Is25ManRaid() const
void UpdateAI(uint32 diff) override
void InitializeAI() override
void DoAction(int32 action) override
boss_sister_svalna(Creature *creature)
void KilledUnit(Unit *victim) override
void JustDied(Unit *) override
void JustEngagedWith(Unit *who) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void MovementInform(uint32 type, uint32 id) override
void JustReachedHome() override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void JustEngagedWith(Unit *) override
npc_argent_captainAI(Creature *creature)
bool CanAIAttack(Unit const *target) const override
void DoAction(int32 action) override
void JustDied(Unit *) override
void KilledUnit(Unit *victim) override
void EnterEvadeMode(EvadeReason why) override
Creature * FindFriendlyCreature() const
void UpdateAI(uint32 diff) override
npc_captain_arnath(Creature *creature)
npc_captain_brandon(Creature *creature)
void UpdateAI(uint32 diff) override
npc_captain_grondel(Creature *creature)
void UpdateAI(uint32 diff) override
npc_captain_rupert(Creature *creature)
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
void WaypointReached(uint32 waypointId, uint32) override
bool CanAIAttack(Unit const *target) const override
void SetGUID(ObjectGuid const &guid, int32 id) override
void UpdateEscortAI(uint32 diff) override
void WaypointStarted(uint32 waypointId, uint32) override
== Waypoints system =============================
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
npc_crok_scourgebane(Creature *creature)
void UpdateAI(uint32 diff) override
void SummonedCreatureDespawn(Creature *summon) override
void JustSummoned(Creature *summon) override
void JustEngagedWith(Unit *who) override
npc_frostwing_ymirjar_vrykul(Creature *creature)
npc_impaling_spear(Creature *creature)
void UpdateAI(uint32 diff) override