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 "MoveSplineInit.h"
25#include "ObjectAccessor.h"
26#include "PassiveAI.h"
27#include "Player.h"
28#include "ScriptedCreature.h"
29#include "ScriptMgr.h"
30#include "Spell.h"
31#include "SpellAuraEffects.h"
32#include "SpellMgr.h"
33#include "SpellScript.h"
34#include "TemporarySummon.h"
35
37{
38 // Sara
39 SAY_SARA_ULDUAR_SCREAM_1 = 0, // screams randomly in a whole instance, unused on retail
40 SAY_SARA_ULDUAR_SCREAM_2 = 1, // screams randomly in a whole instance, unused on retail
51
52 // Yogg-Saron
62
63 // Voice of Yogg-Saron
66
67 // Brain of Yogg-Saron
69
70 // Ominous Cloud
72
73 // Keepers
76
77 // Yogg-Saron illusions
83
84 // Neltharion
87
88 // Ysera
90
91 // Malygos
93
94 // Immolated Champion
97
98 // The Lich King
101
102 // Garona
107
108 // King Llane
110};
111
113{
114 // Voice of Yogg-Saron
120 //SPELL_CLEAR_INSANE = 63122, // when should it be cast?
125
126 // Sara
140 SPELL_BRAIN_LINK_DAMAGE = 63803, // red beam
141 SPELL_BRAIN_LINK_NO_DAMAGE = 63804, // yellow beam
143
144 // Ominous Cloud
147
148 // Guardian of Yogg-Saron
152
153 // Yogg-Saron
162
163 // Brain of Yogg-Saron
170
171 // Tentacles
172 SPELL_ERUPT = 64144,
173 SPELL_TENTACLE_VOID_ZONE = 64017, // used by Corruptor Tentacle and Crusher Tentacle only
174
175 // Crusher Tentacle
179 SPELL_CRUSH = 64146,
180 //SPELL_CRUSH_2 = 65201, // triggered by SPELL_CRUSH, basepoints of SPELL_MALADY_OF_THE_MIND
181
182 // Constrictor Tentacle
184 SPELL_LUNGE = 64131,
185
186 // Corruptor Tentacle
191
192 // Immortal Guardian
200
201 // Keepers at Observation Ring
203
204 // Keepers
207
208 // Mimiron
211
212 // Freya
215
216 // Sanity Well
219
220 // Thorim
223
224 // Hodir
228
229 // Death Orb
231
232 // Death Ray
236
237 // Laughing Skull
239
240 // Descend Into Madness
245
246 // Illusions
249
250 // Suit of Armor
252
253 // Dragon Consorts & Deathsworn Zealot
255
256 // Garona
258
259 // King Llane
261
262 // The Lich King
264
265 // Turned Champion
267
268 // Player self cast spells
278
280};
281
289
291{
292 // Voice of Yogg-Saron
300 EVENT_EXTINGUISH_ALL_LIFE = 8, // handled by Voice, timer starts at the beginning of the fight (Yogg-Saron is not spawned at this moment)
301
302 // Sara
314
315 // Tentacles
318
319 // Yogg-Saron
323 EVENT_DEAFENING_ROAR = 25, // only on 25-man with 0-3 keepers active (Hard Mode)
324
325 // Guardian of Yogg-Saron
327
328 // Immortal Guardian
330
331 // Keepers
334
335 // Chamber Illusion
341
342 // Icecrown Illusion
349
350 // Stormwind Illusion
358};
359
364
377
384
385Position const YoggSaronSpawnPos = {1980.43f, -25.7708f, 324.9724f, 3.141593f};
387{
388 {1945.682f, 33.34201f, 411.4408f, 5.270895f}, // Freya
389 {1945.761f, -81.52171f, 411.4407f, 1.029744f}, // Hodir
390 {2028.822f, -65.73573f, 411.4426f, 2.460914f}, // Thorim
391 {2028.766f, 17.42014f, 411.4446f, 3.857178f}, // Mimiron
392};
394{
395 {2036.873f, 25.42513f, 338.4984f, 3.909538f}, // Freya
396 {1939.045f, -90.87457f, 338.5426f, 0.994837f}, // Hodir
397 {1939.148f, 42.49035f, 338.5427f, 5.235988f}, // Thorim
398 {2036.658f, -73.58822f, 338.4985f, 2.460914f}, // Mimiron
399};
401{
402 {1928.793f, 65.03109f, 242.3763f, 0.0f}, // Garona end position
403 {1912.324f, -155.7967f, 239.9896f, 0.0f}, // Saurfang end position
404};
405
412
419
421{
422 public:
423 boss_voice_of_yogg_saron() : CreatureScript("boss_voice_of_yogg_saron") { }
424
426 {
428 {
429 Initialize();
430 SetCombatMovement(false);
431 }
432
434 {
435 _guardiansCount = 0;
436 _guardianTimer = 20s;
437 _illusionShattered = false;
438 }
439
440 void MoveInLineOfSight(Unit* who) override
441 {
442 // TODO: MoveInLineOfSight doesn't work for such a big distance
443 if (who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && me->GetDistance2d(who) < 99.0f && !me->IsInCombat())
445 }
446
447 void EnterEvadeMode(EvadeReason why) override
448 {
450
451 for (uint8 i = DATA_SARA; i <= DATA_MIMIRON_YS; ++i)
453 creature->AI()->EnterEvadeMode();
454
455 // not sure, spoken by Sara (sound), regarding to wowwiki Voice whispers it
456 Map::PlayerList const& players = me->GetMap()->GetPlayers();
457 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
458 if (Player* player = itr->GetSource())
459 {
462
463 player->RemoveAurasDueToSpell(SPELL_SANITY);
464 player->RemoveAurasDueToSpell(SPELL_INSANE);
465 }
466 }
467
468 void Reset() override
469 {
470 _Reset();
472
475
476 Initialize();
477
478 bool clockwise = false;
479 std::list<TempSummon*> clouds;
481 clouds.sort(Trinity::ObjectDistanceOrderPred(me, true));
482 for (std::list<TempSummon*>::const_iterator itr = clouds.begin(); itr != clouds.end(); ++itr)
483 {
484 (*itr)->AI()->DoAction(int32(clockwise));
485 clockwise = !clockwise;
486 }
487 }
488
507
508 void JustDied(Unit* /*killer*/) override
509 {
510 // don't despawn Yogg-Saron's corpse, remove him from SummonList!
512 summons.Despawn(yogg);
513
514 _JustDied();
515 }
516
517 void UpdateAI(uint32 diff) override
518 {
519 if (!UpdateVictim())
520 return;
521
524
525 events.Update(diff);
526 // don't summon tentacles when illusion is shattered, delay them
529
530 while (uint32 eventId = events.ExecuteEvent())
531 {
532 switch (eventId)
533 {
534 case EVENT_LOCK_DOOR:
537 break;
540 {
541 yogg->AI()->Talk(EMOTE_YOGG_SARON_EXTINGUISH_ALL_LIFE, me);
542 yogg->CastSpell(nullptr, SPELL_EXTINGUISH_ALL_LIFE, true);
543 }
544 events.ScheduleEvent(EVENT_EXTINGUISH_ALL_LIFE, 10s); // cast it again after a short while, players can survive
545 break;
549 if (_guardiansCount <= 6 && _guardiansCount % 3 == 0)
550 _guardianTimer -= 5s;
552 break;
556 break;
560 break;
564 break;
565 case EVENT_ILLUSION:
566 {
568 {
569 yogg->AI()->Talk(EMOTE_YOGG_SARON_MADNESS);
570 yogg->AI()->Talk(SAY_YOGG_SARON_MADNESS);
571 }
572
574 if (me->GetMap()->Is25ManRaid())
576
578 instance->SetData(DATA_ILLUSION, illusion);
579
581 brain->AI()->DoAction(ACTION_INDUCE_MADNESS);
582 events.ScheduleEvent(EVENT_ILLUSION, 80s, 0, PHASE_TWO); // wowwiki says 80 secs, wowhead says something about 90 secs
583 break;
584 }
588 break;
589 default:
590 break;
591 }
592 }
593 }
594
624
625 void JustSummoned(Creature* summon) override
626 {
627 switch (summon->GetEntry())
628 {
630 SetAggressiveStateAfter(1s, summon, true, me, StartCombatArgs().SetDistance(300.f));
631 break;
632 case NPC_YOGG_SARON:
634 break;
636 summon->CastSpell(summon, SPELL_LUNGE, true);
637 break;
642 SetAggressiveStateAfter(5s, summon, true, me, StartCombatArgs().SetDistance(300.f));
643 break;
645 summon->CastSpell(summon, SPELL_TELEPORT_PORTAL_VISUAL, true);
646 break;
648 summon->CastSpell(summon, SPELL_SIMPLE_TELEPORT, true);
649 break;
650 }
651
652 BossAI::JustSummoned(summon);
653 }
654
655 private:
659 };
660
661 CreatureAI* GetAI(Creature* creature) const override
662 {
663 return GetUlduarAI<boss_voice_of_yogg_saronAI>(creature);
664 }
665};
666
668{
669 public:
670 boss_sara() : CreatureScript("boss_sara") { }
671
672 struct boss_saraAI : public ScriptedAI
673 {
674 boss_saraAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
675
677 {
678 std::map<ObjectGuid, ObjectGuid>::const_iterator itr = _linkData.find(guid);
679 if (itr != _linkData.end())
680 return itr->second;
681
682 return ObjectGuid::Empty;
683 }
684
685 void SetLinkBetween(ObjectGuid player1, ObjectGuid player2)
686 {
687 _linkData[player1] = player2;
688 _linkData[player2] = player1;
689 }
690
691 // called once for each target on aura remove
693 {
694 _linkData.erase(player1);
695 }
696
697 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
698 {
699 if (damage >= me->GetHealth())
700 {
701 damage = me->GetHealth() - 1;
702
704 {
706 voice->AI()->DoAction(ACTION_PHASE_TRANSFORM);
707
714 }
715 }
716 }
717
718 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
719 {
721 return;
722
723 switch (spellInfo->Id)
724 {
727 break;
730 break;
731 case SPELL_PSYCHOSIS:
733 break;
734 default:
735 break;
736 }
737 }
738
739 void KilledUnit(Unit* victim) override
740 {
741 if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode())
743 }
744
752
753 void JustEnteredCombat(Unit* who) override
754 {
755 if (IsEngaged())
756 return;
757
758 EngagementStart(who);
759 }
760
761 void Reset() override
762 {
766 _events.Reset();
768 }
769
770 void UpdateAI(uint32 diff) override
771 {
772 if (!me->IsInCombat())
773 return;
774
776 return;
777
778 _events.Update(diff);
779
781 return;
782
783 while (uint32 eventId = _events.ExecuteEvent())
784 {
785 switch (eventId)
786 {
790 break;
794 break;
798 break;
801 break;
804 break;
810 voice->AI()->DoAction(ACTION_PHASE_TWO);
812 mimiron->AI()->DoAction(ACTION_PHASE_TWO);
813 break;
820 _events.ScheduleEvent(EVENT_DEATH_RAY, 20s, 0, PHASE_TWO); // almost never cast at scheduled time, why?
824 break;
825 case EVENT_DEATH_RAY:
828 break;
832 break;
833 case EVENT_PSYCHOSIS:
836 break;
837 case EVENT_BRAIN_LINK:
840 break;
841 default:
842 break;
843 }
844 }
845 }
846
847 void JustSummoned(Creature* summon) override
848 {
850
851 switch (summon->GetEntry())
852 {
853 case NPC_DEATH_ORB:
856 for (uint8 i = 0; i < 4; ++i)
857 {
858 Position pos;
859 float radius = frand(25.0f, 50.0f);
860 float angle = frand(0.0f, 2.0f * float(M_PI));
861 pos.m_positionX = YoggSaronSpawnPos.GetPositionX() + radius * cosf(angle);
862 pos.m_positionY = YoggSaronSpawnPos.GetPositionY() + radius * sinf(angle);
865 }
866 break;
867 case NPC_DEATH_RAY:
869 break;
870 }
871
873 voice->AI()->JustSummoned(summon);
874 }
875
876 void DoAction(int32 action) override
877 {
878 switch (action)
879 {
880 case ACTION_PHASE_THREE: // Sara does nothing in phase 3
882 break;
883 default:
884 break;
885 }
886 }
887
888 private:
891 std::map<ObjectGuid, ObjectGuid> _linkData;
892 };
893
894 CreatureAI* GetAI(Creature* creature) const override
895 {
896 return GetUlduarAI<boss_saraAI>(creature);
897 }
898};
899
901{
902 public:
903 boss_yogg_saron() : CreatureScript("boss_yogg_saron") { }
904
906 {
907 boss_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
908
909 void Reset() override
910 {
911 _events.Reset();
916
917 me->ResetLootMode();
919 if (keepersCount == 0)
921 if (keepersCount <= 1)
923 if (keepersCount <= 2)
925 if (keepersCount <= 3)
927 }
928
929 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
930 {
931 // Val'anyr
932 if (spellInfo->Id == SPELL_IN_THE_MAWS_OF_THE_OLD_GOD)
933 me->AddLootMode(32);
934 }
935
936 void JustDied(Unit* /*killer*/) override
937 {
939
941 Unit::Kill(me, creature);
942
943 for (uint8 i = DATA_SARA; i <= DATA_BRAIN_OF_YOGG_SARON; ++i)
945 creature->DisappearAndDie();
946
947 for (uint8 i = DATA_FREYA_YS; i <= DATA_MIMIRON_YS; ++i)
949 creature->AI()->EnterEvadeMode();
950
951 Map::PlayerList const& players = me->GetMap()->GetPlayers();
952 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
953 if (Player* player = itr->GetSource())
954 {
955 player->RemoveAurasDueToSpell(SPELL_SANITY);
956 player->RemoveAurasDueToSpell(SPELL_INSANE);
957 }
958 }
959
960 void UpdateAI(uint32 diff) override
961 {
962 _events.Update(diff);
963
965 return;
966
967 while (uint32 eventId = _events.ExecuteEvent())
968 {
969 switch (eventId)
970 {
973 break;
978 break;
983 break;
988 _events.ScheduleEvent(EVENT_DEAFENING_ROAR, 20s, 25s, 0, PHASE_THREE); // timer guessed
989 break;
990 default:
991 break;
992 }
993 }
994 }
995
996 void DoAction(int32 action) override
997 {
998 switch (action)
999 {
1000 case ACTION_PHASE_THREE:
1005 _events.ScheduleEvent(EVENT_DEAFENING_ROAR, 20s, 25s, 0, PHASE_THREE); // timer guessed
1010 break;
1011 default:
1012 break;
1013 }
1014 }
1015
1016 private:
1019 };
1020
1021 CreatureAI* GetAI(Creature* creature) const override
1022 {
1023 return GetUlduarAI<boss_yogg_saronAI>(creature);
1024 }
1025};
1026
1028{
1029 public:
1030 boss_brain_of_yogg_saron() : CreatureScript("boss_brain_of_yogg_saron") { }
1031
1033 {
1034 boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature)
1035 {
1036 _tentaclesKilled = 0;
1037 }
1038
1039 void Reset() override
1040 {
1042 me->SetImmuneToPC(false);
1045 }
1046
1047 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1048 {
1050 {
1051 me->RemoveAllAuras();
1054 DoCast(me, SPELL_MATCH_HEALTH_2, true); // it doesn't seem to hit Yogg-Saron here
1057 me->SetImmuneToPC(true);
1058
1060 voice->AI()->DoAction(ACTION_PHASE_THREE);
1062 sara->AI()->DoAction(ACTION_PHASE_THREE);
1064 yogg->AI()->DoAction(ACTION_PHASE_THREE);
1065
1066 for (uint8 i = DATA_THORIM_YS; i <= DATA_MIMIRON_YS; ++i)
1068 keeper->AI()->DoAction(ACTION_PHASE_THREE);
1069 }
1070 }
1071
1072 void UpdateAI(uint32 /*diff*/) override { }
1073
1074 void DoAction(int32 action) override
1075 {
1076 switch (action)
1077 {
1079 {
1080 _tentaclesKilled = 0;
1081
1083
1084 // make sure doors won't be opened
1087
1089 break;
1090 }
1092 {
1093 uint8 illusion = _instance->GetData(DATA_ILLUSION);
1094 if (++_tentaclesKilled >= (illusion == ICECROWN_ILLUSION ? 9 : 8))
1095 {
1100
1102 voice->AI()->DoAction(ACTION_TOGGLE_SHATTERED_ILLUSION);
1103 }
1104 break;
1105 }
1106 default:
1107 break;
1108 }
1109 }
1110
1111 void JustSummoned(Creature* summon) override
1112 {
1113 _summons.Summon(summon);
1114 }
1115
1116 private:
1120 };
1121
1122 CreatureAI* GetAI(Creature* creature) const override
1123 {
1124 return GetUlduarAI<boss_brain_of_yogg_saronAI>(creature);
1125 }
1126};
1127
1129{
1130 public:
1131 npc_ominous_cloud() : CreatureScript("npc_ominous_cloud") { }
1132
1134 {
1135 npc_ominous_cloudAI(Creature* creature) : PassiveAI(creature) { }
1136
1137 void Reset() override
1138 {
1140 }
1141
1142 void UpdateAI(uint32 /*diff*/) override { }
1143
1149
1150 bool clockwise = false;
1151 };
1152
1153 CreatureAI* GetAI(Creature* creature) const override
1154 {
1155 return GetUlduarAI<npc_ominous_cloudAI>(creature);
1156 }
1157};
1158
1160{
1161 public:
1162 npc_guardian_of_yogg_saron() : CreatureScript("npc_guardian_of_yogg_saron") { }
1163
1165 {
1166 npc_guardian_of_yogg_saronAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1167
1168 void JustDied(Unit* /*killer*/) override
1169 {
1172 }
1173
1174 void Reset() override
1175 {
1177 }
1178
1179 void UpdateAI(uint32 diff) override
1180 {
1181 if (!UpdateVictim())
1182 return;
1183
1184 _events.Update(diff);
1185
1187 return;
1188
1189 while (uint32 eventId = _events.ExecuteEvent())
1190 {
1191 switch (eventId)
1192 {
1193 case EVENT_DARK_VOLLEY:
1196 break;
1197 default:
1198 break;
1199 }
1200 }
1201
1203 }
1204
1205 void IsSummonedBy(WorldObject* summoner) override
1206 {
1207 if (summoner->GetEntry() != NPC_OMINOUS_CLOUD)
1208 return;
1209
1210 // Guardian can be summoned both by Voice of Yogg-Saron and by Ominous Cloud
1212 voice->AI()->JustSummoned(me);
1213 }
1214
1215 private:
1218 };
1219
1220 CreatureAI* GetAI(Creature* creature) const override
1221 {
1222 return GetUlduarAI<npc_guardian_of_yogg_saronAI>(creature);
1223 }
1224};
1225
1227{
1228 public:
1229 npc_corruptor_tentacle() : CreatureScript("npc_corruptor_tentacle") { }
1230
1232 {
1234 {
1235 SetCombatMovement(false);
1236 }
1237
1244
1245 void UpdateAI(uint32 diff) override
1246 {
1247 if (!UpdateVictim())
1248 return;
1249
1251 return;
1252
1253 _events.Update(diff);
1254
1256 return;
1257
1258 while (uint32 eventId = _events.ExecuteEvent())
1259 {
1260 switch (eventId)
1261 {
1266 break;
1267 default:
1268 break;
1269 }
1270 }
1271 }
1272
1273 private:
1275 };
1276
1277 CreatureAI* GetAI(Creature* creature) const override
1278 {
1279 return GetUlduarAI<npc_corruptor_tentacleAI>(creature);
1280 }
1281};
1282
1284{
1285 public:
1286 npc_constrictor_tentacle() : CreatureScript("npc_constrictor_tentacle") { }
1287
1289 {
1290 npc_constrictor_tentacleAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
1291 {
1292 SetCombatMovement(false);
1293 }
1294
1295 void Reset() override
1296 {
1299 }
1300
1301 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
1302 {
1303 if (!apply)
1304 passenger->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, passenger));
1305 }
1306
1307 void UpdateAI(uint32 /*diff*/) override
1308 {
1309 UpdateVictim();
1310 }
1311
1312 void IsSummonedBy(WorldObject* /*summoner*/) override
1313 {
1315 voice->AI()->JustSummoned(me);
1316 }
1317
1318 private:
1320 };
1321
1322 CreatureAI* GetAI(Creature* creature) const override
1323 {
1324 return GetUlduarAI<npc_constrictor_tentacleAI>(creature);
1325 }
1326};
1327
1329{
1330 public:
1331 npc_crusher_tentacle() : CreatureScript("npc_crusher_tentacle") { }
1332
1334 {
1336 {
1337 SetCombatMovement(false);
1338 }
1339
1350
1351 void UpdateAI(uint32 diff) override
1352 {
1353 if (!UpdateVictim())
1354 return;
1355
1357 return;
1358
1359 // update timers when the Diminish Power is not being channeled so the next one
1360 // is not cast immediately after interrupt
1361 _events.Update(diff);
1362
1363 while (uint32 eventId = _events.ExecuteEvent())
1364 {
1365 switch (eventId)
1366 {
1370 break;
1371 default:
1372 break;
1373 }
1374 }
1375
1377 }
1378
1379 private:
1381 };
1382
1383 CreatureAI* GetAI(Creature* creature) const override
1384 {
1385 return GetUlduarAI<npc_crusher_tentacleAI>(creature);
1386 }
1387};
1388
1390{
1391 public:
1392 npc_influence_tentacle() : CreatureScript("npc_influence_tentacle") { }
1393
1395 {
1396 npc_influence_tentacleAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
1397
1398 void Reset() override
1399 {
1401 }
1402
1403 void JustDied(Unit* /*killer*/) override
1404 {
1406 brain->AI()->DoAction(ACTION_TENTACLE_KILLED);
1407 }
1408
1409 void UpdateAI(uint32 /*diff*/) override { }
1410
1411 private:
1413 };
1414
1415 CreatureAI* GetAI(Creature* creature) const override
1416 {
1417 return GetUlduarAI<npc_influence_tentacleAI>(creature);
1418 }
1419};
1420
1422
1424{
1425 public:
1426 npc_descend_into_madness() : CreatureScript("npc_descend_into_madness") { }
1427
1429 {
1430 npc_descend_into_madnessAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
1431
1432 void OnSpellClick(Unit* clicker, bool spellClickHandled) override
1433 {
1434 if (!spellClickHandled)
1435 return;
1436
1439 if (illusion < MAX_ILLUSION_ROOMS)
1440 DoCast(clicker, IllusionSpells[illusion], true);
1442 }
1443
1444 void UpdateAI(uint32 /*diff*/) override { }
1445
1446 private:
1448 };
1449
1450 CreatureAI* GetAI(Creature* creature) const override
1451 {
1452 return GetUlduarAI<npc_descend_into_madnessAI>(creature);
1453 }
1454};
1455
1457{
1458 public:
1459 npc_immortal_guardian() : CreatureScript("npc_immortal_guardian") { }
1460
1462 {
1464
1465 void Reset() override
1466 {
1470 }
1471
1472 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1473 {
1474 if (me->HealthBelowPctDamaged(1, damage))
1475 damage = me->GetHealth() - me->CountPctFromMaxHealth(1); // or set immune to damage? should be done here or in SPELL_WEAKENED spell script?
1476 }
1477
1478 void UpdateAI(uint32 diff) override
1479 {
1480 if (!UpdateVictim())
1481 return;
1482
1483 _events.Update(diff);
1484
1486 return;
1487
1488 while (uint32 eventId = _events.ExecuteEvent())
1489 {
1490 switch (eventId)
1491 {
1492 case EVENT_DRAIN_LIFE:
1495 break;
1496 default:
1497 break;
1498 }
1499 }
1500
1502 }
1503
1504 private:
1506 };
1507
1508 CreatureAI* GetAI(Creature* creature) const override
1509 {
1510 return GetUlduarAI<npc_immortal_guardianAI>(creature);
1511 }
1512};
1513
1515{
1516 public:
1517 npc_observation_ring_keeper() : CreatureScript("npc_observation_ring_keeper") { }
1518
1520 {
1522
1523 void Reset() override
1524 {
1525 DoCast(SPELL_SIMPLE_TELEPORT_KEEPERS); // not visible here
1527 }
1528
1529 bool OnGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
1530 {
1531 if (menuId != 10333)
1532 return false;
1533
1535 me->DespawnOrUnsummon(2s);
1537 Talk(SAY_KEEPER_CHOSEN_1, player);
1538 Talk(SAY_KEEPER_CHOSEN_2, player);
1539
1540 switch (me->GetEntry())
1541 {
1544 break;
1547 break;
1550 break;
1553 break;
1554 }
1555 return false;
1556 }
1557
1558 void UpdateAI(uint32 /*diff*/) override { }
1559 };
1560
1561 CreatureAI* GetAI(Creature* creature) const override
1562 {
1563 return GetUlduarAI<npc_observation_ring_keeperAI>(creature);
1564 }
1565};
1566
1568{
1569 public:
1570 npc_yogg_saron_keeper() : CreatureScript("npc_yogg_saron_keeper") { }
1571
1573 {
1575
1576 void IsSummonedBy(WorldObject* /*summoner*/) override
1577 {
1579 }
1580
1581 void Reset() override
1582 {
1583 _events.Reset();
1586 me->RemoveAllAuras();
1587
1588 DoCast(SPELL_KEEPER_ACTIVE); // can we skip removing this aura somehow?
1589
1590 if (me->GetEntry() == NPC_FREYA_YS)
1591 {
1592 std::list<Creature*> wells;
1594 for (std::list<Creature*>::const_iterator itr = wells.begin(); itr != wells.end(); ++itr)
1595 {
1596 (*itr)->RemoveAurasDueToSpell(SPELL_SANITY_WELL);
1597 (*itr)->RemoveAurasDueToSpell(SPELL_SANITY_WELL_VISUAL);
1598 }
1599 }
1600 }
1601
1602 void JustEnteredCombat(Unit* who) override
1603 {
1604 if (IsEngaged())
1605 return;
1606
1607 EngagementStart(who);
1608
1609 switch (me->GetEntry())
1610 {
1611 case NPC_FREYA_YS:
1614 break;
1615 case NPC_HODIR_YS:
1618 break;
1619 case NPC_THORIM_YS:
1621 break;
1622 case NPC_MIMIRON_YS:
1624 break;
1625 }
1626 }
1627
1628 void UpdateAI(uint32 diff) override
1629 {
1630 if (!me->IsInCombat())
1631 return;
1632
1633 _events.Update(diff);
1634
1636 return;
1637
1638 while (uint32 eventId = _events.ExecuteEvent())
1639 {
1640 switch (eventId)
1641 {
1645 break;
1648 break;
1649 }
1650 }
1651 }
1652
1653 void DoAction(int32 action) override
1654 {
1655 switch (action)
1656 {
1657 // setting the phases is only for Thorim and Mimiron
1658 case ACTION_PHASE_TWO:
1661 break;
1662 case ACTION_PHASE_THREE:
1664 if (me->GetEntry() == NPC_THORIM_YS)
1666 break;
1668 {
1669 std::list<Creature*> wells;
1671 for (std::list<Creature*>::const_iterator itr = wells.begin(); itr != wells.end(); ++itr)
1672 {
1673 (*itr)->CastSpell(*itr, SPELL_SANITY_WELL);
1674 (*itr)->CastSpell(*itr, SPELL_SANITY_WELL_VISUAL);
1675 }
1676 break;
1677 }
1681 break;
1682 }
1683 }
1684
1685 private:
1687 };
1688
1689 CreatureAI* GetAI(Creature* creature) const override
1690 {
1691 return GetUlduarAI<npc_yogg_saron_keeperAI>(creature);
1692 }
1693};
1694
1696{
1697 public:
1698 npc_yogg_saron_illusions() : CreatureScript("npc_yogg_saron_illusions") { }
1699
1701 {
1702 npc_yogg_saron_illusionsAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1703
1704 void IsSummonedBy(WorldObject* /*summoner*/) override
1705 {
1707 {
1708 case CHAMBER_ILLUSION:
1709 // i think the first Talk should be delayed as in this moment
1710 // players are too far away to be able to see it
1711 if (Creature* neltharion = me->FindNearestCreature(NPC_NELTHARION, 50.0f))
1712 neltharion->AI()->Talk(SAY_CHAMBER_ROLEPLAY_1);
1713
1718 break;
1719 case ICECROWN_ILLUSION:
1720 // same here
1727 break;
1728 case STORMWIND_ILLUSION:
1729 _events.ScheduleEvent(EVENT_STORMWIND_ROLEPLAY_4, 33800ms); // "A thousand deaths..."
1732 // TODO: use "or one murder." sound and split the text in DB
1733 break;
1734 }
1735 }
1736
1737 void UpdateAI(uint32 diff) override
1738 {
1739 _events.Update(diff);
1740
1741 while (uint32 eventId = _events.ExecuteEvent())
1742 {
1743 switch (eventId)
1744 {
1746 if (Creature* ysera = me->FindNearestCreature(NPC_YSERA, 50.0f))
1747 ysera->AI()->Talk(SAY_CHAMBER_ROLEPLAY_2);
1748 break;
1750 if (Creature* neltharion = me->FindNearestCreature(NPC_NELTHARION, 50.0f))
1751 neltharion->AI()->Talk(SAY_CHAMBER_ROLEPLAY_3);
1752 break;
1754 if (Creature* malygos = me->FindNearestCreature(NPC_MALYGOS, 50.0f))
1755 malygos->AI()->Talk(SAY_CHAMBER_ROLEPLAY_4);
1756 break;
1759 break;
1762 {
1763 bolvar->AI()->Talk(SAY_ICECROWN_ROLEPLAY_1);
1764
1765 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1766 lichKing->CastSpell(bolvar, SPELL_DEATHGRASP);
1767 }
1768 break;
1770 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1771 lichKing->AI()->Talk(SAY_ICECROWN_ROLEPLAY_2);
1772 break;
1775 bolvar->AI()->Talk(SAY_ICECROWN_ROLEPLAY_3);
1776 if (Creature* saurfang = me->FindNearestCreature(NPC_TURNED_CHAMPION, 50.0f))
1777 saurfang->AI()->DoAction(ACTION_START_ROLEPLAY);
1778 break;
1780 if (Creature* lichKing = me->FindNearestCreature(NPC_THE_LICH_KING, 50.0f))
1781 lichKing->AI()->Talk(SAY_ICECROWN_ROLEPLAY_4);
1782 break;
1785 break;
1788 break;
1791 break;
1793 if (Creature* llane = me->FindNearestCreature(NPC_KING_LLANE, 50.0f))
1794 llane->AI()->Talk(SAY_STORMWIND_ROLEPLAY_5);
1795 break;
1798 break;
1799 default:
1800 break;
1801 }
1802 }
1803 }
1804
1805 private:
1808 };
1809
1810 CreatureAI* GetAI(Creature* creature) const override
1811 {
1812 return GetUlduarAI<npc_yogg_saron_illusionsAI>(creature);
1813 }
1814};
1815
1817{
1818 public:
1819 npc_garona() : CreatureScript("npc_garona") { }
1820
1821 struct npc_garonaAI : public ScriptedAI
1822 {
1823 npc_garonaAI(Creature* creature) : ScriptedAI(creature) { }
1824
1837
1838 void UpdateAI(uint32 diff) override
1839 {
1840 _events.Update(diff);
1841
1842 while (uint32 eventId = _events.ExecuteEvent())
1843 {
1844 switch (eventId)
1845 {
1848 break;
1851 break;
1854 break;
1857 if (Creature* llane = me->FindNearestCreature(NPC_KING_LLANE, 50.0f))
1858 {
1860 llane->CastSpell(llane, SPELL_PERMANENT_FEIGN_DEATH);
1861 }
1862 break;
1863 default:
1864 break;
1865 }
1866 }
1867 }
1868
1869 private:
1871 };
1872
1873 CreatureAI* GetAI(Creature* creature) const override
1874 {
1875 return GetUlduarAI<npc_garonaAI>(creature);
1876 }
1877};
1878
1880{
1881 public:
1882 npc_turned_champion() : CreatureScript("npc_turned_champion") { }
1883
1885 {
1886 npc_turned_championAI(Creature* creature) : ScriptedAI(creature) { }
1887
1888 void Reset() override
1889 {
1891 }
1892
1893 void MovementInform(uint32 type, uint32 pointId) override
1894 {
1895 if (type != POINT_MOTION_TYPE || pointId != 0)
1896 return;
1897
1899 }
1900
1901 void DoAction(int32 action) override
1902 {
1903 if (action != ACTION_START_ROLEPLAY)
1904 return;
1905
1906 me->SetWalk(true);
1908 }
1909 };
1910
1911 CreatureAI* GetAI(Creature* creature) const override
1912 {
1913 return GetUlduarAI<npc_turned_championAI>(creature);
1914 }
1915};
1916
1918{
1919 public:
1920 npc_laughing_skull() : CreatureScript("npc_laughing_skull") { }
1921
1923 {
1924 npc_laughing_skullAI(Creature* creature) : ScriptedAI(creature) { }
1925
1926 void Reset() override
1927 {
1930 }
1931
1932 // don't evade, otherwise the Lunatic Gaze aura is removed
1933 void UpdateAI(uint32 /*diff*/) override { }
1934 };
1935
1936 CreatureAI* GetAI(Creature* creature) const override
1937 {
1938 return GetUlduarAI<npc_laughing_skullAI>(creature);
1939 }
1940};
1941
1942/* 63744 - Sara's Anger
1943 63745 - Sara's Blessing
1944 63747 - Sara's Fervor
1945 65206 - Destabilization Matrix */
1946class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744, 63745, 63747, 65206
1947{
1948 public:
1949 spell_yogg_saron_target_selectors() : SpellScriptLoader("spell_yogg_saron_target_selectors") { }
1950
1966
1967 SpellScript* GetSpellScript() const override
1968 {
1970 }
1971};
1972
1974{
1975 public:
1977 SanityReduction(uint8 stacks) : SpellScript(), _stacks(stacks) { }
1978
1979 void RemoveSanity(SpellEffIndex /*effIndex*/)
1980 {
1981 if (Unit* target = GetHitUnit())
1982 if (Aura* sanity = target->GetAura(SPELL_SANITY))
1983 sanity->ModStackAmount(-int32(_stacks), AURA_REMOVE_BY_ENEMY_SPELL);
1984 }
1985
1986 protected:
1988};
1989
1991{
1992 public:
1994
1996 {
1997 if (Unit* unit = object->ToUnit())
1998 if (Aura* sanity = unit->GetAura(SPELL_SANITY))
1999 return sanity->GetStackAmount() <= 40;
2000 return true;
2001 }
2002};
2003
2004// 63795, 65301 - Psychosis
2039
2040// 63830, 63881 - Malady of the Mind
2042{
2043 public:
2044 spell_yogg_saron_malady_of_the_mind() : SpellScriptLoader("spell_yogg_saron_malady_of_the_mind") { }
2045
2071
2073 {
2075
2076 bool Validate(SpellInfo const* /*spell*/) override
2077 {
2079 }
2080
2081 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2082 {
2083 switch (GetTargetApplication()->GetRemoveMode())
2084 {
2088 break;
2089 default:
2090 return;
2091 }
2092
2094 }
2095
2100 };
2101
2102 SpellScript* GetSpellScript() const override
2103 {
2105 }
2106
2107 AuraScript* GetAuraScript() const override
2108 {
2110 }
2111};
2112
2113// 63802 - Brain Link
2115{
2116 public:
2117 spell_yogg_saron_brain_link() : SpellScriptLoader("spell_yogg_saron_brain_link") { }
2118
2120 {
2122
2123 void FilterTargets(std::list<WorldObject*>& targets)
2124 {
2125 targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_ILLUSION_ROOM));
2126
2127 if (targets.size() != 2)
2128 {
2129 targets.clear();
2130 return;
2131 }
2132
2133 if (SaraAI* ai = CAST_AI(SaraAI, GetCaster()->GetAI()))
2134 ai->SetLinkBetween(targets.front()->GetGUID(), targets.back()->GetGUID());
2135 }
2136
2141 };
2142
2144 {
2146
2147 bool Validate(SpellInfo const* /*spellInfo*/) override
2148 {
2150 }
2151
2152 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2153 {
2154 Unit* caster = GetCaster();
2155 if (!caster)
2156 return;
2157
2158 if (SaraAI* ai = CAST_AI(SaraAI, caster->GetAI()))
2159 {
2160 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
2161 ai->RemoveLinkFrom(GetTarget()->GetGUID());
2162 else
2163 {
2164 if (Player* player = ObjectAccessor::GetPlayer(*GetTarget(), ai->GetLinkedPlayerGUID(GetTarget()->GetGUID())))
2165 {
2166 ai->RemoveLinkFrom(GetTarget()->GetGUID());
2167 player->RemoveAurasDueToSpell(SPELL_BRAIN_LINK);
2168 }
2169 }
2170 }
2171 }
2172
2173 void DummyTick(AuraEffect const* aurEff)
2174 {
2175 Unit* caster = GetCaster();
2176 if (!caster)
2177 return;
2178
2179 SaraAI* ai = CAST_AI(SaraAI, caster->GetAI());
2180 if (!ai)
2181 return;
2182
2184 if (!linked)
2185 return;
2186
2187 GetTarget()->CastSpell(linked, (GetTarget()->GetDistance(linked) > (float)aurEff->GetAmount()) ? SPELL_BRAIN_LINK_DAMAGE : SPELL_BRAIN_LINK_NO_DAMAGE, true);
2188 }
2189
2195 };
2196
2197 SpellScript* GetSpellScript() const override
2198 {
2200 }
2201
2202 AuraScript* GetAuraScript() const override
2203 {
2205 }
2206};
2207
2208// 63803 - Brain Link (Damage)
2232
2233// 63030 - Boil Ominously
2235{
2236 public:
2237 spell_yogg_saron_boil_ominously() : SpellScriptLoader("spell_yogg_saron_boil_ominously") { }
2238
2240 {
2242
2243 bool Validate(SpellInfo const* /*spellInfo*/) override
2244 {
2246 }
2247
2248 void HandleDummy(SpellEffIndex /*effIndex*/)
2249 {
2250 if (Unit* target = GetHitUnit())
2251 if (!target->HasAura(SPELL_FLASH_FREEZE) && !GetCaster()->HasAura(SPELL_SUMMON_GUARDIAN_1) && !GetCaster()->HasAura(SPELL_SUMMON_GUARDIAN_2))
2252 {
2253 if (Creature* caster = GetCaster()->ToCreature())
2254 caster->AI()->Talk(EMOTE_OMINOUS_CLOUD_PLAYER_TOUCH, target);
2255
2257 }
2258 }
2259
2264 };
2265
2266 SpellScript* GetSpellScript() const override
2267 {
2269 }
2270};
2271
2272// 64465 - Shadow Beacon
2306
2307// 64466 - Empowering Shadows
2334
2335// 64467 - Empowering Shadows
2337{
2338 public:
2339 spell_yogg_saron_empowering_shadows_missile() : SpellScriptLoader("spell_yogg_saron_empowering_shadows_missile") { }
2340
2361
2366};
2367
2368// it works, but is it scripted correctly? why is it aura with 2500ms duration?
2369// 64132 - Constrictor Tentacle
2400
2401// 64131 - Lunge
2403{
2404 public:
2405 spell_yogg_saron_lunge() : SpellScriptLoader("spell_yogg_saron_lunge") { }
2406
2408 {
2410
2411 bool Validate(SpellInfo const* /*spellInfo*/) override
2412 {
2413 return ValidateSpellInfo({ SPELL_SQUEEZE });
2414 }
2415
2416 void HandleScript(SpellEffIndex /*effIndex*/)
2417 {
2418 if (Unit* target = GetHitUnit())
2419 {
2420 target->CastSpell(target, SPELL_SQUEEZE, true);
2421 target->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
2422 }
2423 }
2424
2429 };
2430
2431 SpellScript* GetSpellScript() const override
2432 {
2434 }
2435};
2436
2437// 64125, 64126 - Squeeze
2438class spell_yogg_saron_squeeze : public SpellScriptLoader // 64125, 64126
2439{
2440 public:
2441 spell_yogg_saron_squeeze() : SpellScriptLoader("spell_yogg_saron_squeeze") { }
2442
2444 {
2446
2447 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2448 {
2449 if (Unit* vehicle = GetTarget()->GetVehicleBase())
2450 if (vehicle->IsAlive())
2451 vehicle->KillSelf(); // should tentacle die or just release its target?
2452 }
2453
2458 };
2459
2460 AuraScript* GetAuraScript() const override
2461 {
2463 }
2464};
2465
2466// 64148 - Diminsh Power
2468{
2469 public:
2470 spell_yogg_saron_diminsh_power() : SpellScriptLoader("spell_yogg_saron_diminsh_power") { }
2471
2489
2490 AuraScript* GetAuraScript() const override
2491 {
2493 }
2494};
2495
2496// not sure about SPELL_WEAKENED part, where should it be handled?
2497// 64161 - Empowered
2499{
2500 public:
2501 spell_yogg_saron_empowered() : SpellScriptLoader("spell_yogg_saron_empowered") { }
2502
2504 {
2506
2507 bool Validate(SpellInfo const* /*spellInfo*/) override
2508 {
2510 }
2511
2512 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2513 {
2517 }
2518
2519 void OnPeriodic(AuraEffect const* /*aurEff*/)
2520 {
2521 Unit* target = GetTarget();
2522 float stack = std::ceil((target->GetHealthPct() / 10) - 1);
2524
2525 if (stack)
2526 {
2530 target->CastSpell(target, SPELL_EMPOWERED_BUFF, args);
2531 }
2532 else if (!target->HealthAbovePct(1) && !target->HasAura(SPELL_WEAKENED))
2533 target->CastSpell(target, SPELL_WEAKENED, true);
2534 }
2535
2541 };
2542
2543 AuraScript* GetAuraScript() const override
2544 {
2546 }
2547};
2548
2549// 64069 - Match Health
2551{
2552 public:
2553 spell_yogg_saron_match_health() : SpellScriptLoader("spell_yogg_saron_match_health") { }
2554
2556 {
2558
2559 void HandleScript(SpellEffIndex /*effIndex*/)
2560 {
2561 if (Unit* target = GetHitUnit())
2562 target->SetHealth(target->CountPctFromMaxHealth((int32)GetCaster()->GetHealthPct()));
2563 }
2564
2569 };
2570
2571 SpellScript* GetSpellScript() const override
2572 {
2574 }
2575};
2576
2577// 65238 - Shattered Illusion
2579{
2580 public:
2581 spell_yogg_saron_shattered_illusion() : SpellScriptLoader("spell_yogg_saron_shattered_illusion") { }
2582
2598
2599 SpellScript* GetSpellScript() const override
2600 {
2602 }
2603};
2604
2605// 63882 - Death Ray Warning Visual
2607{
2608 public:
2609 spell_yogg_saron_death_ray_warning_visual() : SpellScriptLoader("spell_yogg_saron_death_ray_warning_visual") { }
2610
2612 {
2614
2615 bool Validate(SpellInfo const* /*spellInfo*/) override
2616 {
2618 }
2619
2620 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2621 {
2622 if (Unit* caster = GetCaster())
2623 {
2624 caster->CastSpell(caster, SPELL_DEATH_RAY_PERIODIC, true);
2625 caster->CastSpell(nullptr, SPELL_DEATH_RAY_DAMAGE_VISUAL, true);
2626 // TODO: set better movement
2627 caster->GetMotionMaster()->MoveConfused();
2628 }
2629 }
2630
2635 };
2636
2637 AuraScript* GetAuraScript() const override
2638 {
2640 }
2641};
2642
2643// 63993 - Cancel Illusion Room Aura
2645{
2646 public:
2647 spell_yogg_saron_cancel_illusion_room_aura() : SpellScriptLoader("spell_yogg_saron_cancel_illusion_room_aura") { }
2648
2650 {
2652
2653 bool Validate(SpellInfo const* /*spellInfo*/) override
2654 {
2656 }
2657
2658 void HandleScript(SpellEffIndex /*effIndex*/)
2659 {
2660 if (Unit* target = GetHitUnit())
2661 {
2662 target->CastSpell(target, SPELL_TELEPORT_BACK_TO_MAIN_ROOM);
2663 target->RemoveAurasDueToSpell(uint32(GetEffectValue()));
2664 }
2665 }
2666
2671 };
2672
2677};
2678
2679// 64010, 64013 - Nondescript
2705
2706// 64012 - Revealed Tentacle
2708{
2709 public:
2710 spell_yogg_saron_revealed_tentacle() : SpellScriptLoader("spell_yogg_saron_revealed_tentacle") { }
2711
2713 {
2715
2716 bool Validate(SpellInfo const* /*spellInfo*/) override
2717 {
2719 }
2720
2721 void HandleScript(SpellEffIndex /*effIndex*/)
2722 {
2723 if (Creature* caster = GetCaster()->ToCreature())
2724 {
2725 caster->CastSpell(caster, SPELL_TENTACLE_VOID_ZONE, true);
2726 caster->CastSpell(caster, SPELL_GRIM_REPRISAL, true);
2727 caster->UpdateEntry(NPC_INFLUENCE_TENTACLE, caster->GetCreatureData());
2728 }
2729 }
2730
2735 };
2736
2737 SpellScript* GetSpellScript() const override
2738 {
2740 }
2741};
2742
2743// 63305 - Grim Reprisal
2745{
2746 public:
2747 spell_yogg_saron_grim_reprisal() : SpellScriptLoader("spell_yogg_saron_grim_reprisal") { }
2748
2750 {
2752
2753 bool Validate(SpellInfo const* /*spellInfo*/) override
2754 {
2756 }
2757
2758 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
2759 {
2761 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2762 if (!damageInfo || !damageInfo->GetDamage())
2763 return;
2764
2765 CastSpellExtraArgs args(aurEff);
2766 args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), 60));
2768 }
2769
2774 };
2775
2776 AuraScript* GetAuraScript() const override
2777 {
2779 }
2780};
2781
2782// 64059 - Induce Madness
2784{
2785 public:
2786 spell_yogg_saron_induce_madness() : SpellScriptLoader("spell_yogg_saron_induce_madness") { }
2787
2789 {
2791
2792 bool Validate(SpellInfo const* /*spellInfo*/) override
2793 {
2795 }
2796
2797 void HandleScript(SpellEffIndex /*effIndex*/)
2798 {
2799 if (Unit* target = GetHitUnit())
2800 {
2801 target->CastSpell(target, SPELL_TELEPORT_BACK_TO_MAIN_ROOM);
2802 target->RemoveAurasDueToSpell(SPELL_SANITY, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL);
2803 target->RemoveAurasDueToSpell(uint32(GetEffectValue()));
2804 }
2805 }
2806
2808 {
2810
2811 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
2812 if (Creature* voice = instance->GetCreature(DATA_VOICE_OF_YOGG_SARON))
2813 voice->AI()->DoAction(ACTION_TOGGLE_SHATTERED_ILLUSION);
2814 }
2815
2821 };
2822
2823 SpellScript* GetSpellScript() const override
2824 {
2826 }
2827};
2828
2829// 63050 - Sanity
2831{
2832 public:
2833 spell_yogg_saron_sanity() : SpellScriptLoader("spell_yogg_saron_sanity") { }
2834
2836 {
2838
2839 // don't target players outside of room or handle it in SPELL_INSANE_PERIODIC?
2840
2845
2850 };
2851
2853 {
2855
2856 bool Validate(SpellInfo const* /*spellInfo*/) override
2857 {
2859 }
2860
2861 void DummyTick(AuraEffect const* /*aurEff*/)
2862 {
2863 if (GetTarget()->HasAura(SPELL_SANITY_WELL))
2864 ModStackAmount(20);
2865
2866 if (GetStackAmount() <= 40 && !GetTarget()->HasAura(SPELL_LOW_SANITY_SCREEN_EFFECT))
2868 }
2869
2870 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2871 {
2872 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
2873 return;
2874
2875 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
2876 instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(false));
2877
2879
2880 if (Unit* caster = GetCaster())
2881 caster->CastSpell(GetTarget(), SPELL_INSANE, true);
2882 }
2883
2889 };
2890
2891 SpellScript* GetSpellScript() const override
2892 {
2894 }
2895
2896 AuraScript* GetAuraScript() const override
2897 {
2899 }
2900};
2901
2902// 63120 - Insane
2904{
2905 public:
2906 spell_yogg_saron_insane() : SpellScriptLoader("spell_yogg_saron_insane") { }
2907
2909 {
2911
2912 bool Validate(SpellInfo const* /*spellInfo*/) override
2913 {
2915 }
2916
2917 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2918 {
2919 if (Unit* caster = GetCaster())
2920 if (Creature* yogg = caster->ToCreature())
2921 yogg->AI()->Talk(WHISPER_VOICE_INSANE, GetTarget());
2922
2924 }
2925
2926 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2927 {
2928 if (GetTarget()->IsAlive())
2929 GetTarget()->KillSelf();
2930 }
2931
2937 };
2938
2939 AuraScript* GetAuraScript() const override
2940 {
2942 }
2943};
2944
2945// 64555 - Insane Periodic
2947{
2948 public:
2949 spell_yogg_saron_insane_periodic() : SpellScriptLoader("spell_yogg_saron_insane_periodic") { }
2950
2966
2967 SpellScript* GetSpellScript() const override
2968 {
2970 }
2971};
2972
2974{
2975 public:
2977
2979 {
2980 return !object->HasInArc(static_cast<float>(M_PI), _caster);
2981 }
2982
2983 private:
2985};
2986
2987// 64164, 64168 - Lunatic Gaze
3021
3022/* 62650 - Fortitude of Frost
3023 62670 - Resilience of Nature
3024 62671 - Speed of Invention
3025 62702 - Fury of the Storm */
3026class spell_yogg_saron_keeper_aura : public SpellScriptLoader // 62650, 62670, 62671, 62702
3027{
3028 public:
3029 spell_yogg_saron_keeper_aura() : SpellScriptLoader("spell_yogg_saron_keeper_aura") { }
3030
3032 {
3034
3035 bool CanApply(Unit* target)
3036 {
3037 if (target->GetTypeId() != TYPEID_PLAYER && target != GetCaster())
3038 return false;
3039 return true;
3040 }
3041
3046 };
3047
3048 AuraScript* GetAuraScript() const override
3049 {
3051 }
3052};
3053
3054// 64184 - In the Maws of the Old God
3056{
3057 public:
3058 spell_yogg_saron_in_the_maws_of_the_old_god() : SpellScriptLoader("spell_yogg_saron_in_the_maws_of_the_old_god") { }
3059
3061 {
3063
3065 {
3066 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
3067 {
3068 if (Creature* yogg = instance->GetCreature(DATA_YOGG_SARON))
3069 {
3070 if (yogg->FindCurrentSpellBySpellId(SPELL_DEAFENING_ROAR))
3071 {
3072 if (GetCaster()->GetDistance(yogg) > 20.0f)
3074 else
3075 return SPELL_CAST_OK;
3076 }
3077 }
3078 }
3079
3081 }
3082
3087 };
3088
3093};
3094
3095// 64172 - Titanic Storm
3097{
3098 public:
3099 spell_yogg_saron_titanic_storm() : SpellScriptLoader("spell_yogg_saron_titanic_storm") { }
3100
3116
3117 SpellScript* GetSpellScript() const override
3118 {
3120 }
3121};
3122
3123// 64174 - Hodir's Protective Gaze
3125{
3126 public:
3127 spell_yogg_saron_hodirs_protective_gaze() : SpellScriptLoader("spell_yogg_saron_hodirs_protective_gaze") { }
3128
3130 {
3132
3133 bool Validate(SpellInfo const* /*spellInfo*/) override
3134 {
3136 }
3137
3138 bool CanApply(Unit* target)
3139 {
3140 if (target->GetTypeId() != TYPEID_PLAYER && target != GetCaster())
3141 return false;
3142 return true;
3143 }
3144
3145 void OnAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)
3146 {
3147 if (dmgInfo.GetDamage() >= GetTarget()->GetHealth())
3148 {
3149 absorbAmount = dmgInfo.GetDamage();
3150 // or absorbAmount = dmgInfo.GetDamage() - GetTarget()->GetHealth() + 1
3152 }
3153 else
3155 }
3156
3162 };
3163
3164 AuraScript* GetAuraScript() const override
3165 {
3167 }
3168};
3169
3171{
3173 new boss_sara();
3174 new boss_yogg_saron();
3176 new npc_ominous_cloud();
3187 new npc_garona();
3188 new npc_turned_champion();
3189 new npc_laughing_skull();
3220}
Actions
#define M_PI
Definition Common.h:72
First const & RAND(First const &first, Second const &second, Rest const &... rest)
#define sCreatureTextMgr
@ TEXT_RANGE_AREA
@ TEXT_RANGE_NORMAL
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:122
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ IN_PROGRESS
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Spells
Definition PlayerAI.cpp:32
float frand(float min, float max)
Definition Random.cpp:55
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
bool roll_chance_i(int chance)
Definition Random.h:59
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
@ TEAM_OTHER
@ CHAT_MSG_ADDON
@ CHAT_MSG_MONSTER_YELL
@ LOOT_MODE_HARD_MODE_3
@ LOOT_MODE_HARD_MODE_1
@ LOOT_MODE_HARD_MODE_2
@ LOOT_MODE_HARD_MODE_4
@ FACTION_MONSTER_2
@ FACTION_FRIENDLY
SpellCastResult
@ SPELL_FAILED_OUT_OF_RANGE
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_CAST_OK
@ AURA_REMOVE_BY_DEATH
@ AURA_REMOVE_BY_EXPIRE
@ AURA_REMOVE_BY_ENEMY_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ 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
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_AURA_STACK
@ SPELLVALUE_MAX_TARGETS
#define sSpellMgr
Definition SpellMgr.h:738
#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_CASTING
Definition Spell.h:133
#define CAST_AI(a, b)
Definition UnitAI.h:27
@ REACT_PASSIVE
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_FLAG_UNINTERACTIBLE
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:608
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
T CalculatePct(T base, U pct)
Definition Util.h:71
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_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_SQUEEZE
@ 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_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:161
int32 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)
InstanceScript *const instance
void JustSummoned(Creature *summon) override
SummonList summons
EventMap events
bool HasPvECombatWithPlayers() const
bool IsEngaged() const
Definition CreatureAI.h:105
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:94
void DoZoneInCombat(Creature *creature=nullptr)
bool UpdateVictim()
void EngagementStart(Unit *who)
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void ResetLootMode()
Definition Creature.h:227
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void SetReactState(ReactStates st)
Definition Creature.h:119
void ResetPlayerDamageReq()
Definition Creature.h:323
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void AddLootMode(uint16 lootMode)
Definition Creature.h:225
bool IsInEvadeMode() const
Definition Creature.h:146
Unit * GetAttacker() const
Definition Unit.h:458
uint32 GetDamage() const
Definition Unit.h:464
void Update(uint32 time)
Definition EventMap.h:67
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
bool IsInPhase(PhaseIndex phase) const
Definition EventMap.h:236
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:28
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
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 DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
bool operator()(WorldObject *object)
iterator end()
iterator begin()
float GetHeight(float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
Definition Map.cpp:2484
bool Is25ManRaid() const
Definition Map.cpp:4261
PlayerList const & GetPlayers() const
Definition Map.h:448
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount)
static ObjectGuid const Empty
Definition ObjectGuid.h:140
static Creature * ToCreature(Object *o)
Definition Object.h:186
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static Player * ToPlayer(Object *o)
Definition Object.h:180
bool IsGameMaster() const
Definition Player.h:998
DamageInfo * GetDamageInfo() const
Definition Unit.h:519
SanityReduction(uint8 stacks)
void RemoveSanity(SpellEffIndex)
uint32 Id
Definition SpellInfo.h:289
HookList< CastHandler > AfterCast
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > BeforeCast
Spell * GetSpell() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:152
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:7895
void Despawn(Creature const *summon)
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
bool HealthAbovePct(int32 pct) const
Definition Unit.h:919
float GetHealthPct() const
Definition Unit.h:921
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
void SetFaction(uint32 faction) override
Definition Unit.h:974
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
UnitAI * GetAI() const
Definition Unit.h:800
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, SpellCastResult result=SPELL_FAILED_INTERRUPTED, Optional< SpellCastResult > resultOther={})
Definition Unit.cpp:3021
uint32 GetHealth() const
Definition Unit.h:913
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:922
void RemoveAllAuras()
Definition Unit.cpp:4157
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:918
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true)
Definition Unit.cpp:10930
CombatManager & GetCombatManager()
Definition Unit.h:1130
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
bool IsInCombat() const
Definition Unit.h:1144
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
uint32 GetPhaseMask() const
Definition Object.h:368
Map * GetMap() const
Definition Object.h:449
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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:1992
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1141
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2082
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
uint32 m_scriptSpellId
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)
PrepareAuraScript(spell_yogg_saron_empowered_AuraScript)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
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)
PrepareAuraScript(spell_yogg_saron_insane_AuraScript)
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
PrepareSpellScript(spell_yogg_saron_lunge_SpellScript)
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
PrepareSpellScript(spell_yogg_saron_psychosis_SpellScript)
SpellScript * GetSpellScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_yogg_saron_sanity_AuraScript)
PrepareSpellScript(spell_yogg_saron_sanity_SpellScript)
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
AuraScript * GetAuraScript() const override
SpellScript * GetSpellScript() const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_yogg_saron_squeeze_AuraScript)
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(int32 val)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
float m_positionZ
Definition Position.h:58
float m_positionX
Definition Position.h:56
float GetPositionZ() const
Definition Position.h:81
float m_positionY
Definition Position.h:57
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void SetCombatMovement(bool allowMovement)
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:517
@ STORMWIND_ILLUSION
Definition ulduar.h:518
@ CHAMBER_ILLUSION
Definition ulduar.h:516
@ DATA_YOGG_SARON
Definition ulduar.h:48
@ DATA_SARA
Definition ulduar.h:440
@ DATA_DRIVE_ME_CRAZY
Definition ulduar.h:447
@ DATA_ILLUSION
Definition ulduar.h:446
@ DATA_MIMIRON_YS
Definition ulduar.h:445
@ DATA_KEEPERS_COUNT
Definition ulduar.h:448
@ DATA_FREYA_YS
Definition ulduar.h:442
@ DATA_BRAIN_OF_YOGG_SARON
Definition ulduar.h:441
@ DATA_VOICE_OF_YOGG_SARON
Definition ulduar.h:439
@ DATA_THORIM_YS
Definition ulduar.h:444
@ GO_BRAIN_ROOM_DOOR_3
Definition ulduar.h:311
@ GO_BRAIN_ROOM_DOOR_1
Definition ulduar.h:309
@ NPC_INFLUENCE_TENTACLE
Definition ulduar.h:219
@ NPC_KING_LLANE
Definition ulduar.h:210
@ NPC_OMINOUS_CLOUD
Definition ulduar.h:204
@ NPC_HODIR_OBSERVATION_RING
Definition ulduar.h:199
@ NPC_MIMIRON_OBSERVATION_RING
Definition ulduar.h:202
@ NPC_DEATH_RAY
Definition ulduar.h:216
@ NPC_IMMORTAL_GUARDIAN
Definition ulduar.h:224
@ NPC_DESCEND_INTO_MADNESS
Definition ulduar.h:226
@ NPC_YOGG_SARON
Definition ulduar.h:82
@ NPC_THORIM_YS
Definition ulduar.h:208
@ NPC_CONSTRICTOR_TENTACLE
Definition ulduar.h:222
@ NPC_CORRUPTOR_TENTACLE
Definition ulduar.h:223
@ NPC_SANITY_WELL
Definition ulduar.h:225
@ NPC_FREYA_OBSERVATION_RING
Definition ulduar.h:200
@ NPC_HODIR_YS
Definition ulduar.h:206
@ NPC_THORIM_OBSERVATION_RING
Definition ulduar.h:201
@ NPC_CRUSHER_TENTACLE
Definition ulduar.h:221
@ NPC_NELTHARION
Definition ulduar.h:214
@ NPC_IMMOLATED_CHAMPION
Definition ulduar.h:212
@ NPC_MARKED_IMMORTAL_GUARDIAN
Definition ulduar.h:227
@ NPC_TURNED_CHAMPION
Definition ulduar.h:220
@ NPC_MIMIRON_YS
Definition ulduar.h:207
@ NPC_SUIT_OF_ARMOR
Definition ulduar.h:209
@ NPC_DEATH_ORB
Definition ulduar.h:217
@ NPC_FREYA_YS
Definition ulduar.h:205
@ NPC_YSERA
Definition ulduar.h:213
@ NPC_GUARDIAN_OF_YOGG_SARON
Definition ulduar.h:198