Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_xt002.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/*
7 @todo
8 Fix void zone damage
9 If the boss is to close to a scrap pile -> no summon -- Needs retail confirmation
10 make the life sparks visible... /? Need test
11 Codestyle
12*/
13
14#include "ScriptMgr.h"
15#include "ScriptedCreature.h"
16#include "SpellScript.h"
17#include "SpellAuraEffects.h"
18#include "ulduar.h"
19#include "Vehicle.h"
20#include "Player.h"
21#include "WorldPacket.h"
22#include "Opcodes.h"
23
25{
29
32
35
38
39 // Cast by 33337 at Heartbreak:
40 SPELL_RECHARGE_PUMMELER = 62831, // Summons 33344
41 SPELL_RECHARGE_SCRAPBOT = 62828, // Summons 33343
42 SPELL_RECHARGE_BOOMBOT = 62835, // Summons 33346
43
44 // Cast by 33329 on 33337 (visual?)
45 SPELL_ENERGY_ORB = 62790, // Triggers 62826 - needs spellscript for periodic tick to cast one of the random spells above
46
49
50 SPELL_HEART_LIGHTNING_TETHER = 64799, // Cast on self?
52 SPELL_ENRAGE = 26662,
53 SPELL_STAND = 37752,
55
56 //------------------VOID ZONE--------------------
59
60 // Life Spark
63 SPELL_SHOCK = 64230,
64
65 //----------------XT-002 HEART-------------------
67 // Channeled
68
69 //---------------XM-024 PUMMELLER----------------
73
74 // Scrabot:
77
78 //------------------BOOMBOT-----------------------
80 SPELL_BOOM = 62834,
81
82 // Achievement-related spells
84};
85
97
99{
107 TIMER_ENRAGE = 600000,
108
110
111 // Life Spark
112 TIMER_SHOCK = 12000,
113
114 // Pummeller
115 // Timers may be off
119
121};
122
132
137
145
161
166
172
173/*-------------------------------------------------------
174 *
175 * XT-002 DECONSTRUCTOR
176 *
177 *///----------------------------------------------------
179{
180public:
181 boss_xt002() : CreatureScript("boss_xt002") { }
182
183 struct boss_xt002_AI : public BossAI
184 {
185 boss_xt002_AI(Creature* creature) : BossAI(creature, BOSS_XT002)
186 {
187 _healthRecovered = false;
188 _hardMode = false;
189 _gravityBombCasualty = false;
190
191 _phase = 0;
192 _heartExposed = 0;
193 _transferHealth = 0;
194 }
195
197 {
198 _Reset();
199
201 me->SetReactState(REACT_AGGRESSIVE);
203
204 _healthRecovered = false;
205 _gravityBombCasualty = false;
206 _hardMode = false;
207
208 _phase = 1;
209 _heartExposed = 0;
210
211 if (!instance)
212 return;
213
215 }
216
217 void EnterCombat(Unit* /*who*/) OVERRIDE
218 {
220 _EnterCombat();
221
222 events.ScheduleEvent(EVENT_ENRAGE, TIMER_ENRAGE);
225 //Tantrum is casted a bit slower the first time.
227
228 if (!instance)
229 return;
230
232 }
233
235 {
236 switch (action)
237 {
239 {
240 events.ScheduleEvent(EVENT_ENTER_HARD_MODE, 1);
241 break;
242 }
243 }
244 }
245
247 {
248 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
249 Talk(SAY_SLAY);
250 }
251
252 void JustDied(Unit* /*killer*/) OVERRIDE
253 {
255 _JustDied();
256 }
257
258 void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE
259 {
260 if (!_hardMode && _phase == 1 && !HealthAbovePct(100 - 25 * (_heartExposed+1)))
261 ExposeHeart();
262 }
263
265 {
266 if (!UpdateVictim() || !CheckInRoom())
267 return;
268
269 events.Update(diff);
270
271 if (me->HasUnitState(UNIT_STATE_CASTING))
272 return;
273
274 while (uint32 eventId = events.ExecuteEvent())
275 {
276 switch (eventId)
277 {
279 {
280 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
282
284 break;
285 }
287 {
288 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
290
292 break;
293 }
295 {
300 break;
301 }
303 {
304 SetPhaseOne();
305 break;
306 }
307 case EVENT_ENRAGE:
308 {
311 break;
312 }
314 {
315
316 me->SetFullHealth();
318 me->AddLootMode(LOOT_MODE_HARD_MODE_1);
319 _hardMode = true;
320 SetPhaseOne();
321 break;
322 }
323 }
324 }
325
326 if (_phase == 1)
328 }
329
330 void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) OVERRIDE
331 {
332 if (apply && who->GetEntry() == NPC_XS013_SCRAPBOT)
333 {
334 // Need this so we can properly determine when to expose heart again in damagetaken hook
335 if (me->GetHealthPct() > (25 * (4 - _heartExposed)))
337
339 _healthRecovered = true;
340 }
341 }
342
344 {
345 switch (type)
346 {
347 case DATA_HARD_MODE:
348 {
349 return _hardMode ? 1 : 0;
350 }
352 {
353 return _healthRecovered ? 1 : 0;
354 }
356 {
357 return _gravityBombCasualty ? 1 : 0;
358 }
359 }
360
361 return 0;
362 }
363
364 void SetData(uint32 type, uint32 data) OVERRIDE
365 {
366 switch (type)
367 {
369 {
370 _transferHealth = data;
371 break;
372 }
374 {
375 _gravityBombCasualty = (data > 0) ? true : false;
376 break;
377 }
378 }
379 }
380
382 {
385
386 DoCast(me, SPELL_SUBMERGE); // WIll make creature untargetable
387 me->AttackStop();
388 me->SetReactState(REACT_PASSIVE);
389
390 Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT_NORMAL) : NULL;
391 if (heart)
392 {
393 heart->CastSpell(heart, SPELL_HEART_OVERLOAD, false);
395 heart->CastSpell(heart, SPELL_HEART_HEAL_TO_FULL, true);
396 heart->CastSpell(heart, SPELL_EXPOSED_HEART, false); // Channeled
400 }
401
402 events.CancelEvent(EVENT_SEARING_LIGHT);
403 events.CancelEvent(EVENT_GRAVITY_BOMB);
404 events.CancelEvent(EVENT_TYMPANIC_TANTRUM);
405
406 // Start "end of phase 2 timer"
408
409 // Phase 2 has officially started
410 _phase = 2;
412 }
413
415 {
418
420 me->SetReactState(REACT_AGGRESSIVE);
421
422 _phase = 1;
423
424 events.RescheduleEvent(EVENT_SEARING_LIGHT, TIMER_SEARING_LIGHT / 2);
427
428 Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT_EXPOSED) : NULL;
429 if (!heart)
430 return;
431
436
437 if (!_hardMode)
438 {
439 if (!_transferHealth)
440 _transferHealth = (heart->GetMaxHealth() - heart->GetHealth());
441
442 me->ModifyHealth(-((int32)_transferHealth));
443 }
444 }
445
446 private:
447 // Achievement related
448 bool _healthRecovered; // Did a scrapbot recover XT-002's health during the encounter?
449 bool _hardMode; // Are we in hard mode? Or: was the heart killed during phase 2?
450 bool _gravityBombCasualty; // Did someone die because of Gravity Bomb damage?
451
455 };
456
458 {
459 return GetUlduarAI<boss_xt002_AI>(creature);
460 }
461};
462
463/*-------------------------------------------------------
464 *
465 * XT-002 HEART
466 *
467 *///----------------------------------------------------
468
470{
471public:
472 npc_xt002_heart() : CreatureScript("npc_xt002_heart") { }
473
475 {
476 npc_xt002_heartAI(Creature* creature) : ScriptedAI(creature),
477 _instance(creature->GetInstanceScript())
478 {
479 SetCombatMovement(false);
480 }
481
482 void UpdateAI(uint32 /*diff*/) OVERRIDE { }
483
484 void JustDied(Unit* /*killer*/) OVERRIDE
485 {
486 Creature* xt002 = _instance ? me->GetCreature(*me, _instance->GetData64(BOSS_XT002)) : NULL;
487 if (!xt002 || !xt002->AI())
488 return;
489
490 xt002->AI()->SetData(DATA_TRANSFERED_HEALTH, me->GetHealth());
492 }
493
494 private:
496 };
497
499 {
500 return new npc_xt002_heartAI(creature);
501 }
502};
503
504/*-------------------------------------------------------
505 *
506 * XS-013 SCRAPBOT
507 *
508 *///----------------------------------------------------
510{
511public:
512 npc_scrapbot() : CreatureScript("npc_scrapbot") { }
513
515 {
516 npc_scrapbotAI(Creature* creature) : ScriptedAI(creature)
517 {
518 _instance = me->GetInstanceScript();
520 }
521
523 {
524 me->SetReactState(REACT_PASSIVE);
525
526 _rangeCheckTimer = 500;
527
528 if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
529 me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
530 }
531
533 {
534 if (_rangeCheckTimer <= diff)
535 {
536 if (Creature* xt002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
537 {
538 if (me->IsWithinMeleeRange(xt002))
539 {
541 // Unapply vehicle aura again
542 xt002->RemoveAurasDueToSpell(SPELL_SCRAPBOT_RIDE_VEHICLE);
543 me->DespawnOrUnsummon();
544 }
545 }
546 }
547 else
548 _rangeCheckTimer -= diff;
549 }
550
551 private:
554 };
555
557 {
558 return new npc_scrapbotAI(creature);
559 }
560};
561
562/*-------------------------------------------------------
563 *
564 * XM-024 PUMMELLER
565 *
566 *///----------------------------------------------------
568{
569public:
570 npc_pummeller() : CreatureScript("npc_pummeller") { }
571
573 {
574 npc_pummellerAI(Creature* creature) : ScriptedAI(creature)
575 {
576 _instance = creature->GetInstanceScript();
577
579 _trampleTimer = 0;
580 _uppercutTimer = 0;
581 }
582
584 {
588
589 if (Creature* xt002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
590 {
591 Position pos;
592 xt002->GetPosition(&pos);
593 me->GetMotionMaster()->MovePoint(0, pos);
594 }
595 }
596
598 {
599 if (!UpdateVictim())
600 return;
601
602 if (me->IsWithinMeleeRange(me->GetVictim()))
603 {
604 if (_arcingSmashTimer <= diff)
605 {
608 }
609 else
610 _arcingSmashTimer -= diff;
611
612 if (_trampleTimer <= diff)
613 {
616 }
617 else
618 _trampleTimer -= diff;
619
620 if (_uppercutTimer <= diff)
621 {
624 }
625 else
626 _uppercutTimer -= diff;
627 }
628
630 }
631
632 private:
637 };
638
640 {
641 return new npc_pummellerAI(creature);
642 }
643};
644
645/*-------------------------------------------------------
646 *
647 * XE-321 BOOMBOT
648 *
649 *///----------------------------------------------------
650class BoomEvent : public BasicEvent
651{
652public:
654 {
655 }
656
657 bool Execute(uint64 /*time*/, uint32 /*diff*/)
658 {
659 // This hack is here because we suspect our implementation of spell effect execution on targets
660 // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets,
661 // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc.
662 // The above situation causes the visual for this spell to be bugged, so we remove the instakill
663 // effect and implement a script hack for that.
664
665 _me->CastSpell(_me, SPELL_BOOM, false);
666 return true;
667 }
668
669private:
671};
672
674{
675public:
676 npc_boombot() : CreatureScript("npc_boombot") { }
677
678 struct npc_boombotAI : public ScriptedAI
679 {
680 npc_boombotAI(Creature* creature) : ScriptedAI(creature)
681 {
682 _instance = creature->GetInstanceScript();
683 _boomed = false;
684 }
685
687 {
688 _boomed = false;
689
690 DoCast(SPELL_AURA_BOOMBOT); // For achievement
691
692 // HACK/workaround:
693 // these values aren't confirmed - lack of data - and the values in DB are incorrect
694 // these values are needed for correct damage of Boom spell
695 me->SetFloatValue(UNIT_FIELD_MIN_DAMAGE, 15000.0f);
696 me->SetFloatValue(UNIT_FIELD_MAX_DAMAGE, 18000.0f);
697
699 if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
700 me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
701 }
702
703 void DamageTaken(Unit* /*who*/, uint32& damage) OVERRIDE
704 {
705 if (damage >= (me->GetHealth() - me->GetMaxHealth() * 0.5f) && !_boomed)
706 {
707 _boomed = true; // Prevent recursive calls
708
710 data << uint64(me->GetGUID());
711 data << uint64(me->GetGUID());
712 data << uint32(SPELL_BOOM);
713 me->SendMessageToSet(&data, false);
714
715 me->DealDamage(me, me->GetHealth(), NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
716
717 damage = 0;
718
719 // Visual only seems to work if the instant kill event is delayed or the spell itself is delayed
720 // Casting done from player and caster source has the same targetinfo flags,
721 // so that can't be the issue
722 // See BoomEvent class
723 // Schedule 1s delayed
724 me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1*IN_MILLISECONDS));
725 }
726 }
727
728 void UpdateAI(uint32 /*diff*/) OVERRIDE
729 {
730 if (!UpdateVictim())
731 return;
732
733 // No melee attack
734 }
735
736 private:
739 };
740
742 {
743 return new npc_boombotAI(creature);
744 }
745};
746
747
748/*-------------------------------------------------------
749 *
750 * LIFE SPARK
751 *
752 *///----------------------------------------------------
754{
755public:
756 npc_life_spark() : CreatureScript("npc_life_spark") { }
757
759 {
760 npc_life_sparkAI(Creature* creature) : ScriptedAI(creature)
761 {
762 _shockTimer = 0;
763 }
764
766 {
768 _shockTimer = 0; // first one is immediate.
769 }
770
772 {
773 if (!UpdateVictim())
774 return;
775
776 if (_shockTimer <= diff)
777 {
778 if (me->IsWithinMeleeRange(me->GetVictim()))
779 {
782 }
783 }
784 else _shockTimer -= diff;
785 }
786
787 private:
789 };
790
792 {
793 return new npc_life_sparkAI(creature);
794 }
795};
796
798{
799public:
800 spell_xt002_searing_light_spawn_life_spark() : SpellScriptLoader("spell_xt002_searing_light_spawn_life_spark") { }
801
803 {
805
806 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
807 {
808 if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_LIFE_SPARK))
809 return false;
810 return true;
811 }
812
813 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
814 {
815 if (Player* player = GetOwner()->ToPlayer())
816 if (Unit* xt002 = GetCaster())
817 if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode
818 player->CastSpell(player, SPELL_SUMMON_LIFE_SPARK, true);
819 }
820
825 };
826
831};
832
834{
835public:
836 spell_xt002_gravity_bomb_aura() : SpellScriptLoader("spell_xt002_gravity_bomb_aura") { }
837
839 {
841
842 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
843 {
844 if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_VOID_ZONE))
845 return false;
846 return true;
847 }
848
849 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
850 {
851 if (Player* player = GetOwner()->ToPlayer())
852 if (Unit* xt002 = GetCaster())
853 if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode
854 player->CastSpell(player, SPELL_SUMMON_VOID_ZONE, true);
855 }
856
857 void OnPeriodic(AuraEffect const* aurEff)
858 {
859 Unit* xt002 = GetCaster();
860 if (!xt002)
861 return;
862
863 Unit* owner = GetOwner()->ToUnit();
864 if (!owner)
865 return;
866
867 if (aurEff->GetAmount() >= int32(owner->GetHealth()))
868 if (xt002->GetAI())
870 }
871
877 };
878
883};
884
916
918{
919public:
920 spell_xt002_heart_overload_periodic() : SpellScriptLoader("spell_xt002_heart_overload_periodic") { }
921
923 {
925
926 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
927 {
928 if (!sSpellMgr->GetSpellInfo(SPELL_ENERGY_ORB))
929 return false;
930
931 if (!sSpellMgr->GetSpellInfo(SPELL_RECHARGE_BOOMBOT))
932 return false;
933
934 if (!sSpellMgr->GetSpellInfo(SPELL_RECHARGE_PUMMELER))
935 return false;
936
937 if (!sSpellMgr->GetSpellInfo(SPELL_RECHARGE_SCRAPBOT))
938 return false;
939
940 return true;
941 }
942
943 void HandlePeriodic(AuraEffect const* /*aurEff*/)
944 {
946
947 if (Unit* caster = GetCaster())
948 {
949 if (InstanceScript* instance = caster->GetInstanceScript())
950 {
951 if (Unit* toyPile = ObjectAccessor::GetUnit(*caster, instance->GetData64(DATA_TOY_PILE_0 + std::rand() % 3)))
952 {
953 caster->CastSpell(toyPile, SPELL_ENERGY_ORB, true);
954
955 // This should probably be incorporated in a dummy effect handler, but I've had trouble getting the correct target
956 // Weighed randomization (approximation)
959
960 for (uint8 i = 0; i < 5; ++i)
961 {
962 uint8 a = std::rand() % 4;
963 uint32 spellId = spells[a];
964 toyPile->CastSpell(toyPile, spellId, true, NULL, NULL, instance->GetData64(BOSS_XT002));
965 }
966 }
967 }
968
969 if (Creature* base = caster->GetVehicleCreatureBase())
970 base->AI()->Talk(SAY_SUMMON);
971 }
972 }
973
978 };
979
984};
985
1018
1049
1080
1082{
1083public:
1084 achievement_nerf_engineering() : AchievementCriteriaScript("achievement_nerf_engineering") { }
1085
1086 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
1087 {
1088 if (!target || !target->GetAI())
1089 return false;
1090
1091 return !(target->GetAI()->GetData(DATA_HEALTH_RECOVERED));
1092 }
1093};
1094
1096{
1097public:
1098 achievement_heartbreaker() : AchievementCriteriaScript("achievement_heartbreaker") { }
1099
1100 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
1101 {
1102 if (!target || !target->GetAI())
1103 return false;
1104
1105 return target->GetAI()->GetData(DATA_HARD_MODE);
1106 }
1107};
1108
1110{
1111public:
1112 achievement_nerf_gravity_bombs() : AchievementCriteriaScript("achievement_nerf_gravity_bombs") { }
1113
1114 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
1115 {
1116 if (!target || !target->GetAI())
1117 return false;
1118
1119 return !(target->GetAI()->GetData(DATA_GRAVITY_BOMB_CASUALTY));
1120 }
1121};
1122
Actions
@ IN_MILLISECONDS
Definition Common.h:125
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:158
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::int8_t int8
Definition Define.h:75
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ TYPEID_PLAYER
Definition Object.h:55
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TARGET_UNIT_SRC_AREA_ENEMY
@ LOOT_MODE_HARD_MODE_1
@ SPELL_SCHOOL_MASK_NORMAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_STAND_STATE_SUBMERGED
Definition Unit.h:171
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_DISABLE_POWERS
Definition Unit.h:654
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ NODAMAGE
Definition Unit.h:618
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_MIN_DAMAGE
@ UNIT_FIELD_ANIM_TIER
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_MAX_DAMAGE
Creatures
@ SPELL_ENRAGE
@ EVENT_ENRAGE
@ SAY_BERSERK
@ SAY_SLAY
@ SPELL_SUBMERGE
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_SUICIDE
AchievementCredits
@ ACHIEV_MUST_DECONSTRUCT_FASTER
@ ACTION_ENTER_HARD_MODE
@ NPC_LIFE_SPARK
@ NPC_XM024_PUMMELLER
@ NPC_XE321_BOOMBOT
@ NPC_VOID_ZONE
@ NPC_XT002_HEART
@ NPC_XS013_SCRAPBOT
XT002Data
@ DATA_GRAVITY_BOMB_CASUALTY
@ DATA_TRANSFERED_HEALTH
@ DATA_HEALTH_RECOVERED
@ DATA_HARD_MODE
@ SAY_DEATH
@ SAY_HEART_OPENED
@ EMOTE_HEART_CLOSED
@ SAY_AGGRO
@ SAY_TYMPANIC_TANTRUM
@ EMOTE_SCRAPBOT
@ EMOTE_TYMPANIC_TANTRUM
@ SAY_SLAY
@ EMOTE_HEART_OPENED
@ SAY_HEART_CLOSED
@ SAY_SUMMON
@ SAY_BERSERK
@ SPELL_EXPOSED_HEART
@ SPELL_TRAMPLE
@ SPELL_SUMMON_LIFE_SPARK
@ SPELL_ACHIEVEMENT_CREDIT_NERF_SCRAPBOTS
@ SPELL_RECHARGE_SCRAPBOT
@ SPELL_VOID_ZONE_10
@ SPELL_HEART_OVERLOAD
@ SPELL_SEARING_LIGHT_10
@ SPELL_ENRAGE
@ SPELL_GRAVITY_BOMB_10
@ SPELL_SHOCK
@ SPELL_GRAVITY_BOMB_25
@ SPELL_ENERGY_ORB
@ SPELL_RECHARGE_PUMMELER
@ SPELL_BOOM
@ SPELL_HEART_HEAL_TO_FULL
@ SPELL_STAND
@ SPELL_HEART_RIDE_VEHICLE
@ SPELL_TYMPANIC_TANTRUM
@ SPELL_RECHARGE_BOOMBOT
@ SPELL_SCRAPBOT_RIDE_VEHICLE
@ SPELL_SUMMON_VOID_ZONE
@ SPELL_SEARING_LIGHT_25
@ SPELL_HEARTBREAK_25
@ SPELL_HEART_LIGHTNING_TETHER
@ SPELL_STATIC_CHARGED_25
@ SPELL_VOID_ZONE_25
@ SPELL_ARCING_SMASH
@ SPELL_AURA_BOOMBOT
@ SPELL_STATIC_CHARGED_10
@ SPELL_SUBMERGE
@ SPELL_UPPERCUT
@ SPELL_HEARTBREAK_10
Timers
@ TIMER_SEARING_LIGHT
@ TIMER_TYMPANIC_TANTRUM_MAX
@ TIMER_UPPERCUT
@ TIMER_TRAMPLE
@ TIMER_VOID_ZONE
@ TIMER_TYMPANIC_TANTRUM_MIN
@ TIMER_ENERGY_ORB_MIN
@ TIMER_ENERGY_ORB_MAX
@ TIMER_ARCING_SMASH
@ TIMER_GRAVITY_BOMB
@ TIMER_HEART_PHASE
@ TIMER_SHOCK
@ TIMER_SPAWN_ADD
@ TIMER_ENRAGE
VehicleSeats
@ HEART_VEHICLE_SEAT_NORMAL
@ HEART_VEHICLE_SEAT_EXPOSED
void AddSC_boss_xt002()
@ EVENT_ENERGY_ORB
@ EVENT_SEARING_LIGHT
@ EVENT_ENTER_HARD_MODE
@ EVENT_DISPOSE_HEART
@ EVENT_ENRAGE
@ EVENT_GRAVITY_BOMB
@ EVENT_TYMPANIC_TANTRUM
@ EVENT_HEART_PHASE
AchievementCriteriaScript(const char *name)
int32 GetAmount() const
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
WorldObject * GetOwner() const
Unit * GetCaster() const
bool Execute(uint64, uint32)
Creature * _me
BoomEvent(Creature *me)
InstanceScript *const instance
bool CheckInRoom()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
static Unit * GetUnit(WorldObject const &, uint64 guid)
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:1158
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:1261
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:1280
Unit * ToUnit()
Definition Object.h:210
Creature * GetHitCreature()
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
void SetHitDamage(int32 damage)
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
int32 GetHitDamage()
SpellScriptLoader(const char *name)
virtual void SetData(uint32, uint32)
Definition UnitAI.h:128
virtual void DoAction(int32)
Definition UnitAI.h:126
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:7208
uint32 GetMaxHealth() const
Definition Unit.h:1604
uint32 GetHealth() const
Definition Unit.h:1600
UnitAI * GetAI()
Definition Unit.h:1393
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:8274
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
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
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_xt002_stand_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_xt002_submerged_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_xt002_tympanic_tantrum_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
@ SMSG_SPELLINSTAKILLLOG
Definition Opcodes.h:972
void GetPosition(float &x, float &y) const
Definition Object.h:333
void SetCombatMovement(bool allowMovement)
Creature * me
bool HealthAbovePct(uint32 pct) const
const T & RAID_MODE(const T &normal10, const T &normal25) const
ScriptedAI(Creature *creature)
void DamageTaken(Unit *, uint32 &) OVERRIDE
void PassengerBoarded(Unit *who, int8, bool apply) OVERRIDE
== Fields =======================================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE
uint32 GetData(uint32 type) const OVERRIDE
void KilledUnit(Unit *who) OVERRIDE
void JustDied(Unit *) OVERRIDE
void DoAction(int32 action) OVERRIDE
boss_xt002_AI(Creature *creature)
void SetData(uint32 type, uint32 data) OVERRIDE
npc_boombotAI(Creature *creature)
void DamageTaken(Unit *, uint32 &damage) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
InstanceScript * _instance
npc_life_sparkAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
npc_pummellerAI(Creature *creature)
npc_scrapbotAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
npc_xt002_heartAI(Creature *creature)
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
@ BOSS_XT002
Definition ulduar.h:23
@ DATA_TOY_PILE_0
Definition ulduar.h:270
AI * GetUlduarAI(T *obj)
Definition ulduar.h:336