TrinityCore
boss_blood_prince_council.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "icecrown_citadel.h"
19#include "InstanceScript.h"
20#include "Map.h"
21#include "MotionMaster.h"
22#include "ObjectAccessor.h"
23#include "PassiveAI.h"
24#include "Player.h"
25#include "ScriptedCreature.h"
26#include "ScriptMgr.h"
27#include "SpellAuraEffects.h"
28#include "SpellInfo.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31
33{
34 // Blood Queen Lana'Thel
37
38 // Prince Keleseth
45
46 // Prince Taldaram
54
55 // Prince Valanar
63};
64
66{
70
71 // Heroic mode
75
76 // Prince Keleseth
81
82 // Dark Nucleus
85
86 // Prince Taldaram
91
92 // Ball of Flame
96 SPELL_FLAMES = 71393,
98
99 // Ball of Inferno Flame
102
103 // Prince Valanar
110
111 // Kinetic Bomb
116
117 // Shock Vortex
120
121 // Visual Spells
126
128{
131
134
135 // Keleseth
138
139 // Taldaram
142
143 // Valanar
149
151{
160
162{
166
168{
175
177{
178 public:
179 StandUpEvent(Creature* owner) : BasicEvent(), _owner(owner) { }
180
181 bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override
182 {
185 return true;
186 }
187
188 private:
190};
191
193{
194public:
195 VortexEvent(Creature* owner) : _owner(owner) { }
196
197 bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override
198 {
200 return true;
201 }
202
203private:
205};
206
207Position const introFinalPos = {4660.490f, 2769.200f, 430.0000f, 0.000000f};
208Position const triggerPos = {4680.231f, 2769.134f, 379.9256f, 3.121708f};
209Position const triggerEndPos = {4680.180f, 2769.150f, 365.5000f, 3.121708f};
210
212{
216};
217
219{
221 {
222 Initialize();
223 SetCombatMovement(false);
224 }
225
227 {
229 _resetCounter = 0;
230 }
231
232 void Reset() override
233 {
234 _Reset();
235 Initialize();
237
239 for (uint32 bossData : PrincesData)
240 if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData)))
241 {
242 prince->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
243 prince->SetImmuneToPC(false);
244 if (bossData == DATA_PRINCE_VALANAR)
245 {
246 prince->SetHealth(prince->GetMaxHealth());
247 prince->CastSpell(prince, SPELL_REMOVE_EMPOWERED_BLOOD, true);
248 }
249 }
250 }
251
252 void EnterEvadeMode(EvadeReason /*why*/) override
253 {
254 for (uint32 bossData : PrincesData)
255 if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData)))
257
260 }
261
262 void JustEngagedWith(Unit* who) override
263 {
265 return;
266
268 {
271 return;
272 }
273
275 me->setActive(true);
278
280
281 for (uint32 bossData : PrincesData)
282 if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData)))
283 {
285 DoZoneInCombat(prince);
286 }
287
289
291 if (roll_chance_i(50))
292 {
295 }
296 else
297 {
300 }
301 }
302
303 void SetData(uint32 /*type*/, uint32 data) override
304 {
305 _resetCounter += uint8(data);
306 if (_resetCounter == 3)
308 }
309
310 uint32 GetData(uint32 data) const override
311 {
313 return DATA_INTRO_DONE;
314 return 0;
315 }
316
317 void JustDied(Unit* killer) override
318 {
319 events.Reset();
321 // Kill all prices
322 for (uint8 i = 0; i < 3; ++i)
323 {
324 if (++_invocationStage == 3)
326
328 {
329 // Make sure looting is allowed
330 prince->LowerPlayerDamageReq(prince->GetMaxHealth());
331 Unit::Kill(killer, prince);
332 }
333 }
334 }
335
336 void DoAction(int32 actionId) override
337 {
339 {
342 bloodQueen->AI()->DoAction(ACTION_START_INTRO);
343 }
344 else if (actionId == ACTION_INTRO_DONE)
345 {
346 // Remove feigh death from princes
347 for (uint32 bossData : PrincesData)
348 if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData)))
349 {
350 prince->AI()->DoAction(ACTION_STAND_UP);
351 if (bossData == DATA_PRINCE_VALANAR)
352 prince->SetHealth(prince->GetMaxHealth());
353 }
354 }
355 }
356
357 void UpdateAI(uint32 diff) override
358 {
359 if (!UpdateVictim())
360 return;
361
362 events.Update(diff);
363
365 return;
366
367 while (uint32 eventId = events.ExecuteEvent())
368 {
369 switch (eventId)
370 {
372 {
374 if (++_invocationStage == 3)
376
378 if (oldPrince)
379 {
380 oldPrince->AI()->DoAction(ACTION_REMOVE_INVOCATION);
381 if (newPrince)
382 oldPrince->CastSpell(newPrince, _invocationOrder[_invocationStage].visualSpell, true);
383 }
384
385 if (newPrince)
386 {
387 newPrince->SetHealth(me->GetHealth());
388 newPrince->AI()->Talk(uint8(_invocationOrder[_invocationStage].textId));
389 }
390
392 events.Repeat(Seconds(46) + Milliseconds(500));
393 break;
394 }
395 default:
396 break;
397 }
398
400 return;
401 }
402 }
403
404private:
406 {
411
412 InvocationData(ObjectGuid _guid, uint32 _spellId, uint32 _textId, uint32 _visualSpell)
413 {
414 guid = _guid;
415 spellId = _spellId;
416 textId = _textId;
417 visualSpell = _visualSpell;
418 }
419
422
425};
426
428{
429 BloodPrincesBossAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId), _spawnHealth (creature->GetMaxHealth()), _isEmpowered(false)
430 {
432 }
433
434 void InitializeAI() override
435 {
436 _spawnHealth = 1;
437 if (!me->isDead())
438 JustAppeared();
439 }
440
441 void Reset() override
442 {
443 events.Reset();
446
447 me->SetImmuneToPC(false);
448 _isEmpowered = false;
451 }
452
453 void JustEngagedWith(Unit* /*who*/) override
454 {
456 me->setActive(true);
458 DoZoneInCombat(controller);
460 }
461
462 virtual void ScheduleEvents() = 0;
463
464 void JustDied(Unit* /*killer*/) override
465 {
466 events.Reset();
469
470 switch (me->GetEntry())
471 {
474 break;
477 break;
480 break;
481 default:
482 break;
483 }
484 }
485
486 void JustAppeared() override
487 {
489 if (controller->AI()->GetData(DATA_INTRO) != DATA_INTRO_DONE)
491
493 }
494
495 void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
496 {
497 if (!_isEmpowered)
498 {
499 AddThreat(attacker, float(damage));
500 damage = 0;
501 }
502 }
503
504 void KilledUnit(Unit* victim) override
505 {
506 if (victim->GetTypeId() == TYPEID_PLAYER)
507 switch (me->GetEntry())
508 {
511 break;
514 break;
517 break;
518 default:
519 break;
520 }
521 }
522
523 void JustReachedHome() override
524 {
527 _isEmpowered = false;
529 {
531 controller->AI()->SetData(DATA_PRINCE_EVADE, 1);
532 }
533 }
534
535 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
536 {
537 if (spellInfo->Id == SelectInvocationSpell())
539 }
540
541 void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) override
542 {
543 if (damageType != SPELL_DIRECT_DAMAGE)
544 return;
545
546 if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000))
548 }
549
550 void DoAction(int32 action) override
551 {
552 switch (action)
553 {
554 case ACTION_STAND_UP:
556 me->SetUninteractible(false);
557 me->SetImmuneToPC(false);
560 break;
564 _isEmpowered = true;
565 break;
570 _isEmpowered = false;
571 break;
572 default:
573 break;
574 }
575 }
576
578 {
579 switch (me->GetEntry())
580 {
587 default: // Should never happen
588 return 0;
589 }
590 }
591
593 {
594 switch (me->GetEntry())
595 {
602 default: // Should never happen
603 return 0;
604 }
605 }
606
607protected:
610};
611
613{
615 {
616 me->SetCanMelee(false);
617 }
618
619 void ScheduleEvents() override
620 {
624
625 if (IsHeroic())
626 {
629 }
630 }
631
632 void JustSummoned(Creature* summon) override
633 {
634 summons.Summon(summon);
635 Position pos = me->GetPosition();
636 float maxRange = me->GetDistance2d(summon);
637 float angle = me->GetAbsoluteAngle(summon);
638 me->MovePositionToFirstCollision(pos, maxRange, angle);
639 summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
641 }
642
643 void UpdateAI(uint32 diff) override
644 {
645 if (!UpdateVictim())
646 return;
647
648 events.Update(diff);
649
651 return;
652
653 while (uint32 eventId = events.ExecuteEvent())
654 {
655 switch (eventId)
656 {
657 case EVENT_BERSERK:
660 break;
664 events.Repeat(Seconds(10), Seconds(15));
665 break;
669 break;
670 default:
671 break;
672 }
673
675 return;
676 }
677 }
678};
679
681{
683
684 void ScheduleEvents() override
685 {
689 if (IsHeroic())
691 }
692
693 void JustSummoned(Creature* summon) override
694 {
695 summons.Summon(summon);
696 Unit* target = SelectTarget(SelectTargetMethod::Random, 1, -10.0f, true); // first try at distance
697 if (!target)
698 target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // too bad for you raiders, its going to boom
699
700 if (summon->GetEntry() == NPC_BALL_OF_INFERNO_FLAME && target)
701 Talk(EMOTE_TALDARAM_FLAME, target);
702
703 if (target)
704 summon->AI()->SetGUID(target->GetGUID());
705 }
706
707 void UpdateAI(uint32 diff) override
708 {
709 if (!UpdateVictim())
710 return;
711
712 events.Update(diff);
713
715 return;
716
717 while (uint32 eventId = events.ExecuteEvent())
718 {
719 switch (eventId)
720 {
721 case EVENT_BERSERK:
724 break;
727 events.Repeat(Seconds(15), Seconds(50));
728 break;
730 if (_isEmpowered)
731 {
733 events.Repeat(Seconds(15), Seconds(25));
734 }
735 else
736 {
738 events.Repeat(Seconds(20), Seconds(30));
739 }
741 break;
742 default:
743 break;
744 }
745
747 return;
748 }
749 }
750};
751
753{
755
756 void ScheduleEvents() override
757 {
761 if (IsHeroic())
763 }
764
765 void JustSummoned(Creature* summon) override
766 {
767 switch (summon->GetEntry())
768 {
772 .SetOriginalCaster(me->GetGUID()));
773 break;
774 case NPC_KINETIC_BOMB:
775 {
776 float x, y, z;
777 summon->GetPosition(x, y, z);
778 float ground_Z = summon->GetMap()->GetHeight(summon->GetPhaseShift(), x, y, z, true, 500.0f);
779 summon->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, ground_Z);
780 summon->SetUninteractible(false);
781 break;
782 }
783 case NPC_SHOCK_VORTEX:
784 summon->CastSpell(summon, SPELL_SHOCK_VORTEX_DUMMY, true);
785 summon->m_Events.AddEvent(new VortexEvent(summon), summon->m_Events.CalculateTime(5s));
786 break;
787 default:
788 break;
789 }
790
791 summons.Summon(summon);
792 if (me->IsInCombat())
793 DoZoneInCombat(summon);
794 }
795
796 void UpdateAI(uint32 diff) override
797 {
798 if (!UpdateVictim())
799 return;
800
801 events.Update(diff);
802
804 return;
805
806 while (uint32 eventId = events.ExecuteEvent())
807 {
808 switch (eventId)
809 {
810 case EVENT_BERSERK:
813 break;
815 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
816 {
819 }
820 events.Repeat(Seconds(18), Seconds(24));
821 break;
823 if (_isEmpowered)
824 {
827 events.Repeat(Seconds(30));
828 }
829 else
830 {
831 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
832 DoCast(target, SPELL_SHOCK_VORTEX);
833 events.Repeat(Seconds(18), Seconds(23));
834 }
835 break;
836 default:
837 break;
838 }
839
841 return;
842 }
843 }
844};
845
847{
848 npc_blood_queen_lana_thel(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
849
850 void Reset() override
851 {
852 _events.Reset();
853 me->SetDisableGravity(true);
855 }
856
857 void DoAction(int32 action) override
858 {
859 switch (action)
860 {
863 _events.SetPhase(1);
865 // summon a visual trigger
867 {
868 summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true);
869 summon->SetSpeedRate(MOVE_RUN, 0.14f);
870 summon->GetMotionMaster()->MovePoint(0, triggerEndPos);
871 }
872 break;
873 default:
874 break;
875 }
876 }
877
878 void MovementInform(uint32 type, uint32 id) override
879 {
880 if (type == POINT_MOTION_TYPE && id == POINT_INTRO_DESPAWN)
881 me->SetVisible(false);
882 }
883
884 void UpdateAI(uint32 diff) override
885 {
886 if (!_events.GetPhaseMask())
887 return;
888
889 _events.Update(diff);
890
892 {
895 _events.Reset();
896
898 controller->AI()->DoAction(ACTION_INTRO_DONE);
899 }
900 }
901
902private:
905};
906
908{
909 npc_ball_of_flame(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
910
911 void Reset() override
912 {
916 {
919 }
920 }
921
922 void MovementInform(uint32 type, uint32 id) override
923 {
924 if (type == CHASE_MOTION_TYPE && id == _chaseGUID.GetCounter() && !_chaseGUID.IsEmpty())
925 {
928 _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/)
929 {
931 });
933 }
934 }
935
936 void SetGUID(ObjectGuid const& guid, int32 /*id*/) override
937 {
938 _chaseGUID = guid;
939 }
940
941 void DoAction(int32 action) override
942 {
943 if (action == ACTION_FLAME_BALL_CHASE)
945 {
946 // need to clear states now because this call is before AuraEffect is fully removed
948 if (me->Attack(target, true))
949 me->GetMotionMaster()->MoveChase(target, 1.0f);
950 }
951 }
952
953 void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) override
954 {
955 if (damageType != SPELL_DIRECT_DAMAGE)
956 return;
957
958 if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000))
960 }
961
962 void UpdateAI(uint32 diff) override
963 {
964 _scheduler.Update(diff);
965 }
966
967private:
971};
972
974{
975 npc_kinetic_bomb(Creature* creature) : ScriptedAI(creature), _x(0.f), _y(0.f), _groundZ(0.f) { }
976
977 void Reset() override
978 {
979 _events.Reset();
980 me->SetWalk(true);
985 me->DespawnOrUnsummon(60s);
986 _groundZ = me->GetMap()->GetHeight(me->GetPhaseShift(), _x, _y, _groundZ, true, 500.0f);
987 }
988
989 void DoAction(int32 action) override
990 {
991 if (action == SPELL_KINETIC_BOMB_EXPLOSION)
993
994 else if (action == ACTION_KINETIC_BOMB_JUMP)
995 {
997 {
1000 }
1002 }
1003 }
1004
1005 void UpdateAI(uint32 diff) override
1006 {
1007 _events.Update(diff);
1008
1009 while (uint32 eventId = _events.ExecuteEvent())
1010 {
1011 switch (eventId)
1012 {
1013 case EVENT_BOMB_DESPAWN:
1014 me->SetVisible(false);
1015 me->DespawnOrUnsummon(5s);
1016 break;
1018 me->GetMotionMaster()->Clear();
1020 break;
1021 default:
1022 break;
1023 }
1024 }
1025 }
1026
1027private:
1029 float _x;
1030 float _y;
1032};
1033
1035{
1036 npc_dark_nucleus(Creature* creature) : ScriptedAI(creature) { }
1037
1038 void Reset() override
1039 {
1042 }
1043
1044 void JustEngagedWith(Unit* who) override
1045 {
1046 _scheduler.Schedule(Seconds(1), [this](TaskContext targetAuraCheck)
1047 {
1048 if (Unit* victim = me->GetVictim())
1049 {
1050 if (me->GetDistance(victim) < 15.0f && !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID()))
1051 DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST);
1052 else
1053 MoveInLineOfSight(me->GetVictim());
1054 }
1055 targetAuraCheck.Repeat();
1056 });
1057
1058 if (me->GetDistance(who) >= 15.0f)
1059 {
1060 DoStartMovement(who);
1061 return;
1062 }
1063
1065 }
1066
1067 void DamageTaken(Unit* attacker, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1068 {
1069 if (attacker == me)
1070 return;
1071
1073 AddThreat(attacker, 500000000.0f);
1074 }
1075
1076 void UpdateAI(uint32 diff) override
1077 {
1078 if (!UpdateVictim())
1079 return;
1080
1081 _scheduler.Update(diff);
1082 }
1083
1084private:
1086};
1087
1088// 71806 - Glittering Sparks
1090{
1092 {
1093 PreventHitDefaultEffect(effIndex);
1095 }
1096
1097 void Register() override
1098 {
1100 }
1101};
1102
1103/* 71718 - Conjure Flame
1104 72040 - Conjure Empowered Flame */
1106{
1108 {
1109 PreventHitDefaultEffect(effIndex);
1111 }
1112
1113 void Register() override
1114 {
1116 }
1117};
1118
1119/* 55891 - Flame Sphere Spawn Effect
1120 55947 - Flame Sphere Death Effect */
1122{
1123 bool Load() override
1124 {
1126 return true;
1127 return false;
1128 }
1129
1130 bool Validate(SpellInfo const* /*spell*/) override
1131 {
1133 }
1134
1135 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1136 {
1137 Creature* target = GetTarget()->ToCreature();
1138 if (!target)
1139 return;
1140
1141 // SPELL_FLAME_SPHERE_SPAWN_EFFECT
1143 {
1144 target->CastSpell(target, SPELL_BALL_OF_FLAMES, true);
1146 }
1147 else // SPELL_FLAME_SPHERE_DEATH_EFFECT
1148 target->DespawnOrUnsummon();
1149 }
1150
1151 void Register() override
1152 {
1154 }
1155};
1156
1157/* 71756 - Ball of Flames Proc
1158 72782 - Ball of Flames Proc
1159 72783 - Ball of Flames Proc
1160 72784 - Ball of Flames Proc */
1162{
1164 {
1165 if (Aura* aur = GetHitAura())
1166 aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount));
1167 }
1168
1169 void Register() override
1170 {
1172 }
1173};
1174
1176{
1177 void HandleStackDrop(ProcEventInfo& /*eventInfo*/)
1178 {
1179 ModStackAmount(-1);
1180 }
1181
1182 void Register() override
1183 {
1185 }
1186};
1187
1188// 72080 - Kinetic Bomb
1190{
1192 {
1193 Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f };
1194 dest.RelocateOffset(offset);
1195 }
1196
1197 void Register() override
1198 {
1200 }
1201};
1202
1204{
1205 bool Validate(SpellInfo const* /*spell*/) override
1206 {
1208 }
1209
1210 void HandleDummyTick(AuraEffect const* /*aurEff*/)
1211 {
1212 Unit* target = GetTarget();
1213 if (target->GetTypeId() != TYPEID_UNIT)
1214 return;
1215
1216 if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true))
1217 {
1218 bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true);
1219 bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL);
1220 target->RemoveAura(GetAura());
1221 bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION);
1222 }
1223 }
1224
1225 void Register() override
1226 {
1228 }
1229};
1230
1231// 72087 - Kinetic Bomb Knockback
1233{
1235 {
1236 if (missInfo != SPELL_MISS_NONE)
1237 return;
1238
1239 if (Creature* target = GetHitCreature())
1240 target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP);
1241 }
1242
1243 void Register() override
1244 {
1246 }
1247};
1248
1249// 72054 - Kinetic Bomb Visual
1251{
1252 void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
1253 {
1254 absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount());
1255 RoundToInterval<uint32>(absorbAmount, 0, dmgInfo.GetDamage());
1256 dmgInfo.AbsorbDamage(absorbAmount);
1257 }
1258
1259 void Register() override
1260 {
1262 }
1263};
1264
1265// 73001 - Shadow Prison
1267{
1268 bool Validate(SpellInfo const* /*spell*/) override
1269 {
1271 }
1272
1273 void HandleDummyTick(AuraEffect const* aurEff)
1274 {
1275 if (GetTarget()->isMoving())
1277 }
1278
1279 void Register() override
1280 {
1282 }
1283};
1284
1285// 72999 - Shadow Prison
1287{
1288 void CalculateDamage(Unit const* victim, int32& /*damage*/, int32& flatMod, float& /*pctMod*/) const
1289 {
1290 if (Aura const* aur = victim->GetAura(GetSpellInfo()->Id))
1291 if (AuraEffect const* eff = aur->GetEffect(EFFECT_1))
1292 flatMod += eff->GetAmount();
1293 }
1294
1295 void Register() override
1296 {
1298 }
1299};
1300
1302{
1303 public:
1304 at_blood_prince_council_start_intro() : AreaTriggerScript("at_blood_prince_council_start_intro") { }
1305
1306 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
1307 {
1308 if (InstanceScript* instance = player->GetInstanceScript())
1309 if (Creature* controller = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_BLOOD_PRINCES_CONTROL)))
1310 controller->AI()->DoAction(ACTION_START_INTRO);
1311
1312 return true;
1313 }
1314};
1315
1317{
1318 // Creatures
1327
1328 // Spells
1338
1339 // AreaTriggers
1341}
Texts
Actions
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ IN_PROGRESS
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ CHASE_MOTION_TYPE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
@ SPELL_BERSERK
Definition: PlayerAI.cpp:371
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition: ScriptMgr.h:1371
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
SpellMissInfo
@ SPELL_MISS_NONE
@ TARGET_DEST_CASTER
@ EMOTE_ONESHOT_ROAR
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_MOD_STUN
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
#define AuraProcFn(F)
Definition: SpellScript.h:2150
#define BeforeSpellHitFn(F)
Definition: SpellScript.h:847
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellCalcDamageFn(F)
Definition: SpellScript.h:879
#define SpellDestinationTargetSelectFn(F, I, N)
Definition: SpellScript.h:874
#define AuraEffectAbsorbFn(F, I)
Definition: SpellScript.h:2090
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ MOVE_RUN
Definition: UnitDefines.h:118
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
DamageEffectType
Definition: UnitDefines.h:131
@ SPELL_DIRECT_DAMAGE
Definition: UnitDefines.h:133
@ UNIT_FLAG3_FAKE_DEAD
Definition: UnitDefines.h:259
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ UNIT_STATE_STUNNED
Definition: Unit.h:258
T CalculatePct(T base, U pct)
Definition: Util.h:72
@ DATA_PRINCE_TALDARAM
Definition: ahnkahet.h:32
@ NPC_PRINCE_TALDARAM
Definition: ahnkahet.h:46
@ ACTION_REMOVE_INVOCATION
@ ACTION_KINETIC_BOMB_JUMP
Position const triggerPos
@ POINT_KINETIC_BOMB_IMPACT
@ SPELL_SHADOW_RESONANCE_RESIST
@ SPELL_INVOCATION_OF_BLOOD_VALANAR
@ SPELL_INVOCATION_OF_BLOOD_TALDARAM
@ SPELL_BALL_OF_FLAMES_PERIODIC
@ SPELL_KINETIC_BOMB_TARGET
@ SPELL_FLAME_SPHERE_DEATH_EFFECT
@ SPELL_BALL_OF_FLAMES_VISUAL
@ SPELL_KINETIC_BOMB_KNOCKBACK
@ SPELL_FLAME_SPHERE_SPAWN_EFFECT
@ SPELL_EMPOWERED_SHADOW_LANCE
@ SPELL_INVOCATION_VISUAL_TALDARAM
@ SPELL_SHADOW_PRISON_DUMMY
@ SPELL_OOC_INVOCATION_VISUAL
@ SPELL_BALL_OF_FLAMES_PROC
@ SPELL_KINETIC_BOMB_EXPLOSION
@ SPELL_GLITTERING_SPARKS
@ SPELL_INVOCATION_VISUAL_VALANAR
@ SPELL_INVOCATION_OF_BLOOD_KELESETH
@ SPELL_KINETIC_BOMB_VISUAL
@ SPELL_SHADOW_PRISON_DAMAGE
@ SPELL_SHOCK_VORTEX_PERIODIC
@ SPELL_REMOVE_EMPOWERED_BLOOD
@ SPELL_SHADOW_RESONANCE_AURA
@ SPELL_SHOCK_VORTEX_DUMMY
@ SPELL_CONJURE_EMPOWERED_FLAME
@ SPELL_INVOCATION_VISUAL_ACTIVE
@ SPELL_EMPOWERED_SHOCK_VORTEX
@ SPELL_INVOCATION_VISUAL_KELESETH
@ SPELL_SHADOW_RESONANCE
void AddSC_boss_blood_prince_council()
Position const triggerEndPos
@ SAY_VALANAR_INVOCATION
@ EMOTE_VALANAR_INVOCATION
@ SAY_TALDARAM_INVOCATION
@ EMOTE_TALDARAM_INVOCATION
@ EMOTE_KELESETH_BERSERK
@ SAY_KELESETH_INVOCATION
@ EMOTE_KELESETH_INVOCATION
@ EMOTE_VALANAR_SHOCK_VORTEX
@ EMOTE_TALDARAM_BERSERK
Position const introFinalPos
uint32 const PrincesData[]
@ EVENT_INVOCATION_OF_BLOOD
int32 GetAmount() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
SpellInfo const * GetSpellInfo() const
Unit * GetCaster() const
HookList< EffectAbsorbHandler > OnEffectAbsorb
Definition: SpellScript.h:2089
Aura * GetAura() const
Unit * GetTarget() const
HookList< AuraProcHandler > OnProc
Definition: SpellScript.h:2145
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void SetBoundary(CreatureBoundary const *boundary, bool negativeBoundaries=false)
Definition: CreatureAI.cpp:446
Creature *const me
Definition: CreatureAI.h:61
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
Definition: CreatureAI.cpp:464
void SetCombatPulseDelay(uint32 delay)
Definition: Creature.h:345
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
Definition: Creature.cpp:2822
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
CreatureAI * AI() const
Definition: Creature.h:214
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:211
uint32 GetDamage() const
Definition: Unit.h:446
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
uint8 GetPhaseMask() const
Definition: EventMap.h:75
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
virtual bool SetBossState(uint32 id, EncounterState state)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
CreatureBoundary const * GetBossBoundary(uint32 id) const
EncounterState GetBossState(uint32 id) const
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
float GetHeight(PhaseShift const &phaseShift, float x, float y, float z, bool vmap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH)
Definition: Map.h:290
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={})
void MoveCharge(float x, float y, float z, float speed=SPEED_CHARGE, uint32 id=EVENT_CHARGE, bool generatePath=false, Unit const *target=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr)
LowType GetCounter() const
Definition: ObjectGuid.h:293
bool IsEmpty() const
Definition: ObjectGuid.h:319
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
HookList< DamageAndHealingCalcHandler > CalcDamage
Definition: SpellScript.h:878
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Definition: SpellScript.h:873
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
Aura * GetHitAura(bool dynObjAura=false) const
HookList< BeforeHitHandler > BeforeHit
Definition: SpellScript.h:846
SpellInfo const * GetSpellInfo() const
bool Execute(uint64, uint32) override
StandUpEvent(Creature *owner)
void Summon(Creature const *summon)
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
void SetTempSummonType(TempSummonType type)
virtual void DoAction(int32)
Definition: UnitAI.h:72
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
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition: UnitAI.h:75
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void ClearUnitState(uint32 f)
Definition: Unit.h:733
void SetVisible(bool x)
Definition: Unit.cpp:8351
void SetHealth(uint64 val)
Definition: Unit.cpp:9346
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:8515
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
ThreatManager & GetThreatManager()
Definition: Unit.h:1063
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
TempSummon * ToTempSummon()
Definition: Unit.h:1756
void RemoveUnitFlag3(UnitFlags3 flags)
Definition: Unit.h:844
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:5670
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
uint64 GetHealth() const
Definition: Unit.h:776
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition: Unit.cpp:10591
bool IsInCombat() const
Definition: Unit.h:1043
bool isDead() const
Definition: Unit.h:1166
VortexEvent(Creature *owner)
bool Execute(uint64, uint32) override
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition: Object.cpp:3482
PhaseShift & GetPhaseShift()
Definition: Object.h:523
void setActive(bool isActiveObject)
Definition: Object.cpp:922
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
EventProcessor m_Events
Definition: Object.h:777
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1078
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
void CalculateDamage(Unit const *victim, int32 &, int32 &flatMod, float &) const
bool Validate(SpellInfo const *) override
void HandleDummyTick(AuraEffect const *aurEff)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnAbsorb(AuraEffect *aurEff, DamageInfo &dmgInfo, uint32 &absorbAmount)
bool Validate(SpellInfo const *) override
void SetDest(SpellDestination &dest)
@ LIGHT_S_HAMMER_TELEPORT
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ DATA_ORB_WHISPERER_ACHIEVEMENT
@ DATA_BLOOD_PRINCE_COUNCIL_INTRO
@ DATA_BLOOD_PRINCE_COUNCIL
@ DATA_PRINCE_VALANAR
@ DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL
also used by conditions
@ DATA_BLOOD_PRINCES_CONTROL
@ DATA_PRINCE_KELESETH
@ NPC_KINETIC_BOMB
@ NPC_PRINCE_VALANAR
@ NPC_SHOCK_VORTEX
@ NPC_BALL_OF_FLAME
@ NPC_FLOATING_TRIGGER
@ NPC_BALL_OF_INFERNO_FLAME
@ NPC_KINETIC_BOMB_TARGET
@ NPC_PRINCE_KELESETH
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void DamageTaken(Unit *attacker, uint32 &damage, DamageEffectType, SpellInfo const *) override
void KilledUnit(Unit *victim) override
void DoAction(int32 action) override
void JustDied(Unit *) override
virtual void ScheduleEvents()=0
BloodPrincesBossAI(Creature *creature, uint32 bossId)
void JustEngagedWith(Unit *) override
void DamageDealt(Unit *, uint32 &damage, DamageEffectType damageType) override
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
float GetAbsoluteAngle(float x, float y) const
Definition: Position.h:125
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
bool IsHeroic() const
void SetCombatMovement(bool allowMovement)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void DoStartMovement(Unit *target, float distance=0.0f, float angle=0.0f)
void RelocateOffset(Position const &offset)
Definition: Spell.cpp:122
InvocationData(ObjectGuid _guid, uint32 _spellId, uint32 _textId, uint32 _visualSpell)
uint32 GetData(uint32 data) const override
void SetData(uint32, uint32 data) override
struct boss_blood_council_controller::InvocationData _invocationOrder[3]
void DoAction(int32 actionId) override
void JustDied(Unit *killer) override
void EnterEvadeMode(EvadeReason) override
void UpdateAI(uint32 diff) override
boss_prince_keleseth_icc(Creature *creature)
void JustSummoned(Creature *summon) override
boss_prince_taldaram_icc(Creature *creature)
void UpdateAI(uint32 diff) override
void JustSummoned(Creature *summon) override
void UpdateAI(uint32 diff) override
boss_prince_valanar_icc(Creature *creature)
void JustSummoned(Creature *summon) override
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
void SetGUID(ObjectGuid const &guid, int32) override
void DamageDealt(Unit *, uint32 &damage, DamageEffectType damageType) override
npc_ball_of_flame(Creature *creature)
void MovementInform(uint32 type, uint32 id) override
npc_blood_queen_lana_thel(Creature *creature)
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32 id) override
void JustEngagedWith(Unit *who) override
npc_dark_nucleus(Creature *creature)
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *attacker, uint32 &, DamageEffectType, SpellInfo const *) override
void DoAction(int32 action) override
npc_kinetic_bomb(Creature *creature)
void UpdateAI(uint32 diff) override