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->SetUnitFlag2(UNIT_FLAG2_ALLOW_ENEMY_INTERACT);
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
511 }
512
513private:
515};
516
517static constexpr uint32 PATH_ESCORT_CROK_SCOURGEBANE = 297034;
518
519// 37129 - Crok Scourgebane
521{
522 npc_crok_scourgebane(Creature* creature) : EscortAI(creature), _instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()), _corpseDelay(creature->GetCorpseDelay())
523 {
524 Initialize();
525 SetDespawnAtEnd(false);
526 SetDespawnAtFar(false);
527 _isEventActive = false;
529 _currentWPid = 0;
530 }
531
533 {
535 _wipeCheckTimer = 1000;
536 }
537
538 void Reset() override
539 {
540 _events.Reset();
544 Initialize();
545 }
546
547 void DoAction(int32 action) override
548 {
549 if (action == ACTION_START_GAUNTLET)
550 {
551 if (_isEventDone || !me->IsAlive())
552 return;
553
554 _isEventActive = true;
555 _isEventDone = true;
556
557 // Load Grid with Sister Svalna
558 me->GetMap()->LoadGrid(4356.71f, 2484.33f);
559
561 svalna->AI()->DoAction(ACTION_START_GAUNTLET);
562
567 me->setActive(true);
568 me->SetFarVisible(true);
569
570 for (uint32 itr = 0; itr < 4; ++itr)
572 crusader->AI()->DoAction(ACTION_START_GAUNTLET);
573 }
574 else if (action == ACTION_RESET_EVENT)
575 {
576 _isEventActive = false;
578 me->setActive(false);
579 me->SetFarVisible(false);
580 _aliveTrash.clear();
581 _currentWPid = 0;
582 }
583 }
584
585 void SetGUID(ObjectGuid const& guid, int32 id) override
586 {
587 if (id == ACTION_VRYKUL_DEATH)
588 {
589 _aliveTrash.erase(guid);
590 if (_aliveTrash.empty())
591 {
592 SetEscortPaused(false);
593 if (_currentWPid == 4 && _isEventActive)
594 {
595 _isEventActive = false;
596 me->setActive(false);
597 me->SetFarVisible(false);
600 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
601 }
602 }
603 }
604 }
605
606 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
607 {
608 switch (waypointId)
609 {
610 case 0: // pause pathing until trash pack is cleared
611 me->SetImmuneToNPC(false);
613 if (!_aliveTrash.empty())
614 SetEscortPaused(true);
615 break;
616 case 1:
618 if (!_aliveTrash.empty())
619 SetEscortPaused(true);
620 break;
621 case 4:
622 if (_aliveTrash.empty() && _isEventActive)
623 {
624 _isEventActive = false;
625 me->setActive(false);
626 me->SetFarVisible(false);
629 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
630 }
631 break;
632 default:
633 break;
634 }
635 }
636
637 void WaypointStarted(uint32 waypointId, uint32 /*pathId*/) override
638 {
639 _currentWPid = waypointId;
640 switch (waypointId)
641 {
642 case 0:
643 case 1:
644 case 4:
645 {
646 // get spawns by home position
647 float minY = 2600.0f;
648 float maxY = 2650.0f;
649 if (waypointId == 1)
650 {
651 minY -= 50.0f;
652 maxY -= 50.0f;
653 // at waypoints 1 and 2 she kills one captain
655 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
656 }
657 else if (waypointId == 4)
658 {
659 minY -= 100.0f;
660 maxY -= 100.0f;
661 }
662
663 // get all nearby vrykul
664 std::list<Creature*> temp;
665 FrostwingVrykulSearcher check(me, 80.0f);
667 Cell::VisitGridObjects(me, searcher, 80.0f);
668
669 _aliveTrash.clear();
670 for (auto itr = temp.begin(); itr != temp.end(); ++itr)
671 if ((*itr)->GetHomePosition().GetPositionY() < maxY && (*itr)->GetHomePosition().GetPositionY() > minY)
672 _aliveTrash.insert((*itr)->GetGUID());
673 break;
674 }
675 // at waypoints 1 and 2 she kills one captain
676 case 2:
678 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
679 break;
680 default:
681 break;
682 }
683 }
684
685 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
686 {
687 // check wipe
688 if (!_wipeCheckTimer)
689 {
690 _wipeCheckTimer = 1000;
691 Player* player = nullptr;
694 Cell::VisitWorldObjects(me, searcher, 60.0f);
695 // wipe
696 if (!player)
697 {
698 damage *= 100;
699 if (damage >= me->GetHealth())
700 {
703 Cell::VisitGridObjects(me, worker, 333.0f);
705 }
706 return;
707 }
708 }
709
710 if (HealthBelowPct(10))
711 {
713 {
715 if (_isEventActive)
717 else
719 }
720
721 damage = 0;
724 }
725 }
726
727 void UpdateEscortAI(uint32 diff) override
728 {
729 if (_wipeCheckTimer <= diff)
730 _wipeCheckTimer = 0;
731 else
732 _wipeCheckTimer -= diff;
733
734 if (!UpdateVictim() && !_isEventActive)
735 return;
736
737 _events.Update(diff);
738
740 return;
741
742 while (uint32 eventId = _events.ExecuteEvent())
743 {
744 switch (eventId)
745 {
748 arnath->AI()->Talk(SAY_ARNATH_INTRO_2);
749 break;
752 break;
755 Start(true);
756 break;
760 break;
762 if (HealthBelowPct(20))
765 break;
767 if (HealthAbovePct(15))
768 {
771 }
772 else
773 {
774 // looks totally hacky to me
777 }
778 break;
779 default:
780 break;
781 }
782 }
783
785 }
786
787 bool CanAIAttack(Unit const* target) const override
788 {
789 // do not see targets inside Frostwing Halls when we are not there
790 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
791 }
792
793private:
804};
805
807{
808public:
809 npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), _firstDeath(true)
810 {
813 IsUndead = false;
814 }
815
816 void JustDied(Unit* /*killer*/) override
817 {
818 if (_firstDeath)
819 {
820 _firstDeath = false;
822 }
823 else
825 }
826
827 void KilledUnit(Unit* victim) override
828 {
829 if (victim->GetTypeId() == TYPEID_PLAYER)
831 }
832
833 void DoAction(int32 action) override
834 {
835 if (action == ACTION_START_GAUNTLET)
836 {
838 {
841 FollowDist = me->GetDistance2d(crok);
843 }
844
845 me->setActive(true);
846 me->SetFarVisible(true);
847 }
848 else if (action == ACTION_RESET_EVENT)
849 {
850 _firstDeath = true;
851 }
852 }
853
854 void JustEngagedWith(Unit* /*target*/) override
855 {
857 if (IsUndead)
859 }
860
861 bool CanAIAttack(Unit const* target) const override
862 {
863 // do not see targets inside Frostwing Halls when we are not there
864 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
865 }
866
867 void EnterEvadeMode(EvadeReason why) override
868 {
869 // not yet following
871 {
873 return;
874 }
875
876 if (!_EnterEvadeMode(why))
877 return;
878
879 if (!me->GetVehicle())
880 {
884 }
885
886 Reset();
887 }
888
889 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
890 {
891 if (spellInfo->Id == SPELL_REVIVE_CHAMPION && !IsUndead)
892 {
893 IsUndead = true;
895 uint32 newEntry = 0;
896 switch (me->GetEntry())
897 {
899 newEntry = NPC_CAPTAIN_ARNATH_UNDEAD;
900 break;
903 break;
906 break;
908 newEntry = NPC_CAPTAIN_RUPERT_UNDEAD;
909 break;
910 default:
911 return;
912 }
913
915 me->UpdateEntry(newEntry, me->GetCreatureData());
917 }
918 }
919
920protected:
926
927private:
929};
930
931// 37122 - Captain Arnath
933{
935 {
936 }
937
938 void Reset() override
939 {
940 Events.Reset();
941 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 4s, 7s);
942 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 8s, 14s);
943 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 3s, 6s);
944 if (Is25ManRaid() && IsUndead)
945 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 22s, 27s);
946 }
947
948 void UpdateAI(uint32 diff) override
949 {
950 if (!UpdateVictim())
951 return;
952
953 Events.Update(diff);
954
956 return;
957
958 while (uint32 eventId = Events.ExecuteEvent())
959 {
960 switch (eventId)
961 {
963 if (Creature* target = FindFriendlyCreature())
964 DoCast(target, SPELL_FLASH_HEAL);
965 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 6s, 9s);
966 break;
968 {
969 std::list<Creature*> targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD);
970 if (!targets.empty())
972 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 15s, 20s);
973 break;
974 }
977 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 4s, 7s);
978 break;
980 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
982 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 28s, 37s);
983 break;
984 default:
985 break;
986 }
987
989 return;
990 }
991
993 }
994
995private:
997 {
998 Creature* target = nullptr;
999 Trinity::MostHPMissingInRange u_check(me, 60.0f, 0);
1001 Cell::VisitGridObjects(me, searcher, 60.0f);
1002 return target;
1003 }
1004};
1005
1006// 37123 - Captain Brandon
1008{
1010 {
1011 }
1012
1013 void Reset() override
1014 {
1015 Events.Reset();
1016 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 10s);
1017 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1018 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1019 if (IsUndead)
1020 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 25s, 30s);
1021 }
1022
1023 void UpdateAI(uint32 diff) override
1024 {
1025 if (!UpdateVictim())
1026 return;
1027
1028 Events.Update(diff);
1029
1031 return;
1032
1033 while (uint32 eventId = Events.ExecuteEvent())
1034 {
1035 switch (eventId)
1036 {
1039 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 12s);
1040 break;
1042 if (HealthBelowPct(20))
1044 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1045 break;
1048 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1049 break;
1051 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
1053 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 45s, 60s);
1054 break;
1055 default:
1056 break;
1057 }
1058
1060 return;
1061 }
1062
1064 }
1065};
1066
1067// 37124 - Captain Grondel
1069{
1071 {
1072 }
1073
1074 void Reset() override
1075 {
1076 Events.Reset();
1077 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1078 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 8s, 14s);
1079 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 3s, 12s);
1080 if (IsUndead)
1081 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 12s, 17s);
1082 }
1083
1084 void UpdateAI(uint32 diff) override
1085 {
1086 if (!UpdateVictim())
1087 return;
1088
1089 Events.Update(diff);
1090
1092 return;
1093
1094 while (uint32 eventId = Events.ExecuteEvent())
1095 {
1096 switch (eventId)
1097 {
1100 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1101 break;
1104 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 10s, 15s);
1105 break;
1108 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 5s, 17s);
1109 break;
1111 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
1112 DoCast(target, SPELL_CONFLAGRATION);
1113 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 10s, 15s);
1114 break;
1115 default:
1116 break;
1117 }
1118
1120 return;
1121 }
1122
1124 }
1125};
1126
1127// 37125 - Captain Rupert
1129{
1131 {
1132 }
1133
1134 void Reset() override
1135 {
1136 Events.Reset();
1137 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1138 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1139 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1140 }
1141
1142 void UpdateAI(uint32 diff) override
1143 {
1144 if (!UpdateVictim())
1145 return;
1146
1147 Events.Update(diff);
1148
1150 return;
1151
1152 while (uint32 eventId = Events.ExecuteEvent())
1153 {
1154 switch (eventId)
1155 {
1158 DoCast(target, SPELL_FEL_IRON_BOMB);
1159 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1160 break;
1163 DoCast(target, SPELL_MACHINE_GUN);
1164 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1165 break;
1168 DoCast(target, SPELL_ROCKET_LAUNCH);
1169 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1170 break;
1171 default:
1172 break;
1173 }
1174
1176 return;
1177 }
1178
1180 }
1181};
1182
1183/* 37127 - Ymirjar Frostbinder
1184 37132 - Ymirjar Battle-Maiden
1185 37133 - Ymirjar Warlord
1186 37134 - Ymirjar Huntress
1187 38125 - Ymirjar Deathbringer */
1189{
1191 {
1192 }
1193
1194 void Reset() override
1195 {
1196 _events.Reset();
1197 _OOCevents.Reset();
1199
1200 if (!me->IsAlive())
1201 return;
1202
1203 switch (me->GetEntry())
1204 {
1207 [[fallthrough]];
1210 break;
1212 if (Is25ManRaid())
1214 break;
1215 default:
1216 break;
1217 }
1218 }
1219
1220 void JustDied(Unit* /*killer*/) override
1221 {
1224 }
1225
1226 void JustSummoned(Creature* summon) override
1227 {
1228 if (summon->GetEntry() == NPC_YMIRJAR_WARHAWK)
1230
1231 _summons.Summon(summon);
1232
1233 if (me->IsEngaged())
1234 DoZoneInCombat(summon);
1235 }
1236
1237 void SummonedCreatureDespawn(Creature* summon) override
1238 {
1239 _summons.Despawn(summon);
1240 }
1241
1242 void JustEngagedWith(Unit* who) override
1243 {
1244 if (!who)
1245 return;
1246
1248
1249 switch (me->GetEntry())
1250 {
1255 break;
1259 break;
1262 break;
1268 break;
1274 break;
1275 default:
1276 break;
1277 }
1278 }
1279
1280 void UpdateAI(uint32 diff) override
1281 {
1282 if (!UpdateVictim())
1283 {
1284 _OOCevents.Update(diff);
1285
1287 return;
1288
1289 while (uint32 eventId = _OOCevents.ExecuteEvent())
1290 {
1291 switch (eventId)
1292 {
1295 _OOCevents.Repeat(40s, 60s);
1296 break;
1297 default:
1298 break;
1299 }
1300
1302 return;
1303 }
1304 return;
1305 }
1306
1307 _events.Update(diff);
1308
1310 return;
1311
1312 while (uint32 eventId = _events.ExecuteEvent())
1313 {
1314 switch (eventId)
1315 {
1318 _events.Repeat(10s, 20s);
1319 break;
1321 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true))
1322 DoCast(target, SPELL_TWISTED_WINDS);
1323 _events.Repeat(10s, 20s);
1324 break;
1327 _events.Repeat(2s, 4s);
1328 break;
1331 _events.Repeat(10s, 20s);
1332 break;
1335 _events.Repeat(6s, 12s);
1336 break;
1339 _events.Repeat(20s, 30s);
1340 break;
1342 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1343 DoCast(target, SPELL_ICE_TRAP);
1344 _events.Repeat(15s, 20s);
1345 break;
1347 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
1348 DoCast(target, SPELL_VOLLEY);
1349 _events.Repeat(10s, 20s);
1350 break;
1353 _events.Repeat(2s);
1354 break;
1357 _events.Repeat(5s, 8s);
1358 break;
1361 _events.Repeat(10s, 20s);
1362 break;
1364 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1365 DoCast(target, SPELL_BANISH);
1366 _events.Repeat(10s, 20s);
1367 break;
1370 _events.DelayEvents(2s);
1371 _events.Repeat(90s);
1372 break;
1373 default:
1374 break;
1375 }
1376
1378 return;
1379 }
1380
1382 }
1383
1384private:
1388};
1389
1390// 38248 - Impaling Spear
1392{
1394 {
1395 Initialize();
1396 }
1397
1399 {
1400 _vehicleCheckTimer = 500;
1401 }
1402
1403 void Reset() override
1404 {
1406 Initialize();
1407 }
1408
1409 void UpdateAI(uint32 diff) override
1410 {
1411 if (_vehicleCheckTimer <= diff)
1412 {
1413 _vehicleCheckTimer = 500;
1414 if (!me->GetVehicle())
1415 me->DespawnOrUnsummon(100ms);
1416 }
1417 else
1418 _vehicleCheckTimer -= diff;
1419 }
1420
1421private:
1423};
1424
1426{
1427public:
1428 bool operator()(WorldObject* object) const
1429 {
1430 if (Unit* unit = object->ToUnit())
1431 return unit->IsAlive();
1432 return true;
1433 }
1434};
1435
1436// 70053 - Revive Champion
1438{
1440
1441 void RemoveAliveTarget(std::list<WorldObject*>& targets)
1442 {
1443 targets.remove_if(ICCSvalnaAliveCheck());
1445 }
1446
1447 void Land(SpellEffIndex /*effIndex*/)
1448 {
1449 Creature* caster = GetCaster()->ToCreature();
1450 if (!caster)
1451 return;
1452
1453 Position pos = caster->GetNearPosition(5.0f, 0.0f);
1454 //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f);
1455 //pos.m_positionZ += 0.05f;
1456 caster->SetHomePosition(pos);
1458 }
1459
1465};
1466
1467// 71462 - Remove Spear
1469{
1471
1473 {
1474 PreventHitDefaultEffect(effIndex);
1475 if (Creature* target = GetHitCreature())
1476 {
1477 if (Unit* vehicle = target->GetVehicleBase())
1478 vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR);
1479 target->DespawnOrUnsummon(1ms);
1480 }
1481 }
1482
1487};
1488
1490{
1491public:
1492 at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { }
1493
1494 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
1495 {
1496 if (InstanceScript* instance = player->GetInstanceScript())
1497 if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CROK_SCOURGEBANE)))
1498 crok->AI()->DoAction(ACTION_START_GAUNTLET);
1499 return true;
1500 }
1501};
1502
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint32_t uint32
Definition Define.h:133
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:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:260
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:86
#define PET_FOLLOW_DIST
Definition PetDefines.h:85
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1127
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_DEST_AREA_ENTRY
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_MAX_TARGETS
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
@ UNIT_FLAG2_ALLOW_ENEMY_INTERACT
@ REACT_DEFENSIVE
@ REACT_PASSIVE
@ JUST_RESPAWNED
Definition Unit.h:215
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
@ 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
InstanceScript *const instance
void _JustReachedHome()
void JustEngagedWith(Unit *who) override
EventMap events
bool Execute(uint64, uint32) override
CaptainSurviveTalk(Creature const *owner)
bool _EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void DoZoneInCombat(Creature *creature=nullptr)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:293
void setDeathState(DeathState s) override
uint32 GetOriginalEntry() const
Definition Creature.h:326
bool IsEngaged() const override
void SetReactState(ReactStates st)
Definition Creature.h:119
void SetRespawnDelay(uint32 delay)
Definition Creature.h:262
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition Creature.cpp:540
CreatureData const * GetCreatureData() const
Definition Creature.h:187
uint32 GetRespawnDelay() const
Definition Creature.h:261
void SetImmuneToNPC(bool apply) override
Definition Creature.h:132
uint32 GetCorpseDelay() const
Definition Creature.h:95
void SetImmuneToAll(bool apply) override
Definition Creature.h:126
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:89
CreatureAI * AI() const
Definition Creature.h:154
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
void 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:578
MovementGeneratorType GetCurrentMovementGeneratorType() const
void MoveFollow(Unit *target, float dist, ChaseAngle angle, MovementSlot slot=MOTION_SLOT_ACTIVE)
void MoveLand(uint32 id, Position const &pos, Optional< float > velocity={})
static Creature * ToCreature(Object *o)
Definition Object.h:186
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
uint32 Id
Definition SpellInfo.h:289
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 DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
virtual void Reset()
Definition UnitAI.h:145
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
int32 ModifyHealth(int32 val)
Definition Unit.cpp:8381
Vehicle * GetVehicle() const
Definition Unit.h:1737
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
Unit * GetVehicleBase() const
Definition Unit.cpp:11826
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool SetHover(bool enable, bool updateAnimTier=true)
Definition Unit.cpp:13503
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:11964
bool IsAlive() const
Definition Unit.h:1234
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:12890
uint32 GetHealth() const
Definition Unit.h:913
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:922
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true)
Definition Unit.cpp:10930
bool isDead() const
Definition Unit.h:1236
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1992
void setActive(bool isActiveObject)
Definition Object.cpp:991
Position GetNearPosition(float dist, float angle)
Definition Object.cpp:3250
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1141
void SetFarVisible(bool on)
Definition Object.cpp:1014
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
void HandleScript(SpellEffIndex effIndex)
PrepareSpellScript(spell_svalna_remove_spear)
PrepareSpellScript(spell_svalna_revive_champion)
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) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:66
@ NPC_YMIRJAR_DEATHBRINGER
CastSpellExtraArgs & AddSpellBP0(int32 val)
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:168
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:180
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)
float GetOrientation() const
Definition Position.h:82
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
float GetPositionY() const
Definition Position.h:80
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