TrinityCore
boss_mimiron.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 "ScriptMgr.h"
19#include "Containers.h"
20#include "GameObject.h"
21#include "GameObjectAI.h"
22#include "GridNotifiers.h"
23#include "InstanceScript.h"
24#include "Map.h"
25#include "MotionMaster.h"
26#include "ObjectAccessor.h"
27#include "ScriptedCreature.h"
28#include "SpellAuraEffects.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31#include "ulduar.h"
32#include "Vehicle.h"
33
35{
50 SAY_BERSERK = 14
51};
52
54{
68};
69
71{
72 // Mimiron
73 SPELL_WELD = 63339, // Idle aura.
74 SPELL_SEAT_1 = 52391, // Cast on all vehicles, Cycled on MKII
75 SPELL_SEAT_2 = 63313, // Cast on MKII and VX-001, Cycled on MKII
76 SPELL_SEAT_3 = 63314, // Cast on MKII, Cycled on MKII
77 SPELL_SEAT_5 = 63316, // Cast on MKII and VX-001, Cycled on MKII
78 SPELL_SEAT_6 = 63344, // Cast on MKII
79 SPELL_SEAT_7 = 63345, // Cast on MKII
81 SPELL_DESPAWN_ASSAULT_BOTS = 64463, // only despawns assault bots... no equivalent spell for the other adds...
85
86 // Leviathan MK II
94 SPELL_SHOCK_BLAST_AURA = 63632, // Deprecated? It is never cast.
95
96 // VX-001
104
105 // Aerial Command Unit
109
110 // Proximity Mines
111 SPELL_PROXIMITY_MINES = 63027, // Cast by Leviathan MK II
117
118 // Rapid Burst
121 SPELL_RAPID_BURST = 63382, // Cast by VX-001
122 SPELL_RAPID_BURST_TARGET_ME = 64841, // Cast by Burst Target
123 SPELL_SUMMON_BURST_TARGET = 64840, // Cast by VX-001
124
125 // Rocket Strike
127 SPELL_SCRIPT_EFFECT_ROCKET_STRIKE = 63681, // Cast by Rocket (Mimiron Visual)
128 SPELL_ROCKET_STRIKE = 64064, // Added in creature_template_addon
129 SPELL_ROCKET_STRIKE_SINGLE = 64402, // Cast by VX-001
130 SPELL_ROCKET_STRIKE_BOTH = 65034, // Cast by VX-001
131
132 // Flames
133 SPELL_FLAMES_PERIODIC_TRIGGER = 64561, // Added in creature_template_addon
139
140 // Frost Bomb
141 SPELL_SCRIPT_EFFECT_FROST_BOMB = 64623, // Cast by VX-001
142 SPELL_FROST_BOMB_LINKED = 64624, // Added in creature_template_addon
144 SPELL_SUMMON_FROST_BOMB = 64627, // Cast by VX-001
147
148 // Bots
151 SPELL_SUMMON_FIRE_BOT_TRIGGER = 64620, // Cast by Areal Command Unit
152 SPELL_DEAFENING_SIREN = 64616, // Added in creature_template_addon
153 SPELL_FIRE_SEARCH_AURA = 64617, // Added in creature_template_addon
156
158 SPELL_SUMMON_JUNK_BOT_TRIGGER = 63820, // Cast by Areal Command Unit
160
161 SPELL_SUMMON_ASSAULT_BOT_TRIGGER = 64425, // Cast by Areal Command Unit
165
166 SPELL_SUMMON_BOMB_BOT = 63811, // Cast by Areal Command Unit
167 SPELL_BOMB_BOT_AURA = 63767, // Added in creature_template_addon
168
169 // Miscellaneous
173 SPELL_ELEVATOR_KNOCKBACK = 65096, // Cast by worldtrigger.
175 SPELL_EMERGENCY_MODE = 64582, // mkii, vx001, aerial, assault, junk
176 SPELL_EMERGENCY_MODE_TURRET = 65101, // Cast by Leviathan MK II, only hits Leviathan MK II turret
182 SPELL_FREEZE_ANIM_STUN = 63354, // used to prevent mkii from doing stuff?..
183 SPELL_FREEZE_ANIM = 16245 // Idle aura. Freezes animation.
185
187{
196
198{
199 // Leviathan MK II
208
209 // VX-001
217
218 // Aerial Command Unit
223
224 // Mimiron
229
239
246
254
258
259 // Computer
271
272 // Misc
282
284{
287
291
297
300 DO_ASSEMBLED_COMBAT, // All 3 parts use this action, its done on purpose.
301
306
309
311{
317
319{
328
330{
335
337{
342};
343
345{
346 { 0.0f, 0.0f, 0.0f},
347 { 2792.070f, 2596.320f, 364.3136f }, // WP_MKII_P1_IDLE
348 { 2765.945f, 2571.095f, 364.0636f }, // WP_MKII_P4_POS_1
349 { 2768.195f, 2573.095f, 364.0636f }, // WP_MKII_P4_POS_2
350 { 2763.820f, 2568.870f, 364.3136f }, // WP_MKII_P4_POS_3
351 { 2761.215f, 2568.875f, 364.0636f }, // WP_MKII_P4_POS_4
352 { 2744.610f, 2569.380f, 364.3136f }, // WP_MKII_P4_POS_5
353 { 2744.62f, 2569.41f, 382.0f, 3.054326f } // WP_AERIAL_P4_POS
354};
355
356Position const VX001SummonPos = { 2744.431f, 2569.385f, 364.3968f, 3.141593f };
357Position const ACUSummonPos = { 2744.650f, 2569.460f, 380.0000f, 3.141593f };
358
359static bool IsEncounterFinished(Unit* who)
360{
361 InstanceScript* instance = who->GetInstanceScript();
362
366 if (!mkii || !vx001 || !aerial)
367 return false;
368
369 if (mkii->GetStandState() == UNIT_STAND_STATE_DEAD &&
372 {
373 Unit::Kill(who, mkii);
374 Unit::Kill(who, vx001);
375 Unit::Kill(who, aerial);
376 mkii->DespawnOrUnsummon(120s);
377 vx001->DespawnOrUnsummon(120s);
378 aerial->DespawnOrUnsummon(120s);
379 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
380 mimiron->AI()->JustDied(who);
381 return true;
382 }
383 return false;
384}
385
387{
388 public:
389 boss_mimiron() : CreatureScript("boss_mimiron") { }
390
391 struct boss_mimironAI : public BossAI
392 {
394 {
396 _fireFighter = false;
397 }
398
399 void DoAction(int32 action) override
400 {
401 switch (action)
402 {
405 break;
408 break;
412 mkii->GetMotionMaster()->MovePoint(WP_MKII_P4_POS_1, VehicleRelocation[WP_MKII_P4_POS_1]);
413 break;
416 break;
418 _fireFighter = true;
420 break;
421 default:
422 break;
423 }
424 }
425
426 void JustEngagedWith(Unit* who) override
427 {
428 if (!me->GetVehicleBase())
429 return;
430
435
437 button->SetFlag(GO_FLAG_NOT_SELECTABLE);
438
439 if (_fireFighter)
442 }
443
444 void JustDied(Unit* /*killer*/) override
445 {
447 events.Reset();
448 me->CombatStop(true);
449 me->SetDisableGravity(false);
452 me->ExitVehicle();
453 // ExitVehicle() offset position is not implemented, so we make up for that with MoveJump()...
454 me->GetMotionMaster()->MoveJump(me->GetPositionX() + (10.f * std::cos(me->GetOrientation())), me->GetPositionY() + (10.f * std::sin(me->GetOrientation())), me->GetPositionZ(), me->GetOrientation(), 10.f, 5.f);
456 }
457
458 void Reset() override
459 {
460 if (instance->GetBossState(DATA_MIMIRON) == DONE) // Mimiron will attempt to reset because he is not dead and will be set to friendly before despawning.
461 return;
462
464 aerial->AI()->EnterEvadeMode();
465
466 _Reset();
468
470 elevator->SetGoState(GO_STATE_ACTIVE);
471
472 if (_fireFighter)
473 if (Creature* computer = instance->GetCreature(DATA_COMPUTER))
474 computer->AI()->DoAction(DO_DEACTIVATE_COMPUTER);
475
477 {
478 button->SetGoState(GO_STATE_READY);
479 button->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
480 }
481
482 _fireFighter = false;
484
486 DoCast(mkii, SPELL_SEAT_3);
487 }
488
489 void UpdateAI(uint32 diff) override
490 {
492 return;
493
494 events.Update(diff);
495
497 return;
498
499 while (uint32 eventId = events.ExecuteEvent())
500 {
501 switch (eventId)
502 {
506 .SetOriginalCaster(me->GetGUID())
509 break;
510 case EVENT_INTRO_1:
513 break;
514 case EVENT_INTRO_2:
515 if (Unit* mkii = me->GetVehicleBase())
516 {
517 DoCast(mkii, SPELL_SEAT_7);
518 mkii->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM);
519 mkii->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
520 mkii->SetUninteractible(false);
521 }
523 break;
524 case EVENT_INTRO_3:
525 if (Creature* mkii = me->GetVehicleCreatureBase())
526 mkii->AI()->DoAction(_fireFighter ? DO_HARDMODE_MKII : DO_START_MKII);
527 break;
529 if (Unit* mkii = me->GetVehicleBase())
530 mkii->SetFacingTo(3.686f); // fix magic number
532 break;
534 if (Unit* mkii = me->GetVehicleBase())
535 DoCast(mkii, SPELL_SEAT_6);
537 break;
541 break;
544 elevator->SetGoState(GO_STATE_READY);
546 worldtrigger->CastSpell(worldtrigger, SPELL_ELEVATOR_KNOCKBACK);
548 break;
551 elevator->SetGoState(GO_STATE_DESTROYED);
553 vx001->CastSpell(vx001, SPELL_FREEZE_ANIM);
555 break;
558 DoCast(vx001, SPELL_SEAT_1);
560 break;
564 break;
566 if (Unit* vx001 = me->GetVehicleBase())
567 DoCast(vx001, SPELL_SEAT_2);
569 break;
571 if (Creature* vx001 = me->GetVehicleCreatureBase())
572 vx001->AI()->DoAction(_fireFighter ? DO_HARDMODE_VX001 : DO_START_VX001);
573 break;
575 if (Unit* mkii = me->GetVehicleBase())
576 DoCast(mkii, SPELL_SEAT_5);
578 break;
582 break;
586 break;
589 me->CastSpell(aerial, SPELL_SEAT_1);
591 break;
595 break;
597 if (Creature* acu = me->GetVehicleCreatureBase())
598 acu->AI()->DoAction(_fireFighter? DO_HARDMODE_AERIAL : DO_START_AERIAL);
599 break;
602 mkii->SetFacingTo(float(M_PI));
604 break;
607 {
609 {
610 vx001->RemoveAurasDueToSpell(SPELL_TORSO_DISABLED);
611 vx001->CastSpell(mkii, SPELL_MOUNT_MKII);
612 }
613 }
615 break;
618 mkii->GetMotionMaster()->MovePoint(WP_MKII_P4_POS_4, VehicleRelocation[WP_MKII_P4_POS_4]);
620 break;
623 {
625 {
626 aerial->CastSpell(vx001, SPELL_MOUNT_VX_001);
627 aerial->CastSpell(aerial, SPELL_HALF_HEAL);
628 }
629 }
631 break;
635 break;
638 DoCast(vx001, SPELL_SEAT_2);
640 break;
642 for (uint8 data = DATA_LEVIATHAN_MK_II; data <= DATA_AERIAL_COMMAND_UNIT; ++data)
643 if (Creature* mimironVehicle = ObjectAccessor::GetCreature(*me, instance->GetGuidData(data)))
644 mimironVehicle->AI()->DoAction(DO_ASSEMBLED_COMBAT);
645 break;
646 case EVENT_OUTTRO_1:
651 break;
652 case EVENT_OUTTRO_2:
654 if (_fireFighter)
655 {
656 if (Creature* computer = instance->GetCreature(DATA_COMPUTER))
657 computer->AI()->DoAction(DO_DEACTIVATE_COMPUTER);
658 me->SummonGameObject(RAID_MODE(GO_CACHE_OF_INNOVATION_FIREFIGHTER, GO_CACHE_OF_INNOVATION_FIREFIGHTER_HERO), 2744.040f, 2569.352f, 364.3135f, 3.124123f, QuaternionData(0.f, 0.f, 0.9999619f, 0.008734641f), 420_days);
659 }
660 else
661 me->SummonGameObject(RAID_MODE(GO_CACHE_OF_INNOVATION, GO_CACHE_OF_INNOVATION_HERO), 2744.040f, 2569.352f, 364.3135f, 3.124123f, QuaternionData(0.f, 0.f, 0.9999619f, 0.008734641f), 420_days);
663 break;
664 case EVENT_OUTTRO_3:
666 me->SetUninteractible(true);
667 me->DespawnOrUnsummon(1s); // sniffs say 6 sec after, but it doesnt matter.
668 break;
669 default:
670 break;
671 }
672
674 return;
675 }
676 }
677
678 private:
680 };
681
682 CreatureAI* GetAI(Creature* creature) const override
683 {
684 return GetUlduarAI<boss_mimironAI>(creature);
685 }
686};
687
689{
690 public:
691 boss_leviathan_mk_ii() : CreatureScript("boss_leviathan_mk_ii") { }
692
694 {
696 {
697 _fireFighter = false;
698 _setupMine = true;
699 _setupBomb = true;
700 _setupRocket = true;
701 }
702
703 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
704 {
705 if (damage >= me->GetHealth())
706 {
707 damage = me->GetHealth() - 1; // Let creature fall to 1 hp, but do not let it die or damage itself with SetHealth().
710 me->AttackStop();
713
715 {
716 me->CastStop();
718 turret->KillSelf();
719
720 me->SetSpeedRate(MOVE_RUN, 1.5f);
722 }
724 {
726
727 Unit* ref = who ? who : me;
728 if (IsEncounterFinished(ref))
729 return;
730
731 me->CastStop();
733 }
734 events.Reset();
735 }
736 }
737
738 void DoAction(int32 action) override
739 {
740 switch (action)
741 {
742 case DO_HARDMODE_MKII:
743 _fireFighter = true;
747 [[fallthrough]];
748 case DO_START_MKII:
751
756 break;
760 me->SetUninteractible(false);
762
766 break;
767 default:
768 break;
769 }
770 }
771
772 uint32 GetData(uint32 type) const override
773 {
774 switch (type)
775 {
776 case DATA_SETUP_MINE:
777 return _setupMine;
778 case DATA_SETUP_BOMB:
779 return _setupBomb;
781 return _setupRocket;
782 case DATA_FIREFIGHTER:
783 return _fireFighter;
784 default:
785 return 0;
786 }
787 }
788
789 void JustSummoned(Creature* summon) override
790 {
791 summons.Summon(summon);
792 }
793
794 void KilledUnit(Unit* victim) override
795 {
796 if (victim->GetTypeId() == TYPEID_PLAYER)
797 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
799 }
800
801 void MovementInform(uint32 type, uint32 point) override
802 {
803 if (type != POINT_MOTION_TYPE)
804 return;
805
806 switch (point)
807 {
808 case WP_MKII_P1_IDLE:
809 me->SetUninteractible(true);
811
812 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
813 mimiron->AI()->DoAction(DO_ACTIVATE_VX001);
814 break;
815 case WP_MKII_P4_POS_1:
817 break;
818 case WP_MKII_P4_POS_2:
820 break;
821 case WP_MKII_P4_POS_3:
822 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
823 mimiron->AI()->DoAction(DO_ACTIVATE_V0L7R0N_2);
824 break;
825 case WP_MKII_P4_POS_4:
827 break;
828 default:
829 break;
830 }
831 }
832
833 void Reset() override
834 {
835 _Reset();
837 me->SetUninteractible(true);
839 _fireFighter = false;
840 _setupMine = true;
841 _setupBomb = true;
842 _setupRocket = true;
844 }
845
846 void SetData(uint32 id, uint32 data) override
847 {
848 switch (id)
849 {
850 case DATA_SETUP_MINE:
851 _setupMine = data != 0;
852 break;
853 case DATA_SETUP_BOMB:
854 _setupBomb = data != 0;
855 break;
857 _setupRocket = data != 0;
858 break;
859 default:
860 break;
861 }
862 }
863
864 void UpdateAI(uint32 diff) override
865 {
866 if (!UpdateVictim())
867 return;
868
869 events.Update(diff);
870
872 return;
873
874 while (uint32 eventId = events.ExecuteEvent())
875 {
876 switch (eventId)
877 {
881 break;
885
887 events.RescheduleEvent(EVENT_NAPALM_SHELL, 9s, 0, PHASE_LEVIATHAN_MK_II); // The actual spell is cast by the turret, we should not let it interrupt itself.
888 break;
892 break;
896 break;
900
902 events.RescheduleEvent(EVENT_PLASMA_BLAST, 2s, 0, PHASE_LEVIATHAN_MK_II); // The actual spell is cast by the turret, we should not let it interrupt itself.
903 break;
906 break;
909 break;
912 break;
913 default:
914 break;
915 }
916
918 return;
919 }
920 }
921
922 private:
927 };
928
929 CreatureAI* GetAI(Creature* creature) const override
930 {
931 return GetUlduarAI<boss_leviathan_mk_iiAI>(creature);
932 }
933};
934
936{
937 public:
938 boss_vx_001() : CreatureScript("boss_vx_001") { }
939
940 struct boss_vx_001AI : public BossAI
941 {
943 {
944 me->SetDisableGravity(true); // This is the unfold visual state of VX-001, it has to be set on create as it requires an objectupdate if set later.
945 me->SetEmoteState(EMOTE_STATE_SPECIAL_UNARMED); // This is a hack to force the yet to be unfolded visual state.
947 _fireFighter = false;
949 }
950
951 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
952 {
953 if (damage >= me->GetHealth())
954 {
955 damage = me->GetHealth() - 1; // Let creature fall to 1 hp, but do not let it die or damage itself with SetHealth().
956 me->AttackStop();
959
961 {
962 me->CastStop();
963 me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); // | UNIT_FLAG_UNINTERACTIBLE);
964 DoCast(me, SPELL_HALF_HEAL); // has no effect, wat
966 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
967 mimiron->AI()->DoAction(DO_ACTIVATE_AERIAL);
968 }
970 {
973
974 Unit* ref = who ? who : me;
975 if (IsEncounterFinished(ref))
976 return;
977
978 me->CastStop();
980 }
981 events.Reset();
982 }
983 }
984
985 void DoAction(int32 action) override
986 {
987 switch (action)
988 {
990 _fireFighter = true;
994 [[fallthrough]];
995 case DO_START_VX001:
997 me->SetImmuneToPC(false);
998 me->SetUninteractible(false);
1000 me->SetEmoteState(EMOTE_ONESHOT_NONE); // Remove emotestate.
1001 //me->SetHover(true); // Blizzard handles hover animation like this it seems.
1003
1008 break;
1012 me->SetUninteractible(false);
1013
1018 if (_fireFighter)
1020 break;
1021 default:
1022 break;
1023 }
1024 }
1025
1026 void EnterEvadeMode(EvadeReason /*why*/) override
1027 {
1029 }
1030
1031 void JustSummoned(Creature* summon) override
1032 {
1033 summons.Summon(summon);
1034 if (summon->GetEntry() == NPC_BURST_TARGET)
1036 }
1037
1038 void KilledUnit(Unit* victim) override
1039 {
1040 if (victim->GetTypeId() == TYPEID_PLAYER)
1041 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
1043 }
1044
1045 void SpellHit(WorldObject* caster, SpellInfo const* /*spellInfo*/) override
1046 {
1048 DoCast(caster->ToUnit(), SPELL_RAPID_BURST);
1049 }
1050
1051 void UpdateAI(uint32 diff) override
1052 {
1053 if (!UpdateVictim())
1054 return;
1055
1056 events.Update(diff);
1057
1058 // Handle rotation during SPELL_SPINNING_UP, SPELL_P3WX2_LASER_BARRAGE, SPELL_RAPID_BURST, and SPELL_HAND_PULSE_LEFT/RIGHT
1060 {
1061 auto const& channelObjects = me->m_unitData->ChannelObjects;
1062 if (Unit* channelTarget = (channelObjects.size() == 1 ? ObjectAccessor::GetUnit(*me, *channelObjects.begin()) : nullptr))
1063 me->SetFacingToObject(channelTarget);
1064 return;
1065 }
1066
1067 while (uint32 eventId = events.ExecuteEvent())
1068 {
1069 switch (eventId)
1070 {
1071 case EVENT_RAPID_BURST:
1072 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 120, true))
1075 break;
1080 break;
1081 case EVENT_RELOAD:
1082 for (int8 seat = ROCKET_SEAT_LEFT; seat <= ROCKET_SEAT_RIGHT; ++seat)
1083 if (Unit* rocket = me->GetVehicleKit()->GetPassenger(seat))
1084 rocket->SetDisplayId(rocket->GetNativeDisplayId());
1085 break;
1086 case EVENT_HAND_PULSE:
1087 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 120, true))
1090 break;
1091 case EVENT_FROST_BOMB:
1094 break;
1095 case EVENT_SPINNING_UP:
1097 events.DelayEvents(14s);
1099 break;
1103 break;
1104 default:
1105 break;
1106 }
1107
1109 return;
1110 }
1111 }
1112
1113 private:
1115 };
1116
1117 CreatureAI* GetAI(Creature* creature) const override
1118 {
1119 return GetUlduarAI<boss_vx_001AI>(creature);
1120 }
1121};
1122
1124{
1125 public:
1126 boss_aerial_command_unit() : CreatureScript("boss_aerial_command_unit") { }
1127
1129 {
1131 {
1133 me->SetDisableGravity(true);
1134 fireFigther = false;
1135 }
1136
1137 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1138 {
1139 if (damage >= me->GetHealth())
1140 {
1141 damage = me->GetHealth() - 1; // Let creature fall to 1 hp, but do not let it die or damage itself with SetHealth().
1143 me->AttackStop();
1144 me->SetDisableGravity(true);
1146
1148
1150 {
1151 me->GetMotionMaster()->Clear();
1153 }
1154 else if (events.IsInPhase(PHASE_VOL7RON))
1155 {
1157
1158 Unit* ref = who ? who : me;
1159 if (IsEncounterFinished(ref))
1160 return;
1161
1162 me->CastStop();
1164 }
1165 events.Reset();
1166 }
1167 }
1168
1169 void DoAction(int32 action) override
1170 {
1171 switch (action)
1172 {
1173 case DO_HARDMODE_AERIAL:
1174 fireFigther = true;
1177 [[fallthrough]];
1178 case DO_START_AERIAL:
1179 me->SetDisableGravity(false);
1180 me->SetHover(true);
1182 me->SetImmuneToPC(false);
1183 me->SetUninteractible(false);
1185
1190 break;
1191 case DO_DISABLE_AERIAL:
1192 me->CastStop();
1194 me->AttackStop();
1196 events.DelayEvents(23s);
1197 break;
1198 case DO_ENABLE_AERIAL:
1200 break;
1203 me->SetUninteractible(false);
1207 break;
1208 default:
1209 break;
1210 }
1211 }
1212
1213 void EnterEvadeMode(EvadeReason /*why*/) override
1214 {
1216 }
1217
1218 void JustSummoned(Creature* summon) override
1219 {
1220 if (fireFigther && (summon->GetEntry() == NPC_ASSAULT_BOT || summon->GetEntry() == NPC_JUNK_BOT))
1221 summon->CastSpell(summon, SPELL_EMERGENCY_MODE);
1222 BossAI::JustSummoned(summon);
1223 }
1224
1225 void KilledUnit(Unit* victim) override
1226 {
1227 if (victim->GetTypeId() == TYPEID_PLAYER)
1228 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
1230 }
1231
1232 void MovementInform(uint32 type, uint32 point) override
1233 {
1234 if (type == POINT_MOTION_TYPE && point == WP_AERIAL_P4_POS)
1235 {
1237 me->SetUninteractible(true);
1239
1240 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
1241 mimiron->AI()->DoAction(DO_ACTIVATE_V0L7R0N_1);
1242 }
1243 }
1244
1245 void UpdateAI(uint32 diff) override
1246 {
1247 if (!UpdateVictim())
1248 return;
1249
1250 events.Update(diff);
1251
1253 return;
1254
1255 while (uint32 eventId = events.ExecuteEvent())
1256 {
1257 switch (eventId)
1258 {
1262 break;
1266 break;
1270 break;
1274 break;
1275 default:
1276 break;
1277 }
1278
1280 return;
1281 }
1283 }
1284
1285 private:
1287 };
1288
1289 CreatureAI* GetAI(Creature* creature) const override
1290 {
1291 return GetUlduarAI<boss_aerial_command_unitAI>(creature);
1292 }
1293};
1294
1296{
1297 public:
1298 npc_mimiron_assault_bot() : CreatureScript("npc_mimiron_assault_bot") { }
1299
1301 {
1303 {
1304 }
1305
1306 void JustEngagedWith(Unit* /*who*/) override
1307 {
1309 }
1310
1311 void UpdateAI(uint32 diff) override
1312 {
1313 if (!UpdateVictim())
1314 return;
1315
1316 events.Update(diff);
1317
1319 {
1320 if (Unit* newTarget = SelectTarget(SelectTargetMethod::MinDistance, 0, 30.0f, true))
1321 {
1323 AttackStart(newTarget);
1324 }
1325 }
1326
1327 while (uint32 eventId = events.ExecuteEvent())
1328 {
1329 switch (eventId)
1330 {
1334 break;
1335 default:
1336 break;
1337 }
1338 }
1339 }
1340
1341 private:
1343 };
1344
1345 CreatureAI* GetAI(Creature* creature) const override
1346 {
1347 return GetUlduarAI<npc_mimiron_assault_botAI>(creature);
1348 }
1349};
1350
1352{
1353 public:
1354 npc_mimiron_emergency_fire_bot() : CreatureScript("npc_mimiron_emergency_fire_bot") { }
1355
1357 {
1359 {
1361 isWaterSprayReady = true;
1362 moveNew = true;
1363 }
1364
1365 uint32 GetData(uint32 id) const override
1366 {
1367 if (id == DATA_WATERSPRAY)
1368 return isWaterSprayReady;
1369 if (id == DATA_MOVE_NEW)
1370 return moveNew;
1371 return 0;
1372 }
1373
1374 void SetData(uint32 id, uint32 data) override
1375 {
1376 if (id == DATA_WATERSPRAY)
1377 isWaterSprayReady = false;
1378 else if (id == DATA_MOVE_NEW)
1379 moveNew = data ? true : false;
1380 }
1381
1382 void Reset() override
1383 {
1385 isWaterSprayReady = true;
1386 moveNew = true;
1387 }
1388
1389 void UpdateAI(uint32 diff) override
1390 {
1391 if (!isWaterSprayReady)
1392 events.Update(diff);
1393
1394 while (uint32 eventId = events.ExecuteEvent())
1395 {
1396 switch (eventId)
1397 {
1398 case EVENT_WATER_SPRAY:
1399 isWaterSprayReady = true;
1401 break;
1402 default:
1403 break;
1404 }
1405 }
1406 }
1407
1408 private:
1412 };
1413
1414 CreatureAI* GetAI(Creature* creature) const override
1415 {
1416 return GetUlduarAI<npc_mimiron_emergency_fire_botAI>(creature);
1417 }
1418};
1419
1421{
1422 public:
1423 npc_mimiron_computer() : CreatureScript("npc_mimiron_computer") { }
1424
1426 {
1428 {
1431 }
1432
1433 void DoAction(int32 action) override
1434 {
1435 switch (action)
1436 {
1440 break;
1445 events.Reset();
1446 break;
1447 default:
1448 break;
1449 }
1450 }
1451
1452 void UpdateAI(uint32 diff) override
1453 {
1454 events.Update(diff);
1455
1456 while (uint32 eventId = events.ExecuteEvent())
1457 {
1458 switch (eventId)
1459 {
1462 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
1463 mimiron->AI()->DoAction(DO_ACTIVATE_HARD_MODE);
1465 break;
1469 break;
1473 break;
1477 break;
1481 break;
1485 break;
1489 break;
1493 break;
1497 break;
1501 break;
1504 if (Creature* mimiron = instance->GetCreature(DATA_MIMIRON))
1505 mimiron->AI()->DoAction(DO_ACTIVATE_SELF_DESTRUCT);
1508 break;
1509 default:
1510 break;
1511 }
1512 }
1513 }
1514
1515 private:
1518 };
1519
1520 CreatureAI* GetAI(Creature* creature) const override
1521 {
1522 return GetUlduarAI<npc_mimiron_computerAI>(creature);
1523 }
1524};
1525
1527{
1528 public:
1529 npc_mimiron_flames() : CreatureScript("npc_mimiron_flames") { }
1530
1532 {
1534 {
1536 }
1537
1538 void Reset() override // Reset is possibly more suitable for this case.
1539 {
1541 }
1542
1543 void UpdateAI(uint32 diff) override
1544 {
1547
1548 events.Update(diff);
1549
1550 while (uint32 eventId = events.ExecuteEvent())
1551 {
1552 switch (eventId)
1553 {
1556 break;
1557 default:
1558 break;
1559 }
1560 }
1561 }
1562
1563 private:
1566 };
1567
1568 CreatureAI* GetAI(Creature* creature) const override
1569 {
1570 return GetUlduarAI<npc_mimiron_flamesAI>(creature);
1571 }
1572};
1573
1575{
1576 public:
1577 npc_mimiron_frost_bomb() : CreatureScript("npc_mimiron_frost_bomb") { }
1578
1580 {
1582 {
1583 }
1584
1585 void Reset() override
1586 {
1588 }
1589
1590 void UpdateAI(uint32 diff) override
1591 {
1592 events.Update(diff);
1593
1594 while (uint32 eventId = events.ExecuteEvent())
1595 {
1596 switch (eventId)
1597 {
1601 break;
1604 me->DespawnOrUnsummon(3s);
1605 break;
1606 default:
1607 break;
1608 }
1609 }
1610 }
1611
1612 private:
1614 };
1615
1616 CreatureAI* GetAI(Creature* creature) const override
1617 {
1618 return GetUlduarAI<npc_mimiron_frost_bombAI>(creature);
1619 }
1620};
1621
1623{
1624 public:
1625 npc_mimiron_proximity_mine() : CreatureScript("npc_mimiron_proximity_mine") { }
1626
1628 {
1630 {
1631 }
1632
1633 void Reset() override
1634 {
1636 }
1637
1638 void UpdateAI(uint32 diff) override
1639 {
1640 events.Update(diff);
1641
1642 while (uint32 eventId = events.ExecuteEvent())
1643 {
1644 switch (eventId)
1645 {
1649 break;
1653 me->DespawnOrUnsummon(1s);
1654 break;
1655 default:
1656 break;
1657 }
1658 }
1659 }
1660
1661 private:
1663 };
1664
1665 CreatureAI* GetAI(Creature* creature) const override
1666 {
1667 return GetUlduarAI<npc_mimiron_proximity_mineAI>(creature);
1668 }
1669};
1670
1672{
1674
1675 void Reset() override
1676 {
1679 }
1680};
1681
1683{
1684 public:
1685 go_mimiron_hardmode_button() : GameObjectScript("go_mimiron_hardmode_button") { }
1686
1688 {
1689 go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
1690
1692
1693 bool OnGossipHello(Player* /*player*/) override
1694 {
1696 return true;
1697
1698 if (Creature* computer = instance->GetCreature(DATA_COMPUTER))
1699 computer->AI()->DoAction(DO_ACTIVATE_COMPUTER);
1700
1703 return true;
1704 }
1705 };
1706
1707 GameObjectAI* GetAI(GameObject* go) const override
1708 {
1709 return GetUlduarAI<go_mimiron_hardmode_buttonAI>(go);
1710 }
1711};
1712
1713// 63801 - Bomb Bot
1715{
1716 public:
1717 spell_mimiron_bomb_bot() : SpellScriptLoader("spell_mimiron_bomb_bot") { }
1718
1720 {
1721 void HandleScript(SpellEffIndex /*effIndex*/)
1722 {
1723 if (GetHitPlayer())
1724 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
1725 if (Creature* mkii = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_LEVIATHAN_MK_II)))
1726 mkii->AI()->SetData(DATA_SETUP_BOMB, 0);
1727 }
1728
1729 void HandleDespawn(SpellEffIndex /*effIndex*/)
1730 {
1731 if (Creature* target = GetHitCreature())
1732 {
1733 target->SetUnitFlag(UNIT_FLAG_PACIFIED);
1734 target->SetUninteractible(true);
1735 target->DespawnOrUnsummon(1s);
1736 }
1737 }
1738
1739 void Register() override
1740 {
1743 }
1744 };
1745
1746 SpellScript* GetSpellScript() const override
1747 {
1749 }
1750};
1751
1752// 65192 - Flame Suppressant, 65224 - Clear Fires, 65354 - Clear Fires, 64619 - Water Spray
1754{
1755 public:
1756 spell_mimiron_clear_fires() : SpellScriptLoader("spell_mimiron_clear_fires") { }
1757
1759 {
1760 void HandleDummy(SpellEffIndex /*effIndex*/)
1761 {
1762 if (GetHitCreature())
1764 }
1765
1766 void Register() override
1767 {
1769 }
1770 };
1771
1772 SpellScript* GetSpellScript() const override
1773 {
1775 }
1776};
1777
1778// 64463 - Despawn Assault Bots
1780{
1781 public:
1782 spell_mimiron_despawn_assault_bots() : SpellScriptLoader("spell_mimiron_despawn_assault_bots") { }
1783
1785 {
1786 void HandleScript(SpellEffIndex /*effIndex*/)
1787 {
1788 if (GetHitCreature())
1790 }
1791
1792 void Register() override
1793 {
1795 }
1796 };
1797
1798 SpellScript* GetSpellScript() const override
1799 {
1801 }
1802};
1803
1804// 64618 - Fire Search
1806{
1807 public:
1808 spell_mimiron_fire_search() : SpellScriptLoader("spell_mimiron_fire_search") { }
1809
1811 {
1812 public:
1814 {
1815 _noTarget = false;
1816 }
1817
1818 private:
1819 bool Validate(SpellInfo const* /*spell*/) override
1820 {
1822 }
1823
1824 void FilterTargets(std::list<WorldObject*>& targets)
1825 {
1826 _noTarget = targets.empty();
1827 if (_noTarget)
1828 return;
1829
1831 targets.clear();
1832 targets.push_back(target);
1833 }
1834
1836 {
1837 if (_noTarget)
1839 }
1840
1841 void HandleScript(SpellEffIndex /*effIndex*/)
1842 {
1843 Unit* caster = GetCaster();
1844
1845 if (UnitAI* ai = caster->GetAI())
1846 {
1847 if (caster->GetDistance2d(GetHitUnit()) <= 15.0f && ai->GetData(DATA_WATERSPRAY))
1848 {
1849 caster->CastSpell(GetHitUnit(), SPELL_WATER_SPRAY, true);
1850 ai->SetData(DATA_WATERSPRAY, 0);
1851 ai->SetData(DATA_MOVE_NEW, 1);
1852 }
1853 else if (caster->GetAI()->GetData(DATA_MOVE_NEW))
1854 {
1855 caster->GetMotionMaster()->MoveChase(GetHitUnit());
1856 ai->SetData(DATA_MOVE_NEW, 0);
1857 }
1858 }
1859 }
1860
1861 void Register() override
1862 {
1866 }
1867
1868 private:
1870 };
1871
1872 SpellScript* GetSpellScript() const override
1873 {
1875 }
1876};
1877
1878// 64444 - Magnetic Core Summon
1880{
1882 {
1883 Unit* caster = GetCaster();
1884 Position pos = caster->GetPosition();
1885 float z = caster->GetMap()->GetHeight(caster->GetPhaseShift(), pos);
1886 pos.m_positionZ = z;
1887 dest.Relocate(pos);
1888 }
1889
1890 void Register() override
1891 {
1893 }
1894};
1895
1896// 64436 - Magnetic Core
1898{
1899 public:
1900 spell_mimiron_magnetic_core() : SpellScriptLoader("spell_mimiron_magnetic_core") { }
1901
1903 {
1904 void FilterTargets(std::list<WorldObject*>& targets)
1905 {
1906 targets.remove_if([](WorldObject* obj) { return obj->IsUnit() && (obj->ToUnit()->GetVehicleBase() || obj->ToUnit()->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)); });
1907 }
1908
1909 void Register() override
1910 {
1912 }
1913 };
1914
1915 SpellScript* GetSpellScript() const override
1916 {
1918 }
1919
1921 {
1922 bool Validate(SpellInfo const* /*spell*/) override
1923 {
1925 }
1926
1927 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1928 {
1929 if (Creature* target = GetTarget()->ToCreature())
1930 {
1931 target->AI()->DoAction(DO_DISABLE_AERIAL);
1932 target->CastSpell(target, SPELL_MAGNETIC_CORE_VISUAL, true);
1933 }
1934 }
1935
1936 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1937 {
1938 if (Creature* target = GetTarget()->ToCreature())
1939 {
1940 target->AI()->DoAction(DO_ENABLE_AERIAL);
1941 target->RemoveAurasDueToSpell(SPELL_MAGNETIC_CORE_VISUAL);
1942 }
1943 }
1944
1945 void OnRemoveSelf(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1946 {
1947 if (TempSummon* summ = GetTarget()->ToTempSummon())
1948 summ->DespawnOrUnsummon();
1949 }
1950
1951 void Register() override
1952 {
1956 }
1957 };
1958
1959 AuraScript* GetAuraScript() const override
1960 {
1962 }
1963};
1964
1965// 63667 - Napalm Shell
1967{
1968 public:
1969 spell_mimiron_napalm_shell() : SpellScriptLoader("spell_mimiron_napalm_shell") { }
1970
1972 {
1973 bool Validate(SpellInfo const* /*spell*/) override
1974 {
1976 }
1977
1978 void FilterTargets(std::list<WorldObject*>& targets)
1979 {
1980 if (targets.empty())
1981 return;
1982
1984
1985 targets.remove_if(Trinity::AllWorldObjectsInRange(GetCaster(), 15.0f));
1986
1987 if (!targets.empty())
1989
1990 targets.clear();
1991 targets.push_back(target);
1992 }
1993
1994 void HandleScript(SpellEffIndex /*effIndex*/)
1995 {
1997 }
1998
1999 void Register() override
2000 {
2003 }
2004 };
2005
2006 SpellScript* GetSpellScript() const override
2007 {
2009 }
2010};
2011
2012// 64542 - Plasma Blast
2014{
2015 public:
2016 spell_mimiron_plasma_blast() : SpellScriptLoader("spell_mimiron_plasma_blast") { }
2017
2019 {
2020 bool Validate(SpellInfo const* /*spell*/) override
2021 {
2023 }
2024
2025 bool Load() override
2026 {
2027 return GetCaster()->GetVehicleKit() != nullptr;
2028 }
2029
2030 void HandleScript(SpellEffIndex /*effIndex*/)
2031 {
2032 if (Unit* caster = GetCaster()->GetVehicleKit()->GetPassenger(3))
2033 caster->CastSpell(GetHitUnit(), SPELL_PLASMA_BLAST);
2034 }
2035
2036 void Register() override
2037 {
2039 }
2040 };
2041
2042 SpellScript* GetSpellScript() const override
2043 {
2045 }
2046};
2047
2048// 66351, 63009 - Explosion
2050{
2051 public:
2052 spell_mimiron_proximity_explosion() : SpellScriptLoader("spell_mimiron_proximity_explosion") { }
2053
2055 {
2056 void OnHit(SpellEffIndex /*effIndex*/)
2057 {
2058 if (GetHitPlayer())
2059 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
2060 if (Creature* mkII = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_LEVIATHAN_MK_II)))
2061 mkII->AI()->SetData(DATA_SETUP_MINE, 0);
2062 }
2063
2064 void HandleAura(SpellEffIndex /*effIndex*/)
2065 {
2067 }
2068
2069 void Register() override
2070 {
2073 }
2074 };
2075
2076 SpellScript* GetSpellScript() const override
2077 {
2079 }
2080};
2081
2082// 63027 - Proximity Mines
2084{
2085 public:
2086 spell_mimiron_proximity_mines() : SpellScriptLoader("spell_mimiron_proximity_mines") { }
2087
2089 {
2090 bool Validate(SpellInfo const* /*spell*/) override
2091 {
2093 }
2094
2095 void HandleScript(SpellEffIndex /*effIndex*/)
2096 {
2097 for (uint8 i = 0; i < 10; ++i)
2099 }
2100
2101 void Register() override
2102 {
2104 }
2105 };
2106
2107 SpellScript* GetSpellScript() const override
2108 {
2110 }
2111};
2112
2113// 65346 - Proximity Mine
2115{
2116 public:
2117 spell_mimiron_proximity_trigger() : SpellScriptLoader("spell_mimiron_proximity_trigger") { }
2118
2120 {
2121 bool Validate(SpellInfo const* /*spell*/) override
2122 {
2124 }
2125
2126 void FilterTargets(std::list<WorldObject*>& targets)
2127 {
2128 targets.remove(GetExplTargetWorldObject());
2129
2130 if (targets.empty())
2132 }
2133
2134 void HandleDummy(SpellEffIndex /*effIndex*/)
2135 {
2137 }
2138
2139 void Register() override
2140 {
2143 }
2144 };
2145
2146 SpellScript* GetSpellScript() const override
2147 {
2149 }
2150};
2151
2152// 63382 - Rapid Burst
2154{
2155 public:
2156 spell_mimiron_rapid_burst() : SpellScriptLoader("spell_mimiron_rapid_burst") { }
2157
2159 {
2160 bool Validate(SpellInfo const* /*spell*/) override
2161 {
2163 }
2164
2165 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2166 {
2167 if (TempSummon* summ = GetTarget()->ToTempSummon())
2168 summ->DespawnOrUnsummon();
2169 }
2170
2171 void HandleDummyTick(AuraEffect const* aurEff)
2172 {
2173 if (GetCaster())
2175 }
2176
2177 void Register() override
2178 {
2181 }
2182 };
2183
2184 AuraScript* GetAuraScript() const override
2185 {
2187 }
2188};
2189
2190// 64402 - Rocket Strike, 65034 - Rocket Strike
2192{
2193 public:
2194 spell_mimiron_rocket_strike() : SpellScriptLoader("spell_mimiron_rocket_strike") { }
2195
2197 {
2198 bool Validate(SpellInfo const* /*spell*/) override
2199 {
2201 }
2202
2203 void FilterTargets(std::list<WorldObject*>& targets)
2204 {
2205 if (targets.empty())
2206 return;
2207
2208 if (GetSpellInfo()->Id == SPELL_ROCKET_STRIKE_SINGLE && GetCaster()->IsVehicle())
2209 {
2210 if (WorldObject* target = GetCaster()->GetVehicleKit()->GetPassenger(RAND(ROCKET_SEAT_LEFT, ROCKET_SEAT_RIGHT)))
2211 {
2212 targets.clear();
2213 targets.push_back(target);
2214 }
2215 }
2216 }
2217
2218 void HandleDummy(SpellEffIndex /*effIndex*/)
2219 {
2221 .SetOriginalCaster(GetCaster()->GetGUID()));
2222 }
2223
2224 void Register() override
2225 {
2228 }
2229 };
2230
2231 SpellScript* GetSpellScript() const override
2232 {
2234 }
2235};
2236
2237// 63041 - Rocket Strike
2239{
2240 public:
2241 spell_mimiron_rocket_strike_damage() : SpellScriptLoader("spell_mimiron_rocket_strike_damage") { }
2242
2244 {
2245 bool Validate(SpellInfo const* /*spell*/) override
2246 {
2248 }
2249
2251 {
2252 if (TempSummon* summ = GetCaster()->ToTempSummon())
2253 summ->DespawnOrUnsummon();
2254 }
2255
2256 void HandleScript(SpellEffIndex /*effIndex*/)
2257 {
2258 if (GetHitPlayer())
2259 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
2260 if (Creature* mkii = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_LEVIATHAN_MK_II)))
2261 mkii->AI()->SetData(DATA_SETUP_ROCKET, 0);
2262 }
2263
2265 {
2267 }
2268
2269 void Register() override
2270 {
2274 }
2275 };
2276
2277 SpellScript* GetSpellScript() const override
2278 {
2280 }
2281};
2282
2283// 63681 - Rocket Strike
2285{
2286 public:
2287 spell_mimiron_rocket_strike_target_select() : SpellScriptLoader("spell_mimiron_rocket_strike_target_select") { }
2288
2290 {
2291 bool Validate(SpellInfo const* /*spell*/) override
2292 {
2294 }
2295
2296 void FilterTargets(std::list<WorldObject*>& targets)
2297 {
2298 if (targets.empty())
2299 return;
2300
2302
2303 targets.remove_if(Trinity::AllWorldObjectsInRange(GetCaster(), 15.0f));
2304
2305 if (!targets.empty())
2307
2308 targets.clear();
2309 targets.push_back(target);
2310 }
2311
2312 void HandleScript(SpellEffIndex /*effIndex*/)
2313 {
2314 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
2316 .SetOriginalCaster(instance->GetGuidData(DATA_VX_001)));
2317 GetCaster()->SetDisplayId(11686);
2318 }
2319
2320 void Register() override
2321 {
2324 }
2325 };
2326
2327 SpellScript* GetSpellScript() const override
2328 {
2330 }
2331};
2332
2333// 64383 - Self Repair
2335{
2336 public:
2337 spell_mimiron_self_repair() : SpellScriptLoader("spell_mimiron_self_repair") { }
2338
2340 {
2342 {
2343 if (GetCaster()->GetAI())
2345 }
2346
2347 void Register() override
2348 {
2350 }
2351 };
2352
2353 SpellScript* GetSpellScript() const override
2354 {
2356 }
2357};
2358
2359// 64426 - Summon Scrap Bot
2361{
2362 public:
2363 spell_mimiron_summon_assault_bot() : SpellScriptLoader("spell_mimiron_summon_assault_bot") { }
2364
2366 {
2367 bool Validate(SpellInfo const* /*spell*/) override
2368 {
2370 }
2371
2372 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
2373 {
2374 if (Unit* caster = GetCaster())
2375 if (InstanceScript* instance = caster->GetInstanceScript())
2376 if (instance->GetBossState(DATA_MIMIRON) == IN_PROGRESS)
2378 .SetTriggeringAura(aurEff)
2379 .SetOriginalCaster(instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)));
2380 }
2381
2382 void Register() override
2383 {
2385 }
2386 };
2387
2388 AuraScript* GetAuraScript() const override
2389 {
2391 }
2392};
2393
2394// 64425 - Summon Scrap Bot Trigger
2396{
2397 public:
2398 spell_mimiron_summon_assault_bot_target() : SpellScriptLoader("spell_mimiron_summon_assault_bot_target") { }
2399
2401 {
2402 bool Validate(SpellInfo const* /*spell*/) override
2403 {
2405 }
2406
2407 void HandleDummy(SpellEffIndex /*effIndex*/)
2408 {
2410 }
2411
2412 void Register() override
2413 {
2415 }
2416 };
2417
2418 SpellScript* GetSpellScript() const override
2419 {
2421 }
2422};
2423
2424// 64621 - Summon Fire Bot
2426{
2427 public:
2428 spell_mimiron_summon_fire_bot() : SpellScriptLoader("spell_mimiron_summon_fire_bot") { }
2429
2431 {
2432 bool Validate(SpellInfo const* /*spell*/) override
2433 {
2435 }
2436
2437 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
2438 {
2439 if (Unit* caster = GetCaster())
2440 if (InstanceScript* instance = caster->GetInstanceScript())
2441 if (instance->GetBossState(DATA_MIMIRON) == IN_PROGRESS)
2443 .SetTriggeringAura(aurEff)
2444 .SetOriginalCaster(instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)));
2445 }
2446
2447 void Register() override
2448 {
2450 }
2451 };
2452
2453 AuraScript* GetAuraScript() const override
2454 {
2456 }
2457};
2458
2459// 64620 - Summon Fire Bot Trigger
2461{
2462 public:
2463 spell_mimiron_summon_fire_bot_target() : SpellScriptLoader("spell_mimiron_summon_fire_bot_target") { }
2464
2466 {
2467 bool Validate(SpellInfo const* /*spell*/) override
2468 {
2470 }
2471
2472 void HandleDummy(SpellEffIndex /*effIndex*/)
2473 {
2475 }
2476
2477 void Register() override
2478 {
2480 }
2481 };
2482
2483 SpellScript* GetSpellScript() const override
2484 {
2486 }
2487};
2488
2489// 64562 - Summon Flames Spread Trigger
2491{
2492 public:
2493 spell_mimiron_summon_flames_spread() : SpellScriptLoader("spell_mimiron_summon_flames_spread") { }
2494
2496 {
2497 void FilterTargets(std::list<WorldObject*>& targets)
2498 {
2499 if (targets.empty())
2500 return;
2501
2502 // Flames must chase the closest player
2503 WorldObject* target = targets.front();
2504
2505 for (std::list<WorldObject*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
2506 if (GetCaster()->GetDistance2d(*iter) < GetCaster()->GetDistance2d(target))
2507 target = *iter;
2508
2509 targets.clear();
2510 targets.push_back(target);
2511 }
2512
2513 void OnHit(SpellEffIndex /*effIndex*/)
2514 {
2516 }
2517
2518 void Register() override
2519 {
2522 }
2523 };
2524
2525 SpellScript* GetSpellScript() const override
2526 {
2528 }
2529
2531 {
2532 bool Validate(SpellInfo const* /*spell*/) override
2533 {
2535 }
2536
2537 void HandleTick(AuraEffect const* /*aurEff*/)
2538 {
2540 if (Unit* caster = GetCaster())
2541 if (caster->HasAura(SPELL_FLAMES_PERIODIC_TRIGGER))
2542 caster->CastSpell(GetTarget(), SPELL_SUMMON_FLAMES_SPREAD, true);
2543 }
2544
2545 void Register() override
2546 {
2548 }
2549 };
2550
2551 AuraScript* GetAuraScript() const override
2552 {
2554 }
2555};
2556
2557// 64623 - Frost Bomb
2559{
2560 public:
2561 spell_mimiron_summon_frost_bomb_target() : SpellScriptLoader("spell_mimiron_summon_frost_bomb_target") { }
2562
2564 {
2565 bool Validate(SpellInfo const* /*spell*/) override
2566 {
2568 }
2569
2570 void FilterTargets(std::list<WorldObject*>& targets)
2571 {
2572 if (targets.empty())
2573 return;
2574
2575 targets.remove_if(Trinity::AllWorldObjectsInRange(GetCaster(), 15.0f));
2576
2577 if (targets.empty())
2578 return;
2579
2581
2582 targets.clear();
2583 targets.push_back(target);
2584 }
2585
2586 void HandleScript(SpellEffIndex /*effIndex*/)
2587 {
2589 }
2590
2591 void Register() override
2592 {
2595 }
2596 };
2597
2598 SpellScript* GetSpellScript() const override
2599 {
2601 }
2602};
2603
2604// 64398 - Summon Scrap Bot
2606{
2607 public:
2608 spell_mimiron_summon_junk_bot() : SpellScriptLoader("spell_mimiron_summon_junk_bot") { }
2609
2611 {
2612 bool Validate(SpellInfo const* /*spell*/) override
2613 {
2615 }
2616
2617 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
2618 {
2619 if (Unit* caster = GetCaster())
2620 if (InstanceScript* instance = caster->GetInstanceScript())
2621 if (instance->GetBossState(DATA_MIMIRON) == IN_PROGRESS)
2623 .SetTriggeringAura(aurEff)
2624 .SetOriginalCaster(instance->GetGuidData(DATA_AERIAL_COMMAND_UNIT)));
2625 }
2626
2627 void Register() override
2628 {
2630 }
2631 };
2632
2633 AuraScript* GetAuraScript() const override
2634 {
2636 }
2637};
2638
2639// 63820 - Summon Scrap Bot Trigger
2641{
2642 public:
2643 spell_mimiron_summon_junk_bot_target() : SpellScriptLoader("spell_mimiron_summon_junk_bot_target") { }
2644
2646 {
2647 bool Validate(SpellInfo const* /*spell*/) override
2648 {
2650 }
2651
2652 void HandleDummy(SpellEffIndex /*effIndex*/)
2653 {
2655 }
2656
2657 void Register() override
2658 {
2660 }
2661 };
2662
2663 SpellScript* GetSpellScript() const override
2664 {
2666 }
2667};
2668
2669// 63339 - Weld
2671{
2672 public:
2673 spell_mimiron_weld() : SpellScriptLoader("spell_mimiron_weld") { }
2674
2676 {
2677 void HandleTick(AuraEffect const* aurEff)
2678 {
2679 Unit* caster = GetTarget();
2680 if (Unit* vehicle = caster->GetVehicleBase())
2681 {
2682 if (aurEff->GetTickNumber() % 5 == 0)
2683 caster->CastSpell(vehicle, RepairSpells[urand(0, 3)]);
2684 caster->SetFacingToObject(vehicle);
2685 }
2686 }
2687
2688 void Register() override
2689 {
2691 }
2692 };
2693
2694 AuraScript* GetAuraScript() const override
2695 {
2696 return new spell_mimiron_weld_AuraScript();
2697 }
2698};
2699
2701{
2702 public:
2703 achievement_setup_boom() : AchievementCriteriaScript("achievement_setup_boom") { }
2704
2705 bool OnCheck(Player* /*source*/, Unit* target) override
2706 {
2707 return target && target->GetAI()->GetData(DATA_SETUP_BOMB);
2708 }
2709};
2710
2712{
2713 public:
2714 achievement_setup_mine() : AchievementCriteriaScript("achievement_setup_mine") { }
2715
2716 bool OnCheck(Player* /*source*/, Unit* target) override
2717 {
2718 return target && target->GetAI()->GetData(DATA_SETUP_MINE);
2719 }
2720};
2721
2723{
2724 public:
2725 achievement_setup_rocket() : AchievementCriteriaScript("achievement_setup_rocket") { }
2726
2727 bool OnCheck(Player* /*source*/, Unit* target) override
2728 {
2729 return target && target->GetAI()->GetData(DATA_SETUP_ROCKET);
2730 }
2731};
2732
2734{
2735 public:
2736 achievement_firefighter() : AchievementCriteriaScript("achievement_firefighter") { }
2737
2738 bool OnCheck(Player* /*source*/, Unit* target) override
2739 {
2740 return target && target->GetAI()->GetData(DATA_FIREFIGHTER);
2741 }
2742};
2743
2745{
2748 new boss_mimiron();
2749 new boss_vx_001();
2750
2754 new npc_mimiron_flames();
2758
2760
2785 new spell_mimiron_weld();
2786
2791}
Actions
#define M_PI
Definition: Common.h:115
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ DONE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_DEST_NEARBY_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_STATE_SPECIAL_UNARMED
@ EMOTE_ONESHOT_NONE
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_APPLY_AURA
@ SPELL_FAILED_NO_VALID_TARGETS
@ GO_FLAG_NOT_SELECTABLE
@ FACTION_FRIENDLY
@ GO_STATE_READY
@ GO_STATE_DESTROYED
@ GO_STATE_ACTIVE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_CONTROL_VEHICLE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT
@ 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
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellCastFn(F)
Definition: SpellScript.h:825
#define SpellDestinationTargetSelectFn(F, I, N)
Definition: SpellScript.h:874
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ MOVE_RUN
Definition: UnitDefines.h:118
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_DEAD
Definition: UnitDefines.h:49
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:161
@ UNIT_STATE_ROOT
Definition: Unit.h:265
@ UNIT_STATE_CASTING
Definition: Unit.h:270
static bool IsEncounterFinished(Unit *who)
Position const VehicleRelocation[]
void AddSC_boss_mimiron()
SeatIds
@ ROCKET_SEAT_LEFT
@ MKII_SEAT_CANNON
@ ROCKET_SEAT_RIGHT
@ DO_ACTIVATE_VX001
@ DO_ACTIVATE_V0L7R0N_1
@ DO_ENABLE_AERIAL
@ DO_ASSEMBLED_COMBAT
@ DO_ACTIVATE_COMPUTER
@ DO_ACTIVATE_AERIAL
@ DO_ACTIVATE_V0L7R0N_2
@ DO_ACTIVATE_HARD_MODE
@ DO_ENCOUNTER_DONE
@ DO_ACTIVATE_SELF_DESTRUCT
@ DO_HARDMODE_MKII
@ DO_START_VX001
@ DO_DEACTIVATE_COMPUTER
@ DO_HARDMODE_VX001
@ DO_DISABLE_AERIAL
@ DO_START_MKII
@ DO_START_AERIAL
@ DO_HARDMODE_AERIAL
@ SAY_AERIAL_SLAY
@ SAY_AERIAL_ACTIVATE
@ SAY_MKII_SLAY
@ SAY_AGGRO
@ SAY_VX001_ACTIVATE
@ SAY_V07TRON_ACTIVATE
@ SAY_AERIAL_DEATH
@ SAY_VX001_DEATH
@ SAY_V07TRON_SLAY
@ SAY_MKII_DEATH
@ SAY_VX001_SLAY
@ SAY_HARDMODE_ON
@ SAY_V07TRON_DEATH
@ SAY_BERSERK
@ SAY_MKII_ACTIVATE
Position const ACUSummonPos
@ SPELL_PROXIMITY_MINE_EXPLOSION
@ SPELL_PLASMA_BLAST
@ SPELL_NAPALM_SHELL_25
@ SPELL_FREEZE_ANIM
@ SPELL_CLEAR_ALL_DEBUFFS
@ SPELL_SUMMON_ROCKET_STRIKE
@ SPELL_PLASMA_BALL_P2
@ SPELL_PERIODIC_PROXIMITY_AURA
@ SPELL_HALF_HEAL
@ SPELL_FIRE_SEARCH_AURA
@ SPELL_SUMMON_JUNK_BOT
@ SPELL_BOMB_BOT_AURA
@ SPELL_PLASMA_BALL_P1
@ SPELL_SCRIPT_EFFECT_PLASMA_BLAST
@ SPELL_MOUNT_MKII
@ SPELL_PROXIMITY_MINE_PERIODIC_TRIGGER
@ SPELL_JETPACK
@ SPELL_MAGNETIC_FIELD
@ SPELL_SUMMON_FLAMES_SPREAD
@ SPELL_RAPID_BURST_RIGHT
@ SPELL_SHOCK_BLAST
@ SPELL_SHOCK_BLAST_AURA
@ SPELL_HEAT_WAVE_AURA
@ SPELL_NOT_SO_FRIENDLY_FIRE
@ SPELL_SEAT_1
@ SPELL_ELEVATOR_KNOCKBACK
@ SPELL_SELF_DESTRUCTION_AURA
@ SPELL_SCRIPT_EFFECT_FROST_BOMB
@ SPELL_FLAMES_PERIODIC_TRIGGER
@ SPELL_SUMMON_ASSAULT_BOT_TRIGGER
@ SPELL_SUMMON_ASSAULT_BOT_DUMMY
@ SPELL_SUMMON_FIRE_BOT_DUMMY
@ SPELL_FREEZE_ANIM_STUN
@ SPELL_FROST_BOMB_LINKED
@ SPELL_RAPID_BURST
@ SPELL_SUMMON_JUNK_BOT_TRIGGER
@ SPELL_ROCKET_STRIKE
@ SPELL_SEAT_5
@ SPELL_EMERGENCY_MODE
@ SPELL_SEAT_3
@ SPELL_SUMMON_BOMB_BOT
@ SPELL_RAPID_BURST_LEFT
@ SPELL_ROCKET_STRIKE_SINGLE
@ SPELL_SELF_REPAIR
@ SPELL_HAND_PULSE_RIGHT
@ SPELL_EMERGENCY_MODE_TURRET
@ SPELL_SCRIPT_EFFECT_ROCKET_STRIKE
@ SPELL_SUMMON_FIRE_BOT
@ SPELL_TELEPORT_VISUAL
@ SPELL_SUMMON_PROXIMITY_MINE
@ SPELL_FLAMES
@ SPELL_SLEEP_VISUAL_2
@ SPELL_PROXIMITY_MINE_TRIGGER
@ SPELL_SUMMON_FLAMES_INITIAL
@ SPELL_FIRE_SEARCH
@ SPELL_NAPALM_SHELL
@ SPELL_MAGNETIC_CORE
@ SPELL_RAPID_BURST_TARGET_ME
@ SPELL_TORSO_DISABLED
@ SPELL_MAGNETIC_CORE_VISUAL
@ SPELL_FROST_BOMB_DUMMY
@ SPELL_WATER_SPRAY
@ SPELL_SUMMON_FIRE_BOT_TRIGGER
@ SPELL_SCRIPT_EFFECT_SUMMON_FLAMES_INITIAL
@ SPELL_CLEAR_FIRES
@ SPELL_SUMMON_FLAMES_SPREAD_TRIGGER
@ SPELL_FORCE_CAST_NAPALM_SHELL
@ SPELL_ROCKET_STRIKE_BOTH
@ SPELL_SUMMON_BURST_TARGET
@ SPELL_FLAME_SUPPRESSANT_MK
@ SPELL_SEAT_7
@ SPELL_SUMMON_FROST_BOMB
@ SPELL_VEHICLE_DAMAGED
@ SPELL_SEAT_2
@ SPELL_DEAFENING_SIREN
@ SPELL_SPINNING_UP
@ SPELL_MOUNT_VX_001
@ SPELL_SUMMON_JUNK_BOT_DUMMY
@ SPELL_WELD
@ SPELL_HAND_PULSE_LEFT
@ SPELL_SUMMON_ASSAULT_BOT
@ SPELL_PROXIMITY_MINES
@ SPELL_FLAME_SUPPRESSANT_VX
@ SPELL_FROST_BOMB_EXPLOSION
@ SPELL_SEAT_6
@ SPELL_SELF_DESTRUCTION_VISUAL
@ SPELL_SLEEP_VISUAL_1
@ SPELL_DESPAWN_ASSAULT_BOTS
@ PHASE_AERIAL_COMMAND_UNIT
@ PHASE_VX_001
@ PHASE_LEVIATHAN_MK_II
@ PHASE_VOL7RON
ComputerYells
@ SAY_SELF_DESTRUCT_4
@ SAY_SELF_DESTRUCT_7
@ SAY_SELF_DESTRUCT_TERMINATED
@ SAY_SELF_DESTRUCT_10
@ SAY_SELF_DESTRUCT_8
@ SAY_SELF_DESTRUCT_FINALIZED
@ SAY_SELF_DESTRUCT_1
@ SAY_SELF_DESTRUCT_3
@ SAY_SELF_DESTRUCT_5
@ SAY_SELF_DESTRUCT_INITIATED
@ SAY_SELF_DESTRUCT_6
@ SAY_SELF_DESTRUCT_9
@ SAY_SELF_DESTRUCT_2
Waypoints
@ WP_AERIAL_P4_POS
@ WP_MKII_P4_POS_4
@ WP_MKII_P4_POS_2
@ WP_MKII_P4_POS_3
@ WP_MKII_P4_POS_5
@ WP_MKII_P4_POS_1
@ WP_MKII_P1_IDLE
uint32 const RepairSpells[4]
Position const VX001SummonPos
@ DATA_MOVE_NEW
@ DATA_SETUP_MINE
@ DATA_SETUP_BOMB
@ DATA_NOT_SO_FRIENDLY_FIRE
@ DATA_WATERSPRAY
@ DATA_FIREFIGHTER
@ DATA_SETUP_ROCKET
@ EVENT_OUTTRO_1
@ EVENT_SUMMON_JUNK_BOT
@ EVENT_FROST_BOMB_CLEAR_FIRES
@ EVENT_VX001_ACTIVATION_3
@ EVENT_SUMMON_FIRE_BOTS
@ EVENT_SELF_DESTRUCT_2
@ EVENT_SELF_DESTRUCT_8
@ EVENT_MOVE_POINT_5
@ EVENT_VX001_ACTIVATION_7
@ EVENT_INTRO_1
@ EVENT_SELF_DESTRUCT_7
@ EVENT_OUTTRO_3
@ EVENT_INTRO_2
@ EVENT_VX001_ACTIVATION_9
@ EVENT_VOL7RON_ACTIVATION_7
@ EVENT_AERIAL_ACTIVATION_5
@ EVENT_VOL7RON_ACTIVATION_5
@ EVENT_SELF_DESTRUCT_9
@ EVENT_SPREAD_FLAMES
@ EVENT_VX001_ACTIVATION_5
@ EVENT_VOL7RON_ACTIVATION_6
@ EVENT_SUMMON_FLAMES
@ EVENT_SELF_DESTRUCT_FINALIZED
@ EVENT_VOL7RON_ACTIVATION_1
@ EVENT_SELF_DESTRUCT_5
@ EVENT_SELF_DESTRUCT_3
@ EVENT_FROST_BOMB
@ EVENT_FLAME_SUPPRESSANT_VX
@ EVENT_SHOCK_BLAST
@ EVENT_MAGNETIC_FIELD
@ EVENT_FLAME_SUPPRESSANT_MK
@ EVENT_AERIAL_ACTIVATION_6
@ EVENT_VOL7RON_ACTIVATION_3
@ EVENT_AERIAL_ACTIVATION_1
@ EVENT_NAPALM_SHELL
@ EVENT_VX001_ACTIVATION_1
@ EVENT_PROXIMITY_MINE
@ EVENT_MOVE_POINT_3
@ EVENT_VX001_ACTIVATION_2
@ EVENT_AERIAL_ACTIVATION_4
@ EVENT_FROST_BOMB_EXPLOSION
@ EVENT_PROXIMITY_MINE_DETONATION
@ EVENT_SUMMON_ASSAULT_BOT
@ EVENT_VOL7RON_ACTIVATION_2
@ EVENT_SELF_DESTRUCT_4
@ EVENT_WATER_SPRAY
@ EVENT_SELF_DESTRUCT_6
@ EVENT_PLASMA_BLAST
@ EVENT_VX001_ACTIVATION_8
@ EVENT_VX001_ACTIVATION_4
@ EVENT_MOVE_POINT_2
@ EVENT_AERIAL_ACTIVATION_2
@ EVENT_SUMMON_BOMB_BOT
@ EVENT_RAPID_BURST
@ EVENT_VX001_ACTIVATION_6
@ EVENT_OUTTRO_2
@ EVENT_SEARCH_FLAMES
@ EVENT_RELOAD
@ EVENT_INTRO_3
@ EVENT_SPINNING_UP
@ EVENT_ROCKET_STRIKE
@ EVENT_HAND_PULSE
@ EVENT_SELF_DESTRUCT_10
@ EVENT_PROXIMITY_MINE_ARM
@ EVENT_AERIAL_ACTIVATION_3
@ EVENT_VOL7RON_ACTIVATION_4
@ EVENT_SELF_DESTRUCT_1
Yells
uint32 GetTickNumber() const
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
Unit * GetCaster() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void JustSummoned(Creature *summon) override
SummonList summons
EventMap events
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void ExitVehicle(Position const *exitPosition=nullptr) override
Definition: Creature.cpp:3676
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void DelayEvents(Milliseconds delay)
Definition: EventMap.cpp:96
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
bool IsInPhase(uint8 phase) const
Definition: EventMap.h:217
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition: EventMap.cpp:175
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21
GameObject *const me
Definition: GameObjectAI.h:50
void SetGoState(GOState state)
bool HasFlag(GameObjectFlags flags) const
Definition: GameObject.h:273
void SetFlag(GameObjectFlags flags)
Definition: GameObject.h:274
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
GameObject * GetGameObject(uint32 type)
float GetHeight(PhaseShift const &phaseShift, float x, float y, float z, bool vmap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH)
Definition: Map.h:290
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=EVENT_JUMP, bool hasOrientation=false, JumpArrivalCastArgs const *arrivalCast=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MoveRandom(float wanderDistance=0.0f, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_DEFAULT)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveFall(uint32 id=0)
static Unit * ToUnit(Object *o)
Definition: Object.h:225
bool IsUnit() const
Definition: Object.h:224
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
HookList< CastHandler > AfterCast
Definition: SpellScript.h:824
Creature * GetHitCreature() const
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Definition: SpellScript.h:873
HookList< HitHandler > OnHit
Definition: SpellScript.h:850
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void FinishCast(SpellCastResult result, int32 *param1=nullptr, int32 *param2=nullptr)
WorldObject * GetExplTargetWorldObject() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void Summon(Creature const *summon)
Definition: UnitAI.h:50
bool DoSpellAttackIfReady(uint32 spellId)
Definition: UnitAI.cpp:61
virtual void DoAction(int32)
Definition: UnitAI.h:72
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
virtual uint32 GetData(uint32) const
Definition: UnitAI.h:73
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
void CastStop(uint32 except_spellid=0)
Definition: Unit.cpp:1135
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
UF::UpdateField< UF::UnitData, 0, TYPEID_UNIT > m_unitData
Definition: Unit.h:1814
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:11501
void SetFaction(uint32 faction) override
Definition: Unit.h:859
void RemoveAllAurasExceptType(AuraType type)
Definition: Unit.cpp:4377
void SetAnimTier(AnimTier animTier, bool notifyClient=true)
Definition: Unit.cpp:10114
Unit * GetVehicleBase() const
Definition: Unit.cpp:11480
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:832
bool SetHover(bool enable, bool updateAnimTier=true)
Definition: Unit.cpp:12938
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
UnitAI * GetAI() const
Definition: Unit.h:660
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetEmoteState(Emote emote)
Definition: Unit.h:852
uint64 GetHealth() const
Definition: Unit.h:776
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition: Unit.cpp:8525
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
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
UnitStandStateType GetStandState() const
Definition: Unit.h:886
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:12647
Vehicle * GetVehicleKit() const
Definition: Unit.h:1711
bool AttackStop()
Definition: Unit.cpp:5781
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
virtual void SetDisplayId(uint32 displayId, bool setNative=false)
Definition: Unit.cpp:10148
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition: Vehicle.cpp:291
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
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
PhaseShift & GetPhaseShift()
Definition: Object.h:523
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition: Object.cpp:2065
bool OnCheck(Player *, Unit *target) override
bool OnCheck(Player *, Unit *target) override
bool OnCheck(Player *, Unit *target) override
bool OnCheck(Player *, Unit *target) override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
GameObjectAI * GetAI(GameObject *go) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void FilterTargets(std::list< WorldObject * > &targets)
SpellScript * GetSpellScript() const override
void OnApply(AuraEffect const *, AuraEffectHandleModes)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void OnRemoveSelf(AuraEffect const *, AuraEffectHandleModes)
void ModDest(SpellDestination &dest)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
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
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
Definition: SpellDefines.h:474
constexpr float GetPositionX() const
Definition: Position.h:76
float m_positionZ
Definition: Position.h:55
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
T const & RAID_MODE(T const &normal10, T const &normal25) const
void Relocate(Position const &pos)
Definition: Spell.cpp:111
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 type, uint32 point) override
void MovementInform(uint32 type, uint32 point) override
uint32 GetData(uint32 type) const override
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustSummoned(Creature *summon) override
void SetData(uint32 id, uint32 data) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void DoAction(int32 action) override
void JustEngagedWith(Unit *who) override
boss_mimironAI(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void KilledUnit(Unit *victim) override
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SpellHit(WorldObject *caster, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
void JustSummoned(Creature *summon) override
boss_vx_001AI(Creature *creature)
npc_mimiron_magnetic_core(Creature *creature)
@ DATA_MIMIRON
Definition: ulduar.h:47
@ DATA_MIMIRON_ELEVATOR
Definition: ulduar.h:422
@ DATA_MIMIRON_BUTTON
Definition: ulduar.h:424
@ DATA_LEVIATHAN_MK_II
Definition: ulduar.h:417
@ DATA_VX_001
Definition: ulduar.h:418
@ DATA_MIMIRON_WORLD_TRIGGER
Definition: ulduar.h:421
@ DATA_AERIAL_COMMAND_UNIT
Definition: ulduar.h:419
@ DATA_COMPUTER
Definition: ulduar.h:420
@ GO_CACHE_OF_INNOVATION_FIREFIGHTER
Definition: ulduar.h:301
@ GO_CACHE_OF_INNOVATION_FIREFIGHTER_HERO
Definition: ulduar.h:303
@ GO_CACHE_OF_INNOVATION_HERO
Definition: ulduar.h:302
@ GO_CACHE_OF_INNOVATION
Definition: ulduar.h:300
#define RegisterUlduarCreatureAI(ai_name)
Definition: ulduar.h:524
@ NPC_BURST_TARGET
Definition: ulduar.h:128
@ NPC_ASSAULT_BOT
Definition: ulduar.h:123
@ NPC_AERIAL_COMMAND_UNIT
Definition: ulduar.h:122
@ NPC_JUNK_BOT
Definition: ulduar.h:125
@ NPC_VX_001
Definition: ulduar.h:121