TrinityCore
boss_xt002.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 "InstanceScript.h"
21#include "Map.h"
22#include "MotionMaster.h"
23#include "PassiveAI.h"
24#include "ScriptedCreature.h"
25#include "SpellAuraEffects.h"
26#include "SpellMgr.h"
27#include "SpellScript.h"
28#include "ulduar.h"
29#include "Vehicle.h"
30
32{
39 SPELL_STAND = 37752,
41 SPELL_ENRAGE = 26662,
44
45 // XT-Toy Pile
49
50 // Heart of the Deconstructor
59
60 // Void Zone
62
63 // Life Spark
66 SPELL_SHOCK = 64230,
67
68 // XM-024 Pummeller
72
73 //Boombot
75 SPELL_BOOM = 62834,
76
77 // Achievement-related spells
79};
80
82{
92};
93
95{
98};
99
101{
106
108{
114
116{
128 EMOTE_SCRAPBOT = 11
130
132{
137
139{
140 PATH_XT002_IDLE = 10884320
142
143struct boss_xt002 : public BossAI
144{
145 boss_xt002(Creature* creature) : BossAI(creature, DATA_XT002)
146 {
147 Initialize();
148 }
149
151 {
152 _healthRecovered = false;
153 _gravityBombCasualty = false;
154 _hardMode = false;
156 }
157
159 {
160 switch (_exposeHeartPercent)
161 {
162 case 75:
164 break;
165 case 50:
167 break;
168 default:
170 break;
171 }
172 }
173
174 void Reset() override
175 {
176 _Reset();
179 Initialize();
180 }
181
182 void EnterEvadeMode(EvadeReason /*why*/) override
183 {
186 }
187
188 void JustEngagedWith(Unit* who) override
189 {
191
200 }
201
202 void DoAction(int32 action) override
203 {
204 if (action == ACTION_ENTER_HARD_MODE)
206 }
207
208 void KilledUnit(Unit* who) override
209 {
210 if (who->GetTypeId() == TYPEID_PLAYER)
211 Talk(SAY_SLAY);
212 }
213
214 void JustDied(Unit* /*killer*/) override
215 {
217 _JustDied();
218 me->SetUninteractible(false);
219 }
220
222 {
225 me->AttackStop();
230 }
231
232 void DisposeHeart(bool isHardMode = false)
233 {
235
236 if (isHardMode)
237 {
240 }
241 else
242 {
245 }
246
249 me->SetUninteractible(false);
251 {
252 if (heart->IsAlive())
253 heart->AI()->DoAction(ACTION_DISPOSE_HEART);
254 else
255 heart->DespawnOrUnsummon();
256 }
257 }
258
260 {
265 if (!_hardMode)
267 }
268
269 void PassengerBoarded(Unit* who, int8 seatId, bool apply) override
270 {
271 if (!apply)
272 return;
273
274 if (who->GetEntry() == NPC_XS013_SCRAPBOT)
275 {
277 _healthRecovered = true;
278 }
279 else if (seatId == HEART_VEHICLE_SEAT_EXPOSED)
280 who->CastSpell(who, SPELL_EXPOSED_HEART); // Channeled
281 }
282
283 uint32 GetData(uint32 type) const override
284 {
285 switch (type)
286 {
287 case DATA_HARD_MODE:
288 return _hardMode ? 1 : 0;
290 return _healthRecovered ? 1 : 0;
292 return _gravityBombCasualty ? 1 : 0;
293 default:
294 return 0;
295 }
296 }
297
298 void SetData(uint32 type, uint32 data) override
299 {
300 switch (type)
301 {
303 if (!_hardMode)
304 {
305 uint32 transferHealth = data;
306 if (transferHealth >= me->GetHealth())
307 transferHealth = me->GetHealth() - 1;
308
309 me->ModifyHealth(-static_cast<int32>(transferHealth));
310 me->LowerPlayerDamageReq(transferHealth);
311 }
312 break;
314 _gravityBombCasualty = (data > 0) ? true : false;
315 break;
316 default:
317 break;
318 }
319 }
320
321 void UpdateAI(uint32 diff) override
322 {
323 if (!UpdateVictim())
324 return;
325
326 events.Update(diff);
327
329 return;
330
331 while (uint32 eventId = events.ExecuteEvent())
332 {
333 switch (eventId)
334 {
337 events.Repeat(Is25ManRaid() ? 16s : 20s);
338 break;
341 events.Repeat(Is25ManRaid() ? 16s : 20s);
342 break;
348 events.Repeat(1min);
349 break;
352 ExposeHeart();
353 events.Repeat(1s);
354 break;
355 case EVENT_SUBMERGE:
357 me->SetUninteractible(true);
360 heart->AI()->DoAction(ACTION_START_PHASE_HEART);
362 break;
364 DisposeHeart();
365 break;
366 case EVENT_ENRAGE:
369 break;
371 me->SetFullHealth();
374 _hardMode = true;
376 break;
380 break;
381 default:
382 break;
383 }
384
386 return;
387 }
388 }
389
390 void WaypointReached(uint32 waypointId, uint32 pathId) override
391 {
392 if (pathId != PATH_XT002_IDLE)
393 return;
394
395 if (waypointId == 3 || waypointId == 9)
396 {
398
399 scheduler.Schedule(11s, [this](TaskContext /*task*/)
400 {
402 });
403 }
404 else if (waypointId == 13)
405 {
407
408 scheduler.Schedule(30s, [this](TaskContext /*task*/)
409 {
411 });
412 }
413 }
414
415private:
416 bool _healthRecovered; // Did a scrapbot recover XT-002's health during the encounter?
417 bool _hardMode; // Are we in hard mode? Or: was the heart killed during phase 2?
418 bool _gravityBombCasualty; // Did someone die because of Gravity Bomb damage?
420};
421
423{
424 npc_xt002_heart(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) { }
425
426 void Reset() override
427 {
428 me->SetRegenerateHealth(false);
429 }
430
431 void DoAction(int32 action) override
432 {
434 if (!xt002)
435 return;
436
437 if (action == ACTION_START_PHASE_HEART)
438 {
442 me->SetUninteractible(false);
444 }
445 else if (action == ACTION_DISPOSE_HEART)
446 {
447 DoCast(xt002, SPELL_HEART_RIDE_VEHICLE, true);
448 me->SetUninteractible(true);
450 }
451 }
452
453 void JustDied(Unit* /*killer*/) override
454 {
456 xt002->AI()->DoAction(ACTION_ENTER_HARD_MODE);
457 }
458
459private:
461};
462
464{
465 npc_scrapbot(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
466
467 void Reset() override
468 {
471
473 {
475 return;
476 }
477
479 xt002->AI()->JustSummoned(me);
480
482 Schedule(2s, [this](TaskContext /*StartMove*/)
483 {
485 me->GetMotionMaster()->MoveFollow(xt002, 0.0f, 0.0f);
486 })
487 .Schedule(1s, [this](TaskContext checkXt002)
488 {
490 {
491 if (me->IsWithinMeleeRange(xt002))
492 {
493 DoCast(xt002, SPELL_SCRAPBOT_RIDE_VEHICLE);
494 _scheduler.Schedule(1s, [this](TaskContext /*ScrapRepair*/)
495 {
496 if (Creature* xt002 = _instance->GetCreature(DATA_XT002))
497 xt002->CastSpell(me, SPELL_SCRAP_REPAIR, true);
498 me->DespawnOrUnsummon(1s);
499 });
500 }
501 else
502 checkXt002.Repeat();
503 }
504 else
506 });
507 }
508
509 void UpdateAI(uint32 diff) override
510 {
511 _scheduler.Update(diff);
512 }
513
514private:
517
518};
519
521{
522 npc_pummeller(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
523
524 void Reset() override
525 {
528
530 {
532 return;
533 }
534
536 xt002->AI()->JustSummoned(me);
537
539 Schedule(1s, [this](TaskContext /*StartMove*/)
540 {
543 })
544 .Schedule(17s, [this](TaskContext trample)
545 {
547 trample.Repeat(11s);
548 })
549 .Schedule(19s, [this](TaskContext arcingSmash)
550 {
552 arcingSmash.Repeat(8s);
553 })
554 .Schedule(19s, [this](TaskContext upperCut)
555 {
557 upperCut.Repeat(14s);
558 });
559
560 }
561
562 void UpdateAI(uint32 diff) override
563 {
564 if (!UpdateVictim())
565 return;
566
567 _scheduler.Update(diff);
568 }
569
570private:
573};
574
575struct npc_boombot : public ScriptedAI
576{
577 npc_boombot(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _boomed(false) { }
578
579 void Reset() override
580 {
584
586 {
588 return;
589 }
590
592 xt002->AI()->JustSummoned(me);
593
595 Schedule(4s, [this](TaskContext /*StartMove*/)
596 {
598 me->GetMotionMaster()->MoveFollow(xt002, 0.0f, 0.0f);
599
600 })
601 .Schedule(1s, [this](TaskContext checkXt002)
602 {
604 {
605 if (me->IsWithinMeleeRange(xt002))
606 DoCastAOE(SPELL_BOOM);
607 else
608 checkXt002.Repeat();
609 }
610 else
612 });
613 }
614
615 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
616 {
617 if (damage >= (me->GetHealth() - me->GetMaxHealth() * 0.5f) && !_boomed)
618 {
619 _boomed = true; // Prevent recursive call
620 damage = 0;
622 }
623 }
624
625 void UpdateAI(uint32 diff) override
626 {
627 _scheduler.Update(diff);
628 }
629
630private:
634};
635
637{
638 npc_life_spark(Creature* creature) : ScriptedAI(creature) { }
639
640 void Reset() override
641 {
644 }
645
646 void JustEngagedWith(Unit* /*who*/) override
647 {
649 _scheduler.Schedule(12s, [this](TaskContext spellShock)
650 {
652 spellShock.Repeat();
653 });
654 }
655
656 void UpdateAI(uint32 diff) override
657 {
658 if (!UpdateVictim())
659 return;
660
662 return;
663
664 _scheduler.Update(diff);
665 }
666
667private:
669};
670
672{
673 npc_xt_void_zone(Creature* creature) : PassiveAI(creature) { }
674
675 void JustAppeared() override
676 {
677 _scheduler.Schedule(2500ms, [this](TaskContext /*task*/)
678 {
680 });
681 }
682
683 void UpdateAI(uint32 diff) override
684 {
685 _scheduler.Update(diff);
686 }
687
688private:
690};
691
692// 63018, 65121 - Searing Light
694{
695 bool Validate(SpellInfo const* /*spell*/) override
696 {
698 }
699
700 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
701 {
702 if (Unit* xt002 = GetCaster())
703 if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode
704 xt002->CastSpell(GetOwner(), SPELL_SUMMON_LIFE_SPARK, true);
705 }
706
707 void Register() override
708 {
710 }
711};
712
713// 63024, 64234 - Gravity Bomb
715{
716 bool Validate(SpellInfo const* /*spell*/) override
717 {
719 }
720
721 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
722 {
723 if (Unit* xt002 = GetCaster())
724 if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode
725 xt002->CastSpell(GetOwner(), SPELL_SUMMON_VOID_ZONE, true);
726 }
727
728 void OnPeriodic(AuraEffect const* aurEff)
729 {
730 Unit* xt002 = GetCaster();
731 Unit* owner = GetTarget();
732 if (!xt002)
733 return;
734
735 if (aurEff->GetAmount() >= int32(owner->GetHealth()))
737 }
738
739 void Register() override
740 {
743 }
744};
745
746// 63025, 64233 - Gravity Bomb (Damage)
748{
749 void HandleScript(SpellEffIndex /*effIndex*/)
750 {
751 if (GetHitDamage() >= int32(GetHitUnit()->GetHealth()))
752 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
753 if (Creature* xt002 = instance->GetCreature(DATA_XT002))
754 xt002->AI()->SetData(DATA_GRAVITY_BOMB_CASUALTY, 1);
755 }
756
757 void Register() override
758 {
760 }
761};
762
763// 62791 - XT-002 Heart Overload Trigger Spell (SERVERSIDE)
765{
766 bool Validate(SpellInfo const* /*spell*/) override
767 {
768 return ValidateSpellInfo
769 ({
772 });
773 }
774
776 {
777 std::list<Creature*> possibleCreatures;
778 Unit* caster = GetCaster();
779 caster->GetCreatureListWithEntryInGrid(possibleCreatures, NPC_XT_TOY_PILE);
780 possibleCreatures.remove_if([caster](Creature* creature)
781 {
782 return caster->GetDistance2d(creature) < 60.0f;
783 });
784
785 if (possibleCreatures.empty())
786 return nullptr;
787
789 }
790
791 void HandleScript(SpellEffIndex /*effIndex*/)
792 {
793 Unit* caster = GetCaster();
794 if (Creature* toyPile = GetRandomToyPile())
795 {
796 caster->CastSpell(toyPile, SPELL_ENERGY_ORB, true);
797 caster->CastSpell(nullptr, SPELL_HEART_LIGHTNING_TETHER, true);
798 }
799 }
800
801 void Register() override
802 {
804 }
805};
806
807// 62826 - Energy Orb
809{
810 bool Validate(SpellInfo const* /*spell*/) override
811 {
812 return ValidateSpellInfo
813 ({
817 });
818 }
819
820 void HandleSummons(SpellEffIndex /*effIndex*/)
821 {
822 Unit* target = GetHitUnit();
823 if (target->GetEntry() != NPC_XT_TOY_PILE)
824 return;
825
826 target->CastSpell(target, SPELL_RECHARGE_BOOMBOT, true);
827
828 if (roll_chance_i(30))
829 target->CastSpell(target, SPELL_RECHARGE_PUMMELER, true);
830
831 for (uint8 i = 0; i < urand(5, 7); ++i)
832 target->CastSpell(target, SPELL_RECHARGE_SCRAPBOT, true);
833
835 base->AI()->Talk(SAY_SUMMON);
836 }
837
838 void Register() override
839 {
841 }
842};
843
844// 62775 - Tympanic Tantrum
846{
847 void FilterTargets(std::list<WorldObject*>& targets)
848 {
849 targets.remove_if([](WorldObject* object) -> bool
850 {
851 if (object->GetTypeId() == TYPEID_PLAYER)
852 return false;
853
854 if (Creature* creature = object->ToCreature())
855 return !creature->IsPet();
856
857 return true;
858 });
859 }
860
862 {
863 SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(GetHitDamage()));
864 }
865
866 void Register() override
867 {
871 }
872};
873
874// 65032 - 321-Boombot Aura
876{
877 bool Validate(SpellInfo const* /*spellInfo*/) override
878 {
880 }
881
882 bool CheckProc(ProcEventInfo& eventInfo)
883 {
884 if (eventInfo.GetActionTarget()->GetEntry() != NPC_XS013_SCRAPBOT)
885 return false;
886 return true;
887 }
888
889 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
890 {
891 if (InstanceScript* instance = eventInfo.GetActor()->GetInstanceScript())
892 instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CREDIT_NERF_SCRAPBOTS);
893 }
894
895 void Register() override
896 {
899 }
900};
901
902// 63849 - Exposed Heart
904{
905 bool Load() override
906 {
907 _damageAmount = 0;
908 return true;
909 }
910
911 void OnProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
912 {
914 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
915 if (!damageInfo || !damageInfo->GetDamage())
916 return;
917
918 _damageAmount += damageInfo->GetDamage();
919 }
920
921 void HandleLifeTransfer(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
922 {
923 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
924 if (Creature* xt002 = instance->GetCreature(DATA_XT002))
925 xt002->AI()->SetData(DATA_TRANSFERED_HEALTH, _damageAmount);
926 }
927
928 void Register() override
929 {
932 }
933
934private:
936};
937
939{
940 public:
941 achievement_nerf_engineering() : AchievementCriteriaScript("achievement_nerf_engineering") { }
942
943 bool OnCheck(Player* /*source*/, Unit* target) override
944 {
945 if (!target || !target->GetAI())
946 return false;
947
948 return !(target->GetAI()->GetData(DATA_HEALTH_RECOVERED));
949 }
950};
951
953{
954 public:
955 achievement_heartbreaker() : AchievementCriteriaScript("achievement_heartbreaker") { }
956
957 bool OnCheck(Player* /*source*/, Unit* target) override
958 {
959 if (!target || !target->GetAI())
960 return false;
961
962 return target->GetAI()->GetData(DATA_HARD_MODE) != 0;
963 }
964};
965
967{
968 public:
969 achievement_nerf_gravity_bombs() : AchievementCriteriaScript("achievement_nerf_gravity_bombs") { }
970
971 bool OnCheck(Player* /*source*/, Unit* target) override
972 {
973 if (!target || !target->GetAI())
974 return false;
975
976 return !(target->GetAI()->GetData(DATA_GRAVITY_BOMB_CASUALTY));
977 }
978};
979
981{
989
998
1002}
Actions
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
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
#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
@ EFFECT_2
Definition: SharedDefines.h:32
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_STATE_SPELL_CHANNEL_OMNI
@ EMOTE_STATE_DANCE
@ EMOTE_ONESHOT_NONE
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ LOOT_MODE_HARD_MODE_1
Definition: SharedDefines.h:78
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
#define AuraEffectProcFn(F, I, N)
Definition: SpellScript.h:2160
#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 AuraCheckProcFn(F)
Definition: SpellScript.h:2130
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT
Definition: UnitDefines.h:173
@ UNIT_STATE_CASTING
Definition: Unit.h:270
Yells
@ ACTION_ENTER_HARD_MODE
Definition: boss_xt002.cpp:102
@ ACTION_START_PHASE_HEART
Definition: boss_xt002.cpp:103
@ ACTION_DISPOSE_HEART
Definition: boss_xt002.cpp:104
@ GROUP_SEARING_GRAVITY
Definition: boss_xt002.cpp:135
@ HEART_VEHICLE_SEAT_EXPOSED
Definition: boss_xt002.cpp:134
@ ACHIEV_MUST_DECONSTRUCT_FASTER
Definition: boss_xt002.cpp:133
XT002Data
Definition: boss_xt002.cpp:108
@ DATA_GRAVITY_BOMB_CASUALTY
Definition: boss_xt002.cpp:112
@ DATA_TRANSFERED_HEALTH
Definition: boss_xt002.cpp:109
@ DATA_HEALTH_RECOVERED
Definition: boss_xt002.cpp:111
@ DATA_HARD_MODE
Definition: boss_xt002.cpp:110
@ SAY_DEATH
Definition: boss_xt002.cpp:123
@ SAY_HEART_OPENED
Definition: boss_xt002.cpp:118
@ EMOTE_HEART_CLOSED
Definition: boss_xt002.cpp:126
@ SAY_AGGRO
Definition: boss_xt002.cpp:117
@ SAY_TYMPANIC_TANTRUM
Definition: boss_xt002.cpp:120
@ EMOTE_SCRAPBOT
Definition: boss_xt002.cpp:128
@ EMOTE_TYMPANIC_TANTRUM
Definition: boss_xt002.cpp:127
@ SAY_SLAY
Definition: boss_xt002.cpp:121
@ EMOTE_HEART_OPENED
Definition: boss_xt002.cpp:125
@ SAY_HEART_CLOSED
Definition: boss_xt002.cpp:119
@ SAY_SUMMON
Definition: boss_xt002.cpp:124
@ SAY_BERSERK
Definition: boss_xt002.cpp:122
@ SPELL_EXPOSED_HEART
Definition: boss_xt002.cpp:53
@ SPELL_TRAMPLE
Definition: boss_xt002.cpp:70
@ SPELL_SUMMON_LIFE_SPARK
Definition: boss_xt002.cpp:35
@ SPELL_ACHIEVEMENT_CREDIT_NERF_SCRAPBOTS
Definition: boss_xt002.cpp:78
@ SPELL_STATIC_CHARGED
Definition: boss_xt002.cpp:65
@ SPELL_RECHARGE_SCRAPBOT
Definition: boss_xt002.cpp:47
@ SPELL_HEART_OVERLOAD
Definition: boss_xt002.cpp:57
@ SPELL_SEARING_LIGHT
Definition: boss_xt002.cpp:34
@ SPELL_COOLDOWN_CREATURE_SPECIAL_2
Definition: boss_xt002.cpp:42
@ SPELL_321_BOOMBOT_AURA
Definition: boss_xt002.cpp:74
@ SPELL_ENRAGE
Definition: boss_xt002.cpp:41
@ SPELL_HEARTBREAK
Definition: boss_xt002.cpp:38
@ SPELL_SHOCK
Definition: boss_xt002.cpp:66
@ SPELL_GRAVITY_BOMB
Definition: boss_xt002.cpp:37
@ SPELL_ENERGY_ORB
Definition: boss_xt002.cpp:51
@ SPELL_RECHARGE_PUMMELER
Definition: boss_xt002.cpp:46
@ SPELL_BOOM
Definition: boss_xt002.cpp:75
@ SPELL_STAND
Definition: boss_xt002.cpp:39
@ SPELL_HEART_RIDE_VEHICLE
Definition: boss_xt002.cpp:54
@ SPELL_TYMPANIC_TANTRUM
Definition: boss_xt002.cpp:33
@ SPELL_RECHARGE_BOOMBOT
Definition: boss_xt002.cpp:48
@ SPELL_SCRAPBOT_RIDE_VEHICLE
Definition: boss_xt002.cpp:55
@ SPELL_SUMMON_VOID_ZONE
Definition: boss_xt002.cpp:36
@ SPELL_CONSUMPTION
Definition: boss_xt002.cpp:61
@ SPELL_HEART_LIGHTNING_TETHER
Definition: boss_xt002.cpp:58
@ SPELL_ARCANE_POWER_STATE
Definition: boss_xt002.cpp:64
@ SPELL_ARCING_SMASH
Definition: boss_xt002.cpp:69
@ SPELL_SCRAP_REPAIR
Definition: boss_xt002.cpp:43
@ SPELL_FULL_HEAL
Definition: boss_xt002.cpp:56
@ SPELL_SUBMERGE
Definition: boss_xt002.cpp:40
@ SPELL_UPPERCUT
Definition: boss_xt002.cpp:71
@ SPELL_RIDE_VEHICLE_EXPOSED
Definition: boss_xt002.cpp:52
XT002Phases
Definition: boss_xt002.cpp:95
@ PHASE_HEART
Definition: boss_xt002.cpp:97
@ PHASE_1
Definition: boss_xt002.cpp:96
XT002Paths
Definition: boss_xt002.cpp:139
@ PATH_XT002_IDLE
Definition: boss_xt002.cpp:140
void AddSC_boss_xt002()
Definition: boss_xt002.cpp:980
@ EVENT_PHASE_CHECK
Definition: boss_xt002.cpp:84
@ EVENT_SEARING_LIGHT
Definition: boss_xt002.cpp:85
@ EVENT_ENTER_HARD_MODE
Definition: boss_xt002.cpp:90
@ EVENT_DISPOSE_HEART
Definition: boss_xt002.cpp:88
@ EVENT_ENRAGE
Definition: boss_xt002.cpp:89
@ EVENT_GRAVITY_BOMB
Definition: boss_xt002.cpp:86
@ EVENT_RESUME_ATTACK
Definition: boss_xt002.cpp:91
@ EVENT_TYMPANIC_TANTRUM
Definition: boss_xt002.cpp:83
@ EVENT_SUBMERGE
Definition: boss_xt002.cpp:87
int32 GetAmount() const
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
WorldObject * GetOwner() const
Unit * GetCaster() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
Definition: SpellScript.h:2129
HookList< EffectProcHandler > OnEffectProc
Definition: SpellScript.h:2155
HookList< AuraProcHandler > OnProc
Definition: SpellScript.h:2145
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
TaskScheduler scheduler
SummonList summons
EventMap events
void _JustDied()
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 SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetRegenerateHealth(bool value)
Definition: Creature.h:358
void AddLootMode(uint16 lootMode)
Definition: Creature.h:298
void LowerPlayerDamageReq(uint64 unDamage)
Definition: Creature.cpp:1680
uint32 GetDamage() const
Definition: Unit.h:446
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 CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
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
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
Unit * GetActionTarget() const
Definition: Unit.h:494
DamageInfo * GetDamageInfo() const
Definition: Unit.h:505
Unit * GetActor() const
Definition: Unit.h:493
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
int32 GetHitDamage() const
Unit * GetCaster() const
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 SetHitDamage(int32 damage)
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
virtual void SetData(uint32, uint32)
Definition: UnitAI.h:74
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
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
int64 ModifyHealth(int64 val)
Definition: Unit.cpp:8182
void SetFullHealth()
Definition: Unit.h:790
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:11501
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
UnitAI * GetAI() const
Definition: Unit.h:660
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetEmoteState(Emote emote)
Definition: Unit.h:852
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:780
uint64 GetMaxHealth() const
Definition: Unit.h:777
uint64 GetHealth() const
Definition: Unit.h:776
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
bool OnCheck(Player *, Unit *target) override
Definition: boss_xt002.cpp:957
bool OnCheck(Player *, Unit *target) override
Definition: boss_xt002.cpp:943
bool OnCheck(Player *, Unit *target) override
Definition: boss_xt002.cpp:971
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
Definition: boss_xt002.cpp:889
bool CheckProc(ProcEventInfo &eventInfo)
Definition: boss_xt002.cpp:882
bool Validate(SpellInfo const *) override
Definition: boss_xt002.cpp:877
void HandleSummons(SpellEffIndex)
Definition: boss_xt002.cpp:820
void Register() override
Definition: boss_xt002.cpp:838
bool Validate(SpellInfo const *) override
Definition: boss_xt002.cpp:810
void OnProc(AuraEffect *, ProcEventInfo &eventInfo)
Definition: boss_xt002.cpp:911
void Register() override
Definition: boss_xt002.cpp:928
void HandleLifeTransfer(AuraEffect const *, AuraEffectHandleModes)
Definition: boss_xt002.cpp:921
void OnPeriodic(AuraEffect const *aurEff)
Definition: boss_xt002.cpp:728
bool Validate(SpellInfo const *) override
Definition: boss_xt002.cpp:716
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
Definition: boss_xt002.cpp:721
void HandleScript(SpellEffIndex)
Definition: boss_xt002.cpp:749
bool Validate(SpellInfo const *) override
Definition: boss_xt002.cpp:766
bool Validate(SpellInfo const *) override
Definition: boss_xt002.cpp:695
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
Definition: boss_xt002.cpp:700
void FilterTargets(std::list< WorldObject * > &targets)
Definition: boss_xt002.cpp:847
void apply(T *val)
Definition: ByteConverter.h:41
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
bool Is25ManRaid() const
void ChangeNextExpose()
Definition: boss_xt002.cpp:158
void Reset() override
Definition: boss_xt002.cpp:174
bool _gravityBombCasualty
Definition: boss_xt002.cpp:418
uint8 _exposeHeartPercent
Definition: boss_xt002.cpp:419
bool _hardMode
Definition: boss_xt002.cpp:417
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:321
void RescheduleEvents()
Definition: boss_xt002.cpp:259
void WaypointReached(uint32 waypointId, uint32 pathId) override
Definition: boss_xt002.cpp:390
void DisposeHeart(bool isHardMode=false)
Definition: boss_xt002.cpp:232
void JustDied(Unit *) override
Definition: boss_xt002.cpp:214
void DoAction(int32 action) override
Definition: boss_xt002.cpp:202
void ExposeHeart()
Definition: boss_xt002.cpp:221
bool _healthRecovered
Definition: boss_xt002.cpp:416
uint32 GetData(uint32 type) const override
Definition: boss_xt002.cpp:283
void PassengerBoarded(Unit *who, int8 seatId, bool apply) override
== Fields =======================================
Definition: boss_xt002.cpp:269
void JustEngagedWith(Unit *who) override
Definition: boss_xt002.cpp:188
void Initialize()
Definition: boss_xt002.cpp:150
void EnterEvadeMode(EvadeReason) override
Definition: boss_xt002.cpp:182
void SetData(uint32 type, uint32 data) override
Definition: boss_xt002.cpp:298
void KilledUnit(Unit *who) override
Definition: boss_xt002.cpp:208
boss_xt002(Creature *creature)
Definition: boss_xt002.cpp:145
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:625
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
Definition: boss_xt002.cpp:615
npc_boombot(Creature *creature)
Definition: boss_xt002.cpp:577
InstanceScript * _instance
Definition: boss_xt002.cpp:631
TaskScheduler _scheduler
Definition: boss_xt002.cpp:633
void Reset() override
Definition: boss_xt002.cpp:579
void Reset() override
Definition: boss_xt002.cpp:640
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:656
npc_life_spark(Creature *creature)
Definition: boss_xt002.cpp:638
TaskScheduler _scheduler
Definition: boss_xt002.cpp:668
void JustEngagedWith(Unit *) override
Definition: boss_xt002.cpp:646
npc_pummeller(Creature *creature)
Definition: boss_xt002.cpp:522
InstanceScript * _instance
Definition: boss_xt002.cpp:571
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:562
TaskScheduler _scheduler
Definition: boss_xt002.cpp:572
void Reset() override
Definition: boss_xt002.cpp:524
npc_scrapbot(Creature *creature)
Definition: boss_xt002.cpp:465
void Reset() override
Definition: boss_xt002.cpp:467
TaskScheduler _scheduler
Definition: boss_xt002.cpp:516
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:509
InstanceScript * _instance
Definition: boss_xt002.cpp:515
void Reset() override
Definition: boss_xt002.cpp:426
void DoAction(int32 action) override
Definition: boss_xt002.cpp:431
void JustDied(Unit *) override
Definition: boss_xt002.cpp:453
InstanceScript * _instance
Definition: boss_xt002.cpp:460
npc_xt002_heart(Creature *creature)
Definition: boss_xt002.cpp:424
void UpdateAI(uint32 diff) override
Definition: boss_xt002.cpp:683
npc_xt_void_zone(Creature *creature)
Definition: boss_xt002.cpp:673
void JustAppeared() override
Definition: boss_xt002.cpp:675
TaskScheduler _scheduler
Definition: boss_xt002.cpp:689
@ DATA_XT002
Definition: ulduar.h:40
@ DATA_XT002_HEART
Definition: ulduar.h:406
#define RegisterUlduarCreatureAI(ai_name)
Definition: ulduar.h:524
@ NPC_XT_TOY_PILE
Definition: ulduar.h:67
@ NPC_XS013_SCRAPBOT
Definition: ulduar.h:99