TrinityCore
boss_kiljaeden.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/* ScriptData
19SDName: Boss_Kiljaeden
20SD%Complete: 80
21SDComment: Sinister Reflection Model, Armageddon Visual, SAY_KJ_SHADOWSPIKE3, Emote, End Sequence
22SDCategory: Sunwell_Plateau
23EndScriptData */
24
26
27#include "ScriptMgr.h"
28#include "GameObject.h"
29#include "GameObjectAI.h"
30#include "InstanceScript.h"
31#include "Log.h"
32#include "MotionMaster.h"
33#include "ObjectAccessor.h"
34#include "Player.h"
35#include "ScriptedCreature.h"
36#include "sunwell_plateau.h"
37#include "TemporarySummon.h"
38#include <cmath>
39
40/*** Speech and sounds***/
42{
44
56
66
71};
72
73/*** Spells used during the encounter ***/
75{
76 /* Hand of the Deceiver's spells and cosmetics */
77 SPELL_SHADOW_BOLT_VOLLEY = 45770, // ~30 yard range Shadow Bolt Volley for ~2k(?) damage
78 SPELL_SHADOW_INFUSION = 45772, // They gain this at 20% - Immunity to Stun/Silence and makes them look angry!
79 SPELL_FELFIRE_PORTAL = 46875, // Creates a portal that spawns Felfire Fiends (LIVE FOR THE SWARM!1 FOR THE OVERMIND!)
80 SPELL_SHADOW_CHANNELING = 46757, // Channeling animation out of combat
81
82 /* Volatile Felfire Fiend's spells */
83 SPELL_FELFIRE_FISSION = 45779, // Felfire Fiends explode when they die or get close to target.
84
85 /* Kil'Jaeden's spells and cosmetics */
86 SPELL_TRANS = 23188, // Surprisingly, this seems to be the right spell.. (Where is it used?)
87 SPELL_REBIRTH = 44200, // Emerge from the Sunwell
88 SPELL_SOUL_FLAY = 45442, // 9k Shadow damage over 3 seconds. Spammed throughout all the fight.
90 SPELL_LEGION_LIGHTNING = 45664, // Chain Lightning, 4 targets, ~3k Shadow damage, 1.5fk mana burn
91 SPELL_FIRE_BLOOM = 45641, // Places a debuff on 5 raid members, which causes them to deal 2k Fire damage to nearby allies and selves. MIGHT NOT WORK
92 SPELL_DESTROY_ALL_DRAKES = 46707, // when he use it?
93
94 SPELL_SINISTER_REFLECTION = 45785, // Summon shadow copies of 5 raid members that fight against KJ's enemies//dont work
95 // 45892 // right one for SPELL_SINISTER_REFLECTION but no EffectScriptEffect
96 SPELL_COPY_WEAPON = 41055, // }
97 SPELL_COPY_WEAPON2 = 41054, // }
98 SPELL_COPY_OFFHAND = 45206, // }- Spells used in Sinister Reflection creation
100
101 SPELL_SHADOW_SPIKE = 46680, // Bombard random raid members with Shadow Spikes (Very similar to Void Reaver orbs)
102 SPELL_FLAME_DART = 45737, // Bombards the raid with flames every 3(?) seconds
103 SPELL_DARKNESS_OF_A_THOUSAND_SOULS = 46605, // Begins a 8-second channeling, after which he will deal 50'000 damage to the raid
105
106 /* Armageddon spells wrong visual */
107 SPELL_ARMAGEDDON_TRIGGER = 45909, // Meteor spell trigger missile should cast Creature on himself
108 SPELL_ARMAGEDDON_VISUAL = 45911, // Does the hellfire visual to indicate where the meteor missle lands
109 SPELL_ARMAGEDDON_VISUAL2 = 45914, // Does the light visual to indicate where the meteor missle lands
110 SPELL_ARMAGEDDON_VISUAL3 = 24207, // This shouldn't correct but same as seen on the movie
111 SPELL_ARMAGEDDON_SUMMON_TRIGGER = 45921, // Summons the triggers that cast the spells on himself need random target select
112 SPELL_ARMAGEDDON_DAMAGE = 45915, // This does the area damage
113
114 /* Shield Orb Spells*/
115 SPELL_SHADOW_BOLT = 45680, //45679 would be correct but triggers to often /// @todo fix console error
116
117 /* Anveena's spells and cosmetics (Or, generally, everything that has "Anveena" in name) */
118 SPELL_ANVEENA_PRISON = 46367, // She hovers locked within a bubble
119 SPELL_ANVEENA_ENERGY_DRAIN = 46410, // Sunwell energy glow animation (Control mob uses this)
120 SPELL_SACRIFICE_OF_ANVEENA = 46474, // This is cast on Kil'Jaeden when Anveena sacrifices herself into the Sunwell
121
122 /* Sinister Reflection Spells */
125
127
129
131
134
137
141
143
145 //SPELL_SR_PLAGU STRIKE = 58843, Dk Spell!
146
147 /*** Other Spells (used by players, etc) ***/
148 SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT = 45839, // Possess the blue dragon from the orb to help the raid.
149 SPELL_ENTROPIUS_BODY = 46819, // Visual for Entropius at the Epilogue
150 SPELL_RING_OF_BLUE_FLAMES = 45825 //Cast this spell when the go is activated
152
153/*** Others ***/
154#define SHIELD_ORB_Z 45.000f
155
157{
158 PHASE_DECEIVERS = 1, // Fight 3 adds
159 PHASE_NORMAL = 2, // Kil'Jaeden emerges from the sunwell
160 PHASE_DARKNESS = 3, // At 85%, he gains few abilities; Kalecgos joins the fight
161 PHASE_ARMAGEDDON = 4, // At 55%, he gains even more abilities
162 PHASE_SACRIFICE = 5 // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
164
165//Timers
167{
169
170 //Phase 2 Timer
175
176 //Phase 3 Timer
181
182 //Phase 4 Timer
185
186// Locations of the Hand of Deceiver adds
188{
189 {1682.949951f, 637.75000f, 28.0231f, 5.717090f},
190 {1684.699951f, 614.41998f, 28.0580f, 0.698392f},
191 {1707.609985f, 612.15002f, 28.0946f, 1.990370f}
192};
193
194// Locations, where Shield Orbs will spawn
196{
197 {1698.900f, 627.870f}, // middle pont of Sunwell
198 {12, 3.14f}, // First one spawns northeast of KJ
199 {12, 3.14f/0.7f}, // Second one spawns southeast
200 {12, 3.14f*3.8f} // Third one spawns (?)
201};
202
203struct Speech
204{
207};
208
209// Timers
211{
212 //Kil Phase 1 -> Phase 2
215 //Kil Phase 2 -> Phase 3
219 //Kil Phase 3 -> Phase 4
223 //Kil Phase 4 -> Phase 5
229
230 // use in End sequence?
232};
233
234//AI for Kalecgos
236{
237public:
238 boss_kalecgos_kj() : CreatureScript("boss_kalecgos_kj") { }
239
240 CreatureAI* GetAI(Creature* creature) const override
241 {
242 return GetSunwellPlateauAI<boss_kalecgos_kjAI>(creature);
243 }
244
246 {
248 {
249 Initialize();
250 instance = creature->GetInstanceScript();
251 }
252
254 {
255 OrbsEmpowered = 0;
256 EmpowerCount = 0;
257 }
258
262
263 void Reset() override
264 {
265 Initialize();
266 me->SetDisableGravity(true);
267 me->SetUninteractible(true);
268 me->setActive(true);
269 me->SetFarVisible(true);
270
271 for (uint8 i = 0; i < 4; ++i)
272 if (GameObject* pOrb = GetOrb(i))
273 pOrb->SetGoType(GAMEOBJECT_TYPE_BUTTON);
274 }
275
277 {
278 switch (index)
279 {
280 case 0:
282 case 1:
284 case 2:
286 case 3:
288 }
289
290 return nullptr;
291 }
292
294 {
296 for (uint8 i = 0; i < 4; ++i)
297 if (GameObject* pOrb = GetOrb(i))
298 pOrb->SetFaction(FACTION_NONE);
299 }
300
301 void EmpowerOrb(bool all)
302 {
303 GameObject* pOrbEmpowered = GetOrb(OrbsEmpowered);
304 if (!pOrbEmpowered)
305 return;
306
307 if (all)
308 {
310 for (uint8 i = 0; i < 4; ++i)
311 {
312 if (GameObject* pOrb = GetOrb(i))
313 {
314 pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
315 pOrb->SetFaction(FACTION_FRIENDLY);
316 pOrb->setActive(true);
317 pOrb->SetFarVisible(true);
318 pOrb->Refresh();
319 }
320 }
322 }
323 else
324 {
325 if (GameObject* pOrb = GetOrb(urand(0, 3)))
326 {
327 pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
328 pOrb->SetFaction(FACTION_FRIENDLY);
329 pOrb->setActive(true);
330 pOrb->SetFarVisible(true);
331 pOrb->Refresh();
332
334
335 ++EmpowerCount;
336 switch (EmpowerCount)
337 {
338 case 1: Talk(SAY_KALECGOS_READY1); break;
339 case 2: Talk(SAY_KALECGOS_READY2); break;
340 case 3: Talk(SAY_KALECGOS_READY3); break;
341 case 4: Talk(SAY_KALECGOS_READY4); break;
342 }
343 }
344 }
345 }
346
347 void UpdateAI(uint32 /*diff*/) override
348 {
349 }
350
352 {
354 for (uint8 i = 0; i < 4; ++i)
355 {
356 if (GameObject* pOrb = GetOrb(i))
357 {
358 if (pOrb->GetFaction() == FACTION_FRIENDLY)
359 {
360 pOrb->CastSpell(me, SPELL_RING_OF_BLUE_FLAMES);
361 pOrb->setActive(true);
362 pOrb->SetFarVisible(true);
363 pOrb->Refresh();
364 }
365 }
366 }
367 }
368 };
369};
370
372{
373 public:
374 go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
375
377 {
378 go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
379
381
382 bool OnGossipHello(Player* player) override
383 {
385 {
387 player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
389
391 ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
392
393 me->Refresh();
394 }
395 return true;
396 }
397 };
398
399 GameObjectAI* GetAI(GameObject* go) const override
400 {
401 return GetSunwellPlateauAI<go_orb_of_the_blue_flightAI>(go);
402 }
403};
404
405//AI for Kil'jaeden Event Controller
407{
408public:
409 npc_kiljaeden_controller() : CreatureScript("npc_kiljaeden_controller") { }
410
411 CreatureAI* GetAI(Creature* creature) const override
412 {
413 return GetSunwellPlateauAI<npc_kiljaeden_controllerAI>(creature);
414 }
415
417 {
419 {
420 Initialize();
421 instance = creature->GetInstanceScript();
422
423 SetCombatMovement(false);
424 }
425
427 {
430 bSummonedDeceivers = false;
431 bKiljaedenDeath = false;
432 uiRandomSayTimer = 30000;
433 }
434
437
440
444
445 void InitializeAI() override
446 {
447 me->SetUninteractible(true);
450
452 }
453
454 void Reset() override
455 {
456 Initialize();
457
459 ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
461 }
462
463 void JustSummoned(Creature* summoned) override
464 {
465 switch (summoned->GetEntry())
466 {
468 summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);
469 break;
470 case NPC_ANVEENA:
471 summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);
472 break;
473 case NPC_KILJAEDEN:
474 summoned->CastSpell(summoned, SPELL_REBIRTH, false);
475 AddThreat(me->GetVictim(), 1.0f, summoned);
476 break;
477 }
478 summons.Summon(summoned);
479 }
480
481 void UpdateAI(uint32 diff) override
482 {
483 if (uiRandomSayTimer < diff)
484 {
487 uiRandomSayTimer = 30000;
488 } else uiRandomSayTimer -= diff;
489
491 {
492 for (uint8 i = 0; i < 3; ++i)
494
497 bSummonedDeceivers = true;
498 }
499
501 {
505 }
506 }
507 };
508};
509
510//AI for Kil'jaeden
512{
513public:
514 boss_kiljaeden() : CreatureScript("boss_kiljaeden") { }
515
517 {
519 {
520 Initialize();
521 instance = creature->GetInstanceScript();
522 speechPhaseEnd = 0;
523
524 SetCombatMovement(false);
525 }
526
528 {
530 Timer[TIMER_SPEECH] = 0;
531
532 //Phase 2 Timer
533 Timer[TIMER_SOUL_FLAY] = 11000;
535 Timer[TIMER_FIRE_BLOOM] = 20000;
537
538 //Phase 3 Timer
540 Timer[TIMER_FLAME_DART] = 3000;
541 Timer[TIMER_DARKNESS] = 45000;
542 Timer[TIMER_ORBS_EMPOWER] = 35000;
543
544 //Phase 4 Timer
545 Timer[TIMER_ARMAGEDDON] = 2000;
546
547 ActiveTimers = 5;
548 WaitTimer = 0;
549 speechCount = 0;
550 SpeechTimer = 0;
551
553
554 IsInDarkness = false;
555 IsWaiting = false;
556 OrbActivated = false;
557 SpeechBegins = true;
558
559 ChangeTimers(false, 0);
560 }
561
564
568
573
574 /* Boolean */
580
581 void InitializeAI() override
582 {
583 // Scripted_NoMovementAI::InitializeAI();
584 }
585
586 void Reset() override
587 {
588 Initialize();
589
591 pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
592
593 me->SetCombatReach(12.0f);
595 }
596
597 void ChangeTimers(bool status, uint32 WTimer)
598 {
599 for (uint8 i = 1; i < ActiveTimers; ++i)
600 TimerIsDeactivated[i] = status;
601
602 if (WTimer > 0)
603 {
604 IsWaiting = true;
605 WaitTimer = WTimer;
606 }
607
608 if (OrbActivated)
610 if (Timer[TIMER_SHADOW_SPIKE] == 0)
612 if (Phase == PHASE_SACRIFICE)
614 }
615
616 void JustSummoned(Creature* summoned) override
617 {
618 if (summoned->GetEntry() == NPC_ARMAGEDDON_TARGET)
619 {
620 summoned->SetUninteractible(true);
622 // summoned->SetVisibility(VISIBILITY_OFF); //with this we cant see the armageddon visuals
623 }
624 else
625 summoned->SetLevel(me->GetLevel());
626
627 summoned->SetFaction(me->GetFaction());
628 summons.Summon(summoned);
629 }
630
631 void JustDied(Unit* /*killer*/) override
632 {
636 }
637
638 void KilledUnit(Unit* /*victim*/) override
639 {
641 }
642
643 void EnterEvadeMode(EvadeReason why) override
644 {
646
648
649 // Reset the controller
652 }
653
654 void JustEngagedWith(Unit* /*who*/) override
655 {
657 }
658
660 {
661 SpeechBegins = true;
662 OrbActivated = false;
663 ChangeTimers(true, 0);//stop every cast Shadow spike will reactivate em all
666 // empowered orbs before darkness
667 Timer[TIMER_DARKNESS] = (Phase == PHASE_SACRIFICE) ? 15000 : urand(10000, 40000);
668 Timer[TIMER_ORBS_EMPOWER] = (Phase == PHASE_SACRIFICE) ? 10000 : 5000;
669 }
670
672 {
674 for (uint8 i = 0; i < 4; ++i)
675 {
677 {
678 float x, y, z;
679 target->GetPosition(x, y, z);
680 if (Creature* pSinisterReflection = me->SummonCreature(NPC_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN))
681 {
682 pSinisterReflection->SetDisplayId(target->GetDisplayId());
683 pSinisterReflection->AI()->AttackStart(target);
684 }
685 }
686 }
687 }
688
689 void UpdateAI(uint32 diff) override
690 {
691 if (!UpdateVictim() || Phase < PHASE_NORMAL)
692 return;
693
694 if (IsWaiting)
695 {
696 if (WaitTimer <= diff)
697 {
698 IsWaiting = false;
699 ChangeTimers(false, 0);
700 } else WaitTimer -= diff;
701 }
702
703 for (uint8 t = 0; t < ActiveTimers; ++t)
704 {
705 if (Timer[t] < diff && !TimerIsDeactivated[t])
706 {
707 switch (t)
708 {
709 case TIMER_SPEECH:
710 if (SpeechBegins)
711 {
712 SpeechBegins = false;
713 switch (Phase)
714 {
715 case PHASE_NORMAL:
717 break;
718 case PHASE_DARKNESS:
720 break;
721 case PHASE_ARMAGEDDON:
723 break;
724 case PHASE_SACRIFICE:
726 break;
727 }
728 }
729 if (Speeches[speechCount].timer < SpeechTimer)
730 {
731 SpeechTimer = 0;
732 if (Creature* speechCreature = instance->GetCreature(Speeches[speechCount].creature))
733 speechCreature->AI()->Talk(Speeches[speechCount].textid);
734 if (speechCount == 12)
735 if (Creature* pAnveena = instance->GetCreature(DATA_ANVEENA))
736 pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
737 // ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
740 speechCount++;
741 }
742 SpeechTimer += diff;
743 break;
744 case TIMER_SOUL_FLAY:
745 if (!me->IsNonMeleeSpellCast(false))
746 {
749 Timer[TIMER_SOUL_FLAY] = 3500;
750 }
751 break;
753 if (!me->IsNonMeleeSpellCast(false))
754 {
755 Unit* pRandomPlayer = nullptr;
756
758 for (uint8 z = 0; z < 6; ++z)
759 {
760 pRandomPlayer = SelectTarget(SelectTargetMethod::Random, 0, 100, true);
761 if (!pRandomPlayer || !pRandomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT))
762 break;
763 }
764
765 if (pRandomPlayer)
766 DoCast(pRandomPlayer, SPELL_LEGION_LIGHTNING, false);
767 else
768 TC_LOG_ERROR("scripts", "try to cast SPELL_LEGION_LIGHTNING on invalid target");
769
770 Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE
771 Timer[TIMER_SOUL_FLAY] = 2500;
772 }
773 break;
774 case TIMER_FIRE_BLOOM:
775 if (!me->IsNonMeleeSpellCast(false))
776 {
779 Timer[TIMER_FIRE_BLOOM] = (Phase == PHASE_SACRIFICE) ? 25000 : 40000; // 25 seconds in PHASE_SACRIFICE
780 Timer[TIMER_SOUL_FLAY] = 1000;
781 }
782 break;
784 for (uint8 i = 1; i < Phase; ++i)
785 {
786 float sx, sy;
787 sx = ShieldOrbLocations[0][0] + std::sin(ShieldOrbLocations[i][0]);
788 sy = ShieldOrbLocations[0][1] + std::sin(ShieldOrbLocations[i][1]);
790 }
791 Timer[TIMER_SUMMON_SHILEDORB] = urand(30000, 60000); // 30-60seconds cooldown
792 Timer[TIMER_SOUL_FLAY] = 2000;
793 break;
794 case TIMER_SHADOW_SPIKE: //Phase 3
795 if (!me->IsNonMeleeSpellCast(false))
796 {
799 ChangeTimers(true, 30000);
802 }
803 break;
804 case TIMER_FLAME_DART: //Phase 3
806 Timer[TIMER_FLAME_DART] = 3000;
807 break;
808 case TIMER_DARKNESS: //Phase 3
809 if (!me->IsNonMeleeSpellCast(false))
810 {
811 // Begins to channel for 8 seconds, then deals 50'000 damage to all raid members.
812 if (!IsInDarkness)
813 {
816 ChangeTimers(true, 9000);
817 Timer[TIMER_DARKNESS] = 8750;
819 if (Phase == PHASE_SACRIFICE)
821 IsInDarkness = true;
822 }
823 else
824 {
825 Timer[TIMER_DARKNESS] = (Phase == PHASE_SACRIFICE) ? 15000 : urand(40000, 70000);
826 IsInDarkness = false;
829 }
830 Timer[TIMER_SOUL_FLAY] = 9000;
831 }
832 break;
833 case TIMER_ORBS_EMPOWER: //Phase 3
835 {
836 switch (Phase)
837 {
838 case PHASE_SACRIFICE:
839 ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true);
840 break;
841 default:
842 ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false);
843 break;
844 }
845 }
846 OrbActivated = true;
848 break;
849 case TIMER_ARMAGEDDON: //Phase 4
850 Unit* target = nullptr;
851 for (uint8 z = 0; z < 6; ++z)
852 {
853 target = SelectTarget(SelectTargetMethod::Random, 0, 100, true);
854 if (!target || !target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)) break;
855 }
856 if (target)
857 {
858 float x, y, z;
859 target->GetPosition(x, y, z);
861 }
862 Timer[TIMER_ARMAGEDDON] = 2000; // No, I'm not kidding
863 break;
864 }
865 }
866 }
867 //Time runs over!
868 for (uint8 i = 0; i < ActiveTimers; ++i)
869 if (!TimerIsDeactivated[i])
870 {
871 Timer[i] -= diff;
872 if (((int32)Timer[i]) < 0) Timer[i] = 0;
873 }
874
875 //Phase 3
877 {
878 if (Phase == PHASE_NORMAL && HealthBelowPct(85))
879 {
881 ActiveTimers = 9;
883 }
884 else return;
885 }
886
887 //Phase 4
889 {
890 if (Phase == PHASE_DARKNESS && HealthBelowPct(55))
891 {
893 ActiveTimers = 10;
895 }
896 else return;
897 }
898
899 //Phase 5 specific spells all we can
901 {
903 {
906 }
907 else return;
908 }
909 }
910 };
911
912 CreatureAI* GetAI(Creature* creature) const override
913 {
914 return GetSunwellPlateauAI<boss_kiljaedenAI>(creature);
915 }
916};
917
918//AI for Hand of the Deceiver
920{
921public:
922 npc_hand_of_the_deceiver() : CreatureScript("npc_hand_of_the_deceiver") { }
923
925 {
927 {
928 Initialize();
929 instance = creature->GetInstanceScript();
930 }
931
933 {
935 ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
936 FelfirePortalTimer = 20000;
937 }
938
940
943
944 void Reset() override
945 {
946 Initialize();
948 }
949
950 void JustSummoned(Creature* summoned) override
951 {
952 summoned->SetFaction(me->GetFaction());
953 summoned->SetLevel(me->GetLevel());
954 }
955
956 void JustEngagedWith(Unit* who) override
957 {
960 AddThreat(who, 1.0f, pControl);
961
963 }
964
965 void JustDied(Unit* /*killer*/) override
966 {
968 ++(ENSURE_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount);
969 }
970
971 void UpdateAI(uint32 diff) override
972 {
973 if (!me->IsInCombat())
975
976 if (!UpdateVictim())
977 return;
978
979 // Gain Shadow Infusion at 20% health
982
983 // Shadow Bolt Volley - Shoots Shadow Bolts at all enemies within 30 yards, for ~2k Shadow damage.
984 if (ShadowBoltVolleyTimer <= diff)
985 {
987 ShadowBoltVolleyTimer = 12000;
988 }
989 else
990 ShadowBoltVolleyTimer -= diff;
991
992 // Felfire Portal - Creatres a portal, that spawns Volatile Felfire Fiends, which do suicide bombing.
993 if (FelfirePortalTimer <= diff)
994 {
997 AddThreat(ref->GetVictim(), 1.0f, pPortal);
998 FelfirePortalTimer = 20000;
999 } else FelfirePortalTimer -= diff;
1000 }
1001 };
1002
1003 CreatureAI* GetAI(Creature* creature) const override
1004 {
1005 return GetSunwellPlateauAI<npc_hand_of_the_deceiverAI>(creature);
1006 }
1007};
1008
1009//AI for Felfire Portal
1011{
1012public:
1013 npc_felfire_portal() : CreatureScript("npc_felfire_portal") { }
1014
1015 CreatureAI* GetAI(Creature* creature) const override
1016 {
1017 return GetSunwellPlateauAI<npc_felfire_portalAI>(creature);
1018 }
1019
1021 {
1023 {
1024 Initialize();
1025 SetCombatMovement(false);
1026 }
1027
1029 {
1030 uiSpawnFiendTimer = 5000;
1031 }
1032
1034
1035 void Reset() override
1036 {
1037 Initialize();
1039 me->SetUninteractible(true);
1040 }
1041
1042 void JustSummoned(Creature* summoned) override
1043 {
1044 summoned->SetFaction(me->GetFaction());
1045 summoned->SetLevel(me->GetLevel());
1046 }
1047
1048 void UpdateAI(uint32 diff) override
1049 {
1050 if (!UpdateVictim())
1051 return;
1052
1053 if (uiSpawnFiendTimer <= diff)
1054 {
1056 AddThreat(SelectTarget(SelectTargetMethod::Random, 0), 100000.0f, pFiend);
1057 uiSpawnFiendTimer = urand(4000, 8000);
1058 } else uiSpawnFiendTimer -= diff;
1059 }
1060 };
1061};
1062
1063//AI for Felfire Fiend
1065{
1066public:
1067 npc_volatile_felfire_fiend() : CreatureScript("npc_volatile_felfire_fiend") { }
1068
1069 CreatureAI* GetAI(Creature* creature) const override
1070 {
1071 return GetSunwellPlateauAI<npc_volatile_felfire_fiendAI>(creature);
1072 }
1073
1075 {
1077 {
1078 Initialize();
1079 }
1080
1082 {
1083 uiExplodeTimer = 2000;
1084 bLockedTarget = false;
1085 }
1086
1088
1090
1091 void Reset() override
1092 {
1093 Initialize();
1094 }
1095
1096 void DamageTaken(Unit* /*done_by*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1097 {
1098 if (damage > me->GetHealth())
1100 }
1101
1102 void UpdateAI(uint32 diff) override
1103 {
1104 if (!UpdateVictim())
1105 return;
1106
1107 if (!bLockedTarget)
1108 {
1109 AddThreat(me->GetVictim(), 10000000.0f);
1110 bLockedTarget = true;
1111 }
1112
1113 if (uiExplodeTimer)
1114 {
1115 if (uiExplodeTimer <= diff)
1116 uiExplodeTimer = 0;
1117 else uiExplodeTimer -= diff;
1118 }
1119 else if (me->IsWithinDistInMap(me->GetVictim(), 3)) // Explode if it's close enough to it's target
1120 {
1122 me->KillSelf();
1123 }
1124 }
1125 };
1126};
1127
1128//AI for Armageddon target
1130{
1131public:
1132 npc_armageddon() : CreatureScript("npc_armageddon") { }
1133
1134 CreatureAI* GetAI(Creature* creature) const override
1135 {
1136 return GetSunwellPlateauAI<npc_armageddonAI>(creature);
1137 }
1138
1140 {
1141 npc_armageddonAI(Creature* creature) : ScriptedAI(creature)
1142 {
1143 Initialize();
1144 SetCombatMovement(false);
1145 }
1146
1148 {
1149 spell = 0;
1150 uiTimer = 0;
1151 }
1152
1155
1156 void Reset() override
1157 {
1158 Initialize();
1159 }
1160
1161 void UpdateAI(uint32 diff) override
1162 {
1163 if (uiTimer <= diff)
1164 {
1165 switch (spell)
1166 {
1167 case 0:
1169 ++spell;
1170 break;
1171 case 1:
1173 uiTimer = 9000;
1174 ++spell;
1175 break;
1176 case 2:
1178 ++spell;
1179 uiTimer = 5000;
1180 break;
1181 case 3:
1183 break;
1184 }
1185 } else uiTimer -=diff;
1186 }
1187 };
1188};
1189
1190//AI for Shield Orbs
1192{
1193public:
1194 npc_shield_orb() : CreatureScript("npc_shield_orb") { }
1195
1196 CreatureAI* GetAI(Creature* creature) const override
1197 {
1198 return GetSunwellPlateauAI<npc_shield_orbAI>(creature);
1199 }
1200
1202 {
1203 npc_shield_orbAI(Creature* creature) : ScriptedAI(creature)
1204 {
1205 Initialize();
1206 instance = creature->GetInstanceScript();
1207 x = 0.f;
1208 y = 0.f;
1209 }
1210
1212 {
1213 bPointReached = true;
1214 uiTimer = urand(500, 1000);
1215 uiCheckTimer = 1000;
1216 r = 17;
1217 c = 0;
1218 mx = ShieldOrbLocations[0][0];
1219 my = ShieldOrbLocations[0][1];
1221 }
1222
1224
1229 float x, y, r, c, mx, my;
1230
1231 void Reset() override
1232 {
1233 me->SetDisableGravity(true);
1234 Initialize();
1235 }
1236
1237 void UpdateAI(uint32 diff) override
1238 {
1239 if (bPointReached)
1240 {
1241 if (bClockwise)
1242 {
1243 y = my - r * std::sin(c);
1244 x = mx - r * std::cos(c);
1245 }
1246 else
1247 {
1248 y = my + r * std::sin(c);
1249 x = mx + r * std::cos(c);
1250 }
1251 bPointReached = false;
1252 uiCheckTimer = 1000;
1254 c += float(M_PI)/32;
1255 if (c >= 2 * float(M_PI)) c = 0;
1256 }
1257 else
1258 {
1259 if (uiCheckTimer <= diff)
1260 {
1262 bPointReached = true;
1263 }
1264 else uiCheckTimer -= diff;
1265 }
1266
1267 if (uiTimer <= diff)
1268 {
1270 DoCast(random, SPELL_SHADOW_BOLT, false);
1271 uiTimer = urand(500, 1000);
1272 } else uiTimer -= diff;
1273 }
1274
1275 void MovementInform(uint32 type, uint32 /*id*/) override
1276 {
1277 if (type != POINT_MOTION_TYPE)
1278 return;
1279
1280 bPointReached = true;
1281 }
1282 };
1283};
1284
1285//AI for Sinister Reflection
1287{
1288public:
1289 npc_sinster_reflection() : CreatureScript("npc_sinster_reflection") { }
1290
1291 CreatureAI* GetAI(Creature* creature) const override
1292 {
1293 return GetSunwellPlateauAI<npc_sinster_reflectionAI>(creature);
1294 }
1295
1297 {
1299 {
1300 Initialize();
1301 }
1302
1304 {
1305 uiTimer[0] = 0;
1306 uiTimer[1] = 0;
1307 uiTimer[2] = 0;
1308 victimClass = 0;
1309 }
1310
1313
1314 void Reset() override
1315 {
1316 Initialize();
1317 }
1318
1319 void UpdateAI(uint32 diff) override
1320 {
1321 if (!UpdateVictim())
1322 return;
1323
1324 if ((victimClass == 0) && me->GetVictim())
1325 {
1327 switch (victimClass)
1328 {
1329 case CLASS_DRUID:
1330 break;
1331 case CLASS_HUNTER:
1332 break;
1333 case CLASS_MAGE:
1334 break;
1335 case CLASS_WARLOCK:
1336 break;
1337 case CLASS_WARRIOR:
1338 me->SetCanDualWield(true);
1339 break;
1340 case CLASS_PALADIN:
1341 break;
1342 case CLASS_PRIEST:
1343 break;
1344 case CLASS_SHAMAN:
1345 me->SetCanDualWield(true);
1346 break;
1347 case CLASS_ROGUE:
1348 me->SetCanDualWield(true);
1349 break;
1350 }
1351 }
1352
1353 switch (victimClass)
1354 {
1355 case CLASS_DRUID:
1356 if (uiTimer[1] <= diff)
1357 {
1359 uiTimer[1] = urand(2000, 4000);
1360 }
1361 break;
1362 case CLASS_HUNTER:
1363 if (uiTimer[1] <= diff)
1364 {
1366 uiTimer[1] = urand(8000, 10000);
1367 }
1368 if (uiTimer[2] <= diff)
1369 {
1371 uiTimer[2] = urand(4000, 6000);
1372 }
1374 {
1375 if (uiTimer[0] <= diff)
1376 {
1378 uiTimer[0] = urand(6000, 8000);
1379 }
1380 }
1381 break;
1382 case CLASS_MAGE:
1383 if (uiTimer[1] <= diff)
1384 {
1386 uiTimer[1] = urand(2000, 4000);
1387 }
1388 break;
1389 case CLASS_WARLOCK:
1390 if (uiTimer[1] <= diff)
1391 {
1393 uiTimer[1] = urand(3000, 5000);
1394 }
1395 if (uiTimer[2] <= diff)
1396 {
1398 uiTimer[2] = urand(2000, 4000);
1399 }
1400 break;
1401 case CLASS_WARRIOR:
1402 if (uiTimer[1] <= diff)
1403 {
1405 uiTimer[1] = urand(9000, 11000);
1406 }
1407 break;
1408 case CLASS_PALADIN:
1409 if (uiTimer[1] <= diff)
1410 {
1412 uiTimer[1] = urand(6000, 8000);
1413 }
1414 if (uiTimer[2] <= diff)
1415 {
1417 uiTimer[2] = urand(2000, 4000);
1418 }
1419 break;
1420 case CLASS_PRIEST:
1421 if (uiTimer[1] <= diff)
1422 {
1424 uiTimer[1] = urand(4000, 6000);
1425 }
1426 if (uiTimer[2] <= diff)
1427 {
1428 DoCast(me, SPELL_SR_RENEW, false);
1429 uiTimer[2] = urand(6000, 8000);
1430 }
1431 break;
1432 case CLASS_SHAMAN:
1433 if (uiTimer[1] <= diff)
1434 {
1436 uiTimer[1] = urand(4000, 6000);
1437 }
1438 break;
1439 case CLASS_ROGUE:
1440 if (uiTimer[1] <= diff)
1441 {
1443 uiTimer[1] = urand(4000, 6000);
1444 }
1445 break;
1446 }
1447 TC_LOG_DEBUG("scripts", "Sinister-Timer");
1448 for (uint8 i = 0; i < 3; ++i)
1449 uiTimer[i] -= diff;
1450 }
1451 };
1452};
1453
1455{
1457 new boss_kalecgos_kj();
1458 new boss_kiljaeden();
1461 new npc_felfire_portal();
1463 new npc_armageddon();
1464 new npc_shield_orb();
1466}
#define M_PI
Definition: Common.h:115
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
@ POINT_MOTION_TYPE
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN
Definition: ObjectDefines.h:64
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
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
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_PALADIN
@ CLASS_ROGUE
@ GAMEOBJECT_TYPE_BUTTON
@ FACTION_FRIENDLY
@ FACTION_NONE
EvadeReason
Definition: UnitAICommon.h:30
#define ENSURE_AI(a, b)
Definition: UnitAI.h:29
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_STATE_STUNNED
Definition: Unit.h:258
@ SAY_KJ_PHASE3
@ SAY_ANVEENA_GOODBYE
@ SAY_KALECGOS_READY1
@ SAY_KJ_DARKNESS
@ SAY_KJ_PHASE5
@ SAY_KALECGOS_FOCUS
@ SAY_KJ_EMERGE
@ SAY_KJ_SLAY
@ SAY_KJ_REFLECTION
@ SAY_KALECGOS_READY2
@ SAY_ANVEENA_LOST
@ SAY_KALECGOS_JOIN
@ SAY_KJ_DEATH
@ SAY_KJ_PHASE4
@ SAY_KALECGOS_LETGO
@ SAY_KALECGOS_GOODBYE
@ SAY_ANVEENA_IMPRISONED
@ SAY_ANVEENA_KALEC
@ SAY_KJ_OFFCOMBAT
@ SAY_KALECGOS_READY4
@ SAY_KALECGOS_AWAKEN
@ EMOTE_KJ_DARKNESS
@ SAY_KALECGOS_READY3
@ SAY_KALECGOS_ENCOURAGE
@ SAY_KALECGOS_FATE
void AddSC_boss_kiljaeden()
float ShieldOrbLocations[4][2]
@ SPELL_SHADOW_BOLT_VOLLEY
@ SPELL_SR_WING_CLIP
@ SPELL_SHADOW_SPIKE
@ SPELL_SR_MULTI_SHOT
@ SPELL_ENTROPIUS_BODY
@ SPELL_ARMAGEDDON_VISUAL3
@ SPELL_SR_HOLY_SHOCK
@ SPELL_DARKNESS_OF_A_THOUSAND_SOULS
@ SPELL_ARMAGEDDON_DAMAGE
@ SPELL_ARMAGEDDON_SUMMON_TRIGGER
@ SPELL_COPY_WEAPON
@ SPELL_COPY_WEAPON2
@ SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE
@ SPELL_FELFIRE_PORTAL
@ SPELL_SR_MOONFIRE
@ SPELL_ARMAGEDDON_VISUAL
@ SPELL_REBIRTH
@ SPELL_ANVEENA_PRISON
@ SPELL_TRANS
@ SPELL_RING_OF_BLUE_FLAMES
@ SPELL_SINISTER_REFLECTION
@ SPELL_DESTROY_ALL_DRAKES
@ SPELL_FIRE_BLOOM
@ SPELL_SR_HEMORRHAGE
@ SPELL_SHADOW_BOLT
@ SPELL_LEGION_LIGHTNING
@ SPELL_SR_WHIRLWIND
@ SPELL_SOUL_FLAY_SLOW
@ SPELL_SHADOW_INFUSION
@ SPELL_ARMAGEDDON_TRIGGER
@ SPELL_SR_HAMMER_OF_JUSTICE
@ SPELL_SR_RENEW
@ SPELL_SACRIFICE_OF_ANVEENA
@ SPELL_SR_HOLY_SMITE
@ SPELL_SR_EARTH_SHOCK
@ SPELL_SR_CURSE_OF_AGONY
@ SPELL_ARMAGEDDON_VISUAL2
@ SPELL_FLAME_DART
@ SPELL_SR_FIREBALL
@ SPELL_FELFIRE_FISSION
@ SPELL_SR_SHADOW_BOLT
@ SPELL_SOUL_FLAY
@ SPELL_ANVEENA_ENERGY_DRAIN
@ SPELL_SHADOW_CHANNELING
@ SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT
@ SPELL_SR_SHOOT
@ SPELL_COPY_OFFHAND
@ SPELL_COPY_OFFHAND_WEAPON
static Speech Speeches[]
Position DeceiverLocations[3]
#define SHIELD_ORB_Z
@ PHASE_SACRIFICE
@ PHASE_ARMAGEDDON
@ PHASE_DARKNESS
@ PHASE_DECEIVERS
@ PHASE_NORMAL
KilJaedenTimers
@ TIMER_ORBS_EMPOWER
@ TIMER_SPEECH
@ TIMER_ARMAGEDDON
@ TIMER_DARKNESS
@ TIMER_LEGION_LIGHTNING
@ TIMER_FLAME_DART
@ TIMER_FIRE_BLOOM
@ TIMER_SUMMON_SHILEDORB
@ TIMER_SOUL_FLAY
@ TIMER_SHADOW_SPIKE
Yells
void DoZoneInCombat()
Definition: CreatureAI.h:161
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetCanDualWield(bool value) override
Definition: Creature.cpp:1940
GameObject *const me
Definition: GameObjectAI.h:50
uint32 GetFaction() const override
Definition: GameObject.h:388
void Refresh()
void SetFaction(uint32 faction) override
Definition: GameObject.h:389
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
uint32 GetEntry() const
Definition: Object.h:161
void Summon(Creature const *summon)
Trinity::IteratorPair< ThreatListIterator, std::nullptr_t > GetUnsortedThreatList() const
virtual void InitializeAI()
Definition: UnitAI.cpp:43
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
bool IsWithinMeleeRange(Unit const *obj) const
Definition: Unit.h:699
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
uint8 GetClass() const
Definition: Unit.h:752
void SetFaction(uint32 faction) override
Definition: Unit.h:859
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:3059
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void AddUnitState(uint32 f)
Definition: Unit.h:731
Unit * EnsureVictim() const
Definition: Unit.h:717
void SetCombatReach(float combatReach)
Definition: Unit.h:695
uint64 GetHealth() const
Definition: Unit.h:776
uint32 GetFaction() const override
Definition: Unit.h:858
void RemoveDynObject(uint32 spellId)
Definition: Unit.cpp:5180
Unit * GetVictim() const
Definition: Unit.h:715
void SetLevel(uint8 lvl, bool sendUpdate=true)
Definition: Unit.cpp:9329
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition: Unit.h:921
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
uint8 GetLevel() const
Definition: Unit.h:746
bool IsInCombat() const
Definition: Unit.h:1043
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
void setActive(bool isActiveObject)
Definition: Object.cpp:922
void SetFarVisible(bool on)
Definition: Object.cpp:973
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
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
CreatureAI * GetAI(Creature *creature) const override
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetPositionZ() const
Definition: Position.h:78
void SetCombatMovement(bool allowMovement)
void DoTeleportTo(float x, float y, float z, uint32 time=0)
bool HealthBelowPct(uint32 pct) const
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, Milliseconds despawntime)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
int32 textid
uint32 creature
uint32 timer
GameObject * GetOrb(int32 index)
boss_kiljaedenAI(Creature *creature)
void EnterEvadeMode(EvadeReason why) override
void ChangeTimers(bool status, uint32 WTimer)
void JustSummoned(Creature *summoned) override
void UpdateAI(uint32 diff) override
void KilledUnit(Unit *) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void JustSummoned(Creature *summoned) override
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
@ DATA_KILJAEDEN_CONTROLLER
@ DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4
@ DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1
@ DATA_MURU
@ DATA_KILJAEDEN
@ DATA_ANVEENA
@ DATA_PLAYER_GUID
@ DATA_KALECGOS_KJ
@ DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2
@ DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3
@ NPC_ARMAGEDDON_TARGET
@ NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT
@ NPC_SHIELD_ORB
@ NPC_FELFIRE_PORTAL
@ NPC_VOLATILE_FELFIRE_FIEND
@ NPC_ANVEENA
@ NPC_KILJAEDEN
@ NPC_SINISTER_REFLECTION
@ NPC_HAND_OF_THE_DECEIVER