TrinityCore
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
126};
127
129{
130 // Crok Scourgebane
136
137 // Sister Svalna
144
145 // Captain Arnath
150
151 // Captain Brandon
156
157 // Captain Grondel
162
163 // Captain Rupert
167
168 // Ymirjar Vrykuls
183};
184
186{
193
195{
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
306{
308
309 void InitializeAI() override
310 {
311 if (!me->isDead())
312 Reset();
313
315 }
316
317 void Reset() override
318 {
319 _Reset();
321 _isEventInProgress = false;
322 }
323
324 void JustDied(Unit* /*killer*/) override
325 {
326 _JustDied();
328
329 Milliseconds delay = 1ms;
330 for (uint8 itr = 0; itr < 4; ++itr)
331 {
333 {
334 if (crusader->IsAlive() && crusader->GetEntry() == crusader->GetCreatureData()->id)
335 {
336 crusader->m_Events.AddEvent(new CaptainSurviveTalk(crusader), crusader->m_Events.CalculateTime(delay));
337 delay += 6s;
338 }
339 }
340 }
341 }
342
343 void JustEngagedWith(Unit* who) override
344 {
347 crok->AI()->Talk(SAY_CROK_COMBAT_SVALNA);
352 }
353
354 void KilledUnit(Unit* victim) override
355 {
356 switch (victim->GetTypeId())
357 {
358 case TYPEID_PLAYER:
360 break;
361 case TYPEID_UNIT:
362 switch (victim->GetEntry())
363 {
369 break;
370 default:
371 break;
372 }
373 break;
374 default:
375 break;
376 }
377 }
378
379 void JustReachedHome() override
380 {
383 me->SetDisableGravity(false);
384 me->SetHover(false);
385 }
386
387 void DoAction(int32 action) override
388 {
389 switch (action)
390 {
393 break;
395 if (me->IsAlive())
396 {
397 me->setActive(true);
398 me->SetFarVisible(true);
399 _isEventInProgress = true;
400 me->SetImmuneToAll(true);
402 }
403 break;
406 break;
409 break;
411 me->setActive(false);
412 me->SetFarVisible(false);
413 Reset();
414 break;
415 default:
416 break;
417 }
418 }
419
420 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
421 {
422 if (spellInfo->Id == SPELL_HURL_SPEAR && me->HasAura(SPELL_AETHER_SHIELD))
423 {
426 }
427 }
428
429 void MovementInform(uint32 type, uint32 id) override
430 {
431 if (type != EFFECT_MOTION_TYPE || id != POINT_SVALNA_LAND)
432 return;
433
434 _isEventInProgress = false;
435 me->setActive(false);
436 me->SetFarVisible(false);
437 me->SetImmuneToAll(false);
438 me->SetDisableGravity(false);
439 me->SetHover(false);
440 }
441
442 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
443 {
444 Unit* unitTarget = target->ToUnit();
445 if (!unitTarget)
446 return;
447
448 switch (spellInfo->Id)
449 {
451 Unit::Kill(me, unitTarget);
452 break;
454 if (TempSummon* summon = unitTarget->SummonCreature(NPC_IMPALING_SPEAR, *unitTarget))
455 {
456 Talk(EMOTE_SVALNA_IMPALE, unitTarget);
458 args.AddSpellBP0(1);
459 summon->CastSpell(target, VEHICLE_SPELL_RIDE_HARDCODED, args);
460 summon->SetInteractionAllowedWhileHostile(true);
461 }
462 break;
463 default:
464 break;
465 }
466 }
467
468 void UpdateAI(uint32 diff) override
469 {
471 return;
472
473 events.Update(diff);
474
476 return;
477
478 while (uint32 eventId = events.ExecuteEvent())
479 {
480 switch (eventId)
481 {
484 break;
488 break;
492 break;
494 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true, true, -SPELL_IMPALING_SPEAR))
495 {
498 }
500 break;
501 default:
502 break;
503 }
504
506 return;
507 }
508 }
509
510private:
512};
513
514static constexpr uint32 PATH_ESCORT_CROK_SCOURGEBANE = 297034;
515
517{
518 npc_crok_scourgebane(Creature* creature) : EscortAI(creature), _instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()), _corpseDelay(creature->GetCorpseDelay())
519 {
520 Initialize();
521 SetDespawnAtEnd(false);
522 SetDespawnAtFar(false);
523 _isEventActive = false;
525 _currentWPid = 0;
526 }
527
529 {
531 _wipeCheckTimer = 1000;
532 }
533
534 void Reset() override
535 {
536 _events.Reset();
540 Initialize();
541 }
542
543 void DoAction(int32 action) override
544 {
545 if (action == ACTION_START_GAUNTLET)
546 {
547 if (_isEventDone || !me->IsAlive())
548 return;
549
550 _isEventActive = true;
551 _isEventDone = true;
552
553 // Load Grid with Sister Svalna
554 me->GetMap()->LoadGrid(4356.71f, 2484.33f);
555
557 svalna->AI()->DoAction(ACTION_START_GAUNTLET);
558
563 me->setActive(true);
564 me->SetFarVisible(true);
565
566 for (uint32 itr = 0; itr < 4; ++itr)
568 crusader->AI()->DoAction(ACTION_START_GAUNTLET);
569 }
570 else if (action == ACTION_RESET_EVENT)
571 {
572 _isEventActive = false;
574 me->setActive(false);
575 me->SetFarVisible(false);
576 _aliveTrash.clear();
577 _currentWPid = 0;
578 }
579 }
580
581 void SetGUID(ObjectGuid const& guid, int32 id) override
582 {
583 if (id == ACTION_VRYKUL_DEATH)
584 {
585 _aliveTrash.erase(guid);
586 if (_aliveTrash.empty())
587 {
588 SetEscortPaused(false);
589 if (_currentWPid == 4 && _isEventActive)
590 {
591 _isEventActive = false;
592 me->setActive(false);
593 me->SetFarVisible(false);
596 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
597 }
598 }
599 }
600 }
601
602 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
603 {
604 switch (waypointId)
605 {
606 case 0: // pause pathing until trash pack is cleared
607 me->SetImmuneToNPC(false);
609 if (!_aliveTrash.empty())
610 SetEscortPaused(true);
611 break;
612 case 1:
614 if (!_aliveTrash.empty())
615 SetEscortPaused(true);
616 break;
617 case 4:
618 if (_aliveTrash.empty() && _isEventActive)
619 {
620 _isEventActive = false;
621 me->setActive(false);
622 me->SetFarVisible(false);
625 svalna->AI()->DoAction(ACTION_RESURRECT_CAPTAINS);
626 }
627 break;
628 default:
629 break;
630 }
631 }
632
633 void WaypointStarted(uint32 waypointId, uint32 /*pathId*/) override
634 {
635 _currentWPid = waypointId;
636 switch (waypointId)
637 {
638 case 0:
639 case 1:
640 case 4:
641 {
642 // get spawns by home position
643 float minY = 2600.0f;
644 float maxY = 2650.0f;
645 if (waypointId == 1)
646 {
647 minY -= 50.0f;
648 maxY -= 50.0f;
649 // at waypoints 1 and 2 she kills one captain
651 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
652 }
653 else if (waypointId == 4)
654 {
655 minY -= 100.0f;
656 maxY -= 100.0f;
657 }
658
659 // get all nearby vrykul
660 std::list<Creature*> temp;
661 FrostwingVrykulSearcher check(me, 80.0f);
663 Cell::VisitGridObjects(me, searcher, 80.0f);
664
665 _aliveTrash.clear();
666 for (auto itr = temp.begin(); itr != temp.end(); ++itr)
667 if ((*itr)->GetHomePosition().GetPositionY() < maxY && (*itr)->GetHomePosition().GetPositionY() > minY)
668 _aliveTrash.insert((*itr)->GetGUID());
669 break;
670 }
671 // at waypoints 1 and 2 she kills one captain
672 case 2:
674 svalna->AI()->DoAction(ACTION_KILL_CAPTAIN);
675 break;
676 default:
677 break;
678 }
679 }
680
681 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
682 {
683 // check wipe
684 if (!_wipeCheckTimer)
685 {
686 _wipeCheckTimer = 1000;
687 Player* player = nullptr;
690 Cell::VisitWorldObjects(me, searcher, 60.0f);
691 // wipe
692 if (!player)
693 {
694 damage *= 100;
695 if (damage >= me->GetHealth())
696 {
699 Cell::VisitGridObjects(me, worker, 333.0f);
701 }
702 return;
703 }
704 }
705
706 if (HealthBelowPct(10))
707 {
709 {
711 if (_isEventActive)
713 else
715 }
716
717 damage = 0;
720 }
721 }
722
723 void UpdateEscortAI(uint32 diff) override
724 {
725 if (_wipeCheckTimer <= diff)
726 _wipeCheckTimer = 0;
727 else
728 _wipeCheckTimer -= diff;
729
730 if (!UpdateVictim() && !_isEventActive)
731 return;
732
733 _events.Update(diff);
734
736 return;
737
738 while (uint32 eventId = _events.ExecuteEvent())
739 {
740 switch (eventId)
741 {
744 arnath->AI()->Talk(SAY_ARNATH_INTRO_2);
745 break;
748 break;
751 Start(true);
752 break;
756 break;
758 if (HealthBelowPct(20))
761 break;
763 if (HealthAbovePct(15))
764 {
767 }
768 else
769 {
770 // looks totally hacky to me
773 }
774 break;
775 default:
776 break;
777 }
778 }
779 }
780
781 bool CanAIAttack(Unit const* target) const override
782 {
783 // do not see targets inside Frostwing Halls when we are not there
784 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
785 }
786
787private:
798};
799
801{
802public:
803 npc_argent_captainAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()), _firstDeath(true)
804 {
807 IsUndead = false;
808 }
809
810 void JustDied(Unit* /*killer*/) override
811 {
812 if (_firstDeath)
813 {
814 _firstDeath = false;
816 }
817 else
819 }
820
821 void KilledUnit(Unit* victim) override
822 {
823 if (victim->GetTypeId() == TYPEID_PLAYER)
825 }
826
827 void DoAction(int32 action) override
828 {
829 if (action == ACTION_START_GAUNTLET)
830 {
832 {
835 FollowDist = me->GetDistance2d(crok);
837 }
838
839 me->setActive(true);
840 me->SetFarVisible(true);
841 }
842 else if (action == ACTION_RESET_EVENT)
843 {
844 _firstDeath = true;
845 }
846 }
847
848 void JustEngagedWith(Unit* /*target*/) override
849 {
851 if (IsUndead)
853 }
854
855 bool CanAIAttack(Unit const* target) const override
856 {
857 // do not see targets inside Frostwing Halls when we are not there
858 return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
859 }
860
861 void EnterEvadeMode(EvadeReason why) override
862 {
863 // not yet following
865 {
867 return;
868 }
869
870 if (!_EnterEvadeMode(why))
871 return;
872
873 if (!me->GetVehicle())
874 {
878 }
879
880 Reset();
881 }
882
883 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
884 {
885 if (spellInfo->Id == SPELL_REVIVE_CHAMPION && !IsUndead)
886 {
887 IsUndead = true;
889 uint32 newEntry = 0;
890 switch (me->GetEntry())
891 {
893 newEntry = NPC_CAPTAIN_ARNATH_UNDEAD;
894 break;
897 break;
900 break;
902 newEntry = NPC_CAPTAIN_RUPERT_UNDEAD;
903 break;
904 default:
905 return;
906 }
907
909 me->UpdateEntry(newEntry, me->GetCreatureData());
911 }
912 }
913
914protected:
920
921private:
923};
924
926{
928 {
929 }
930
931 void Reset() override
932 {
933 Events.Reset();
934 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 4s, 7s);
935 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 8s, 14s);
936 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 3s, 6s);
937 if (Is25ManRaid() && IsUndead)
938 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 22s, 27s);
939 }
940
941 void UpdateAI(uint32 diff) override
942 {
943 if (!UpdateVictim())
944 return;
945
946 Events.Update(diff);
947
949 return;
950
951 while (uint32 eventId = Events.ExecuteEvent())
952 {
953 switch (eventId)
954 {
956 if (Creature* target = FindFriendlyCreature())
957 DoCast(target, SPELL_FLASH_HEAL);
958 Events.ScheduleEvent(EVENT_ARNATH_FLASH_HEAL, 6s, 9s);
959 break;
961 {
962 std::list<Creature*> targets = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD);
963 if (!targets.empty())
965 Events.ScheduleEvent(EVENT_ARNATH_PW_SHIELD, 15s, 20s);
966 break;
967 }
970 Events.ScheduleEvent(EVENT_ARNATH_SMITE, 4s, 7s);
971 break;
973 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
975 Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, 28s, 37s);
976 break;
977 default:
978 break;
979 }
980
982 return;
983 }
984 }
985
986private:
988 {
989 Creature* target = nullptr;
990 Trinity::MostHPMissingInRange u_check(me, 60.0f, 0);
992 Cell::VisitGridObjects(me, searcher, 60.0f);
993 return target;
994 }
995};
996
998{
1000 {
1001 }
1002
1003 void Reset() override
1004 {
1005 Events.Reset();
1006 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 10s);
1007 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1008 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1009 if (IsUndead)
1010 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 25s, 30s);
1011 }
1012
1013 void UpdateAI(uint32 diff) override
1014 {
1015 if (!UpdateVictim())
1016 return;
1017
1018 Events.Update(diff);
1019
1021 return;
1022
1023 while (uint32 eventId = Events.ExecuteEvent())
1024 {
1025 switch (eventId)
1026 {
1029 Events.ScheduleEvent(EVENT_BRANDON_CRUSADER_STRIKE, 6s, 12s);
1030 break;
1032 if (HealthBelowPct(20))
1034 Events.ScheduleEvent(EVENT_BRANDON_DIVINE_SHIELD, 500ms);
1035 break;
1038 Events.ScheduleEvent(EVENT_BRANDON_JUDGEMENT_OF_COMMAND, 8s, 13s);
1039 break;
1041 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
1043 Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, 45s, 60s);
1044 break;
1045 default:
1046 break;
1047 }
1048
1050 return;
1051 }
1052 }
1053};
1054
1056{
1058 {
1059 }
1060
1061 void Reset() override
1062 {
1063 Events.Reset();
1064 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1065 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 8s, 14s);
1066 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 3s, 12s);
1067 if (IsUndead)
1068 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 12s, 17s);
1069 }
1070
1071 void UpdateAI(uint32 diff) override
1072 {
1073 if (!UpdateVictim())
1074 return;
1075
1076 Events.Update(diff);
1077
1079 return;
1080
1081 while (uint32 eventId = Events.ExecuteEvent())
1082 {
1083 switch (eventId)
1084 {
1087 Events.ScheduleEvent(EVENT_GRONDEL_CHARGE_CHECK, 500ms);
1088 break;
1091 Events.ScheduleEvent(EVENT_GRONDEL_MORTAL_STRIKE, 10s, 15s);
1092 break;
1095 Events.ScheduleEvent(EVENT_GRONDEL_SUNDER_ARMOR, 5s, 17s);
1096 break;
1098 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
1099 DoCast(target, SPELL_CONFLAGRATION);
1100 Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, 10s, 15s);
1101 break;
1102 default:
1103 break;
1104 }
1105
1107 return;
1108 }
1109 }
1110};
1111
1113{
1115 {
1116 }
1117
1118 void Reset() override
1119 {
1120 Events.Reset();
1121 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1122 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1123 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1124 }
1125
1126 void UpdateAI(uint32 diff) override
1127 {
1128 if (!UpdateVictim())
1129 return;
1130
1131 Events.Update(diff);
1132
1134 return;
1135
1136 while (uint32 eventId = Events.ExecuteEvent())
1137 {
1138 switch (eventId)
1139 {
1142 DoCast(target, SPELL_FEL_IRON_BOMB);
1143 Events.ScheduleEvent(EVENT_RUPERT_FEL_IRON_BOMB, 15s, 20s);
1144 break;
1147 DoCast(target, SPELL_MACHINE_GUN);
1148 Events.ScheduleEvent(EVENT_RUPERT_MACHINE_GUN, 25s, 30s);
1149 break;
1152 DoCast(target, SPELL_ROCKET_LAUNCH);
1153 Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, 10s, 15s);
1154 break;
1155 default:
1156 break;
1157 }
1158
1160 return;
1161 }
1162 }
1163};
1164
1166{
1168 {
1169 }
1170
1171 void Reset() override
1172 {
1173 _events.Reset();
1174 _OOCevents.Reset();
1176
1177 if (!me->IsAlive())
1178 return;
1179
1180 switch (me->GetEntry())
1181 {
1184 [[fallthrough]];
1187 break;
1189 if (Is25ManRaid())
1191 break;
1192 default:
1193 break;
1194 }
1195 }
1196
1197 void JustDied(Unit* /*killer*/) override
1198 {
1201 }
1202
1203 void JustSummoned(Creature* summon) override
1204 {
1205 if (summon->GetEntry() == NPC_YMIRJAR_WARHAWK)
1207
1208 _summons.Summon(summon);
1209
1210 if (me->IsEngaged())
1211 DoZoneInCombat(summon);
1212 }
1213
1214 void SummonedCreatureDespawn(Creature* summon) override
1215 {
1216 _summons.Despawn(summon);
1217 }
1218
1219 void JustEngagedWith(Unit* who) override
1220 {
1221 if (!who)
1222 return;
1223
1225
1226 switch (me->GetEntry())
1227 {
1232 break;
1236 break;
1239 break;
1245 break;
1251 break;
1252 default:
1253 break;
1254 }
1255 }
1256
1257 void UpdateAI(uint32 diff) override
1258 {
1259 if (!UpdateVictim())
1260 {
1261 _OOCevents.Update(diff);
1262
1264 return;
1265
1266 while (uint32 eventId = _OOCevents.ExecuteEvent())
1267 {
1268 switch (eventId)
1269 {
1272 _OOCevents.Repeat(40s, 60s);
1273 break;
1274 default:
1275 break;
1276 }
1277
1279 return;
1280 }
1281 return;
1282 }
1283
1284 _events.Update(diff);
1285
1287 return;
1288
1289 while (uint32 eventId = _events.ExecuteEvent())
1290 {
1291 switch (eventId)
1292 {
1295 _events.Repeat(10s, 20s);
1296 break;
1298 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true))
1299 DoCast(target, SPELL_TWISTED_WINDS);
1300 _events.Repeat(10s, 20s);
1301 break;
1304 _events.Repeat(2s, 4s);
1305 break;
1308 _events.Repeat(10s, 20s);
1309 break;
1312 _events.Repeat(6s, 12s);
1313 break;
1316 _events.Repeat(20s, 30s);
1317 break;
1319 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1320 DoCast(target, SPELL_ICE_TRAP);
1321 _events.Repeat(15s, 20s);
1322 break;
1324 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
1325 DoCast(target, SPELL_VOLLEY);
1326 _events.Repeat(10s, 20s);
1327 break;
1330 _events.Repeat(2s);
1331 break;
1334 _events.Repeat(5s, 8s);
1335 break;
1338 _events.Repeat(10s, 20s);
1339 break;
1341 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f, true))
1342 DoCast(target, SPELL_BANISH);
1343 _events.Repeat(10s, 20s);
1344 break;
1347 _events.DelayEvents(2s);
1348 _events.Repeat(90s);
1349 break;
1350 default:
1351 break;
1352 }
1353
1355 return;
1356 }
1357 }
1358
1359private:
1363};
1364
1366{
1368 {
1369 Initialize();
1370 }
1371
1373 {
1374 _vehicleCheckTimer = 500;
1375 }
1376
1377 void Reset() override
1378 {
1380 Initialize();
1381 }
1382
1383 void UpdateAI(uint32 diff) override
1384 {
1385 if (_vehicleCheckTimer <= diff)
1386 {
1387 _vehicleCheckTimer = 500;
1388 if (!me->GetVehicle())
1389 me->DespawnOrUnsummon(100ms);
1390 }
1391 else
1392 _vehicleCheckTimer -= diff;
1393 }
1394
1395private:
1397};
1398
1400{
1401public:
1402 bool operator()(WorldObject* object) const
1403 {
1404 if (Unit* unit = object->ToUnit())
1405 return unit->IsAlive();
1406 return true;
1407 }
1408};
1409
1410// 70053 - Revive Champion
1412{
1413 void RemoveAliveTarget(std::list<WorldObject*>& targets)
1414 {
1415 targets.remove_if(ICCSvalnaAliveCheck());
1417 }
1418
1419 void Land(SpellEffIndex /*effIndex*/)
1420 {
1421 Creature* caster = GetCaster()->ToCreature();
1422 if (!caster)
1423 return;
1424
1425 Position pos = caster->GetNearPosition(5.0f, 0.0f);
1426 //pos.m_positionZ = caster->GetBaseMap()->GetHeight(caster->GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), caster->GetPositionZ(), true, 50.0f);
1427 //pos.m_positionZ += 0.05f;
1428 caster->SetHomePosition(pos);
1430 }
1431
1432 void Register() override
1433 {
1436 }
1437};
1438
1439// 71462 - Remove Spear
1441{
1443 {
1444 PreventHitDefaultEffect(effIndex);
1445 if (Creature* target = GetHitCreature())
1446 {
1447 if (Unit* vehicle = target->GetVehicleBase())
1448 vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR);
1449 target->DespawnOrUnsummon(1ms);
1450 }
1451 }
1452
1453 void Register() override
1454 {
1456 }
1457};
1458
1460{
1461public:
1462 at_icc_start_frostwing_gauntlet() : AreaTriggerScript("at_icc_start_frostwing_gauntlet") { }
1463
1464 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
1465 {
1466 if (InstanceScript* instance = player->GetInstanceScript())
1467 if (Creature* crok = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CROK_SCOURGEBANE)))
1468 crok->AI()->DoAction(ACTION_START_GAUNTLET);
1469 return true;
1470 }
1471};
1472
1474{
1487}
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ DONE
@ MOTION_SLOT_DEFAULT
@ FOLLOW_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
std::set< ObjectGuid > GuidSet
Definition: ObjectGuid.h:393
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:98
#define PET_FOLLOW_DIST
Definition: PetDefines.h:97
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition: ScriptMgr.h:1368
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_UNIT_DEST_AREA_ENTRY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ SPELLVALUE_MAX_TARGETS
Definition: SpellDefines.h:230
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
EvadeReason
Definition: UnitAICommon.h:30
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
DamageEffectType
Definition: UnitDefines.h:131
@ JUST_RESPAWNED
Definition: Unit.h:250
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ VEHICLE_SPELL_RIDE_HARDCODED
ICCSisterSvalnaTexts
@ 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_ROCKET_LAUNCH
ICCSisterSvalnaActions
@ ACTION_RESET_EVENT
@ ACTION_CAPTAIN_DIES
@ ACTION_RESURRECT_CAPTAINS
@ ACTION_START_GAUNTLET
@ ACTION_KILL_CAPTAIN
void AddSC_boss_sister_svalna()
#define SPELL_FLASH_HEAL
#define SPELL_FEL_IRON_BOMB
static constexpr uint32 PATH_ESCORT_CROK_SCOURGEBANE
#define SPELL_SMITE
ICCSisterSvalnaMovePoints
@ POINT_SVALNA_LAND
ICCYmirjarFrostWingMisc
@ NPC_YMIRJAR_WARHAWK
ICCSisterSvalnaSpells
@ 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_BANISH
@ 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_VOLLEY
@ SPELL_MACHINE_GUN_UNDEAD
@ SPELL_WHIRLWIND
ICCSisterSvalnaTimedEventIds
@ 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
#define SPELL_POWER_WORD_SHIELD
#define SPELL_MACHINE_GUN
InstanceScript *const instance
void _JustReachedHome()
void JustEngagedWith(Unit *who) override
EventMap events
void _JustDied()
bool Execute(uint64, uint32) override
Creature const * _owner
CaptainSurviveTalk(Creature const *owner)
void DoZoneInCombat()
Definition: CreatureAI.h:161
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:299
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
void setDeathState(DeathState s) override
Definition: Creature.cpp:2197
uint32 GetOriginalEntry() const
Definition: Creature.h:403
bool IsEngaged() const override
Definition: Creature.cpp:3601
void SetReactState(ReactStates st)
Definition: Creature.h:160
void SetRespawnDelay(uint32 delay)
Definition: Creature.h:338
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition: Creature.cpp:577
CreatureData const * GetCreatureData() const
Definition: Creature.h:251
uint32 GetRespawnDelay() const
Definition: Creature.h:337
void SetImmuneToNPC(bool apply) override
Definition: Creature.h:173
uint32 GetCorpseDelay() const
Definition: Creature.h:110
void SetImmuneToAll(bool apply) override
Definition: Creature.h:167
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition: Creature.h:104
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void DelayEvents(Milliseconds delay)
Definition: EventMap.cpp:96
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
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:405
MovementGeneratorType GetCurrentMovementGeneratorType() const
void MoveLand(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
uint32 const Id
Definition: SpellInfo.h:325
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
virtual void DoAction(int32)
Definition: UnitAI.h:72
virtual void Reset()
Definition: UnitAI.h:63
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
Vehicle * GetVehicle() const
Definition: Unit.h:1713
int64 ModifyHealth(int64 val)
Definition: Unit.cpp:8182
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
Unit * GetVehicleBase() const
Definition: Unit.cpp:11480
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool SetHover(bool enable, bool updateAnimTier=true)
Definition: Unit.cpp:12938
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:11618
bool IsAlive() const
Definition: Unit.h:1164
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:12392
uint64 GetHealth() const
Definition: Unit.h:776
uint64 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:785
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition: Unit.cpp:10591
bool isDead() const
Definition: Unit.h:1166
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
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:2025
void setActive(bool isActiveObject)
Definition: Object.cpp:922
Position GetNearPosition(float dist, float angle)
Definition: Object.cpp:3409
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
void SetFarVisible(bool on)
Definition: Object.cpp:973
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1142
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) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
void RandomResize(C &container, std::size_t requestedSize)
Definition: Containers.h:67
@ NPC_YMIRJAR_DEATHBRINGER
Definition: pit_of_saron.h:93
CastSpellExtraArgs & AddSpellBP0(int32 val)
Definition: SpellDefines.h:475
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:179
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:191
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:77
float GetAbsoluteAngle(float x, float y) const
Definition: Position.h:125
constexpr float GetOrientation() const
Definition: Position.h:79
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
InstanceScript * _instance
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