TrinityCore
Loading...
Searching...
No Matches
boss_kaelthas.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_Kaelthas
20SD%Complete: 60
21SDComment: SQL, weapon scripts, mind control, need correct spells(interruptible/uninterruptible), phoenix spawn location & animation, phoenix behaviour & spawn during gravity lapse
22SDCategory: Tempest Keep, The Eye
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "GameObject.h"
27#include "InstanceScript.h"
28#include "MotionMaster.h"
29#include "ObjectAccessor.h"
30#include "Player.h"
31#include "ScriptedCreature.h"
32#include "SpellInfo.h"
33#include "SpellScript.h"
34#include "the_eye.h"
35
37{
38 // Kael'thas Speech
54
55 // Thaladred the Darkener speech
59
60 //Lord Sanguinar speech
63
64 // Grand Astromancer Capernian speech
67
68 // Master Engineer Telonicus speech
71};
72
74{
75 // Phase 2 spells
85
86 // Phase 4 spells
93 //SPELL_MIND_CONTROL = 32830,
95 SPELL_BANISH = 40370, // Cast on Phoenix
96
97 // Phase 5 spells
108
109 // Visual, phase transition spells
110 SPELL_NETHER_BEAM_VISUAL = 36089, // Channeled by trigger on Kael'thas.
111 SPELL_NETHER_BEAM_VISUAL2 = 36090, // Channeled by trigger on Kael'thas.
112 SPELL_NETHER_BEAM_VISUAL3 = 36364, // Cast by Kael'thas on himself, purple glowing effect.
113
114 // Gravity Lapse spells
117 SPELL_GRAVITY_LAPSE_FLIGHT_AURA = 39432, // Cast by players on themselves, allows flight
118
119 // 25 teleport spells, one for each raid member...
145
146 // Generic spells
155
156 // Thaladred the Darkener spells
159 SPELL_REND = 36965,
160 // Lord Sanguinar spells
162 // Grand Astromancer Capernian spells
163
167 //Master Engineer Telonicus spells
168 SPELL_BOMB = 37036,
170 //Nether Vapor spell
172 //Phoenix spell
173 SPELL_BURN = 36720,
176
177 // Flame Strike
181
183{
184 NPC_PHOENIX = 21362,
185 NPC_PHOENIX_EGG = 21364
187
189{
190 //Phoenix egg and phoenix model
194
203
215
257
266
276
282
311
312constexpr float CAPERNIAN_DISTANCE = 20.0f; //she casts away from the target
313//constexpr float KAEL_VISIBLE_RANGE = 50.0f;
314
316{
317 // First two values are not static, they seem to differ on each sniff.
318 { 794.0522f, -0.96732f, 48.97848f, 0.0f },
319 { 796.641f, -0.5888171f, 48.72847f, 3.176499f },
320 { 795.007f, -0.471827f, 75.0f, 0.0f },
321 { 795.007f, -0.471827f, 75.0f, 3.133458f },
322 { 792.419f, -0.504778f, 50.0505f, 0.0f },
323 { 792.419f, -0.504778f, 50.0505f, 3.130386f }
324};
325
326struct boss_kaelthas : public BossAI
327{
329 {
330 Initialize();
331 }
332
334 {
335 _advisorCounter = 0;
336 _pyrosCast = 0;
339 _scaleStage = 0;
340 _hasFullPower = false;
341 }
342
354
355 void JustReachedHome() override
356 {
359
360 // Rebuild the surrounding environment.
362 statue->ResetDoorOrButton();
363
365 statue->ResetDoorOrButton();
366
368 window->ResetDoorOrButton();
369 }
370
371 void DoAction(int32 action) override
372 {
373 switch (action)
374 {
377 me->SetUninteractible(true);
378
383
387 break;
389 for (uint8 i = 0; i < MAX_ADVISORS; ++i)
390 {
392 {
393 creature->Respawn(true);
394 creature->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
395 creature->AI()->EnterEvadeMode();
396 }
397 }
398 break;
400 // They have already been active, so we are not handling new ones, just counting their death.
403
404 switch (_advisorCounter)
405 {
409 break;
413 break;
417 break;
421 break;
423 // Every advisor defeated - Phase 2 starts.
426 break;
428 // Every advisor killed - Phase 3 starts.
430 break;
431 default:
432 break;
433 }
434 break;
443 break;
444 default:
445 break;
446 }
447 }
448
449 void MoveInLineOfSight(Unit* who) override
450 {
451 if (_phase == PHASE_NONE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 30.0f))
452 {
454 who->SetInCombatWith(me);
455 AddThreat(who, 0.0f);
456 me->SetTarget(who->GetGUID());
457 }
458 }
459
460 void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
461 {
462 if (_phase == PHASE_NONE)
463 {
465
466 if (attacker)
467 me->SetTarget(attacker->GetGUID());
468 }
469
470 if (!_hasFullPower && me->HealthBelowPctDamaged(50, damage))
471 {
472 _hasFullPower = true;
473 me->AttackStop();
480 }
481 }
482
483 void MovementInform(uint32 type, uint32 point) override
484 {
485 if (type != POINT_MOTION_TYPE)
486 return;
487
488 switch (point)
489 {
492 break;
494 me->SetFacingTo(float(M_PI));
496 me->SetUninteractible(true);
497 me->SetDisableGravity(true);
498 //me->SetHover(true); -- Set in sniffs, but breaks his visual.
501 break;
505 break;
508 break;
511 break;
515 me->SetUninteractible(false);
517
519 AttackStart(target);
520
523 break;
524 default:
525 break;
526 }
527 }
528
529 void KilledUnit(Unit* /*victim*/) override
530 {
531 Talk(SAY_SLAY);
532 }
533
534 void JustSummoned(Creature* summoned) override
535 {
536 // if not phoenix, then it's one of the 7 weapons
537 if (summoned->GetEntry() != NPC_PHOENIX)
538 {
540 summoned->AI()->AttackStart(target);
541
542 summons.Summon(summoned);
543 }
544 }
545
546 void JustDied(Unit* /*killer*/) override
547 {
549 _JustDied();
550 }
551
552 void UpdateAI(uint32 diff) override
553 {
554 if (_phase == PHASE_COMBAT)
555 if (!UpdateVictim())
556 return;
557
558 events.Update(diff);
559
560 // SPELL_KAEL_GAINING_POWER and SPELL_KAEL_STUNNED are channeling spells that need to be interrupted during his transition.
562 return;
563
564 while (uint32 eventId = events.ExecuteEvent())
565 {
566 switch (eventId)
567 {
571 break;
574 {
575 advisor->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
576
578 advisor->AI()->AttackStart(target);
579 }
581 break;
585 break;
590 break;
593
594 // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael.
596
598 me->SetUninteractible(false);
599
601 AttackStart(target);
602
605 break;
606 case EVENT_FIREBALL:
609 break;
613 break;
617
619 break;
624 break;
629 break;
634 break;
635 case EVENT_PYROBLAST:
636 _pyrosCast = 0;
641 break;
643 if (_pyrosCast < 3)
644 {
647 _pyrosCast++;
648 }
649 else
651 break;
660 break;
662 if (_netherbeamsCast <= 8)
663 {
666
669 }
670 else
672 break;
675 break;
681 break;
684 break;
687 break;
690 break;
691 case EVENT_EXPLODE:
695 DoCast(me, SPELL_KAEL_STUNNED); // Core doesn't handle the emote properly while flying.
697
698 // Destroy the surrounding environment.
700 statue->UseDoorOrButton();
701
703 statue->UseDoorOrButton();
704
706 window->UseDoorOrButton();
707
709 break;
711 switch (_scaleStage)
712 {
713 case 0:
714 me->SetObjectScale(1.4f);
716 break;
717 case 1:
718 me->SetObjectScale(1.8f);
720 break;
721 case 2:
722 me->SetObjectScale(2.0f);
724 break;
725 case 3:
726 me->SetObjectScale(2.2f);
727 break;
728 default:
729 break;
730 }
731 ++_scaleStage;
732 break;
733 default:
734 break;
735 }
736
738 return;
739 }
740 }
741private:
749};
750
752{
753 advisorbase_ai(Creature* creature) : ScriptedAI(creature)
754 {
755 Initialize();
756 instance = creature->GetInstanceScript();
757 }
758
760 {
761 _hasRessurrected = false;
762 _inFakeDeath = false;
764 }
765
766 void Reset() override
767 {
768 Initialize();
769
773 me->SetUninteractible(false);
774
775 //reset encounter
778 Kaelthas->AI()->EnterEvadeMode();
779 }
780
781 void MoveInLineOfSight(Unit* who) override
782 {
784 return;
785
787 }
788
789 void AttackStart(Unit* who) override
790 {
792 return;
793
795 }
796
797 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
798 {
799 if (spellInfo->Id == SPELL_RESSURECTION)
800 {
801 _hasRessurrected = true;
803 me->SetUninteractible(false);
806 }
807 }
808
809 void DamageTaken(Unit* killer, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
810 {
811 if (damage >= me->GetHealth() && !_inFakeDeath && !_hasRessurrected)
812 {
813 //prevent death
814 damage = 0;
815 _inFakeDeath = true;
816
818 me->SetHealth(0);
825 me->SetUninteractible(true);
829 JustDied(killer);
830 }
831 }
832
833 void JustDied(Unit* /*killer*/) override
834 {
836 kael->AI()->DoAction(ACTION_ACTIVE_ADVISOR);
837 }
838
839 void UpdateAI(uint32 diff) override
840 {
842 events.Update(diff);
843
844 while (uint32 eventId = events.ExecuteEvent())
845 {
846 if (eventId == EVENT_DELAYED_RESSURECTION)
847 {
848 _inFakeDeath = false;
849
851 if (!Target)
852 Target = me->GetVictim();
853
855 AttackStart(Target);
857 me->GetMotionMaster()->MoveChase(Target);
858 AddThreat(Target, 0.0f);
859 }
860 }
861 }
862 public:
868};
869
871{
873 {
874 Initialize();
875 }
876
878 {
879 Gaze_Timer = 100;
880 Silence_Timer = 20000;
881 Rend_Timer = 4000;
882 PsychicBlow_Timer = 10000;
883 }
884
889
890 void Reset() override
891 {
892 Initialize();
893
895 }
896
897 void JustEngagedWith(Unit* who) override
898 {
900 AddThreat(who, 5000000.0f);
901 }
902
903 void JustDied(Unit* killer) override
904 {
907
909 }
910
911 void UpdateAI(uint32 diff) override
912 {
914
915 if (!UpdateVictim() || _inFakeDeath)
916 return;
917
918 //Gaze_Timer
919 if (Gaze_Timer <= diff)
920 {
922 {
924 AddThreat(target, 5000000.0f);
925 Talk(EMOTE_THALADRED_GAZE, target);
926 Gaze_Timer = 8500;
927 }
928 }
929 else
930 Gaze_Timer -= diff;
931
932 //Silence_Timer
933 if (Silence_Timer <= diff)
934 {
936 Silence_Timer = 20000;
937 }
938 else
939 Silence_Timer -= diff;
940
941 //Rend_Timer
942 if (Rend_Timer <= diff)
943 {
945 Rend_Timer = 4000;
946 }
947 else
948 Rend_Timer -= diff;
949
950 //PsychicBlow_Timer
951 if (PsychicBlow_Timer <= diff)
952 {
954 PsychicBlow_Timer = 20000 + rand32() % 5000;
955 }
956 else
957 PsychicBlow_Timer -= diff;
958 }
959};
960
962{
964 {
965 Initialize();
966 }
967
969 {
970 Fear_Timer = 20000;
971 }
972
974
975 void Reset() override
976 {
977 Initialize();
979 }
980
981 void JustEngagedWith(Unit* /*who*/) override
982 {
984 }
985
986 void JustDied(Unit* killer) override
987 {
990
992 }
993
994 void UpdateAI(uint32 diff) override
995 {
997
998 if (!UpdateVictim() || _inFakeDeath)
999 return;
1000
1001 //Fear_Timer
1002 if (Fear_Timer <= diff)
1003 {
1005 Fear_Timer = 25000 + rand32() % 10000; //approximately every 30 seconds
1006 }
1007 else
1008 Fear_Timer -= diff;
1009 }
1010};
1011
1013{
1015 {
1016 Initialize();
1017 }
1018
1020 {
1021 Fireball_Timer = 2000;
1022 Conflagration_Timer = 20000;
1023 ArcaneExplosion_Timer = 5000;
1024 Yell_Timer = 2000;
1025 Yell = false;
1026 }
1027
1032 bool Yell;
1033
1034 void Reset() override
1035 {
1036 Initialize();
1037
1039 }
1040
1041 void JustDied(Unit* killer) override
1042 {
1043 if (_hasRessurrected)
1045
1047 }
1048
1049 void AttackStart(Unit* who) override
1050 {
1052 return;
1053
1054 if (me->Attack(who, true))
1055 {
1056 AddThreat(who, 0.0f);
1057 me->SetInCombatWith(who);
1058 who->SetInCombatWith(me);
1059
1061 }
1062 }
1063
1064 void JustEngagedWith(Unit* /*who*/) override
1065 {
1067 }
1068
1069 void UpdateAI(uint32 diff) override
1070 {
1072
1073 if (!UpdateVictim() || _inFakeDeath)
1074 return;
1075
1076 //Fireball_Timer
1077 if (Fireball_Timer <= diff)
1078 {
1080 Fireball_Timer = 4000;
1081 }
1082 else
1083 Fireball_Timer -= diff;
1084
1085 //Conflagration_Timer
1086 if (Conflagration_Timer <= diff)
1087 {
1089
1090 if (target && me->IsWithinDistInMap(target, 30))
1091 DoCast(target, SPELL_CONFLAGRATION);
1092 else
1094
1095 Conflagration_Timer = 10000 + rand32() % 5000;
1096 }
1097 else
1098 Conflagration_Timer -= diff;
1099
1100 //ArcaneExplosion_Timer
1101 if (ArcaneExplosion_Timer <= diff)
1102 {
1103 bool InMeleeRange = false;
1104 Unit* target = nullptr;
1105 for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
1106 {
1107 Unit* unit = ref->GetVictim();
1108 if (unit->IsWithinMeleeRange(me))
1109 {
1110 InMeleeRange = true;
1111 target = unit;
1112 break;
1113 }
1114 }
1115
1116 if (InMeleeRange)
1118
1119 ArcaneExplosion_Timer = 4000 + rand32() % 2000;
1120 }
1121 else
1122 ArcaneExplosion_Timer -= diff;
1123
1124 //Do NOT deal any melee damage.
1125 }
1126};
1127
1129{
1131 {
1132 Initialize();
1133 }
1134
1136 {
1137 Bomb_Timer = 10000;
1138 RemoteToy_Timer = 5000;
1139 }
1140
1143
1144 void Reset() override
1145 {
1146 Initialize();
1147
1149 }
1150
1151 void JustDied(Unit* killer) override
1152 {
1153 if (_hasRessurrected)
1155
1157 }
1158
1159 void JustEngagedWith(Unit* /*who*/) override
1160 {
1162 }
1163
1164 void UpdateAI(uint32 diff) override
1165 {
1167
1168 if (!UpdateVictim() || _inFakeDeath)
1169 return;
1170
1171 //Bomb_Timer
1172 if (Bomb_Timer <= diff)
1173 {
1175 Bomb_Timer = 25000;
1176 }
1177 else
1178 Bomb_Timer -= diff;
1179
1180 //RemoteToy_Timer
1181 if (RemoteToy_Timer <= diff)
1182 {
1184 DoCast(target, SPELL_REMOTE_TOY);
1185
1186 RemoteToy_Timer = 10000 + rand32() % 5000;
1187 }
1188 else
1189 RemoteToy_Timer -= diff;
1190 }
1191};
1192
1194{
1195 npc_kael_flamestrike(Creature* creature) : ScriptedAI(creature) { }
1196
1197 void InitializeAI() override
1198 {
1200 }
1201
1202 void JustAppeared() override
1203 {
1205 me->DespawnOrUnsummon(15s);
1206 }
1207};
1208
1210{
1211 npc_phoenix_tk(Creature* creature) : ScriptedAI(creature)
1212 {
1213 Initialize();
1214 }
1215
1217 {
1218 Cycle_Timer = 2000;
1219 }
1220
1222
1223 void Reset() override
1224 {
1225 Initialize();
1226 DoCast(me, SPELL_BURN, true);
1227 }
1228
1229 void JustDied(Unit* /*killer*/) override
1230 {
1231 //is this spell in use anylonger?
1232 //DoCast(me, SPELL_EMBER_BLAST, true);
1234 }
1235
1236 void UpdateAI(uint32 diff) override
1237 {
1238 if (!UpdateVictim())
1239 return;
1240
1241 if (Cycle_Timer <= diff)
1242 {
1243 //spell Burn should possible do this, but it doesn't, so do this for now.
1244 uint32 dmg = urand(4500, 5500);
1245 if (me->GetHealth() > dmg)
1246 me->ModifyHealth(-int32(dmg));
1247 Cycle_Timer = 2000;
1248 }
1249 else
1250 Cycle_Timer -= diff;
1251 }
1252};
1253
1255{
1257 {
1258 Initialize();
1259 }
1260
1262 {
1263 Rebirth_Timer = 15000;
1264 }
1265
1267
1268 void Reset() override
1269 {
1270 Initialize();
1271 }
1272
1273 //ignore any
1274 void MoveInLineOfSight(Unit* /*who*/) override { }
1275
1276 void AttackStart(Unit* who) override
1277 {
1278 if (me->Attack(who, false))
1279 {
1280 me->SetInCombatWith(who);
1281 who->SetInCombatWith(me);
1282
1283 DoStartNoMovement(who);
1284 }
1285 }
1286
1287 void JustSummoned(Creature* summoned) override
1288 {
1289 AddThreat(me->GetVictim(), 0.0f, summoned);
1290 summoned->CastSpell(summoned, SPELL_REBIRTH, false);
1291 }
1292
1293 void UpdateAI(uint32 diff) override
1294 {
1295 if (!Rebirth_Timer)
1296 return;
1297
1298 if (Rebirth_Timer <= diff)
1299 {
1301 Rebirth_Timer = 0;
1302 }
1303 else
1304 Rebirth_Timer -= diff;
1305 }
1306};
1307
1308// 35941 - Gravity Lapse
1310{
1311public:
1313 {
1314 _targetCount = 0;
1315 }
1316
1317 bool Validate(SpellInfo const* /*spell*/) override
1318 {
1320 }
1321
1329
1334
1335private:
1337};
1338
1339// 36730 - Flame Strike
1341{
1342 bool Validate(SpellInfo const* /*spellInfo*/) override
1343 {
1345 }
1346
1347 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1348 {
1349 Unit* target = GetTarget();
1350 target->CastSpell(target, SPELL_FLAME_STRIKE_DAMAGE);
1351 }
1352
1357};
1358
1359// 36976 - Summon Weapons
1361{
1362 bool Validate(SpellInfo const* /*spellInfo*/) override
1363 {
1365 }
1366
1367 void HandleScript(SpellEffIndex /*effIndex*/)
1368 {
1369 Unit* caster = GetCaster();
1370 for (uint32 spells : SummonWeaponsSpells)
1371 caster->CastSpell(caster, spells, true);
1372 }
1373
1378};
1379
#define M_PI
Definition Common.h:118
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ IN_PROGRESS
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
@ TEMPSUMMON_CORPSE_DESPAWN
Spells
Definition PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
uint32 rand32()
Definition Random.cpp:70
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_0
@ EMOTE_ONESHOT_NONE
@ EMOTE_STATE_DROWNED
@ SPELL_EFFECT_SCRIPT_EFFECT
@ AURA_STATE_WOUNDED_20_PERCENT
@ AURA_STATE_WOUNDED_35_PERCENT
@ AURA_STATE_WOUND_HEALTH_20_80
@ AURA_STATE_WOUNDED_25_PERCENT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELLVALUE_MAX_TARGETS
#define SpellEffectFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STAND_STATE_DEAD
Definition UnitDefines.h:49
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:42
@ MOVEMENTFLAG_ROOT
DamageEffectType
@ UNIT_FLAG_STUNNED
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_PACIFIED
@ UNIT_STATE_CASTING
Definition Unit.h:276
Creatures
@ ACTION_SCHEDULE_COMBAT_EVENTS
@ ACTION_START_ENCOUNTER
@ ACTION_PREPARE_ADVISORS
@ ACTION_ACTIVE_ADVISOR
@ ACTION_REVIVE_ADVISORS
@ NPC_PHOENIX_EGG
@ NPC_PHOENIX
@ SAY_DEATH
@ SAY_THALADRED_DEATH
@ SAY_SANGUINAR_AGGRO
@ SAY_INTRO_SANGUINAR
@ SAY_PHASE2_WEAPON
@ SAY_TELONICUS_AGGRO
@ SAY_PHASE4_INTRO2
@ SAY_INTRO_TELONICUS
@ SAY_CAPERNIAN_AGGRO
@ SAY_THALADRED_AGGRO
@ SAY_PHASE5_NUTS
@ SAY_SLAY
@ SAY_CAPERNIAN_DEATH
@ SAY_SUMMON_PHOENIX
@ EMOTE_PYROBLAST
@ SAY_GRAVITY_LAPSE
@ SAY_MIND_CONTROL
@ EMOTE_THALADRED_GAZE
@ SAY_INTRO_THALADRED
@ SAY_INTRO_CAPERNIAN
@ SAY_INTRO
@ SAY_PHASE3_ADVANCE
@ SAY_SANGUINAR_DEATH
@ SAY_TELONICUS_DEATH
@ SPELL_CAPERNIAN_FIREBALL
@ SPELL_GRAVITY_LAPSE_TELE_BACK
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT
@ SPELL_SUMMON_WEAPOND
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT3
@ SPELL_REMOVE_WEAPONG
@ SPELL_REMOVE_WEAPONS
@ SPELL_KAEL_STUNNED
@ SPELL_FLAME_STRIKE_DAMAGE
@ SPELL_MIND_CONTROL
@ SPELL_GRAVITY_LAPSE_FLIGHT_AURA
@ SPELL_NETHER_BEAM_VISUAL
@ SPELL_GRAVITY_LAPSE_TELE_BACK_LEFT
@ SPELL_SUMMON_WEAPONF
@ SPELL_GRAVITY_LAPSE_PERIODIC
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT
@ SPELL_NETHER_VAPOR
@ SPELL_BELLOWING_ROAR
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_RIGHT2
@ SPELL_SHOCK_BARRIER
@ SPELL_SILENCE
@ SPELL_REMOVE_WEAPONE
@ SPELL_PHOENIX_ANIMATION
@ SPELL_REMOTE_TOY
@ SPELL_BOMB
@ SPELL_NETHER_BEAM_VISUAL3
@ SPELL_CONFLAGRATION
@ SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT
@ SPELL_SUMMON_NETHER_VAPOR
@ SPELL_ARCANE_DISRUPTION
@ SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT
@ SPELL_SUMMON_WEAPONE
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT2
@ SPELL_SUMMON_WEAPONG
@ SPELL_REBIRTH
@ SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT3
@ SPELL_SUMMON_WEAPONS
@ SPELL_ARCANE_EXPLOSION
@ SPELL_SUMMON_WEAPONB
@ SPELL_NETHER_BEAM
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT2
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_RIGHT
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK_LEFT
@ SPELL_FIREBALL
@ SPELL_GRAVITY_LAPSE
@ SPELL_REMOVE_WEAPONA
@ SPELL_FULLPOWER
@ SPELL_PSYCHIC_BLOW
@ SPELL_GRAVITY_LAPSE_TELE_FRONT
@ SPELL_REMOVE_WEAPONB
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT
@ SPELL_BANISH
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT2
@ SPELL_BURN
@ SPELL_GRAVITY_LAPSE_TELE_TO_CASTER
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK
@ SPELL_GRAVITY_LAPSE_TELE_FRONT_RIGHT2
@ SPELL_REND
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_RIGHT2
@ SPELL_REMOVE_WEAPONF
@ SPELL_GRAVITY_LAPSE_TELE_FRONT_LEFT2
@ SPELL_REMOVE_WEAPOND
@ SPELL_PURE_NETHER_BEAM
@ SPELL_REMOVE_WEAPONC
@ SPELL_SUMMON_WEAPONC
@ SPELL_KAEL_EXPLODES2
@ SPELL_SUMMON_WEAPONA
@ SPELL_KAEL_EXPLODES3
@ SPELL_PYROBLAST
@ SPELL_EMBER_BLAST
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_FRONT_LEFT
@ SPELL_SUMMON_FLAME_STRIKE
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_BACK2
@ SPELL_KAEL_EXPLODES4
@ SPELL_KAEL_EXPLODES
@ SPELL_KAEL_GAINING_POWER
@ SPELL_RESSURECTION
@ SPELL_GRAVITY_LAPSE_TELE_CASTER_LEFT3
@ SPELL_NETHER_BEAM_VISUAL2
@ SPELL_FLAME_STRIKE_DUMMY
@ PHASE_INTRO
@ PHASE_NONE
@ PHASE_TRANSITION
@ PHASE_COMBAT
@ PHASE_REVIVED_ADVISORS
constexpr uint32 GravityLapseSpells[]
@ POINT_START_TRANSITION
@ POINT_END_TRANSITION
@ POINT_TRANSITION_HALFWAY_DESCENDING
@ POINT_TRANSITION_HALFWAY_ASCENDING
@ POINT_TRANSITION_TOP
@ POINT_TRANSITION_CENTER_ASCENDING
constexpr uint32 SummonWeaponsSpells[]
@ ADVISOR_CAPERNIAN
@ MAX_KILLED_ADVISORS
@ MAX_DEFEATED_ADVISORS
@ ADVISOR_SANGUINAR
@ ADVISOR_TELONICUS
@ ADVISOR_THALADRED
@ MAX_ADVISORS
void AddSC_boss_kaelthas()
constexpr Position TransitionPos[6]
@ MODEL_ID_PHOENIX
@ MODEL_ID_PHOENIX_EGG
constexpr float CAPERNIAN_DISTANCE
@ EVENT_START_ENCOUNTER
@ EVENT_FULL_POWER
@ EVENT_GROUP_COMBAT
@ EVENT_TRANSITION_4
@ EVENT_TRANSITION_5
@ EVENT_FIREBALL
@ EVENT_NETHER_BEAM
@ EVENT_GROUP_SPECIAL
@ EVENT_GRAVITY_LAPSE
@ EVENT_SUMMON_PHOENIX
@ EVENT_FLAMESTRIKE
@ EVENT_ARCANE_DISRUPTION
@ EVENT_ENGAGE_COMBAT
@ EVENT_TRANSITION_1
@ EVENT_EXPLODE
@ EVENT_SUMMON_WEAPONS
@ EVENT_END_TRANSITION
@ EVENT_MIND_CONTROL
@ EVENT_TRANSITION_6
@ EVENT_GAINING_POWER
@ EVENT_TRANSITION_2
@ EVENT_SHOCK_BARRIER
@ EVENT_PYROBLAST
@ EVENT_RESUME_COMBAT
@ EVENT_DELAYED_RESSURECTION
@ EVENT_ACTIVE_ADVISOR
@ EVENT_PYROBLAST_CAST
@ EVENT_TRANSITION_3
@ EVENT_SIZE_INCREASE
@ EVENT_REVIVE_ADVISORS
Yells
HookList< EffectApplyHandler > AfterEffectRemove
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
InstanceScript *const instance
void JustReachedHome() override
SummonList summons
EventMap events
void Reset() override
virtual void MoveInLineOfSight(Unit *)
bool UpdateVictim()
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Creature *const me
Definition CreatureAI.h:63
void SetObjectScale(float scale) override
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetTarget(ObjectGuid const &guid) override
CreatureAI * AI() const
Definition Creature.h:228
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
void CancelEventGroup(uint32 group)
Definition EventMap.cpp:157
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void SetPhase(uint8 phase)
Definition EventMap.cpp:32
virtual bool SetBossState(uint32 id, EncounterState state)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
GameObject * GetGameObject(uint32 type)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
static ObjectGuid const Empty
Definition ObjectGuid.h:314
void Clear()
Definition ObjectGuid.h:329
uint32 GetEntry() const
Definition Object.h:89
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
void Summon(Creature const *summon)
Trinity::IteratorPair< ThreatListIterator, std::nullptr_t > GetUnsortedThreatList() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
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:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
bool IsWithinMeleeRange(Unit const *obj) const
Definition Unit.h:710
void SetHealth(uint64 val)
Definition Unit.cpp:9973
int64 ModifyHealth(int64 val)
Definition Unit.cpp:8599
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10731
ThreatManager & GetThreatManager()
Definition Unit.h:1078
void SetInCombatWith(Unit *enemy, bool addSecondUnitSuppressed=false)
Definition Unit.h:1060
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:3246
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3231
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:845
void RemoveAllAurasOnDeath()
Definition Unit.cpp:4473
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13361
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
void SetEmoteState(Emote emote)
Definition Unit.h:865
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:6079
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:5853
uint64 GetHealth() const
Definition Unit.h:788
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:793
Unit * GetVictim() const
Definition Unit.h:726
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:1733
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:846
bool AttackStop()
Definition Unit.cpp:5965
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:847
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2324
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:1398
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:501
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
void DoStartNoMovement(Unit *target)
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void ResetThreatList(Unit *who=nullptr)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void MoveInLineOfSight(Unit *who) override
advisorbase_ai(Creature *creature)
void Reset() override
void AttackStart(Unit *who) override
ObjectGuid DelayRes_Target
InstanceScript * instance
void DamageTaken(Unit *killer, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
boss_grand_astromancer_capernian(Creature *creature)
void AttackStart(Unit *who) override
void JustDied(Unit *killer) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
ObjectGuid _advisorGuid[MAX_ADVISORS]
boss_kaelthas(Creature *creature)
void KilledUnit(Unit *) override
void JustDied(Unit *) override
void MoveInLineOfSight(Unit *who) override
void UpdateAI(uint32 diff) override
void JustReachedHome() override
void Reset() override
void MovementInform(uint32 type, uint32 point) override
void DoAction(int32 action) override
void JustSummoned(Creature *summoned) override
void DamageTaken(Unit *attacker, uint32 &damage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
boss_lord_sanguinar(Creature *creature)
void Reset() override
void JustDied(Unit *killer) override
void JustDied(Unit *killer) override
void UpdateAI(uint32 diff) override
boss_master_engineer_telonicus(Creature *creature)
void JustEngagedWith(Unit *) override
void JustEngagedWith(Unit *who) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *killer) override
boss_thaladred_the_darkener(Creature *creature)
npc_kael_flamestrike(Creature *creature)
void InitializeAI() override
void JustAppeared() override
void JustSummoned(Creature *summoned) override
void AttackStart(Unit *who) override
== Triggered Actions Requested ==================
void Reset() override
void MoveInLineOfSight(Unit *) override
npc_phoenix_egg_tk(Creature *creature)
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void UpdateAI(uint32 diff) override
npc_phoenix_tk(Creature *creature)
void Reset() override
#define RegisterTheEyeCreatureAI(ai_name)
Definition the_eye.h:74
@ DATA_KAEL_STATUE_RIGHT
Definition the_eye.h:43
@ DATA_TEMPEST_BRIDGE_WINDOW
Definition the_eye.h:44
@ DATA_SANGUINAR
Definition the_eye.h:38
@ DATA_TELONICUS
Definition the_eye.h:39
@ DATA_KAELTHAS
Definition the_eye.h:34
@ DATA_KAEL_STATUE_LEFT
Definition the_eye.h:42
@ DATA_CAPERNIAN
Definition the_eye.h:37
@ DATA_THALADRED
Definition the_eye.h:40