TrinityCore
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
196{
203
205{
211
215
217{
236
237 // Movement updates
244
245 // Phase transition
249
250 // Advisors
252
253 // Event groups
254 EVENT_GROUP_COMBAT = 1, // Default abilities
255 EVENT_GROUP_SPECIAL = 2 // Special abilities (Pyroblast, Nether Beam, Shock Barrier)
257
259{
266
268{
276
278{
281};
282
284{
287};
288
290{
316};
317
318constexpr float CAPERNIAN_DISTANCE = 20.0f; //she casts away from the target
319//constexpr float KAEL_VISIBLE_RANGE = 50.0f;
320
322{
323 // First two values are not static, they seem to differ on each sniff.
324 { 794.0522f, -0.96732f, 48.97848f, 0.0f },
325 { 796.641f, -0.5888171f, 48.72847f, 3.176499f },
326 { 795.007f, -0.471827f, 75.0f, 0.0f },
327 { 795.007f, -0.471827f, 75.0f, 3.133458f },
328 { 792.419f, -0.504778f, 50.0505f, 0.0f },
329 { 792.419f, -0.504778f, 50.0505f, 3.130386f }
330};
331
332struct boss_kaelthas : public BossAI
333{
335 {
336 Initialize();
337 }
338
340 {
341 _advisorCounter = 0;
342 _pyrosCast = 0;
345 _scaleStage = 0;
346 _hasFullPower = false;
347 }
348
349 void Reset() override
350 {
351 Initialize();
353 me->SetUninteractible(false);
355 me->SetDisableGravity(false);
357 me->SetObjectScale(1.0f);
359 }
360
361 void JustReachedHome() override
362 {
365
366 // Rebuild the surrounding environment.
368 statue->ResetDoorOrButton();
369
371 statue->ResetDoorOrButton();
372
374 window->ResetDoorOrButton();
375 }
376
377 void DoAction(int32 action) override
378 {
379 switch (action)
380 {
383 me->SetUninteractible(true);
384
389
393 break;
395 for (uint8 i = 0; i < MAX_ADVISORS; ++i)
396 {
398 {
399 creature->Respawn(true);
400 creature->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
401 creature->AI()->EnterEvadeMode();
402 }
403 }
404 break;
406 // They have already been active, so we are not handling new ones, just counting their death.
409
410 switch (_advisorCounter)
411 {
415 break;
419 break;
423 break;
427 break;
429 // Every advisor defeated - Phase 2 starts.
432 break;
434 // Every advisor killed - Phase 3 starts.
436 break;
437 default:
438 break;
439 }
440 break;
449 break;
450 default:
451 break;
452 }
453 }
454
455 void MoveInLineOfSight(Unit* who) override
456 {
457 if (_phase == PHASE_NONE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 30.0f))
458 {
460 who->SetInCombatWith(me);
461 AddThreat(who, 0.0f);
462 me->SetTarget(who->GetGUID());
463 }
464 }
465
466 void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
467 {
468 if (_phase == PHASE_NONE)
469 {
471
472 if (attacker)
473 me->SetTarget(attacker->GetGUID());
474 }
475
476 if (!_hasFullPower && me->HealthBelowPctDamaged(50, damage))
477 {
478 _hasFullPower = true;
479 me->AttackStop();
486 }
487 }
488
489 void MovementInform(uint32 type, uint32 point) override
490 {
491 if (type != POINT_MOTION_TYPE)
492 return;
493
494 switch (point)
495 {
498 break;
500 me->SetFacingTo(float(M_PI));
502 me->SetUninteractible(true);
503 me->SetDisableGravity(true);
504 //me->SetHover(true); -- Set in sniffs, but breaks his visual.
507 break;
511 break;
514 break;
517 break;
521 me->SetUninteractible(false);
523
525 AttackStart(target);
526
529 break;
530 default:
531 break;
532 }
533 }
534
535 void KilledUnit(Unit* /*victim*/) override
536 {
537 Talk(SAY_SLAY);
538 }
539
540 void JustSummoned(Creature* summoned) override
541 {
542 // if not phoenix, then it's one of the 7 weapons
543 if (summoned->GetEntry() != NPC_PHOENIX)
544 {
546 summoned->AI()->AttackStart(target);
547
548 summons.Summon(summoned);
549 }
550 }
551
552 void JustDied(Unit* /*killer*/) override
553 {
555 _JustDied();
556 }
557
558 void UpdateAI(uint32 diff) override
559 {
560 if (_phase == PHASE_COMBAT)
561 if (!UpdateVictim())
562 return;
563
564 events.Update(diff);
565
566 // SPELL_KAEL_GAINING_POWER and SPELL_KAEL_STUNNED are channeling spells that need to be interrupted during his transition.
568 return;
569
570 while (uint32 eventId = events.ExecuteEvent())
571 {
572 switch (eventId)
573 {
577 break;
580 {
581 advisor->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
582
584 advisor->AI()->AttackStart(target);
585 }
587 break;
591 break;
596 break;
599
600 // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael.
602
604 me->SetUninteractible(false);
605
607 AttackStart(target);
608
611 break;
612 case EVENT_FIREBALL:
615 break;
619 break;
623
625 break;
630 break;
635 break;
640 break;
641 case EVENT_PYROBLAST:
642 _pyrosCast = 0;
647 break;
649 if (_pyrosCast < 3)
650 {
653 _pyrosCast++;
654 }
655 else
657 break;
666 break;
668 if (_netherbeamsCast <= 8)
669 {
672
675 }
676 else
678 break;
681 break;
687 break;
690 break;
693 break;
696 break;
697 case EVENT_EXPLODE:
701 DoCast(me, SPELL_KAEL_STUNNED); // Core doesn't handle the emote properly while flying.
703
704 // Destroy the surrounding environment.
706 statue->UseDoorOrButton();
707
709 statue->UseDoorOrButton();
710
712 window->UseDoorOrButton();
713
715 break;
717 switch (_scaleStage)
718 {
719 case 0:
720 me->SetObjectScale(1.4f);
722 break;
723 case 1:
724 me->SetObjectScale(1.8f);
726 break;
727 case 2:
728 me->SetObjectScale(2.0f);
730 break;
731 case 3:
732 me->SetObjectScale(2.2f);
733 break;
734 default:
735 break;
736 }
737 ++_scaleStage;
738 break;
739 default:
740 break;
741 }
742
744 return;
745 }
746 }
747private:
755};
756
758{
759 advisorbase_ai(Creature* creature) : ScriptedAI(creature)
760 {
761 Initialize();
762 instance = creature->GetInstanceScript();
763 }
764
766 {
767 _hasRessurrected = false;
768 _inFakeDeath = false;
770 }
771
772 void Reset() override
773 {
774 Initialize();
775
779 me->SetUninteractible(false);
780
781 //reset encounter
784 Kaelthas->AI()->EnterEvadeMode();
785 }
786
787 void MoveInLineOfSight(Unit* who) override
788 {
790 return;
791
793 }
794
795 void AttackStart(Unit* who) override
796 {
798 return;
799
801 }
802
803 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
804 {
805 if (spellInfo->Id == SPELL_RESSURECTION)
806 {
807 _hasRessurrected = true;
809 me->SetUninteractible(false);
812 }
813 }
814
815 void DamageTaken(Unit* killer, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
816 {
817 if (damage >= me->GetHealth() && !_inFakeDeath && !_hasRessurrected)
818 {
819 //prevent death
820 damage = 0;
821 _inFakeDeath = true;
822
824 me->SetHealth(0);
831 me->SetUninteractible(true);
835 JustDied(killer);
836 }
837 }
838
839 void JustDied(Unit* /*killer*/) override
840 {
842 kael->AI()->DoAction(ACTION_ACTIVE_ADVISOR);
843 }
844
845 void UpdateAI(uint32 diff) override
846 {
848 events.Update(diff);
849
850 while (uint32 eventId = events.ExecuteEvent())
851 {
852 if (eventId == EVENT_DELAYED_RESSURECTION)
853 {
854 _inFakeDeath = false;
855
857 if (!Target)
858 Target = me->GetVictim();
859
861 AttackStart(Target);
863 me->GetMotionMaster()->MoveChase(Target);
864 AddThreat(Target, 0.0f);
865 }
866 }
867 }
868 public:
874};
875
877{
879 {
880 Initialize();
881 }
882
884 {
885 Gaze_Timer = 100;
886 Silence_Timer = 20000;
887 Rend_Timer = 4000;
888 PsychicBlow_Timer = 10000;
889 }
890
895
896 void Reset() override
897 {
898 Initialize();
899
901 }
902
903 void JustEngagedWith(Unit* who) override
904 {
906 AddThreat(who, 5000000.0f);
907 }
908
909 void JustDied(Unit* killer) override
910 {
913
915 }
916
917 void UpdateAI(uint32 diff) override
918 {
920
921 if (!UpdateVictim() || _inFakeDeath)
922 return;
923
924 //Gaze_Timer
925 if (Gaze_Timer <= diff)
926 {
928 {
930 AddThreat(target, 5000000.0f);
931 Talk(EMOTE_THALADRED_GAZE, target);
932 Gaze_Timer = 8500;
933 }
934 }
935 else
936 Gaze_Timer -= diff;
937
938 //Silence_Timer
939 if (Silence_Timer <= diff)
940 {
942 Silence_Timer = 20000;
943 }
944 else
945 Silence_Timer -= diff;
946
947 //Rend_Timer
948 if (Rend_Timer <= diff)
949 {
951 Rend_Timer = 4000;
952 }
953 else
954 Rend_Timer -= diff;
955
956 //PsychicBlow_Timer
957 if (PsychicBlow_Timer <= diff)
958 {
960 PsychicBlow_Timer = 20000 + rand32() % 5000;
961 }
962 else
963 PsychicBlow_Timer -= diff;
964 }
965};
966
968{
970 {
971 Initialize();
972 }
973
975 {
976 Fear_Timer = 20000;
977 }
978
980
981 void Reset() override
982 {
983 Initialize();
985 }
986
987 void JustEngagedWith(Unit* /*who*/) override
988 {
990 }
991
992 void JustDied(Unit* killer) override
993 {
996
998 }
999
1000 void UpdateAI(uint32 diff) override
1001 {
1003
1004 if (!UpdateVictim() || _inFakeDeath)
1005 return;
1006
1007 //Fear_Timer
1008 if (Fear_Timer <= diff)
1009 {
1011 Fear_Timer = 25000 + rand32() % 10000; //approximately every 30 seconds
1012 }
1013 else
1014 Fear_Timer -= diff;
1015 }
1016};
1017
1019{
1021 {
1022 Initialize();
1023 }
1024
1026 {
1027 Fireball_Timer = 2000;
1028 Conflagration_Timer = 20000;
1029 ArcaneExplosion_Timer = 5000;
1030 Yell_Timer = 2000;
1031 Yell = false;
1032 }
1033
1038 bool Yell;
1039
1040 void Reset() override
1041 {
1042 Initialize();
1043
1045 }
1046
1047 void JustDied(Unit* killer) override
1048 {
1049 if (_hasRessurrected)
1051
1053 }
1054
1055 void AttackStart(Unit* who) override
1056 {
1058 return;
1059
1060 if (me->Attack(who, true))
1061 {
1062 AddThreat(who, 0.0f);
1063 me->SetInCombatWith(who);
1064 who->SetInCombatWith(me);
1065
1067 }
1068 }
1069
1070 void JustEngagedWith(Unit* /*who*/) override
1071 {
1073 }
1074
1075 void UpdateAI(uint32 diff) override
1076 {
1078
1079 if (!UpdateVictim() || _inFakeDeath)
1080 return;
1081
1082 //Fireball_Timer
1083 if (Fireball_Timer <= diff)
1084 {
1086 Fireball_Timer = 4000;
1087 }
1088 else
1089 Fireball_Timer -= diff;
1090
1091 //Conflagration_Timer
1092 if (Conflagration_Timer <= diff)
1093 {
1095
1096 if (target && me->IsWithinDistInMap(target, 30))
1097 DoCast(target, SPELL_CONFLAGRATION);
1098 else
1100
1101 Conflagration_Timer = 10000 + rand32() % 5000;
1102 }
1103 else
1104 Conflagration_Timer -= diff;
1105
1106 //ArcaneExplosion_Timer
1107 if (ArcaneExplosion_Timer <= diff)
1108 {
1109 bool InMeleeRange = false;
1110 Unit* target = nullptr;
1111 for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
1112 {
1113 Unit* unit = ref->GetVictim();
1114 if (unit->IsWithinMeleeRange(me))
1115 {
1116 InMeleeRange = true;
1117 target = unit;
1118 break;
1119 }
1120 }
1121
1122 if (InMeleeRange)
1124
1125 ArcaneExplosion_Timer = 4000 + rand32() % 2000;
1126 }
1127 else
1128 ArcaneExplosion_Timer -= diff;
1129
1130 //Do NOT deal any melee damage.
1131 }
1132};
1133
1135{
1137 {
1138 Initialize();
1139 }
1140
1142 {
1143 Bomb_Timer = 10000;
1144 RemoteToy_Timer = 5000;
1145 }
1146
1149
1150 void Reset() override
1151 {
1152 Initialize();
1153
1155 }
1156
1157 void JustDied(Unit* killer) override
1158 {
1159 if (_hasRessurrected)
1161
1163 }
1164
1165 void JustEngagedWith(Unit* /*who*/) override
1166 {
1168 }
1169
1170 void UpdateAI(uint32 diff) override
1171 {
1173
1174 if (!UpdateVictim() || _inFakeDeath)
1175 return;
1176
1177 //Bomb_Timer
1178 if (Bomb_Timer <= diff)
1179 {
1181 Bomb_Timer = 25000;
1182 }
1183 else
1184 Bomb_Timer -= diff;
1185
1186 //RemoteToy_Timer
1187 if (RemoteToy_Timer <= diff)
1188 {
1190 DoCast(target, SPELL_REMOTE_TOY);
1191
1192 RemoteToy_Timer = 10000 + rand32() % 5000;
1193 }
1194 else
1195 RemoteToy_Timer -= diff;
1196 }
1197};
1198
1200{
1201 npc_kael_flamestrike(Creature* creature) : ScriptedAI(creature) { }
1202
1203 void InitializeAI() override
1204 {
1206 }
1207
1208 void JustAppeared() override
1209 {
1211 me->DespawnOrUnsummon(15s);
1212 }
1213};
1214
1216{
1217 npc_phoenix_tk(Creature* creature) : ScriptedAI(creature)
1218 {
1219 Initialize();
1220 }
1221
1223 {
1224 Cycle_Timer = 2000;
1225 }
1226
1228
1229 void Reset() override
1230 {
1231 Initialize();
1232 DoCast(me, SPELL_BURN, true);
1233 }
1234
1235 void JustDied(Unit* /*killer*/) override
1236 {
1237 //is this spell in use anylonger?
1238 //DoCast(me, SPELL_EMBER_BLAST, true);
1240 }
1241
1242 void UpdateAI(uint32 diff) override
1243 {
1244 if (!UpdateVictim())
1245 return;
1246
1247 if (Cycle_Timer <= diff)
1248 {
1249 //spell Burn should possible do this, but it doesn't, so do this for now.
1250 uint32 dmg = urand(4500, 5500);
1251 if (me->GetHealth() > dmg)
1252 me->ModifyHealth(-int32(dmg));
1253 Cycle_Timer = 2000;
1254 }
1255 else
1256 Cycle_Timer -= diff;
1257 }
1258};
1259
1261{
1263 {
1264 Initialize();
1265 }
1266
1268 {
1269 Rebirth_Timer = 15000;
1270 }
1271
1273
1274 void Reset() override
1275 {
1276 Initialize();
1277 }
1278
1279 //ignore any
1280 void MoveInLineOfSight(Unit* /*who*/) override { }
1281
1282 void AttackStart(Unit* who) override
1283 {
1284 if (me->Attack(who, false))
1285 {
1286 me->SetInCombatWith(who);
1287 who->SetInCombatWith(me);
1288
1289 DoStartNoMovement(who);
1290 }
1291 }
1292
1293 void JustSummoned(Creature* summoned) override
1294 {
1295 AddThreat(me->GetVictim(), 0.0f, summoned);
1296 summoned->CastSpell(summoned, SPELL_REBIRTH, false);
1297 }
1298
1299 void UpdateAI(uint32 diff) override
1300 {
1301 if (!Rebirth_Timer)
1302 return;
1303
1304 if (Rebirth_Timer <= diff)
1305 {
1307 Rebirth_Timer = 0;
1308 }
1309 else
1310 Rebirth_Timer -= diff;
1311 }
1312};
1313
1314// 35941 - Gravity Lapse
1316{
1317public:
1319 {
1320 _targetCount = 0;
1321 }
1322
1323 bool Validate(SpellInfo const* /*spell*/) override
1324 {
1326 }
1327
1328 void HandleScript(SpellEffIndex /*effIndex*/)
1329 {
1333 _targetCount++;
1334 }
1335
1336 void Register() override
1337 {
1339 }
1340
1341private:
1343};
1344
1345// 36730 - Flame Strike
1347{
1348 bool Validate(SpellInfo const* /*spellInfo*/) override
1349 {
1351 }
1352
1353 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1354 {
1355 Unit* target = GetTarget();
1356 target->CastSpell(target, SPELL_FLAME_STRIKE_DAMAGE);
1357 }
1358
1359 void Register() override
1360 {
1362 }
1363};
1364
1365// 36976 - Summon Weapons
1367{
1368 bool Validate(SpellInfo const* /*spellInfo*/) override
1369 {
1371 }
1372
1373 void HandleScript(SpellEffIndex /*effIndex*/)
1374 {
1375 Unit* caster = GetCaster();
1376 for (uint32 spells : SummonWeaponsSpells)
1377 caster->CastSpell(caster, spells, true);
1378 }
1379
1380 void Register() override
1381 {
1383 }
1384};
1385
1386// 39497 - Remove Enchanted Weapons
1388{
1389 bool Validate(SpellInfo const* /*spellInfo*/) override
1390 {
1392 }
1393
1394 void HandleScript(SpellEffIndex /*effIndex*/)
1395 {
1396 if (Player* player = GetHitPlayer())
1397 for (uint32 spells : RemoveWeaponsSpells)
1398 player->CastSpell(player, spells, TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST);
1399 }
1400
1401 void Register() override
1402 {
1404 }
1405};
1406
1408{
1421}
Actions
#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
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
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:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ 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
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore power and reagent cost.
Definition: SpellDefines.h:249
@ SPELLVALUE_MAX_TARGETS
Definition: SpellDefines.h:230
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_DEAD
Definition: UnitDefines.h:49
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
@ MOVEMENTFLAG_ROOT
Definition: UnitDefines.h:368
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:162
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:161
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ 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[]
constexpr uint32 RemoveWeaponsSpells[]
@ POINT_START_TRANSITION
@ POINT_END_TRANSITION
@ POINT_TRANSITION_HALFWAY_DESCENDING
@ POINT_TRANSITION_HALFWAY_ASCENDING
@ POINT_TRANSITION_TOP
@ POINT_TRANSITION_CENTER_ASCENDING
constexpr uint32 SummonWeaponsSpells[]
Advisors
@ 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
Definition: SpellScript.h:2039
Unit * GetTarget() const
InstanceScript *const instance
void JustReachedHome() override
SummonList summons
EventMap events
void Reset() override
void _JustDied()
virtual void MoveInLineOfSight(Unit *)
Definition: CreatureAI.cpp:122
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
void SetObjectScale(float scale) override
Definition: Creature.cpp:3391
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetTarget(ObjectGuid const &guid) override
Definition: Creature.cpp:3419
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void DelayEvents(Milliseconds delay)
Definition: EventMap.cpp:96
void CancelEventGroup(uint32 group)
Definition: EventMap.cpp:153
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
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={})
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
void Clear()
Definition: ObjectGuid.h:286
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void Summon(Creature const *summon)
Trinity::IteratorPair< ThreatListIterator, std::nullptr_t > GetUnsortedThreatList() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
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
void SetHealth(uint64 val)
Definition: Unit.cpp:9346
int64 ModifyHealth(int64 val)
Definition: Unit.cpp:8182
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
void SetInCombatWith(Unit *enemy, bool addSecondUnitSuppressed=false)
Definition: Unit.h:1045
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:3104
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:832
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:4333
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetEmoteState(Emote emote)
Definition: Unit.h:852
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:5894
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:5670
uint64 GetHealth() const
Definition: Unit.h:776
Unit * GetVictim() const
Definition: Unit.h:715
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:1662
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition: Object.cpp:2991
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
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
MovementPoints
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:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
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
== Triggered Actions Requested ==================
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
== Triggered Actions Requested ==================
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