TrinityCore
Loading...
Searching...
No Matches
boss_yogg_saron.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 "ulduar.h"
19#include "CreatureTextMgr.h"
20#include "GridNotifiers.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "PassiveAI.h"
26#include "Player.h"
27#include "ScriptedCreature.h"
28#include "ScriptMgr.h"
29#include "Spell.h"
30#include "SpellAuraEffects.h"
31#include "SpellScript.h"
32#include "TemporarySummon.h"
33
35{
36 // Sara
37 SAY_SARA_ULDUAR_SCREAM_1 = 0, // screams randomly in a whole instance, unused on retail
38 SAY_SARA_ULDUAR_SCREAM_2 = 1, // screams randomly in a whole instance, unused on retail
49
50 // Yogg-Saron
60
61 // Voice of Yogg-Saron
64
65 // Brain of Yogg-Saron
67
68 // Ominous Cloud
70
71 // Keepers
74
75 // Yogg-Saron illusions
81
82 // Neltharion
85
86 // Ysera
88
89 // Malygos
91
92 // Immolated Champion
95
96 // The Lich King
99
100 // Garona
105
106 // King Llane
108};
109
111{
112 // Voice of Yogg-Saron
118 //SPELL_CLEAR_INSANE = 63122, // when should it be cast?
123
124 // Sara
138 SPELL_BRAIN_LINK_DAMAGE = 63803, // red beam
139 SPELL_BRAIN_LINK_NO_DAMAGE = 63804, // yellow beam
141
142 // Ominous Cloud
145
146 // Guardian of Yogg-Saron
150
151 // Yogg-Saron
160
161 // Brain of Yogg-Saron
168
169 // Tentacles
170 SPELL_ERUPT = 64144,
171 SPELL_TENTACLE_VOID_ZONE = 64017, // used by Corruptor Tentacle and Crusher Tentacle only
172
173 // Crusher Tentacle
177 SPELL_CRUSH = 64146,
178 //SPELL_CRUSH_2 = 65201, // triggered by SPELL_CRUSH, basepoints of SPELL_MALADY_OF_THE_MIND
179
180 // Constrictor Tentacle
182 SPELL_LUNGE = 64131,
183
184 // Corruptor Tentacle
189
190 // Immortal Guardian
198
199 // Keepers at Observation Ring
201
202 // Keepers
205
206 // Mimiron
209
210 // Freya
213
214 // Sanity Well
217
218 // Thorim
221
222 // Hodir
226
227 // Death Orb
229
230 // Death Ray
234
235 // Laughing Skull
237
238 // Descend Into Madness
243
244 // Illusions
247
248 // Suit of Armor
250
251 // Dragon Consorts & Deathsworn Zealot
253
254 // Garona
256
257 // King Llane
259
260 // The Lich King
262
263 // Turned Champion
265
266 // Player self cast spells
277
279};
280
288
290{
291 // Voice of Yogg-Saron
299 EVENT_EXTINGUISH_ALL_LIFE = 8, // handled by Voice, timer starts at the beginning of the fight (Yogg-Saron is not spawned at this moment)
300
301 // Sara
313
314 // Tentacles
317
318 // Yogg-Saron
322 EVENT_DEAFENING_ROAR = 25, // only on 25-man with 0-3 keepers active (Hard Mode)
323
324 // Guardian of Yogg-Saron
326
327 // Immortal Guardian
329
330 // Keepers
333
334 // Chamber Illusion
340
341 // Icecrown Illusion
348
349 // Stormwind Illusion
357};
358
363
376
383
384Position const YoggSaronSpawnPos = {1980.43f, -25.7708f, 324.9724f, 3.141593f};
386{
387 {1945.682f, 33.34201f, 411.4408f, 5.270895f}, // Freya
388 {1945.761f, -81.52171f, 411.4407f, 1.029744f}, // Hodir
389 {2028.822f, -65.73573f, 411.4426f, 2.460914f}, // Thorim
390 {2028.766f, 17.42014f, 411.4446f, 3.857178f}, // Mimiron
391};
393{
394 {2036.873f, 25.42513f, 338.4984f, 3.909538f}, // Freya
395 {1939.045f, -90.87457f, 338.5426f, 0.994837f}, // Hodir
396 {1939.148f, 42.49035f, 338.5427f, 5.235988f}, // Thorim
397 {2036.658f, -73.58822f, 338.4985f, 2.460914f}, // Mimiron
398};
400{
401 {1928.793f, 65.03109f, 242.3763f, 0.0f}, // Garona end position
402 {1912.324f, -155.7967f, 239.9896f, 0.0f}, // Saurfang end position
403};
404
411
418
420{
421 public:
422 boss_voice_of_yogg_saron() : CreatureScript("boss_voice_of_yogg_saron") { }
423
425 {
427 {
428 Initialize();
429 SetCombatMovement(false);
430 }
431
433 {
434 _guardiansCount = 0;
435 _guardianTimer = 20s;
436 _illusionShattered = false;
437 }
438
439 void MoveInLineOfSight(Unit* who) override
440 {
441 // TODO: MoveInLineOfSight doesn't work for such a big distance
442 if (who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && me->GetDistance2d(who) < 99.0f && !me->IsInCombat())
444 }
445
446 void EnterEvadeMode(EvadeReason why) override
447 {
449
450 for (uint8 i = DATA_SARA; i <= DATA_MIMIRON_YS; ++i)
452 creature->AI()->EnterEvadeMode();
453
454 // not sure, spoken by Sara (sound), regarding to wowwiki Voice whispers it
455 Map::PlayerList const& players = me->GetMap()->GetPlayers();
456 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
457 if (Player* player = itr->GetSource())
458 {
461
462 player->RemoveAurasDueToSpell(SPELL_SANITY);
463 player->RemoveAurasDueToSpell(SPELL_INSANE);
464 }
465 }
466
467 void Reset() override
468 {
469 _Reset();
471
473
474 Initialize();
475
476 bool clockwise = false;
477 std::list<TempSummon*> clouds;
479 clouds.sort(Trinity::ObjectDistanceOrderPred(me, true));
480 for (std::list<TempSummon*>::const_iterator itr = clouds.begin(); itr != clouds.end(); ++itr)
481 {
482 (*itr)->AI()->DoAction(int32(clockwise));
483 clockwise = !clockwise;
484 }
485 }
486
487 void JustEngagedWith(Unit* /*who*/) override
488 {
490 sara->SetInCombatWith(me);
491
492 for (uint8 i = DATA_FREYA_YS; i <= DATA_MIMIRON_YS; ++i)
494 keeper->SetInCombatWith(me);
495
497
500
503 events.ScheduleEvent(EVENT_EXTINGUISH_ALL_LIFE, 15min); // 15 minutes
504 }
505
506 void JustDied(Unit* /*killer*/) override
507 {
508 // don't despawn Yogg-Saron's corpse, remove him from SummonList!
510 summons.Despawn(yogg);
511
512 _JustDied();
513 }
514
515 void UpdateAI(uint32 diff) override
516 {
517 if (!UpdateVictim())
518 return;
519
522
523 events.Update(diff);
524 // don't summon tentacles when illusion is shattered, delay them
527
528 while (uint32 eventId = events.ExecuteEvent())
529 {
530 switch (eventId)
531 {
532 case EVENT_LOCK_DOOR:
535 break;
538 {
539 yogg->AI()->Talk(EMOTE_YOGG_SARON_EXTINGUISH_ALL_LIFE, me);
540 yogg->CastSpell(nullptr, SPELL_EXTINGUISH_ALL_LIFE, true);
541 }
542 events.ScheduleEvent(EVENT_EXTINGUISH_ALL_LIFE, 10s); // cast it again after a short while, players can survive
543 break;
547 if (_guardiansCount <= 6 && _guardiansCount % 3 == 0)
548 _guardianTimer -= 5s;
550 break;
554 break;
558 break;
562 break;
563 case EVENT_ILLUSION:
564 {
566 {
567 yogg->AI()->Talk(EMOTE_YOGG_SARON_MADNESS);
568 yogg->AI()->Talk(SAY_YOGG_SARON_MADNESS);
569 }
570
572 if (me->GetMap()->Is25ManRaid())
574
576 instance->SetData(DATA_ILLUSION, illusion);
577
579 brain->AI()->DoAction(ACTION_INDUCE_MADNESS);
580 events.ScheduleEvent(EVENT_ILLUSION, 80s, 0, PHASE_TWO); // wowwiki says 80 secs, wowhead says something about 90 secs
581 break;
582 }
586 break;
587 default:
588 break;
589 }
590 }
591 }
592
622
623 void JustSummoned(Creature* summon) override
624 {
625 switch (summon->GetEntry())
626 {
628 SetAggressiveStateAfter(1s, summon, true, me, StartCombatArgs().SetDistance(300.f));
629 break;
630 case NPC_YOGG_SARON:
632 break;
634 summon->CastSpell(summon, SPELL_LUNGE, true);
635 break;
640 SetAggressiveStateAfter(5s, summon, true, me, StartCombatArgs().SetDistance(300.f));
641 break;
643 summon->CastSpell(summon, SPELL_TELEPORT_PORTAL_VISUAL, true);
644 break;
646 summon->CastSpell(summon, SPELL_SIMPLE_TELEPORT, true);
647 break;
648 }
649
650 BossAI::JustSummoned(summon);
651 }
652
653 private:
657 };
658
659 CreatureAI* GetAI(Creature* creature) const override
660 {
661 return GetUlduarAI<boss_voice_of_yogg_saronAI>(creature);
662 }
663};
664
666{
667 public:
668 boss_sara() : CreatureScript("boss_sara") { }
669
670 struct boss_saraAI : public ScriptedAI
671 {
672 boss_saraAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
673
675 {
676 std::map<ObjectGuid, ObjectGuid>::const_iterator itr = _linkData.find(guid);
677 if (itr != _linkData.end())
678 return itr->second;
679
680 return ObjectGuid::Empty;
681 }
682
683 void SetLinkBetween(ObjectGuid player1, ObjectGuid player2)
684 {
685 _linkData[player1] = player2;
686 _linkData[player2] = player1;
687 }
688
689 // called once for each target on aura remove
691 {
692 _linkData.erase(player1);
693 }
694
695 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
696 {
697 if (damage >= me->GetHealth())
698 {
699 damage = me->GetHealth() - 1;
700
702 {
704 voice->AI()->DoAction(ACTION_PHASE_TRANSFORM);
705
712 }
713 }
714 }
715
716 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
717 {
719 return;
720
721 switch (spellInfo->Id)
722 {
725 break;
728 break;
729 case SPELL_PSYCHOSIS:
731 break;
732 default:
733 break;
734 }
735 }
736
737 void KilledUnit(Unit* victim) override
738 {
739 if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode())
741 }
742
750
751 void JustEnteredCombat(Unit* who) override
752 {
753 if (IsEngaged())
754 return;
755
756 EngagementStart(who);
757 }
758
759 void Reset() override
760 {
764 _events.Reset();
766 }
767
768 void UpdateAI(uint32 diff) override
769 {
770 if (!me->IsInCombat())
771 return;
772
774 return;
775
776 _events.Update(diff);
777
779 return;
780
781 while (uint32 eventId = _events.ExecuteEvent())
782 {
783 switch (eventId)
784 {
788 break;
792 break;
796 break;
799 break;
802 break;
808 voice->AI()->DoAction(ACTION_PHASE_TWO);
810 mimiron->AI()->DoAction(ACTION_PHASE_TWO);
811 break;
818 _events.ScheduleEvent(EVENT_DEATH_RAY, 20s, 0, PHASE_TWO); // almost never cast at scheduled time, why?
822 break;
823 case EVENT_DEATH_RAY:
826 break;
830 break;
831 case EVENT_PSYCHOSIS:
834 break;
835 case EVENT_BRAIN_LINK:
838 break;
839 default:
840 break;
841 }
842 }
843 }
844
845 void JustSummoned(Creature* summon) override
846 {
848
849 switch (summon->GetEntry())
850 {
851 case NPC_DEATH_ORB:
854 for (uint8 i = 0; i < 4; ++i)
855 {
856 Position pos;
857 float radius = frand(25.0f, 50.0f);
858 float angle = frand(0.0f, 2.0f * float(M_PI));
859 pos.m_positionX = YoggSaronSpawnPos.GetPositionX() + radius * cosf(angle);
860 pos.m_positionY = YoggSaronSpawnPos.GetPositionY() + radius * sinf(angle);
863 }
864 break;
865 case NPC_DEATH_RAY:
867 break;
868 }
869
871 voice->AI()->JustSummoned(summon);
872 }
873
874 void DoAction(int32 action) override
875 {
876 switch (action)
877 {
878 case ACTION_PHASE_THREE: // Sara does nothing in phase 3
880 break;
881 default:
882 break;
883 }
884 }
885
886 private:
889 std::map<ObjectGuid, ObjectGuid> _linkData;
890 };
891
892 CreatureAI* GetAI(Creature* creature) const override
893 {
894 return GetUlduarAI<boss_saraAI>(creature);
895 }
896};
897
899{
900 public:
901 boss_yogg_saron() : CreatureScript("boss_yogg_saron") { }
902
904 {
905 boss_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
906
907 void Reset() override
908 {
909 _events.Reset();
914
915 me->ResetLootMode();
917 if (keepersCount == 0)
919 if (keepersCount <= 1)
921 if (keepersCount <= 2)
923 if (keepersCount <= 3)
925 }
926
927 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
928 {
929 // Val'anyr
930 if (spellInfo->Id == SPELL_IN_THE_MAWS_OF_THE_OLD_GOD)
931 me->AddLootMode(32);
932 }
933
934 void JustDied(Unit* /*killer*/) override
935 {
937
939 Unit::Kill(me, creature);
940
941 for (uint8 i = DATA_SARA; i <= DATA_BRAIN_OF_YOGG_SARON; ++i)
943 creature->DisappearAndDie();
944
945 for (uint8 i = DATA_FREYA_YS; i <= DATA_MIMIRON_YS; ++i)
947 creature->AI()->EnterEvadeMode();
948
949 Map::PlayerList const& players = me->GetMap()->GetPlayers();
950 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
951 if (Player* player = itr->GetSource())
952 {
953 player->RemoveAurasDueToSpell(SPELL_SANITY);
954 player->RemoveAurasDueToSpell(SPELL_INSANE);
955 }
956 }
957
958 void UpdateAI(uint32 diff) override
959 {
960 _events.Update(diff);
961
963 return;
964
965 while (uint32 eventId = _events.ExecuteEvent())
966 {
967 switch (eventId)
968 {
971 break;
976 break;
981 break;
986 _events.ScheduleEvent(EVENT_DEAFENING_ROAR, 20s, 25s, 0, PHASE_THREE); // timer guessed
987 break;
988 default:
989 break;
990 }
991 }
992 }
993
994 void DoAction(int32 action) override
995 {
996 switch (action)
997 {
1003 _events.ScheduleEvent(EVENT_DEAFENING_ROAR, 20s, 25s, 0, PHASE_THREE); // timer guessed
1008 break;
1009 default:
1010 break;
1011 }
1012 }
1013
1014 private:
1017 };
1018
1019 CreatureAI* GetAI(Creature* creature) const override
1020 {
1021 return GetUlduarAI<boss_yogg_saronAI>(creature);
1022 }
1023};
1024
1026{
1027 public:
1028 boss_brain_of_yogg_saron() : CreatureScript("boss_brain_of_yogg_saron") { }
1029
1031 {
1032 boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature)
1033 {
1034 _tentaclesKilled = 0;
1035 }
1036
1037 void Reset() override
1038 {
1039 me->SetUninteractible(false);
1040 me->SetImmuneToPC(false);
1043 }
1044
1045 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1046 {
1048 {
1049 me->RemoveAllAuras();
1052 DoCast(me, SPELL_MATCH_HEALTH_2, true); // it doesn't seem to hit Yogg-Saron here
1054 me->SetUninteractible(true);
1055 me->SetImmuneToPC(true);
1056
1058 voice->AI()->DoAction(ACTION_PHASE_THREE);
1060 sara->AI()->DoAction(ACTION_PHASE_THREE);
1062 yogg->AI()->DoAction(ACTION_PHASE_THREE);
1063
1064 for (uint8 i = DATA_THORIM_YS; i <= DATA_MIMIRON_YS; ++i)
1066 keeper->AI()->DoAction(ACTION_PHASE_THREE);
1067 }
1068 }
1069
1070 void UpdateAI(uint32 /*diff*/) override { }
1071
1072 void DoAction(int32 action) override
1073 {
1074 switch (action)
1075 {
1077 {
1078 _tentaclesKilled = 0;
1079
1081
1082 // make sure doors won't be opened
1085
1087 break;
1088 }
1090 {
1091 uint8 illusion = _instance->GetData(DATA_ILLUSION);
1092 if (++_tentaclesKilled >= (illusion == ICECROWN_ILLUSION ? 9 : 8))
1093 {
1098
1100 voice->AI()->DoAction(ACTION_TOGGLE_SHATTERED_ILLUSION);
1101 }
1102 break;
1103 }
1104 default:
1105 break;
1106 }
1107 }
1108
1109 void JustSummoned(Creature* summon) override
1110 {
1111 _summons.Summon(summon);
1112 }
1113
1114 private:
1118 };
1119
1120 CreatureAI* GetAI(Creature* creature) const override
1121 {
1122 return GetUlduarAI<boss_brain_of_yogg_saronAI>(creature);
1123 }
1124};
1125
1127{
1128 public:
1129 npc_ominous_cloud() : CreatureScript("npc_ominous_cloud") { }
1130
1132 {
1133 npc_ominous_cloudAI(Creature* creature) : PassiveAI(creature) { }
1134
1135 void Reset() override
1136 {
1138 }
1139
1140 void UpdateAI(uint32 /*diff*/) override { }
1141
1147
1148 bool clockwise = false;
1149 };
1150
1151 CreatureAI* GetAI(Creature* creature) const override
1152 {
1153 return GetUlduarAI<npc_ominous_cloudAI>(creature);
1154 }
1155};
1156
1158{
1159 public:
1160 npc_guardian_of_yogg_saron() : CreatureScript("npc_guardian_of_yogg_saron") { }
1161
1163 {
1164 npc_guardian_of_yogg_saronAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1165
1166 void JustDied(Unit* /*killer*/) override
1167 {
1170 }
1171
1172 void Reset() override
1173 {
1175 }
1176
1177 void UpdateAI(uint32 diff) override
1178 {
1179 if (!UpdateVictim())
1180 return;
1181
1182 _events.Update(diff);
1183
1185 return;
1186
1187 while (uint32 eventId = _events.ExecuteEvent())
1188 {
1189 switch (eventId)
1190 {
1191 case EVENT_DARK_VOLLEY:
1194 break;
1195 default:
1196 break;
1197 }
1198 }
1199 }
1200
1201 void IsSummonedBy(WorldObject* summoner) override
1202 {
1203 if (summoner->GetEntry() != NPC_OMINOUS_CLOUD)
1204 return;
1205
1206 // Guardian can be summoned both by Voice of Yogg-Saron and by Ominous Cloud
1208 voice->AI()->JustSummoned(me);
1209 }
1210
1211 private:
1214 };
1215
1216 CreatureAI* GetAI(Creature* creature) const override
1217 {
1218 return GetUlduarAI<npc_guardian_of_yogg_saronAI>(creature);
1219 }
1220};
1221
1223{
1224 public:
1225 npc_corruptor_tentacle() : CreatureScript("npc_corruptor_tentacle") { }
1226
1228 {
1230 {
1231 SetCombatMovement(false);
1232 }
1233
1240
1241 void UpdateAI(uint32 diff) override
1242 {
1243 if (!UpdateVictim())
1244 return;
1245
1247 return;
1248
1249 _events.Update(diff);
1250
1252 return;
1253
1254 while (uint32 eventId = _events.ExecuteEvent())
1255 {
1256 switch (eventId)
1257 {
1262 break;
1263 default:
1264 break;
1265 }
1266 }
1267 }
1268
1269 private:
1271 };
1272
1273 CreatureAI* GetAI(Creature* creature) const override
1274 {
1275 return GetUlduarAI<npc_corruptor_tentacleAI>(creature);
1276 }
1277};
1278
1280{
1281 public:
1282 npc_constrictor_tentacle() : CreatureScript("npc_constrictor_tentacle") { }
1283
1285 {
1286 npc_constrictor_tentacleAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
1287 {
1288 SetCombatMovement(false);
1289 }
1290
1291 void Reset() override
1292 {
1295 }
1296
1297 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
1298 {
1299 if (!apply)
1301 }
1302
1303 void UpdateAI(uint32 /*diff*/) override
1304 {
1305 UpdateVictim();
1306 }
1307
1308 void IsSummonedBy(WorldObject* /*summoner*/) override
1309 {
1311 voice->AI()->JustSummoned(me);
1312 }
1313
1314 private:
1316 };
1317
1318 CreatureAI* GetAI(Creature* creature) const override
1319 {
1320 return GetUlduarAI<npc_constrictor_tentacleAI>(creature);
1321 }
1322};
1323
1325{
1326 public:
1327 npc_crusher_tentacle() : CreatureScript("npc_crusher_tentacle") { }
1328
1330 {
1332 {
1333 SetCombatMovement(false);
1334 }
1335
1346
1347 void UpdateAI(uint32 diff) override
1348 {
1349 if (!UpdateVictim())
1350 return;
1351
1353 return;
1354
1355 // update timers when the Diminish Power is not being channeled so the next one
1356 // is not cast immediately after interrupt
1357 _events.Update(diff);
1358
1359 while (uint32 eventId = _events.ExecuteEvent())
1360 {
1361 switch (eventId)
1362 {
1366 break;
1367 default:
1368 break;
1369 }
1370 }
1371 }
1372
1373 private:
1375 };
1376
1377 CreatureAI* GetAI(Creature* creature) const override
1378 {
1379 return GetUlduarAI<npc_crusher_tentacleAI>(creature);
1380 }
1381};
1382
1384{
1385 public:
1386 npc_influence_tentacle() : CreatureScript("npc_influence_tentacle") { }
1387
1389 {
1390 npc_influence_tentacleAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
1391
1392 void Reset() override
1393 {
1395 }
1396
1397 void JustDied(Unit* /*killer*/) override
1398 {
1400 brain->AI()->DoAction(ACTION_TENTACLE_KILLED);
1401 }
1402
1403 void UpdateAI(uint32 /*diff*/) override { }
1404
1405 private:
1407 };
1408
1409 CreatureAI* GetAI(Creature* creature) const override
1410 {
1411 return GetUlduarAI<npc_influence_tentacleAI>(creature);
1412 }
1413};
1414
1416
1418{
1419 public:
1420 npc_descend_into_madness() : CreatureScript("npc_descend_into_madness") { }
1421
1423 {
1424 npc_descend_into_madnessAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
1425
1426 void OnSpellClick(Unit* clicker, bool spellClickHandled) override
1427 {
1428 if (!spellClickHandled)
1429 return;
1430
1433 if (illusion < MAX_ILLUSION_ROOMS)
1434 DoCast(clicker, IllusionSpells[illusion], true);
1436 }
1437
1438 void UpdateAI(uint32 /*diff*/) override { }
1439
1440 private:
1442 };
1443
1444 CreatureAI* GetAI(Creature* creature) const override
1445 {
1446 return GetUlduarAI<npc_descend_into_madnessAI>(creature);
1447 }
1448};
1449
1451{
1452 public:
1453 npc_immortal_guardian() : CreatureScript("npc_immortal_guardian") { }
1454
1456 {
1458
1459 void Reset() override
1460 {
1464 }
1465
1466 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1467 {
1468 if (me->HealthBelowPctDamaged(1, damage))
1469 damage = me->GetHealth() - me->CountPctFromMaxHealth(1); // or set immune to damage? should be done here or in SPELL_WEAKENED spell script?
1470 }
1471
1472 void UpdateAI(uint32 diff) override
1473 {
1474 if (!UpdateVictim())
1475 return;
1476
1477 _events.Update(diff);
1478
1480 return;
1481
1482 while (uint32 eventId = _events.ExecuteEvent())
1483 {
1484 switch (eventId)
1485 {
1486 case EVENT_DRAIN_LIFE:
1489 break;
1490 default:
1491 break;
1492 }
1493 }
1494 }
1495
1496 private:
1498 };
1499
1500 CreatureAI* GetAI(Creature* creature) const override
1501 {
1502 return GetUlduarAI<npc_immortal_guardianAI>(creature);
1503 }
1504};
1505
1507{
1508 public:
1509 npc_observation_ring_keeper() : CreatureScript("npc_observation_ring_keeper") { }
1510
1512 {
1514
1515 void Reset() override
1516 {
1517 DoCast(SPELL_SIMPLE_TELEPORT_KEEPERS); // not visible here
1519 }
1520
1521 bool OnGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
1522 {
1523 if (menuId != 10333)
1524 return false;
1525
1527 me->DespawnOrUnsummon(2s);
1529 Talk(SAY_KEEPER_CHOSEN_1, player);
1530 Talk(SAY_KEEPER_CHOSEN_2, player);
1531
1532 switch (me->GetEntry())
1533 {
1536 break;
1539 break;
1542 break;
1545 break;
1546 }
1547 return false;
1548 }
1549
1550 void UpdateAI(uint32 /*diff*/) override { }
1551 };
1552
1553 CreatureAI* GetAI(Creature* creature) const override
1554 {
1555 return GetUlduarAI<npc_observation_ring_keeperAI>(creature);
1556 }
1557};
1558
1560{
1561 public:
1562 npc_yogg_saron_keeper() : CreatureScript("npc_yogg_saron_keeper") { }
1563
1565 {
1567
1568 void IsSummonedBy(WorldObject* /*summoner*/) override
1569 {
1571 }
1572
1573 void Reset() override
1574 {
1575 _events.Reset();
1578 me->RemoveAllAuras();
1579
1580 DoCast(SPELL_KEEPER_ACTIVE); // can we skip removing this aura somehow?
1581
1582 if (me->GetEntry() == NPC_FREYA_YS)
1583 {
1584 std::list<Creature*> wells;
1586 for (std::list<Creature*>::const_iterator itr = wells.begin(); itr != wells.end(); ++itr)
1587 {
1588 (*itr)->RemoveAurasDueToSpell(SPELL_SANITY_WELL);
1589 (*itr)->RemoveAurasDueToSpell(SPELL_SANITY_WELL_VISUAL);
1590 }
1591 }
1592 }
1593
1594 void JustEnteredCombat(Unit* who) override
1595 {
1596 if (IsEngaged())
1597 return;
1598
1599 EngagementStart(who);
1600
1601 switch (me->GetEntry())
1602 {
1603 case NPC_FREYA_YS:
1606 break;
1607 case NPC_HODIR_YS:
1610 break;
1611 case NPC_THORIM_YS:
1613 break;
1614 case NPC_MIMIRON_YS:
1616 break;
1617 }
1618 }
1619
1620 void UpdateAI(uint32 diff) override
1621 {
1622 if (!me->IsInCombat())
1623 return;
1624
1625 _events.Update(diff);
1626
1628 return;
1629
1630 while (uint32 eventId = _events.ExecuteEvent())
1631 {
1632 switch (eventId)
1633 {
1637 break;
1640 break;
1641 }
1642 }
1643 }
1644
1645 void DoAction(int32 action) override
1646 {
1647 switch (action)
1648 {
1649 // setting the phases is only for Thorim and Mimiron
1650 case ACTION_PHASE_TWO:
1653 break;
1654 case ACTION_PHASE_THREE:
1656 if (me->GetEntry() == NPC_THORIM_YS)
1658 break;
1660 {
1661 std::list<Creature*> wells;
1663 for (std::list<Creature*>::const_iterator itr = wells.begin(); itr != wells.end(); ++itr)
1664 {
1665 (*itr)->CastSpell(*itr, SPELL_SANITY_WELL);
1666 (*itr)->CastSpell(*itr, SPELL_SANITY_WELL_VISUAL);
1667 }
1668 break;
1669 }
1673 break;
1674 }
1675 }
1676
1677 private:
1679 };
1680
1681 CreatureAI* GetAI(Creature* creature) const override
1682 {
1683 return GetUlduarAI<npc_yogg_saron_keeperAI>(creature);
1684 }
1685};
1686
1688{
1689 public:
1690 npc_yogg_saron_illusions() : CreatureScript("npc_yogg_saron_illusions") { }
1691
1693 {
1694 npc_yogg_saron_illusionsAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1695
1696 void IsSummonedBy(WorldObject* /*summoner*/) override
1697 {
1699 {
1700 case CHAMBER_ILLUSION:
1701 // i think the first Talk should be delayed as in this moment
1702 // players are too far away to be able to see it
1703 if (Creature* neltharion = me->FindNearestCreature(NPC_NELTHARION, 50.0f))
1704 neltharion->AI()->Talk(SAY_CHAMBER_ROLEPLAY_1);
1705
1710 break;
1711 case ICECROWN_ILLUSION:
1712 // same here
1719 break;
1720 case STORMWIND_ILLUSION:
1721 _events.ScheduleEvent(EVENT_STORMWIND_ROLEPLAY_4, 33800ms); // "A thousand deaths..."
1724 // TODO: use "or one murder." sound and split the text in DB
1725 break;
1726 }
1727 }
1728
1729 void UpdateAI(uint32 diff) override
1730 {
1731 _events.Update(diff);
1732
1733 while (uint32 eventId = _events.ExecuteEvent())
1734 {
1735 switch (eventId)
1736 {
1738 if (Creature* ysera = me->FindNearestCreature(NPC_YSERA, 50.0f))
1739 ysera->AI()->Talk(SAY_CHAMBER_ROLEPLAY_2);
1740 break;
1742 if (Creature* neltharion = me->FindNearestCreature(NPC_NELTHARION, 50.0f))
1743 neltharion->AI()->Talk(SAY_CHAMBER_ROLEPLAY_3);
1744 break;
1746 if (Creature* malygos = me->FindNearestCreature(NPC_MALYGOS, 50.0f))
1747 malygos->AI()->Talk(SAY_CHAMBER_ROLEPLAY_4);
1748 break;
1751 break;
1754 {
1755 bolvar->AI()->Talk(SAY_ICECROWN_ROLEPLAY_1);
1756
1757 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1758 lichKing->CastSpell(bolvar, SPELL_DEATHGRASP);
1759 }
1760 break;
1762 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1763 lichKing->AI()->Talk(SAY_ICECROWN_ROLEPLAY_2);
1764 break;
1767 bolvar->AI()->Talk(SAY_ICECROWN_ROLEPLAY_3);
1768 if (Creature* saurfang = me->FindNearestCreature(NPC_TURNED_CHAMPION, 50.0f))
1769 saurfang->AI()->DoAction(ACTION_START_ROLEPLAY);
1770 break;
1772 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1773 lichKing->AI()->Talk(SAY_ICECROWN_ROLEPLAY_4);
1774 break;
1777 break;
1780 break;
1783 break;
1785 if (Creature* llane = me->FindNearestCreature(NPC_KING_LLANE, 50.0f))
1786 llane->AI()->Talk(SAY_STORMWIND_ROLEPLAY_5);
1787 break;
1790 break;
1791 default:
1792 break;
1793 }
1794 }
1795 }
1796
1797 private:
1800 };
1801
1802 CreatureAI* GetAI(Creature* creature) const override
1803 {
1804 return GetUlduarAI<npc_yogg_saron_illusionsAI>(creature);
1805 }
1806};
1807
1809{
1810 public:
1811 npc_garona() : CreatureScript("npc_garona") { }
1812
1813 struct npc_garonaAI : public ScriptedAI
1814 {
1815 npc_garonaAI(Creature* creature) : ScriptedAI(creature) { }
1816
1829
1830 void UpdateAI(uint32 diff) override
1831 {
1832 _events.Update(diff);
1833
1834 while (uint32 eventId = _events.ExecuteEvent())
1835 {
1836 switch (eventId)
1837 {
1840 break;
1843 break;
1846 break;
1849 if (Creature* llane = me->FindNearestCreature(NPC_KING_LLANE, 50.0f))
1850 {
1852 llane->CastSpell(llane, SPELL_PERMANENT_FEIGN_DEATH);
1853 }
1854 break;
1855 default:
1856 break;
1857 }
1858 }
1859 }
1860
1861 private:
1863 };
1864
1865 CreatureAI* GetAI(Creature* creature) const override
1866 {
1867 return GetUlduarAI<npc_garonaAI>(creature);
1868 }
1869};
1870
1872{
1873 public:
1874 npc_turned_champion() : CreatureScript("npc_turned_champion") { }
1875
1877 {
1878 npc_turned_championAI(Creature* creature) : ScriptedAI(creature) { }
1879
1880 void Reset() override
1881 {
1883 }
1884
1885 void MovementInform(uint32 type, uint32 pointId) override
1886 {
1887 if (type != POINT_MOTION_TYPE || pointId != 0)
1888 return;
1889
1891 }
1892
1893 void DoAction(int32 action) override
1894 {
1895 if (action != ACTION_START_ROLEPLAY)
1896 return;
1897
1898 me->SetWalk(true);
1900 }
1901 };
1902
1903 CreatureAI* GetAI(Creature* creature) const override
1904 {
1905 return GetUlduarAI<npc_turned_championAI>(creature);
1906 }
1907};
1908
1910{
1911 public:
1912 npc_laughing_skull() : CreatureScript("npc_laughing_skull") { }
1913
1915 {
1916 npc_laughing_skullAI(Creature* creature) : ScriptedAI(creature) { }
1917
1918 void Reset() override
1919 {
1922 }
1923
1924 // don't evade, otherwise the Lunatic Gaze aura is removed
1925 void UpdateAI(uint32 /*diff*/) override { }
1926 };
1927
1928 CreatureAI* GetAI(Creature* creature) const override
1929 {
1930 return GetUlduarAI<npc_laughing_skullAI>(creature);
1931 }
1932};
1933
1934/* 63744 - Sara's Anger
1935 63745 - Sara's Blessing
1936 63747 - Sara's Fervor
1937 65206 - Destabilization Matrix */
1938class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744, 63745, 63747, 65206
1939{
1940 public:
1941 spell_yogg_saron_target_selectors() : SpellScriptLoader("spell_yogg_saron_target_selectors") { }
1942
1956
1957 SpellScript* GetSpellScript() const override
1958 {
1960 }
1961};
1962
1964{
1965 public:
1967 SanityReduction(uint8 stacks) : SpellScript(), _stacks(stacks) { }
1968
1969 void RemoveSanity(SpellEffIndex /*effIndex*/)
1970 {
1971 if (Unit* target = GetHitUnit())
1972 if (Aura* sanity = target->GetAura(SPELL_SANITY))
1973 sanity->ModStackAmount(-int32(_stacks), AURA_REMOVE_BY_ENEMY_SPELL);
1974 }
1975
1976 protected:
1978};
1979
1981{
1982 public:
1984
1986 {
1987 if (Unit* unit = object->ToUnit())
1988 if (Aura* sanity = unit->GetAura(SPELL_SANITY))
1989 return sanity->GetStackAmount() <= 40;
1990 return true;
1991 }
1992};
1993
1994// 63795, 65301 - Psychosis
2027
2028// 63830, 63881 - Malady of the Mind
2030{
2031 public:
2032 spell_yogg_saron_malady_of_the_mind() : SpellScriptLoader("spell_yogg_saron_malady_of_the_mind") { }
2033
2057
2059 {
2060 bool Validate(SpellInfo const* /*spell*/) override
2061 {
2063 }
2064
2065 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2066 {
2067 switch (GetTargetApplication()->GetRemoveMode())
2068 {
2072 break;
2073 default:
2074 return;
2075 }
2076
2078 }
2079
2084 };
2085
2086 SpellScript* GetSpellScript() const override
2087 {
2089 }
2090
2091 AuraScript* GetAuraScript() const override
2092 {
2094 }
2095};
2096
2097// 63802 - Brain Link
2099{
2100 public:
2101 spell_yogg_saron_brain_link() : SpellScriptLoader("spell_yogg_saron_brain_link") { }
2102
2104 {
2105 void FilterTargets(std::list<WorldObject*>& targets)
2106 {
2107 targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_ILLUSION_ROOM));
2108
2109 if (targets.size() != 2)
2110 {
2111 targets.clear();
2112 return;
2113 }
2114
2115 if (SaraAI* ai = CAST_AI(SaraAI, GetCaster()->GetAI()))
2116 ai->SetLinkBetween(targets.front()->GetGUID(), targets.back()->GetGUID());
2117 }
2118
2123 };
2124
2126 {
2127 bool Validate(SpellInfo const* /*spellInfo*/) override
2128 {
2130 }
2131
2132 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2133 {
2134 Unit* caster = GetCaster();
2135 if (!caster)
2136 return;
2137
2138 if (SaraAI* ai = CAST_AI(SaraAI, caster->GetAI()))
2139 {
2140 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
2141 ai->RemoveLinkFrom(GetTarget()->GetGUID());
2142 else
2143 {
2144 if (Player* player = ObjectAccessor::GetPlayer(*GetTarget(), ai->GetLinkedPlayerGUID(GetTarget()->GetGUID())))
2145 {
2146 ai->RemoveLinkFrom(GetTarget()->GetGUID());
2147 player->RemoveAurasDueToSpell(SPELL_BRAIN_LINK);
2148 }
2149 }
2150 }
2151 }
2152
2153 void DummyTick(AuraEffect const* aurEff)
2154 {
2155 Unit* caster = GetCaster();
2156 if (!caster)
2157 return;
2158
2159 SaraAI* ai = CAST_AI(SaraAI, caster->GetAI());
2160 if (!ai)
2161 return;
2162
2164 if (!linked)
2165 return;
2166
2167 GetTarget()->CastSpell(linked, (GetTarget()->GetDistance(linked) > aurEff->GetAmount()) ? SPELL_BRAIN_LINK_DAMAGE : SPELL_BRAIN_LINK_NO_DAMAGE, true);
2168 }
2169
2175 };
2176
2177 SpellScript* GetSpellScript() const override
2178 {
2180 }
2181
2182 AuraScript* GetAuraScript() const override
2183 {
2185 }
2186};
2187
2188// 63803 - Brain Link (Damage)
2210
2211// 63030 - Boil Ominously
2213{
2214 public:
2215 spell_yogg_saron_boil_ominously() : SpellScriptLoader("spell_yogg_saron_boil_ominously") { }
2216
2218 {
2219 bool Validate(SpellInfo const* /*spellInfo*/) override
2220 {
2222 }
2223
2224 void HandleDummy(SpellEffIndex /*effIndex*/)
2225 {
2226 if (Unit* target = GetHitUnit())
2228 {
2229 if (Creature* caster = GetCaster()->ToCreature())
2230 caster->AI()->Talk(EMOTE_OMINOUS_CLOUD_PLAYER_TOUCH, target);
2231
2233 }
2234 }
2235
2240 };
2241
2242 SpellScript* GetSpellScript() const override
2243 {
2245 }
2246};
2247
2248// 64465 - Shadow Beacon
2250{
2251 public:
2252 spell_yogg_saron_shadow_beacon() : SpellScriptLoader("spell_yogg_saron_shadow_beacon") { }
2253
2274
2275 AuraScript* GetAuraScript() const override
2276 {
2278 }
2279};
2280
2281// 64466 - Empowering Shadows
2283{
2284 public:
2285 spell_yogg_saron_empowering_shadows_range_check() : SpellScriptLoader("spell_yogg_saron_empowering_shadows_range_check") { }
2286
2300
2305};
2306
2307// 64467 - Empowering Shadows
2309{
2310 public:
2311 spell_yogg_saron_empowering_shadows_missile() : SpellScriptLoader("spell_yogg_saron_empowering_shadows_missile") { }
2312
2314 {
2315 bool Validate(SpellInfo const* /*spellInfo*/) override
2316 {
2318 }
2319
2320 void HandleScript(SpellEffIndex /*effIndex*/)
2321 {
2322 if (Unit* target = GetHitUnit())
2323 target->CastSpell(nullptr, SPELL_EMPOWERING_SHADOWS, true);
2324 }
2325
2330 };
2331
2336};
2337
2338// it works, but is it scripted correctly? why is it aura with 2500ms duration?
2339// 64132 - Constrictor Tentacle
2341{
2342 public:
2343 spell_yogg_saron_constrictor_tentacle() : SpellScriptLoader("spell_yogg_saron_constrictor_tentacle") { }
2344
2362
2363 AuraScript* GetAuraScript() const override
2364 {
2366 }
2367};
2368
2369// 64131 - Lunge
2371{
2372 public:
2373 spell_yogg_saron_lunge() : SpellScriptLoader("spell_yogg_saron_lunge") { }
2374
2376 {
2377 bool Validate(SpellInfo const* /*spellInfo*/) override
2378 {
2380 }
2381
2382 void HandleScript(SpellEffIndex /*effIndex*/)
2383 {
2384 if (Unit* target = GetHitUnit())
2385 {
2386 if (target->GetMap()->Is25ManRaid())
2387 target->CastSpell(target, SPELL_SQUEEZE_25, true);
2388 else
2389 target->CastSpell(target, SPELL_SQUEEZE_10, true);
2390
2391 target->CastSpell(GetCaster(), uint32(GetEffectValueAsInt()), true);
2392 }
2393 }
2394
2399 };
2400
2401 SpellScript* GetSpellScript() const override
2402 {
2404 }
2405};
2406
2407// 64125, 64126 - Squeeze
2408class spell_yogg_saron_squeeze : public SpellScriptLoader // 64125, 64126
2409{
2410 public:
2411 spell_yogg_saron_squeeze() : SpellScriptLoader("spell_yogg_saron_squeeze") { }
2412
2414 {
2415 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2416 {
2417 if (Unit* vehicle = GetTarget()->GetVehicleBase())
2418 if (vehicle->IsAlive())
2419 vehicle->KillSelf(); // should tentacle die or just release its target?
2420 }
2421
2426 };
2427
2428 AuraScript* GetAuraScript() const override
2429 {
2431 }
2432};
2433
2434// 64148 - Diminsh Power
2436{
2437 public:
2438 spell_yogg_saron_diminsh_power() : SpellScriptLoader("spell_yogg_saron_diminsh_power") { }
2439
2455
2456 AuraScript* GetAuraScript() const override
2457 {
2459 }
2460};
2461
2462// not sure about SPELL_WEAKENED part, where should it be handled?
2463// 64161 - Empowered
2465{
2466 public:
2467 spell_yogg_saron_empowered() : SpellScriptLoader("spell_yogg_saron_empowered") { }
2468
2470 {
2471 bool Validate(SpellInfo const* /*spellInfo*/) override
2472 {
2474 }
2475
2476 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2477 {
2481 }
2482
2483 void OnPeriodic(AuraEffect const* /*aurEff*/)
2484 {
2485 Unit* target = GetTarget();
2486 float stack = std::ceil((target->GetHealthPct() / 10) - 1);
2488
2489 if (stack)
2490 {
2494 target->CastSpell(target, SPELL_EMPOWERED_BUFF, args);
2495 }
2496 else if (!target->HealthAbovePct(1) && !target->HasAura(SPELL_WEAKENED))
2497 target->CastSpell(target, SPELL_WEAKENED, true);
2498 }
2499
2505 };
2506
2507 AuraScript* GetAuraScript() const override
2508 {
2510 }
2511};
2512
2513// 64069 - Match Health
2515{
2516 public:
2517 spell_yogg_saron_match_health() : SpellScriptLoader("spell_yogg_saron_match_health") { }
2518
2520 {
2521 void HandleScript(SpellEffIndex /*effIndex*/)
2522 {
2523 if (Unit* target = GetHitUnit())
2524 target->SetHealth(target->CountPctFromMaxHealth((int32)GetCaster()->GetHealthPct()));
2525 }
2526
2531 };
2532
2533 SpellScript* GetSpellScript() const override
2534 {
2536 }
2537};
2538
2539// 65238 - Shattered Illusion
2541{
2542 public:
2543 spell_yogg_saron_shattered_illusion() : SpellScriptLoader("spell_yogg_saron_shattered_illusion") { }
2544
2546 {
2547 void HandleScript(SpellEffIndex /*effIndex*/)
2548 {
2549 if (Unit* target = GetHitUnit())
2550 target->RemoveAurasDueToSpell(uint32(GetEffectValueAsInt()));
2551 }
2552
2557 };
2558
2559 SpellScript* GetSpellScript() const override
2560 {
2562 }
2563};
2564
2565// 63882 - Death Ray Warning Visual
2567{
2568 public:
2569 spell_yogg_saron_death_ray_warning_visual() : SpellScriptLoader("spell_yogg_saron_death_ray_warning_visual") { }
2570
2572 {
2573 bool Validate(SpellInfo const* /*spellInfo*/) override
2574 {
2576 }
2577
2578 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2579 {
2580 if (Unit* caster = GetCaster())
2581 {
2582 caster->CastSpell(caster, SPELL_DEATH_RAY_PERIODIC, true);
2583 caster->CastSpell(nullptr, SPELL_DEATH_RAY_DAMAGE_VISUAL, true);
2584 // TODO: set better movement
2585 caster->GetMotionMaster()->MoveConfused();
2586 }
2587 }
2588
2593 };
2594
2595 AuraScript* GetAuraScript() const override
2596 {
2598 }
2599};
2600
2601// 63993 - Cancel Illusion Room Aura
2603{
2604 public:
2605 spell_yogg_saron_cancel_illusion_room_aura() : SpellScriptLoader("spell_yogg_saron_cancel_illusion_room_aura") { }
2606
2608 {
2609 bool Validate(SpellInfo const* /*spellInfo*/) override
2610 {
2612 }
2613
2614 void HandleScript(SpellEffIndex /*effIndex*/)
2615 {
2616 if (Unit* target = GetHitUnit())
2617 {
2618 target->CastSpell(target, SPELL_TELEPORT_BACK_TO_MAIN_ROOM);
2619 target->RemoveAurasDueToSpell(uint32(GetEffectValueAsInt()));
2620 }
2621 }
2622
2627 };
2628
2633};
2634
2635// 64010, 64013 - Nondescript
2637{
2638 public:
2639 spell_yogg_saron_nondescript() : SpellScriptLoader("spell_yogg_saron_nondescript") { }
2640
2653
2654 AuraScript* GetAuraScript() const override
2655 {
2657 }
2658};
2659
2660// 64012 - Revealed Tentacle
2662{
2663 public:
2664 spell_yogg_saron_revealed_tentacle() : SpellScriptLoader("spell_yogg_saron_revealed_tentacle") { }
2665
2667 {
2668 bool Validate(SpellInfo const* /*spellInfo*/) override
2669 {
2671 }
2672
2673 void HandleScript(SpellEffIndex /*effIndex*/)
2674 {
2675 if (Creature* caster = GetCaster()->ToCreature())
2676 {
2677 caster->CastSpell(caster, SPELL_TENTACLE_VOID_ZONE, true);
2678 caster->CastSpell(caster, SPELL_GRIM_REPRISAL, true);
2679 caster->UpdateEntry(NPC_INFLUENCE_TENTACLE, caster->GetCreatureData());
2680 }
2681 }
2682
2687 };
2688
2689 SpellScript* GetSpellScript() const override
2690 {
2692 }
2693};
2694
2695// 63305 - Grim Reprisal
2697{
2698 public:
2699 spell_yogg_saron_grim_reprisal() : SpellScriptLoader("spell_yogg_saron_grim_reprisal") { }
2700
2702 {
2703 bool Validate(SpellInfo const* /*spellInfo*/) override
2704 {
2706 }
2707
2708 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
2709 {
2711 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2712 if (!damageInfo || !damageInfo->GetDamage())
2713 return;
2714
2715 CastSpellExtraArgs args(aurEff);
2716 args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), 60));
2718 }
2719
2724 };
2725
2726 AuraScript* GetAuraScript() const override
2727 {
2729 }
2730};
2731
2732// 64059 - Induce Madness
2734{
2735 public:
2736 spell_yogg_saron_induce_madness() : SpellScriptLoader("spell_yogg_saron_induce_madness") { }
2737
2739 {
2740 bool Validate(SpellInfo const* /*spellInfo*/) override
2741 {
2743 }
2744
2745 void HandleScript(SpellEffIndex /*effIndex*/)
2746 {
2747 if (Unit* target = GetHitUnit())
2748 {
2749 target->CastSpell(target, SPELL_TELEPORT_BACK_TO_MAIN_ROOM);
2750 target->RemoveAurasDueToSpell(SPELL_SANITY, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL);
2751 target->RemoveAurasDueToSpell(uint32(GetEffectValueAsInt()));
2752 }
2753 }
2754
2756 {
2758
2759 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
2760 if (Creature* voice = instance->GetCreature(DATA_VOICE_OF_YOGG_SARON))
2761 voice->AI()->DoAction(ACTION_TOGGLE_SHATTERED_ILLUSION);
2762 }
2763
2769 };
2770
2771 SpellScript* GetSpellScript() const override
2772 {
2774 }
2775};
2776
2777// 63050 - Sanity
2779{
2780 public:
2781 spell_yogg_saron_sanity() : SpellScriptLoader("spell_yogg_saron_sanity") { }
2782
2784 {
2785 // don't target players outside of room or handle it in SPELL_INSANE_PERIODIC?
2786
2788 {
2790 }
2791
2796 };
2797
2799 {
2800 bool Validate(SpellInfo const* /*spellInfo*/) override
2801 {
2803 }
2804
2805 void DummyTick(AuraEffect const* /*aurEff*/)
2806 {
2808 ModStackAmount(20);
2809
2812 }
2813
2814 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2815 {
2816 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
2817 return;
2818
2819 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
2820 instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(false));
2821
2823
2824 if (Unit* caster = GetCaster())
2825 caster->CastSpell(GetTarget(), SPELL_INSANE, true);
2826 }
2827
2833 };
2834
2835 SpellScript* GetSpellScript() const override
2836 {
2838 }
2839
2840 AuraScript* GetAuraScript() const override
2841 {
2843 }
2844};
2845
2846// 63120 - Insane
2848{
2849 public:
2850 spell_yogg_saron_insane() : SpellScriptLoader("spell_yogg_saron_insane") { }
2851
2853 {
2854 bool Validate(SpellInfo const* /*spellInfo*/) override
2855 {
2857 }
2858
2859 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2860 {
2861 if (Unit* caster = GetCaster())
2862 if (Creature* yogg = caster->ToCreature())
2863 yogg->AI()->Talk(WHISPER_VOICE_INSANE, GetTarget());
2864
2866 }
2867
2868 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2869 {
2870 if (GetTarget()->IsAlive())
2871 GetTarget()->KillSelf();
2872 }
2873
2879 };
2880
2881 AuraScript* GetAuraScript() const override
2882 {
2884 }
2885};
2886
2887// 64555 - Insane Periodic
2889{
2890 public:
2891 spell_yogg_saron_insane_periodic() : SpellScriptLoader("spell_yogg_saron_insane_periodic") { }
2892
2906
2907 SpellScript* GetSpellScript() const override
2908 {
2910 }
2911};
2912
2914{
2915 public:
2917
2919 {
2920 return !object->HasInArc(static_cast<float>(M_PI), _caster);
2921 }
2922
2923 private:
2925};
2926
2927// 64164, 64168 - Lunatic Gaze
2959
2960/* 62650 - Fortitude of Frost
2961 62670 - Resilience of Nature
2962 62671 - Speed of Invention
2963 62702 - Fury of the Storm */
2964class spell_yogg_saron_keeper_aura : public SpellScriptLoader // 62650, 62670, 62671, 62702
2965{
2966 public:
2967 spell_yogg_saron_keeper_aura() : SpellScriptLoader("spell_yogg_saron_keeper_aura") { }
2968
2970 {
2971 bool CanApply(Unit* target)
2972 {
2973 if (target->GetTypeId() != TYPEID_PLAYER && target != GetCaster())
2974 return false;
2975 return true;
2976 }
2977
2982 };
2983
2984 AuraScript* GetAuraScript() const override
2985 {
2987 }
2988};
2989
2990// 64184 - In the Maws of the Old God
2992{
2993 public:
2994 spell_yogg_saron_in_the_maws_of_the_old_god() : SpellScriptLoader("spell_yogg_saron_in_the_maws_of_the_old_god") { }
2995
2997 {
2999 {
3000 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
3001 {
3002 if (Creature* yogg = instance->GetCreature(DATA_YOGG_SARON))
3003 {
3004 if (yogg->FindCurrentSpellBySpellId(SPELL_DEAFENING_ROAR))
3005 {
3006 if (GetCaster()->GetDistance(yogg) > 20.0f)
3008 else
3009 return SPELL_CAST_OK;
3010 }
3011 }
3012 }
3013
3015 }
3016
3021 };
3022
3027};
3028
3029// 64172 - Titanic Storm
3031{
3032 public:
3033 spell_yogg_saron_titanic_storm() : SpellScriptLoader("spell_yogg_saron_titanic_storm") { }
3034
3036 {
3037 void HandleScript(SpellEffIndex /*effIndex*/)
3038 {
3039 if (Unit* target = GetHitUnit())
3040 Unit::Kill(GetCaster(), target);
3041 }
3042
3047 };
3048
3049 SpellScript* GetSpellScript() const override
3050 {
3052 }
3053};
3054
3055// 64174 - Hodir's Protective Gaze
3057{
3058 public:
3059 spell_yogg_saron_hodirs_protective_gaze() : SpellScriptLoader("spell_yogg_saron_hodirs_protective_gaze") { }
3060
3062 {
3063 bool Validate(SpellInfo const* /*spellInfo*/) override
3064 {
3066 }
3067
3068 bool CanApply(Unit* target)
3069 {
3070 if (target->GetTypeId() != TYPEID_PLAYER && target != GetCaster())
3071 return false;
3072 return true;
3073 }
3074
3075 void OnAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)
3076 {
3077 if (dmgInfo.GetDamage() >= GetTarget()->GetHealth())
3078 {
3079 absorbAmount = dmgInfo.GetDamage();
3080 // or absorbAmount = dmgInfo.GetDamage() - GetTarget()->GetHealth() + 1
3082 }
3083 else
3085 }
3086
3092 };
3093
3094 AuraScript* GetAuraScript() const override
3095 {
3097 }
3098};
3099
3101{
3103 new boss_sara();
3104 new boss_yogg_saron();
3106 new npc_ominous_cloud();
3117 new npc_garona();
3118 new npc_turned_champion();
3119 new npc_laughing_skull();
3150}
#define M_PI
Definition Common.h:118
First const & RAND(First const &first, Second const &second, Rest const &... rest)
#define sCreatureTextMgr
@ TEXT_RANGE_AREA
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ IN_PROGRESS
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
Spells
Definition PlayerAI.cpp:32
float frand(float min, float max)
Definition Random.cpp:56
bool roll_chance(float chance, PseudoRandomDistributionState &state)
Definition Random.cpp:131
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ LANG_ADDON
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_ONESHOT_EMERGE
@ EMOTE_ONESHOT_SALUTE
@ LOOT_MODE_HARD_MODE_3
@ LOOT_MODE_HARD_MODE_1
@ LOOT_MODE_HARD_MODE_2
@ LOOT_MODE_HARD_MODE_4
SpellCastResult
@ SPELL_FAILED_OUT_OF_RANGE
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_CAST_OK
@ FACTION_MONSTER_2
@ FACTION_FRIENDLY
@ CHAT_MSG_ADDON
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_DEATH
@ AURA_REMOVE_BY_EXPIRE
@ AURA_REMOVE_BY_ENEMY_SPELL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_MOD_FEAR
@ SPELL_AURA_DUMMY
@ SPELL_AURA_AOE_CHARM
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_STUN
@ SPELLVALUE_AURA_STACK
@ SPELLVALUE_MAX_TARGETS
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellCastFn(F)
#define AuraEffectAbsorbFn(F, I)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckAreaTargetFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELL_STATE_CHANNELING
Definition Spell.h:259
EvadeReason
#define CAST_AI(a, b)
Definition UnitAI.h:29
@ REACT_PASSIVE
@ UNIT_NPC_FLAG_GOSSIP
DamageEffectType
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:611
@ UNIT_STATE_CASTING
Definition Unit.h:290
T CalculatePct(T base, U pct)
Definition Util.h:72
Yells
@ EVENT_GROUP_SUMMON_TENTACLES
@ SOUND_LUNATIC_GAZE
@ ACHIEV_TIMED_START_EVENT
@ MAX_ILLUSION_ROOMS
@ ACTION_TOGGLE_SHATTERED_ILLUSION
@ ACTION_PHASE_TRANSFORM
@ ACTION_TENTACLE_KILLED
@ ACTION_PHASE_THREE
@ ACTION_FLASH_FREEZE
@ ACTION_START_ROLEPLAY
@ ACTION_SANITY_WELLS
@ ACTION_PHASE_TWO
@ ACTION_INDUCE_MADNESS
Position const ObservationRingKeepersPos[4]
@ EMOTE_BRAIN_ILLUSION_SHATTERED
@ SAY_STORMWIND_ROLEPLAY_6
@ SAY_SARA_DEATH_RAY
@ WHISPER_VOICE_INSANE
@ SAY_ICECROWN_ROLEPLAY_6
@ EMOTE_YOGG_SARON_EXTINGUISH_ALL_LIFE
@ SAY_YOGG_SARON_MADNESS
@ SAY_CHAMBER_ROLEPLAY_3
@ SAY_CHAMBER_ROLEPLAY_2
@ SAY_SARA_FERVOR_HIT
@ SAY_YOGG_SARON_DEATH
@ SAY_SARA_ULDUAR_SCREAM_1
@ SAY_ICECROWN_ROLEPLAY_3
@ SAY_SARA_ULDUAR_SCREAM_2
@ SAY_CHAMBER_ROLEPLAY_4
@ SAY_STORMWIND_ROLEPLAY_3
@ SAY_CHAMBER_ROLEPLAY_5
@ SAY_STORMWIND_ROLEPLAY_1
@ SAY_SARA_PSYCHOSIS_HIT
@ SAY_YOGG_SARON_SPAWN
@ SAY_SARA_TRANSFORM_2
@ SAY_STORMWIND_ROLEPLAY_5
@ SAY_SARA_BLESSING_HIT
@ EMOTE_OMINOUS_CLOUD_PLAYER_TOUCH
@ EMOTE_YOGG_SARON_MADNESS
@ SAY_STORMWIND_ROLEPLAY_4
@ SAY_SARA_TRANSFORM_1
@ SAY_ICECROWN_ROLEPLAY_5
@ SAY_SARA_TRANSFORM_3
@ SAY_STORMWIND_ROLEPLAY_7
@ EMOTE_YOGG_SARON_EMPOWERING_SHADOWS
@ SAY_ICECROWN_ROLEPLAY_2
@ SAY_YOGG_SARON_DEAFENING_ROAR
@ SAY_CHAMBER_ROLEPLAY_1
@ SAY_ICECROWN_ROLEPLAY_4
@ SAY_KEEPER_CHOSEN_1
@ SAY_YOGG_SARON_PHASE_3
@ SAY_ICECROWN_ROLEPLAY_1
@ SAY_STORMWIND_ROLEPLAY_2
@ EMOTE_YOGG_SARON_DEAFENING_ROAR
@ SAY_SARA_AGGRO
@ SAY_SARA_KILL
@ WHISPER_VOICE_PHASE_1_WIPE
@ SAY_KEEPER_CHOSEN_2
@ SAY_SARA_TRANSFORM_4
Position const IllusionsMiscPos[2]
Position const YoggSaronSpawnPos
@ SPELL_TELEPORT_BACK_TO_MAIN_ROOM
@ SPELL_TELEPORT_PORTAL_VISUAL
@ SPELL_BRAIN_LINK_DAMAGE
@ SPELL_NONDESCRIPT_1
@ SPELL_PSYCHOSIS
@ SPELL_SPEED_OF_INVENTION
@ SPELL_SANITY
@ SPELL_DIMINSH_POWER
@ SPELL_LOW_SANITY_SCREEN_EFFECT
@ SPELL_DEATH_RAY_ORIGIN_VISUAL
@ SPELL_SANITY_WELL_VISUAL
@ SPELL_MATCH_HEALTH_2
@ SPELL_WEAKENED
@ SPELL_TITANIC_STORM
@ SPELL_NONDESCRIPT_2
@ SPELL_SANITY_WELL
@ SPELL_TENTACLE_VOID_ZONE
@ SPELL_DEATH_RAY_DAMAGE_VISUAL
@ SPELL_BRAIN_LINK_NO_DAMAGE
@ SPELL_KEEPER_ACTIVE
@ SPELL_DARK_VOLLEY
@ SPELL_ERUPT
@ SPELL_SHADOWY_BARRIER_YOGG
@ SPELL_SARAS_BLESSING
@ SPELL_EMPOWERED
@ SPELL_DEATH_RAY_PERIODIC
@ SPELL_LUNGE
@ SPELL_EMPOWERED_BUFF
@ SPELL_MALADY_OF_THE_MIND_JUMP
@ SPELL_SHATTERED_ILLUSION_REMOVE
@ SPELL_SQUEEZE_10
@ SPELL_PHASE_2_TRANSFORM
@ SPELL_EMPOWERING_SHADOWS
@ SPELL_INSANE
@ SPELL_RESILIENCE_OF_NATURE
@ SPELL_SHADOW_NOVA_2
@ SPELL_SARAS_FERVOR_TARGET_SELECTOR
@ SPELL_DEATH_RAY
@ SPELL_SIMPLE_TELEPORT
@ SPELL_SUMMON_GUARDIAN_1
@ SPELL_FLASH_FREEZE
@ SPELL_LUNATIC_GAZE_DAMAGE
@ SPELL_TELEPORT
@ SPELL_FOCUSED_ANGER
@ SPELL_GRIM_REPRISAL
@ SPELL_VERTEX_COLOR_BLACK
@ SPELL_HODIRS_PROTECTIVE_GAZE
@ SPELL_SHADOWY_BARRIER_SARA
@ SPELL_DEATH_RAY_WARNING_VISUAL
@ SPELL_IMMORTAL_GUARDIAN
@ SPELL_CRUSHER_TENTACLE_SUMMON
@ SPELL_CURSE_OF_DOOM
@ SPELL_SIMPLE_TELEPORT_KEEPERS
@ SPELL_EXTINGUISH_ALL_LIFE
@ SPELL_RECENTLY_SPAWNED
@ SPELL_SARAS_ANGER
@ SPELL_SANITY_PERIODIC
@ SPELL_LUNATIC_GAZE_SKULL
@ SPELL_APATHY
@ SPELL_MALADY_OF_THE_MIND
@ SPELL_FLASH_FREEZE_VISUAL
@ SPELL_HATE_TO_ZERO
@ SPELL_SHATTERED_ILLUSION
@ SPELL_MATCH_HEALTH
@ SPELL_GRIM_REPRISAL_DAMAGE
@ SPELL_BRAIN_LINK
@ SPELL_CONSTRICTOR_TENTACLE_SUMMON
@ SPELL_TELEPORT_TO_ICECROWN_ILLUSION
@ SPELL_KNOCK_AWAY
@ SPELL_PHASE_3_TRANSFORM
@ SPELL_BLACK_PLAGUE
@ SPELL_FURY_OF_THE_STORM
@ SPELL_INSANE_VISUAL
@ SPELL_DRAINING_POISON
@ SPELL_TELEPORT_TO_CHAMBER_ILLUSION
@ SPELL_ILLUSION_ROOM
@ SPELL_DESTABILIZATION_MATRIX
@ SPELL_FULL_HEAL
@ SPELL_INSANE_PERIODIC
@ SPELL_LUNATIC_GAZE
@ SPELL_SUMMON_GUARDIAN_2
@ SPELL_TELEPORT_TO_STORMWIND_ILLUSION
@ SPELL_SARAS_ANGER_TARGET_SELECTOR
@ SPELL_SARAS_FERVOR
@ SPELL_BRAIN_HURT_VISUAL
@ SPELL_CORRUPTOR_TENTACLE_SUMMON
@ SPELL_SHADOW_NOVA
@ SPELL_PERMANENT_FEIGN_DEATH
@ SPELL_SANITY_WELL_SUMMON
@ SPELL_OMINOUS_CLOUD_VISUAL
@ SPELL_FORTITUDE_OF_FROST
@ SPELL_DEATHGRASP
@ SPELL_ASSASSINATE
@ SPELL_DEAFENING_ROAR
@ SPELL_CONSTRICTOR_TENTACLE
@ SPELL_RIDE_YOGG_SARON_VEHICLE
@ SPELL_IN_THE_MAWS_OF_THE_OLD_GOD
@ SPELL_INDUCE_MADNESS
@ SPELL_SARAS_BLESSING_TARGET_SELECTOR
@ SPELL_DRAIN_LIFE
@ SPELL_SQUEEZE_25
@ SPELL_DIMINISH_POWER
@ SPELL_SHADOW_BEACON
@ SPELL_TENTACLE_VOID_ZONE_2
@ SPELL_CRUSH
@ PHASE_ONE
@ PHASE_THREE
@ PHASE_TRANSFORM
@ PHASE_TWO
uint32 const IllusionSpells[MAX_ILLUSION_ROOMS]
Position const YSKeepersPos[4]
boss_sara::boss_saraAI SaraAI
CreatureGroups
@ CREATURE_GROUP_PORTALS_25
@ CREATURE_GROUP_CLOUDS
@ CREATURE_GROUP_PORTALS_10
void AddSC_boss_yogg_saron()
@ EVENT_CHAMBER_ROLEPLAY_2
@ EVENT_DEATH_RAY
@ EVENT_CHAMBER_ROLEPLAY_3
@ EVENT_SHADOW_BEACON
@ EVENT_DRAIN_LIFE
@ EVENT_MALADY_OF_THE_MIND
@ EVENT_ICECROWN_ROLEPLAY_4
@ EVENT_PSYCHOSIS
@ EVENT_SUMMON_IMMORTAL_GUARDIAN
@ EVENT_TRANSFORM_2
@ EVENT_YELL_BOW_DOWN
@ EVENT_ICECROWN_ROLEPLAY_6
@ EVENT_LOCK_DOOR
@ EVENT_TRANSFORM_4
@ EVENT_SARAS_ANGER
@ EVENT_ICECROWN_ROLEPLAY_1
@ EVENT_SUMMON_CRUSHER_TENTACLE
@ EVENT_DESTABILIZATION_MATRIX
@ EVENT_CAST_RANDOM_SPELL
@ EVENT_ICECROWN_ROLEPLAY_2
@ EVENT_STORMWIND_ROLEPLAY_4
@ EVENT_STORMWIND_ROLEPLAY_7
@ EVENT_HODIRS_PROTECTIVE_GAZE
@ EVENT_SARAS_BLESSING
@ EVENT_ICECROWN_ROLEPLAY_3
@ EVENT_SUMMON_CORRUPTOR_TENTACLE
@ EVENT_CHAMBER_ROLEPLAY_4
@ EVENT_DARK_VOLLEY
@ EVENT_EXTINGUISH_ALL_LIFE
@ EVENT_STORMWIND_ROLEPLAY_6
@ EVENT_BRAIN_LINK
@ EVENT_CHAMBER_ROLEPLAY_1
@ EVENT_SARAS_FERVOR
@ EVENT_CHAMBER_ROLEPLAY_5
@ EVENT_ICECROWN_ROLEPLAY_5
@ EVENT_DIMINISH_POWER
@ EVENT_STORMWIND_ROLEPLAY_5
@ EVENT_STORMWIND_ROLEPLAY_2
@ EVENT_ILLUSION
@ EVENT_TRANSFORM_1
@ EVENT_TRANSFORM_3
@ EVENT_LUNATIC_GAZE
@ EVENT_SUMMON_CONSTRICTOR_TENTACLE
@ EVENT_SUMMON_GUARDIAN_OF_YOGG_SARON
@ EVENT_STORMWIND_ROLEPLAY_3
@ EVENT_DEAFENING_ROAR
@ EVENT_STORMWIND_ROLEPLAY_1
@ NPC_THE_LICH_KING
Definition chapter5.cpp:162
int32 GetAmountAsInt() const
SpellEffectValue GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
HookList< EffectAbsorbHandler > OnEffectAbsorb
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectProcHandler > OnEffectProc
uint8 GetStackAmount() const
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
TypeID GetTypeId() const
Definition BaseEntity.h:166
InstanceScript *const instance
void JustSummoned(Creature *summon) override
SummonList summons
EventMap events
bool HasPvECombatWithPlayers() const
void DoZoneInCombat()
Definition CreatureAI.h:169
bool IsEngaged() const
Definition CreatureAI.h:79
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
void EngagementStart(Unit *who)
Creature *const me
Definition CreatureAI.h:63
void ResetLootMode()
Definition Creature.h:330
void SetImmuneToPC(bool apply) override
Definition Creature.h:190
void SetReactState(ReactStates st)
Definition Creature.h:180
void ResetPlayerDamageReq()
Definition Creature.h:423
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void AddLootMode(uint16 lootMode)
Definition Creature.h:328
bool IsInEvadeMode() const
Definition Creature.h:224
Unit * GetAttacker() const
Definition Unit.h:460
uint32 GetDamage() const
Definition Unit.h:466
void Update(uint32 time)
Definition EventMap.h:77
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
EventId ExecuteEvent()
Definition EventMap.cpp:77
bool IsInPhase(PhaseIndex phase) const
Definition EventMap.h:246
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:32
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
bool operator()(WorldObject *object)
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
virtual ObjectGuid GetGuidData(uint32 type) const override
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
bool operator()(WorldObject *object)
bool Is25ManRaid() const
Definition Map.cpp:3385
float GetHeight(PhaseShift const &phaseShift, float x, float y, float z, bool vmap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH)
Definition Map.h:329
PlayerList const & GetPlayers() const
Definition Map.h:408
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={})
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
Unit * ToUnit()
Definition Object.h:116
bool IsGameMaster() const
Definition Player.h:1293
DamageInfo * GetDamageInfo() const
Definition Unit.h:524
iterator end()
Definition RefManager.h:36
iterator begin()
Definition RefManager.h:35
SanityReduction(uint8 stacks)
void RemoveSanity(SpellEffIndex)
uint32 const Id
Definition SpellInfo.h:328
uint32 m_scriptSpellId
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CastHandler > AfterCast
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
int32 GetEffectValueAsInt() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > BeforeCast
Spell * GetSpell() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:277
void SetSpellValue(CastSpellExtraArgsInit::SpellValueOverride const &value)
Definition Spell.cpp:8729
void Despawn(Creature const *summon)
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
float GetHealthPct() const
Definition Unit.h:808
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:809
void SetFaction(uint32 faction) override
Definition Unit.h:887
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3253
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, SpellCastResult result=SPELL_FAILED_INTERRUPTED, Optional< SpellCastResult > resultOther={}, ObjectGuid const &interrupter=ObjectGuid::Empty)
Definition Unit.cpp:3158
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1013
UnitAI * GetAI() const
Definition Unit.h:680
void SetUninteractible(bool apply)
Definition Unit.cpp:8583
uint64 GetHealth() const
Definition Unit.h:800
bool SetWalk(bool enable)
Definition Unit.cpp:13422
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:805
bool HealthAbovePct(float pct) const
Definition Unit.h:806
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
void RemoveAllAuras()
Definition Unit.cpp:4400
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1662
CombatManager & GetCombatManager()
Definition Unit.h:1053
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.h:951
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.cpp:11311
bool IsInCombat() const
Definition Unit.h:1073
void PlayDirectSound(uint32 soundId, Player const *target=nullptr, uint32 broadcastTextId=0) const
Definition Object.cpp:2941
Map * GetMap() const
Definition Object.h:411
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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:1403
PhaseShift & GetPhaseShift()
Definition Object.h:310
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:448
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1522
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:1512
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:99
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
void OnApply(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
@ NPC_MALYGOS
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
CastSpellExtraArgs & AddSpellBP0(SpellEffectValue val)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
constexpr float GetPositionX() const
Definition Position.h:87
float m_positionZ
Definition Position.h:66
constexpr float GetPositionY() const
Definition Position.h:88
float m_positionX
Definition Position.h:64
float m_positionY
Definition Position.h:65
constexpr float GetPositionZ() const
Definition Position.h:89
void SetCombatMovement(bool allowMovement)
T const & RAID_MODE(T const &normal10, T const &normal25) const
void SetAggressiveStateAfter(Milliseconds timer, Creature *who=nullptr, bool startCombat=true, Creature *summoner=nullptr, StartCombatArgs const &combatArgs={ })
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
std::map< ObjectGuid, ObjectGuid > _linkData
boss_saraAI(Creature *creature)
void SetLinkBetween(ObjectGuid player1, ObjectGuid player2)
void DoAction(int32 action) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
ObjectGuid GetLinkedPlayerGUID(ObjectGuid guid) const
void KilledUnit(Unit *victim) override
void JustEnteredCombat(Unit *who) override
void JustSummoned(Creature *summon) override
void UpdateAI(uint32 diff) override
void RemoveLinkFrom(ObjectGuid player1)
void JustEngagedWith(Unit *) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
void OnSpellClick(Unit *clicker, bool spellClickHandled) override
npc_garonaAI(Creature *creature)
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
bool OnGossipSelect(Player *player, uint32 menuId, uint32) override
void MovementInform(uint32 type, uint32 pointId) override
@ ICECROWN_ILLUSION
Definition ulduar.h:513
@ STORMWIND_ILLUSION
Definition ulduar.h:514
@ CHAMBER_ILLUSION
Definition ulduar.h:512
@ DATA_YOGG_SARON
Definition ulduar.h:49
@ DATA_SARA
Definition ulduar.h:431
@ DATA_DRIVE_ME_CRAZY
Definition ulduar.h:438
@ DATA_ILLUSION
Definition ulduar.h:437
@ DATA_MIMIRON_YS
Definition ulduar.h:436
@ DATA_KEEPERS_COUNT
Definition ulduar.h:439
@ DATA_FREYA_YS
Definition ulduar.h:433
@ DATA_BRAIN_OF_YOGG_SARON
Definition ulduar.h:432
@ DATA_VOICE_OF_YOGG_SARON
Definition ulduar.h:430
@ DATA_THORIM_YS
Definition ulduar.h:435
@ GO_BRAIN_ROOM_DOOR_3
Definition ulduar.h:312
@ GO_BRAIN_ROOM_DOOR_1
Definition ulduar.h:310
@ NPC_INFLUENCE_TENTACLE
Definition ulduar.h:220
@ NPC_KING_LLANE
Definition ulduar.h:211
@ NPC_OMINOUS_CLOUD
Definition ulduar.h:205
@ NPC_HODIR_OBSERVATION_RING
Definition ulduar.h:200
@ NPC_MIMIRON_OBSERVATION_RING
Definition ulduar.h:203
@ NPC_DEATH_RAY
Definition ulduar.h:217
@ NPC_IMMORTAL_GUARDIAN
Definition ulduar.h:225
@ NPC_DESCEND_INTO_MADNESS
Definition ulduar.h:227
@ NPC_YOGG_SARON
Definition ulduar.h:83
@ NPC_THORIM_YS
Definition ulduar.h:209
@ NPC_CONSTRICTOR_TENTACLE
Definition ulduar.h:223
@ NPC_CORRUPTOR_TENTACLE
Definition ulduar.h:224
@ NPC_SANITY_WELL
Definition ulduar.h:226
@ NPC_FREYA_OBSERVATION_RING
Definition ulduar.h:201
@ NPC_HODIR_YS
Definition ulduar.h:207
@ NPC_THORIM_OBSERVATION_RING
Definition ulduar.h:202
@ NPC_CRUSHER_TENTACLE
Definition ulduar.h:222
@ NPC_NELTHARION
Definition ulduar.h:215
@ NPC_IMMOLATED_CHAMPION
Definition ulduar.h:213
@ NPC_MARKED_IMMORTAL_GUARDIAN
Definition ulduar.h:228
@ NPC_TURNED_CHAMPION
Definition ulduar.h:221
@ NPC_MIMIRON_YS
Definition ulduar.h:208
@ NPC_SUIT_OF_ARMOR
Definition ulduar.h:210
@ NPC_DEATH_ORB
Definition ulduar.h:218
@ NPC_FREYA_YS
Definition ulduar.h:206
@ NPC_YSERA
Definition ulduar.h:214
@ NPC_GUARDIAN_OF_YOGG_SARON
Definition ulduar.h:199