TrinityCore
boss_illidan.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 "ScriptMgr.h"
19#include "black_temple.h"
20#include "Containers.h"
21#include "GridNotifiersImpl.h"
22#include "InstanceScript.h"
23#include "Map.h"
24#include "MotionMaster.h"
25#include "ObjectAccessor.h"
26#include "PassiveAI.h"
27#include "Player.h"
28#include "ScriptedCreature.h"
29#include "ScriptedGossip.h"
30#include "SpellAuraEffects.h"
31#include "SpellInfo.h"
32#include "SpellScript.h"
33#include "TemporarySummon.h"
34
36{
37 // Illidan
53
54 // Maiev Shadowsong
63
64 // Flame of Azzinoth
66
67 // Akama
77
78 // Spirits
80
81 // Direct Sounds
90};
91
93{
94 // Akama
101
102 // Spirits
104
105 // Door Trigger
107
108 // Blade of Azzinoth
109 SPELL_BIRTH = 40031,
113
114 // Flame of Azzinoth
119
120 // Maiev
126
127 // Cage Trap Disturb Trigger
129
130 // Shadow Demon
135
136 // Player
139
140 // Illidan DB Target
142
143 // Cage Trap Summon Spells
152
153 // Glaive Target
156
157 // Illidan
159 SPELL_SHEAR = 41032,
180 SPELL_KNEEL = 39656,
187 SPELL_DEATH = 41218,
194
195 // Blaze
196 SPELL_BLAZE = 40610,
197
198 // Demon Fire
200
201 // Flame Crash
204
206{
214
216{
231
233{
242
244{
253
255{
269
271{
279
281{
282 // Akama
312
313 // Illidan Stormrage
354
355 // Flame of Azzinoth
359
360 // Maiev
374
376{
377 { 609.7720f, 308.4560f, 271.826f }, // Illidari Council Position
378 { 752.2771f, 369.9401f, 353.1584f } // Minions Position
379};
380
382{
383 { 745.2552f, 322.1574f, 310.4596f, 6.038839f },
384 { 747.0576f, 326.4268f, 309.0688f, 0.0f },
385 { 743.9686f, 289.6447f, 311.1807f, 6.056293f },
386 { 748.8422f, 288.0620f, 310.9782f, 1.884956f },
387 { 751.0878f, 327.6505f, 309.4576f, 6.178465f },
388 { 750.0472f, 282.3274f, 309.4353f, 3.071779f },
389 { 754.0332f, 325.8136f, 310.3195f, 2.9147f },
390 { 753.8425f, 286.562f, 310.9353f, 1.029744f },
391 { 745.3237f, 283.986f, 309.2765f, 0.6283185f },
392 { 750.0322f, 323.6064f, 310.2757f, 5.497787f }
393};
394
396{
397 { 705.921997f, 337.145996f, 370.083008f, 3.961900f },
398 { 706.226990f, 273.264008f, 370.083008f, 2.251072f },
399 { 658.830017f, 265.098999f, 370.083008f, 0.850345f },
400 { 656.859009f, 344.071991f, 370.083008f, 5.235990f }
401};
402
403Position const IllidanMiddlePoint = { 676.6479f, 304.7606f, 354.1909f , 6.230825f };
404
406{
407 { 710.8815f, 306.4028f, 353.5962f, 2.391101f },
408 { 652.105f, 259.5127f, 353.0794f, 0.122173f },
409 { 642.7164f, 305.2436f, 353.5596f, 3.438299f },
410 { 710.8815f, 306.4028f, 353.5962f, 2.391101f }
411};
412
414{
415 { 660.3492f, 345.5749f, 353.2961f },
416 { 701.6755f, 297.3358f, 354.041f },
417 { 706.7507f, 269.4593f, 353.2778f },
418 { 660.3492f, 345.5749f, 353.2961f }
419};
420
422{
423 { 676.226013f, 325.230988f },
424 { 678.059998f, 285.220001f }
425};
426
428{
437};
438
440{
441public:
443
444 bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override
445 {
448 return true;
449 }
450
451private:
453};
454
456{
457public:
459
460 bool operator()(Unit* unit) const
461 {
462 return unit->GetTypeId() == TYPEID_PLAYER
463 && unit->GetDistance2d(BladesPositions[0].GetPositionX(), BladesPositions[0].GetPositionY()) > 25.0f
464 && unit->GetDistance2d(BladesPositions[1].GetPositionX(), BladesPositions[1].GetPositionY()) > 25.0f;
465 }
466};
467
469{
471 _minionsCount(0), _flameCount(0), _orientation(0.0f), _pillarIndex(0), _phase(0), _dead(false), _isDemon(false) { }
472
473 void Reset() override
474 {
475 _Reset();
478 me->LoadEquipment(1, true);
481 me->SetDisableGravity(false);
482 _dead = false;
483 _minionsCount = 0;
484 _flameCount = 0;
485 _phase = PHASE_1;
486 _isDemon = false;
489 akama->AI()->DoAction(ACTION_ACTIVE_AKAMA_INTRO);
490 }
491
492 void JustEngagedWith(Unit* who) override
493 {
495 me->SetCanDualWield(true);
497 musicController->PlayDirectMusic(EVENT_BT_SUMMIT_WALK_3_SOUND_ID);
502 }
503
504 void JustSummoned(Creature* summon) override
505 {
506 if (summon->GetEntry() == NPC_PARASITIC_SHADOWFIEND)
507 summons.Summon(summon);
508 else
509 BossAI::JustSummoned(summon);
510 }
511
512 void ChangeOrientation(float orientation)
513 {
514 _orientation = orientation;
516 }
517
518 void KilledUnit(Unit* victim) override
519 {
520 if (victim->GetTypeId() == TYPEID_PLAYER)
522 }
523
524 void ScheduleEvents(uint8 phase, uint8 group)
525 {
526 switch (phase)
527 {
528 case GROUP_PHASE_1:
533 break;
534 case GROUP_PHASE_2:
537 if (roll_chance_i(50))
539 break;
540 case GROUP_PHASE_3:
544 break;
549 break;
550 case GROUP_PHASE_4:
553 break;
554 default:
555 break;
556 }
557 }
558
559 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
560 {
561 if (summon->GetEntry() == NPC_ILLIDARI_ELITE)
563 }
564
565 void EnterEvadeMode(EvadeReason /*why*/) override
566 {
570 }
571
572 void DoAction(int32 actionId) override
573 {
574 switch (actionId)
575 {
582 akama->AI()->DoAction(ACTION_FREE);
583 break;
586 break;
590 akama->AI()->DoAction(ACTION_START_MINIONS);
591 break;
594 break;
596 {
598 me->AttackStop();
599 me->SetUninteractible(true);
601 me->SetDisableGravity(true);
605 break;
606 }
608 _flameCount++;
609 if (_flameCount == 2)
610 {
611 _flameCount = 0;
613 }
614 break;
619 _phase = PHASE_3;
622 break;
628 me->AttackStop();
629 me->SetUninteractible(true);
631 break;
633 for (uint32 summonSpell : SummonCageTrapSpells)
634 DoCastSelf(summonSpell, true);
636 break;
638 me->AttackStop();
639 events.Reset();
641 DoCastSelf(SPELL_DEATH, true);
642 me->SetUninteractible(true);
644 break;
645 default:
646 break;
647 }
648 }
649
650 void JustDied(Unit* /*killer*/) override
651 {
652 me->SetUninteractible(false);
654 events.Reset();
655 }
656
657 void MovementInform(uint32 type, uint32 pointId) override
658 {
659 if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
660 return;
661
662 switch (pointId)
663 {
668 break;
670 {
672 ChangeOrientation(orientation);
674 break;
675 }
677 {
678 float orientation = IllidanMiddlePoint.GetOrientation();
679 ChangeOrientation(orientation);
680
681 std::list<Creature*> triggers;
683 for (Creature* trigger : triggers)
684 trigger->CastSpell(trigger, SPELL_GLAIVE_RETURNS, true);
685
687 break;
688 }
689 default:
690 break;
691 }
692 }
693
695 {
696 Map::PlayerList const& players = me->GetMap()->GetPlayers();
697 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
698 if (Player* player = i->GetSource())
699 if (player->IsAlive() && !player->IsGameMaster() && IsInBoundary(player))
700 return;
701
703 }
704
706 {
708 for (uint8 i = 0; i < needSummon; ++i)
709 {
712 }
713 }
714
715 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
716 {
717 if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID()))
718 {
719 damage = me->GetHealth() - 1;
720 if (!_dead)
721 {
722 if (_isDemon)
723 {
724 events.Reset();
727 return;
728 }
729 _dead = true;
734 maiev->AI()->DoAction(ACTION_START_OUTRO);
735 }
736 }
737 else if (me->HealthBelowPct(90) && _phase < PHASE_MINIONS)
738 {
741 }
742 else if (me->HealthBelowPct(65) && _phase < PHASE_2)
743 {
744 _phase = PHASE_2;
746 }
747 else if (me->HealthBelowPct(30) && _phase < PHASE_4)
748 {
749 _phase = PHASE_4;
750
751 if (_isDemon)
752 {
753 _isDemon = false;
759 }
760 else
762 }
763 }
764
766 {
767 while (uint32 eventId = specialEvents.ExecuteEvent())
768 {
769 switch (eventId)
770 {
771 case EVENT_BERSERK:
774 break;
781 _isDemon = false;
782 break;
786 break;
787 default:
788 break;
789 }
790 }
791 }
792
793 void UpdateAI(uint32 diff) override
794 {
796 return;
797
798 specialEvents.Update(diff);
799
801
803 return;
804
805 events.Update(diff);
806
807 while (uint32 eventId = events.ExecuteEvent())
808 {
809 switch (eventId)
810 {
813 break;
817 break;
818 case EVENT_PREPARED:
822 break;
824 me->SetImmuneToAll(false);
827 akama->AI()->DoAction(ACTION_START_ENCOUNTER);
828 break;
831 events.Repeat(Seconds(30));
832 break;
833 case EVENT_DRAW_SOUL:
835 events.Repeat(Seconds(34));
836 break;
837 case EVENT_SHEAR:
839 events.Repeat(Seconds(12));
840 break;
842 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
844 events.Repeat(Seconds(30));
845 break;
847 if (_dead)
848 return;
850 events.Repeat(Seconds(30));
851 break;
853 {
854 Position pos;
855 std::list<Creature*> triggers;
857 triggers.remove_if([](WorldObject* unit)
858 {
859 return unit->GetPositionZ() < 355.0f || unit->GetPositionZ() > 365.0f;
860 });
861
862 if (triggers.empty())
863 break;
864
865 triggers.sort(Trinity::ObjectDistanceOrderPred(me));
866 pos.Relocate(triggers.front());
867 pos.SetOrientation(0.0f);
870 musicController->PlayDirectMusic(EVENT_BT_STORM_WALK_HERO_2_SOUND_ID);
871 break;
872 }
876 break;
881 break;
884 break;
885 case EVENT_FLY:
886 ChangeOrientation(3.137039f);
888 break;
890 {
892 _pillarIndex = urand(0, 3);
894 events.Repeat(Seconds(30));
895 break;
896 }
898 {
899 float angle = me->GetAbsoluteAngle(IllidanMiddlePoint);
900 me->SetFacingTo(angle);
901 break;
902 }
903 case EVENT_EYE_BLAST:
904 {
908 {
910 DoCast(dbTarget, SPELL_EYE_BLAST);
911 dbTarget->GetMotionMaster()->MovePoint(POINT_DB_TARGET, IllidanDBTargetPoints[_pillarIndex]);
912 }
913 break;
914 }
916 {
917 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 150.0f, true))
918 DoCast(target, SPELL_DARK_BARRAGE);
922 break;
923 }
924 case EVENT_FIREBALL:
925 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 150.0f, true))
926 DoCast(target, SPELL_FIREBALL);
928 break;
930 me->SetDisableGravity(false);
934 break;
936 me->SetUninteractible(false);
940 musicController->PlayDirectMusic(EVENT_BT_STORM_WALK_UNI_3_SOUND_ID);
941 break;
944 events.Repeat(Seconds(53));
945 break;
946 case EVENT_DEMON:
948 _isDemon = true;
950 me->LoadEquipment(0, true);
955 break;
959 break;
960 case EVENT_DEMON_TEXT:
962 break;
964 {
967 ScheduleEvents(group, group);
968 me->LoadEquipment(1, true);
969 break;
970 }
973 events.Repeat(Seconds(22));
974 break;
977 break;
981 break;
984 break;
988 break;
992 me->SetFacingToObject(maiev);
994 break;
998 break;
1000 me->SetUninteractible(false);
1004 break;
1005 case EVENT_FRENZY:
1008 events.Repeat(Seconds(40));
1009 break;
1010 case EVENT_TAUNT:
1012 events.Repeat(Seconds(30), Seconds(60));
1013 break;
1017 musicController->PlayDirectMusic(EVENT_BT_ARRIVAL_WALK_HERO_1_SOUND_ID);
1019 break;
1021 {
1023 if (Creature* akama = instance->GetCreature(DATA_AKAMA))
1024 akama->AI()->DoAction(ACTION_START_OUTRO);
1027 summons.DespawnIf([_akamaGUID, _maievGUID](ObjectGuid unitGuid)
1028 {
1029 return unitGuid != _akamaGUID && unitGuid != _maievGUID;
1030 });
1031 break;
1032 }
1033 default:
1034 break;
1035 }
1036
1038 return;
1039 }
1040 }
1041
1042private:
1048 bool _dead;
1051};
1052
1054{
1055 npc_akama_illidan(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()),
1056 _orientation(0.0f), _isTeleportToMinions(false) { }
1057
1058 void Reset() override
1059 {
1060 _events.Reset();
1063 _isTeleportToMinions = false;
1064 }
1065
1066 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
1067 {
1068 if (gossipListId == GOSSIP_START_INTRO)
1069 {
1074 illidan->AI()->DoAction(ACTION_INTRO_DONE);
1075 CloseGossipMenuFor(player);
1076
1077 }
1078 else if (gossipListId == GOSSIP_START_FIGHT)
1079 {
1083 CloseGossipMenuFor(player);
1084 }
1085 return false;
1086 }
1087
1088 bool CanAIAttack(Unit const* who) const override
1089 {
1091 return false;
1092 return ScriptedAI::CanAIAttack(who);
1093 }
1094
1095 uint32 GetData(uint32 /*data*/) const override
1096 {
1097 return _isTeleportToMinions ? 1 : 0;
1098 }
1099
1100 void EnterEvadeMode(EvadeReason /*why*/) override { }
1101
1102 void JustSummoned(Creature* summon) override
1103 {
1104 if (summon->GetEntry() == NPC_SPIRIT_OF_UDALO)
1105 {
1106 _spiritOfUdaloGUID = summon->GetGUID();
1108 }
1109 else if (summon->GetEntry() == NPC_SPIRIT_OF_OLUM)
1110 {
1111 _spiritOfOlumGUID = summon->GetGUID();
1113 }
1114 }
1115
1116 void DoAction(int32 actionId) override
1117 {
1118 switch (actionId)
1119 {
1126 break;
1127 case ACTION_OPEN_DOOR:
1130 break;
1131 case ACTION_FREE:
1133 break;
1137 break;
1140 break;
1141 case ACTION_START_OUTRO:
1143 me->AttackStop();
1144 _events.Reset();
1146 break;
1147 default:
1148 break;
1149 }
1150 }
1151
1152 void ChangeOrientation(float orientation)
1153 {
1154 _orientation = orientation;
1156 }
1157
1158 void MovementInform(uint32 type, uint32 pointId) override
1159 {
1160 if (type != POINT_MOTION_TYPE && type != SPLINE_CHAIN_MOTION_TYPE)
1161 return;
1162
1163 switch (pointId)
1164 {
1168 break;
1169 case POINT_STAIRS:
1170 ChangeOrientation(6.265732f);
1172 break;
1173 case POINT_ILLIDAN_ROOM:
1174 ChangeOrientation(2.129302f);
1177 break;
1178 case POINT_FACE_ILLIDAN:
1179 ChangeOrientation(3.140537f);
1181 break;
1182 case POINT_TELEPORT:
1185 break;
1186 case POINT_MINIONS:
1188 me->SetImmuneToNPC(false);
1191 illidan->AI()->DoAction(ACTION_START_MINIONS_WEAVE);
1193 break;
1194 case POINT_MOVE_BACK:
1196 break;
1197 case POINT_ILLIDAN:
1199 break;
1200 default:
1201 break;
1202 }
1203 }
1204
1205 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1206 {
1207 if (damage >= me->GetHealth())
1208 damage = me->GetHealth() - 1;
1209 }
1210
1211 void UpdateAI(uint32 diff) override
1212 {
1214 return;
1215
1216 _events.Update(diff);
1217
1219 return;
1220
1221 while (uint32 eventId = _events.ExecuteEvent())
1222 {
1223 switch (eventId)
1224 {
1225 case EVENT_TELEPORT:
1227 break;
1230 break;
1234 break;
1238 break;
1242 break;
1246 break;
1247 case EVENT_SPIRIT_SAY_1:
1249 undalo->AI()->Talk(SAY_SPIRIT_ALONE);
1251 break;
1252 case EVENT_SPIRIT_SAY_2:
1254 olum->AI()->Talk(SAY_SPIRIT_ALONE);
1256 break;
1260 undalo->CastSpell((Unit*) nullptr, SPELL_DEATHSWORN_DOOR_CHANNEL);
1262 olum->CastSpell((Unit*) nullptr, SPELL_DEATHSWORN_DOOR_CHANNEL);
1264 break;
1267 musicController->PlayDirectMusic(EVENT_BT_SUMMIT_WALK_SOUND_ID);
1268 break;
1269 case EVENT_AKAMA_THANKS:
1273 break;
1276 {
1277 undalo->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
1278 undalo->DespawnOrUnsummon(Seconds(7));
1279 }
1281 {
1282 olum->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
1283 olum->DespawnOrUnsummon(Seconds(7));
1284 }
1285 break;
1288 break;
1291 illidan->AI()->DoAction(ACTION_START_ENCOUNTER);
1292 break;
1293 case EVENT_FREE:
1296 break;
1300 break;
1301 case EVENT_ROAR:
1304 break;
1307 break;
1309 if (me->HealthBelowPct(20))
1312 break;
1316 break;
1319 me->AttackStop();
1321 me->SetImmuneToNPC(true);
1323 break;
1325 _isTeleportToMinions = true;
1327 break;
1330 break;
1334 break;
1337 break;
1341 break;
1345 break;
1346 case EVENT_FINAL_SALUTE:
1349 break;
1352 break;
1353 default:
1354 break;
1355 }
1356
1358 return;
1359 }
1360 }
1361
1362private:
1369};
1370
1372{
1373 npc_parasitic_shadowfiend(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1374
1375 void Reset() override
1376 {
1378 {
1380 return;
1381 }
1382
1384 illidan->AI()->JustSummoned(me);
1386 _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/)
1387 {
1390 });
1391 }
1392
1393 void DoAction(int32 action) override
1394 {
1395 if (action == ACTION_START_PHASE_4)
1396 {
1398 me->AttackStop();
1399 }
1400 else if (action == ACTION_RESUME_COMBAT)
1401 _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/)
1402 {
1405 });
1406 }
1407
1408 void UpdateAI(uint32 diff) override
1409 {
1410 _scheduler.Update(diff);
1411
1412 if (!UpdateVictim())
1413 return;
1414 }
1415
1416private:
1419};
1420
1422{
1423 npc_blade_of_azzinoth(Creature* creature) : NullCreatureAI(creature), _instance(creature->GetInstanceScript()) { }
1424
1425 void Reset() override
1426 {
1428 {
1430 return;
1431 }
1432
1434 illidan->AI()->JustSummoned(me);
1435 _flameGuid.Clear();
1437 DoCastSelf(SPELL_BIRTH, true);
1438 _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
1439 {
1441 _scheduler.Schedule(Milliseconds(500), [this](TaskContext /*context*/)
1442 {
1445 });
1446 });
1447 }
1448
1449 void JustSummoned(Creature* summon) override
1450 {
1451 if (summon->GetEntry() == NPC_FLAME_OF_AZZINOTH)
1452 _flameGuid = summon->GetGUID();
1453 }
1454
1455 void UpdateAI(uint32 diff) override
1456 {
1457 _scheduler.Update(diff);
1458 }
1459
1460private:
1464};
1465
1467{
1468 npc_flame_of_azzinoth(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
1469 {
1471 }
1472
1473 void Reset() override
1474 {
1476 {
1478 return;
1479 }
1480
1482 illidan->AI()->JustSummoned(me);
1483 DoCastSelf(SPELL_FLAME_TEAR_OF_AZZINOTH, true); // Idk what this spell should do
1487 }
1488
1489 void UpdateAI(uint32 diff) override
1490 {
1491 if (!UpdateVictim())
1492 return;
1493
1495 return;
1496
1497 _events.Update(diff);
1498
1499 while (uint32 eventId = _events.ExecuteEvent())
1500 {
1501 switch (eventId)
1502 {
1503 case EVENT_ENGAGE:
1507 break;
1508 case EVENT_FLAME_CHARGE:
1510 {
1511 DoCast(target, SPELL_CHARGE);
1513 }
1514 else
1516 break;
1517 case EVENT_FLAME_BLAST:
1519 _events.Repeat(Seconds(12));
1520 break;
1521 default:
1522 break;
1523 }
1524
1526 return;
1527 }
1528 }
1529
1530 void JustDied(Unit* /*killer*/) override
1531 {
1533 illidan->AI()->DoAction(ACTION_FLAME_DEAD);
1534 }
1535
1536private:
1539};
1540
1542{
1544
1545 void Reset() override
1546 {
1548 }
1549
1550 void JustSummoned(Creature* summon) override
1551 {
1552 if (summon->GetEntry() == NPC_DEMON_FIRE)
1554 }
1555
1556 void MovementInform(uint32 type, uint32 pointId) override
1557 {
1558 if (type == POINT_MOTION_TYPE && pointId == POINT_DB_TARGET)
1559 {
1562 }
1563 }
1564};
1565
1567{
1568 npc_shadow_demon(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { }
1569
1570 void Reset() override
1571 {
1573 {
1575 return;
1576 }
1577
1580 _scheduler.Schedule(Seconds(1), [this](TaskContext checkTarget)
1581 {
1582 if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
1583 {
1584 if (!target->IsAlive())
1586 else if (me->IsWithinMeleeRange(target))
1587 {
1588 me->InterruptNonMeleeSpells(false);
1589 DoCast(target, SPELL_CONSUME_SOUL, true);
1590 }
1591 }
1592 checkTarget.Repeat();
1593 });
1594 }
1595
1596 void SetGUID(ObjectGuid const& guid, int32 /*id*/) override
1597 {
1598 _targetGUID = guid;
1599 if (Unit* target = ObjectAccessor::GetUnit(*me, _targetGUID))
1600 me->GetMotionMaster()->MoveChase(target);
1601 }
1602
1603 void UpdateAI(uint32 diff) override
1604 {
1605 _scheduler.Update(diff);
1606 }
1607
1608private:
1612};
1613
1614struct npc_maiev : public ScriptedAI
1615{
1616 npc_maiev(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _canDown(true) { }
1617
1618 void JustAppeared() override
1619 {
1621 me->SetFacingToObject(illidan);
1627 _events.ScheduleEvent(EVENT_TAUNT, 20s, 1min);
1628 _canDown = true;
1629 }
1630
1631 void JustEngagedWith(Unit* /*who*/) override
1632 {
1637 }
1638
1639 void DoAction(int32 actionId) override
1640 {
1641 if (actionId == ACTION_START_OUTRO)
1642 {
1643 _events.Reset();
1646 me->AttackStop();
1648 me->SetFacingToObject(illidan);
1651 }
1652 else if (actionId == ACTION_MAIEV_DOWN_FADE)
1653 _canDown = true;
1654 }
1655
1656 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1657 {
1658 if (damage >= me->GetHealth() && _canDown)
1659 {
1660 damage = me->GetHealth() - 1;
1661 _canDown = false;
1664 }
1665 }
1666
1667 void UpdateAI(uint32 diff) override
1668 {
1670 return;
1671
1673 return;
1674
1675 _events.Update(diff);
1676
1677 while (uint32 eventId = _events.ExecuteEvent())
1678 {
1679 switch (eventId)
1680 {
1681 case EVENT_MAIEV_APPEAR:
1683 break;
1686 break;
1690 break;
1691 case EVENT_MAIEV_YES:
1694 break;
1695 case EVENT_MAIEV_ROAR:
1698 break;
1699 case EVENT_MAIEV_COMBAT:
1702 AttackStart(illidan);
1703 break;
1704 case EVENT_CAGE_TRAP:
1706 illidan->CastSpell(illidan, SPELL_CAGED_TRAP_TELEPORT, true);
1709 _events.Repeat(Seconds(30));
1710 break;
1713 _events.Repeat(Seconds(50));
1714 break;
1715 case EVENT_THROW_DAGGER:
1716 if (Unit* target = me->GetVictim())
1717 if (!me->IsWithinMeleeRange(target))
1718 {
1721 break;
1722 }
1724 break;
1725 case EVENT_TAUNT:
1727 _events.Repeat(Seconds(30), Seconds(60));
1728 break;
1732 break;
1736 break;
1740 break;
1741 default:
1742 break;
1743 }
1744
1746 return;
1747 }
1748 }
1749
1750private:
1754};
1755
1757{
1758 npc_cage_trap_trigger(Creature* creature) : PassiveAI(creature) { }
1759
1760 void Reset() override
1761 {
1762 _scheduler.Schedule(Seconds(1), [this](TaskContext checkTarget)
1763 {
1765 checkTarget.Repeat();
1766 });
1767 }
1768
1769 void UpdateAI(uint32 diff) override
1770 {
1771 _scheduler.Update(diff);
1772 }
1773
1774private:
1776};
1777
1779{
1780 npc_illidari_elite(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
1781
1782 void Reset() override
1783 {
1785 {
1786 AttackStart(akama);
1787 AddThreat(akama, 1000.0f);
1788 }
1789 }
1790
1791 bool CanAIAttack(Unit const* who) const override
1792 {
1793 if (who->GetEntry() == NPC_AKAMA)
1794 return true;
1795 return false;
1796 }
1797
1798private:
1800};
1801
1803{
1804 npc_illidan_generic_fire(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
1805 {
1806 SetCombatMovement(false);
1807 }
1808
1809 void Reset() override
1810 {
1812 illidan->AI()->JustSummoned(me);
1813
1815 switch (me->GetEntry())
1816 {
1817 case NPC_DEMON_FIRE:
1819 break;
1820 case NPC_BLAZE:
1821 DoCastSelf(SPELL_BLAZE, true);
1822 DoCastSelf(SPELL_BIRTH, true);
1823 break;
1824 case NPC_FLAME_CRASH:
1826 break;
1827 default:
1828 break;
1829 }
1830 }
1831
1832 void UpdateAI(uint32 /*diff*/) override { }
1833
1834private:
1836};
1837
1838// 41077 - Akama Teleport
1840{
1842 {
1843 if (Creature* caster = GetCaster()->ToCreature())
1844 {
1845 uint32 destination = caster->AI()->GetData(DATA_AKAMA_TELEPORT_POSITION);
1846 dest.Relocate(AkamaTeleportPositions[destination]);
1847 }
1848 }
1849
1850 void Register() override
1851 {
1853 }
1854};
1855
1856// 41268 - Quest - Black Temple - Akama - Door Open
1858{
1859 bool Validate(SpellInfo const* /*spell*/) override
1860 {
1862 }
1863
1864 void OnRemoveDummy(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1865 {
1866 Unit* target = GetTarget();
1867 target->CastSpell(target, SPELL_ARCANE_EXPLOSION, true);
1868
1869 if (InstanceScript* instance = target->GetInstanceScript())
1870 if (Creature* akama = instance->GetCreature(DATA_AKAMA))
1871 akama->AI()->DoAction(ACTION_OPEN_DOOR);
1872 }
1873
1874 void Register() override
1875 {
1877 }
1878};
1879
1880// 40904 - Draw Soul
1882{
1883 bool Validate(SpellInfo const* /*spellInfo*/) override
1884 {
1886 }
1887
1889 {
1890 PreventHitDefaultEffect(effIndex);
1892 }
1893
1894 void Register() override
1895 {
1897 }
1898};
1899
1900/* 41917 - Parasitic Shadowfiend
1901 41914 - Parasitic Shadowfiend */
1903{
1904 bool Validate(SpellInfo const* /*spellInfo*/) override
1905 {
1907 }
1908
1909 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1910 {
1912 if (removeMode != AURA_REMOVE_BY_EXPIRE && removeMode != AURA_REMOVE_BY_DEATH)
1913 return;
1914
1915 Unit* target = GetTarget();
1916 target->CastSpell(target, SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true);
1917 }
1918
1919 void Register() override
1920 {
1922 }
1923};
1924
1925// 41913 - Parasitic Shadowfiend Passive
1927{
1928 bool Validate(SpellInfo const* /*spellInfo*/) override
1929 {
1931 }
1932
1933 bool CheckProc(ProcEventInfo& eventInfo)
1934 {
1935 Unit* target = eventInfo.GetProcTarget();
1936 return target && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND) && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND_2);
1937 }
1938
1939 void Register() override
1940 {
1942 }
1943};
1944
1945// 41923 - Remove Parasitic Shadowfiends (SERVERSIDE)
1947{
1948 bool Validate(SpellInfo const* /*spellInfo*/) override
1949 {
1951 }
1952
1953 void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1954 {
1957 }
1958
1959 void Register() override
1960 {
1962 }
1963};
1964
1965/* 39635 - Throw Glaive
1966 39849 - Throw Glaive */
1968{
1969 void HandleDummy(SpellEffIndex /*effIndex*/)
1970 {
1971 Unit* target = GetHitUnit();
1972 target->m_Events.AddEvent(new SummonWarglaiveEvent(target), target->m_Events.CalculateTime(1s));
1973 }
1974
1975 void Register() override
1976 {
1978 }
1979};
1980
1981// 39857 - Tear of Azzinoth Summon Channel
1983{
1984 bool Validate(SpellInfo const* /*spellInfo*/) override
1985 {
1987 }
1988
1989 void OnPeriodic(AuraEffect const* /*aurEff*/)
1990 {
1992 if (Unit* caster = GetCaster())
1993 {
1994 Unit* target = GetTarget();
1995 if (caster->GetDistance2d(target) > 25.0f)
1996 {
1997 target->CastSpell(target, SPELL_UNCAGED_WRATH, true);
1998 Remove();
1999 }
2000 }
2001 }
2002
2003 void Register() override
2004 {
2006 }
2007};
2008
2009// 40631 - Flame Blast
2011{
2012 bool Validate(SpellInfo const* /*spellInfo*/) override
2013 {
2015 }
2016
2017 void HandleBlaze(SpellEffIndex /*effIndex*/)
2018 {
2019 Unit* target = GetHitUnit();
2020 if (target->GetTypeId() == TYPEID_PLAYER)
2021 target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
2022 }
2023
2024 void Register() override
2025 {
2027 }
2028};
2029
2030// 39873 - Glaive Returns
2032{
2034 {
2036 if (Creature* caster = GetCaster()->ToCreature())
2037 caster->DespawnOrUnsummon();
2038 }
2039
2040 void Register() override
2041 {
2043 }
2044};
2045
2046// 40834 - Agonizing Flames
2048{
2049 bool Validate(SpellInfo const* /*spellInfo*/) override
2050 {
2052 }
2053
2054 void FilterTargets(std::list<WorldObject*>& targets)
2055 {
2056 if (targets.empty())
2057 return;
2058
2060 targets.clear();
2061 targets.push_back(target);
2062 }
2063
2064 void HandleScript(SpellEffIndex /*effIndex*/)
2065 {
2067 }
2068
2069 void Register() override
2070 {
2073 }
2074};
2075
2076// 40511 - Demon Transform 1
2078{
2079 bool Validate(SpellInfo const* /*spellInfo*/) override
2080 {
2082 }
2083
2084 void OnPeriodic(AuraEffect const* /*aurEff*/)
2085 {
2088 Remove();
2089 }
2090
2091 void Register() override
2092 {
2094 }
2095};
2096
2097// 40398 - Demon Transform 2
2099{
2100 bool Validate(SpellInfo const* /*spellInfo*/) override
2101 {
2103 }
2104
2105 void OnPeriodic(AuraEffect const* aurEff)
2106 {
2108 Unit* target = GetTarget();
2109
2110 if (aurEff->GetTickNumber() == 1)
2111 {
2112 if (target->GetDisplayId() == target->GetNativeDisplayId())
2113 target->CastSpell(target, SPELL_DEMON_FORM, true);
2114 else
2116 }
2117 else if (aurEff->GetTickNumber() == 2)
2118 {
2119 target->CastSpell(target, SPELL_DEMON_TRANSFORM_3, true);
2121 aura->SetDuration(4300);
2122 Remove();
2123 }
2124 }
2125
2126 void Register() override
2127 {
2129 }
2130};
2131
2132// 41126 - Flame Burst
2134{
2135 bool Validate(SpellInfo const* /*spellInfo*/) override
2136 {
2138 }
2139
2141 {
2143 }
2144
2145 void Register() override
2146 {
2148 }
2149};
2150
2151// 41081 - Find Target
2153{
2154 bool Validate(SpellInfo const* /*spellInfo*/) override
2155 {
2157 }
2158
2159 void FilterTargets(std::list<WorldObject*>& targets)
2160 {
2161 targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_PARALYZE));
2162
2163 if (targets.empty())
2164 return;
2165
2167 targets.clear();
2168 targets.push_back(target);
2169 }
2170
2171 void HandleScript(SpellEffIndex /*effIndex*/)
2172 {
2173 Unit* target = GetHitUnit();
2174 if (Creature* caster = GetCaster()->ToCreature())
2175 {
2176 caster->CastSpell(target, SPELL_PARALYZE, true);
2177 caster->AI()->SetGUID(target->GetGUID(), 0);
2178 }
2179 }
2180
2181 void Register() override
2182 {
2185 }
2186};
2187
2188// 39908 - Eye Blast
2190{
2191 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2192 {
2193 if (Creature* target = GetTarget()->ToCreature())
2194 target->DespawnOrUnsummon();
2195 }
2196
2197 void Register() override
2198 {
2200 }
2201};
2202
2203// 40761 - Cage Trap
2205{
2207 {
2208 Creature* target = GetHitCreature();
2209 Creature* caster = GetCaster()->ToCreature();
2210
2211 if (!target || !caster)
2212 return;
2213
2214 if (caster->GetDistance2d(target) < 4.0f)
2215 {
2216 target->AI()->DoAction(ACTION_ILLIDAN_CAGED);
2217 caster->DespawnOrUnsummon();
2218 if (GameObject* trap = target->FindNearestGameObject(GO_ILLIDAN_CAGE_TRAP, 10.0f))
2219 trap->UseDoorOrButton();
2220 }
2221 }
2222
2223 void Register() override
2224 {
2226 }
2227};
2228
2229// 40760 - Cage Trap
2231{
2232 bool Validate(SpellInfo const* /*spellInfo*/) override
2233 {
2235 }
2236
2237 void OnPeriodic(AuraEffect const* /*aurEff*/)
2238 {
2240 Unit* target = GetTarget();
2241 target->CastSpell(target, SPELL_CAGED_DEBUFF, true);
2242 Remove();
2243 }
2244
2245 void Register() override
2246 {
2248 }
2249};
2250
2251// 40409 - Maiev Down
2253{
2254 bool Load() override
2255 {
2256 return GetUnitOwner()->GetTypeId() == TYPEID_UNIT;
2257 }
2258
2259 void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2260 {
2262 }
2263
2264 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2265 {
2266 GetTarget()->SetUninteractible(false);
2268 }
2269
2270 void Register() override
2271 {
2274 }
2275};
2276
2277// 40693 - Cage Trap
2279{
2281 {
2282 Position offset = { 0.0f, 0.0f, GetCaster()->GetPositionZ(), 0.0f };
2283 dest.RelocateOffset(offset);
2284 }
2285
2286 void Register() override
2287 {
2289 }
2290};
2291
2292// 41242 - Akama Despawn
2294{
2295 void HandleDummy(SpellEffIndex /*effIndex*/)
2296 {
2297 if (Creature* target = GetHitCreature())
2298 target->DespawnOrUnsummon(Seconds(1));
2299 }
2300
2301 void Register() override
2302 {
2304 }
2305};
2306
2308{
2341}
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
std::chrono::minutes Minutes
Minutes shorthand typedef.
Definition: Duration.h:35
@ IN_PROGRESS
@ DONE
@ SPLINE_CHAIN_MOTION_TYPE
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_DEST_CASTER_RADIUS
@ TARGET_DEST_NEARBY_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_STATE_READY1H
@ EMOTE_ONESHOT_YES
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_ONESHOT_LAND
@ EMOTE_ONESHOT_ROAR
@ EMOTE_ONESHOT_SALUTE
@ EMOTE_ONESHOT_LIFTOFF
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SCHOOL_DAMAGE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
AuraRemoveMode
@ AURA_REMOVE_BY_DEATH
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_STUN
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellDestinationTargetSelectFn(F, I, N)
Definition: SpellScript.h:874
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define AuraCheckProcFn(F)
Definition: SpellScript.h:2130
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
DamageEffectType
Definition: UnitDefines.h:131
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:82
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:83
@ UNIT_STATE_ROOT
Definition: Unit.h:265
@ UNIT_STATE_CASTING
Definition: Unit.h:270
#define RegisterBlackTempleCreatureAI(ai_name)
Definition: black_temple.h:149
@ DATA_AKAMA
Definition: black_temple.h:43
@ DATA_ILLIDARI_COUNCIL
Definition: black_temple.h:38
@ DATA_ILLIDAN_STORMRAGE
Definition: black_temple.h:39
@ DATA_ILLIDAN_MUSIC_CONTROLLER
Definition: black_temple.h:56
@ DATA_AKAMA_ILLIDAN_INTRO
Definition: black_temple.h:57
@ DATA_MAIEV
Definition: black_temple.h:44
@ NPC_SPIRIT_OF_UDALO
Definition: black_temple.h:99
@ NPC_AKAMA
Definition: black_temple.h:86
@ NPC_SPIRIT_OF_OLUM
Definition: black_temple.h:100
@ NPC_FLAME_OF_AZZINOTH
Definition: black_temple.h:101
@ NPC_ILLIDAN_STORMRAGE
Definition: black_temple.h:78
@ NPC_FLAME_CRASH
Definition: black_temple.h:111
@ NPC_ILLIDARI_ELITE
Definition: black_temple.h:105
@ NPC_DEMON_FIRE
Definition: black_temple.h:108
@ NPC_BLAZE
Definition: black_temple.h:110
@ NPC_BLADE_OF_AZZINOTH
Definition: black_temple.h:102
@ NPC_PARASITIC_SHADOWFIEND
Definition: black_temple.h:109
@ NPC_GLAIVE_WORLD_TRIGGER
Definition: black_temple.h:107
@ NPC_ILLIDAN_DB_TARGET
Definition: black_temple.h:104
@ AKAMA_FIGHT
Definition: black_temple.h:138
@ ACTION_OPEN_DOOR
Definition: black_temple.h:140
@ ACTION_ACTIVE_AKAMA_INTRO
Definition: black_temple.h:139
@ GO_ILLIDAN_CAGE_TRAP
Definition: black_temple.h:131
Position const IllidanMiddlePoint
IllidanSay
@ EMOTE_AZZINOTH_GAZE
@ SAY_MAIEV_SHADOWSONG_FAREWELL
@ EVENT_BT_SUMMIT_WALK_SOUND_ID
@ SAY_ILLIDAN_TAKEOFF
@ SAY_ILLIDAN_KILL
@ SAY_AKAMA_TIME_HAS_COME
@ SAY_AKAMA_LIGHT
@ ILLIDAN_WARGLAIVE_SOUND_ID
@ SAY_ILLIDAN_UNCONVINCED
@ EVENT_BT_STORM_WALK_UNI_3_SOUND_ID
@ SAY_AKAMA_SALUTE
@ SAY_ILLIDAN_MINION
@ EVENT_BT_STORM_WALK_HERO_2_SOUND_ID
@ SAY_MAIEV_SHADOWSONG_TRAP
@ SAY_ILLIDAN_CONFRONT_MAIEV
@ SAY_AKAMA_DOOR
@ SAY_AKAMA_ALONE
@ SAY_MAIEV_SHADOWSONG_OUTRO
@ SAY_ILLIDAN_DUPLICITY
@ SAY_AKAMA_MINIONS
@ SAY_ILLIDAN_FRENZY
@ SAY_ILLIDAN_EYE_BLAST
@ EVENT_BT_SUMMIT_WALK_3_SOUND_ID
@ SAY_SPIRIT_ALONE
@ SAY_ILLIDAN_SUMMONFLAMES
@ SAY_ILLIDAN_TAUNT
@ ILLIDAN_TAKEOFF_SOUND_ID
@ SAY_MAIEV_SHADOWSONG_FINISHED
@ SAY_AKAMA_FINISH
@ SAY_ILLIDAN_PREPARED
@ WARGLAIVE_SPAWN_SOUND_ID
@ SAY_ILLIDAN_SHADOW_PRISON
@ SAY_MAIEV_SHADOWSONG_DOWN
@ SAY_MAIEV_SHADOWSONG_APPEAR
@ SAY_AKAMA_FREE
@ SAY_AKAMA_BETRAYER
@ SAY_MAIEV_SHADOWSONG_TAUNT
@ SAY_ILLIDAN_DEFEATED
@ SAY_MAIEV_SHADOWSONG_JUSTICE
@ SAY_ILLIDAN_MORPH
@ SAY_ILLIDAN_ENRAGE
@ EVENT_BT_ARRIVAL_WALK_HERO_1_SOUND_ID
IllidanPoints
@ POINT_RANDOM_PILLAR
@ POINT_ILLIDAN_MIDDLE
@ POINT_TELEPORT
@ POINT_ILLIDAN
@ POINT_ILLIDARI_COUNCIL
@ POINT_THROW_GLAIVE
@ POINT_DB_TARGET
@ POINT_STAIRS
@ POINT_FACE_ILLIDAN
@ POINT_MOVE_BACK
@ POINT_ILLIDAN_ROOM
@ POINT_MINIONS
Position const BladesPositions[2]
Position const MinionsSpawnPositions[10]
IllidanActions
@ ACTION_START_OUTRO
@ ACTION_FINALIZE_AIR_PHASE
@ ACTION_START_MINIONS_WEAVE
@ ACTION_FREE
@ ACTION_RESUME_COMBAT
@ ACTION_ILLIDAN_CAGED
@ ACTION_START_PHASE_2
@ ACTION_FLAME_DEAD
@ ACTION_START_ENCOUNTER
@ ACTION_START_MINIONS
@ ACTION_START_PHASE_4
@ ACTION_INTRO_DONE
@ ACTION_MAIEV_DOWN_FADE
IllidanMisc
@ SUMMON_GROUP
@ GOSSIP_START_FIGHT
@ DATA_AKAMA_TELEPORT_POSITION
@ MAX_MINIONS_NUMBER
@ SPELL_GLAIVE_VISUAL_KIT
@ GOSSIP_START_INTRO
uint32 const SummonCageTrapSpells[8]
IllidanSplineMovement
@ SPLINE_MOVE_BACK
@ SPLINE_ILLIDAN_ROOM
@ SPLINE_STAIRS
@ SPLINE_FACE_ILLIDAN
@ SPLINE_MINIONS
@ SPLINE_ILLIDARI_COUNCIL
@ SPLINE_TELEPORT
Position const IllidanPhase2Positions[4]
void AddSC_boss_illidan()
IllidanEvents
@ EVENT_CHAIN_LIGHTNING
@ EVENT_FLY
@ EVENT_ENCOUNTER_START
@ EVENT_MINIONS_WEAVE
@ EVENT_PHASE_4_DELAYED
@ EVENT_MOVE_TO_ILLIDARI_ROOM
@ EVENT_START_ILLIDAN
@ EVENT_SHADOW_BLAST
@ EVENT_DEMON_TEXT
@ EVENT_MAIEV_FAREWELL_TEXT
@ EVENT_CONFRONT_MAIEV_TEXT
@ EVENT_DEMON
@ EVENT_FIREBALL
@ EVENT_AKAMA_MINIONS_MOVE_2
@ EVENT_MAIEV_OUTRO_TEXT
@ EVENT_PARASITIC_SHADOWFIEND
@ EVENT_AKAMA_MINIONS_EMOTE
@ EVENT_AKAMA_LIGHT_TEXT
@ EVENT_THROW_DAGGER
@ EVENT_THROW_WARGLAIVE_2
@ EVENT_FREE
@ EVENT_GLAIVE_EMOTE
@ EVENT_SPIRIT_SALUTE
@ EVENT_FINAL_SALUTE
@ EVENT_THROW_WARGLAIVE
@ EVENT_UNCONVINCED
@ EVENT_PREPARED
@ EVENT_CAGE_TRAP
@ EVENT_RESUME_COMBAT_PHASE_4
@ EVENT_SHADOW_PRISON_TEXT
@ EVENT_AKAMA_SAY_ALONE
@ EVENT_MAIEV_JUSTICE_TEXT
@ EVENT_TELEPORT
@ EVENT_START_INTRO
@ EVENT_QUIET_SUICIDE
@ EVENT_SPIRIT_SAY_2
@ EVENT_TAUNT
@ EVENT_EVADE_CHECK
@ EVENT_CHANGE_ORIENTATION
@ EVENT_SHADOW_STRIKE
@ EVENT_SHEAR
@ EVENT_MAIEV_ROAR
@ EVENT_FLAME_BLAST
@ EVENT_MAIEV_EXCLAMATION
@ EVENT_FACE_MIDDLE
@ EVENT_HEALING_POTION
@ EVENT_AKAMA_THANKS
@ EVENT_SCHEDULE_DEMON_SPELLS
@ EVENT_RUN_FROM_ILLIDAN_ROOM
@ EVENT_BERSERK
@ EVENT_AKAMA_DOOR_SUCCESS
@ EVENT_SHADOW_DEMON
@ EVENT_AKAMA_MINIONS_MOVE
@ EVENT_ROAR
@ EVENT_ENGAGE
@ EVENT_TIME_HAS_COME
@ EVENT_CANCEL_DEMON_FORM
@ EVENT_MOVE_TO_WARGLAIVE_POINT
@ EVENT_RESUME_COMBAT_DEMON
@ EVENT_AGONIZING_FLAMES
@ EVENT_EYE_BLAST
@ EVENT_MAIEV_TELEPORT_DESPAWN
@ EVENT_AKAMA_MOVE_BACK
@ EVENT_DARK_BARRAGE
@ EVENT_AKAMA_DESPAWN
@ EVENT_AKAMA_MINIONS
@ EVENT_DRAW_SOUL
@ EVENT_FLY_TO_RANDOM_PILLAR
@ EVENT_AKAMA_START_SOUND
@ EVENT_FLAME_BURST
@ EVENT_AKAMA_MOVE_TO_ILLIDAN
@ EVENT_FLAME_CHARGE
@ EVENT_FRENZY
@ EVENT_DEFEATED_TEXT
@ EVENT_AKAMA_SAY_DOOR
@ EVENT_SUMMON_SPIRITS
@ EVENT_AKAMA_DOOR_FAIL
@ EVENT_MAIEV_COMBAT
@ EVENT_RESUME_COMBAT
@ EVENT_MAIEV_YES
@ EVENT_SPIRIT_SAY_1
@ EVENT_MAIEV_APPEAR
@ EVENT_SUMMON_MAIEV
@ EVENT_FLAME_CRASH
Position const IllidanDBTargetSpawnPositions[4]
IllidanEventGroup
@ GROUP_PHASE_2
@ GROUP_PHASE_DEMON
@ GROUP_PHASE_1
@ GROUP_PHASE_ALL
@ GROUP_PHASE_3
@ GROUP_PHASE_4
IllidanPhases
@ PHASE_3
@ PHASE_INTRO
@ PHASE_4
@ PHASE_OUTRO
@ PHASE_MINIONS
@ PHASE_2
@ PHASE_1
IllidanSpells
@ SPELL_BIRTH
@ SPELL_AKAMA_DESPAWN
@ SPELL_DRAW_SOUL_HEAL
@ SPELL_FIND_TARGET
@ SPELL_CLEAR_ALL_DEBUFFS
@ SPELL_CAGED_DEBUFF
@ SPELL_EMOTE_TALK_QUESTION
@ SPELL_SHADOW_PRISON
@ SPELL_DRAW_SOUL
@ SPELL_SHEAR
@ SPELL_HEALING_POTION
@ SPELL_CAGE_TRAP_PERIODIC
@ SPELL_SHADOW_BLAST
@ SPELL_SUMMON_CAGE_TRAP_6
@ SPELL_AGONIZING_FLAMES
@ SPELL_UNCAGED_WRATH
@ SPELL_GLAIVE_RETURNS
@ SPELL_CONSUME_SOUL
@ SPELL_FLAME_CRASH
@ SPELL_SUMMON_CAGE_TRAP_1
@ SPELL_CHARGE
@ SPELL_THROW_DAGGER
@ SPELL_KNEEL
@ SPELL_RANGE_MARKER
@ SPELL_SUMMON_CAGE_TRAP_7
@ SPELL_AURA_OF_DREAD
@ SPELL_AZZINOTH_CHANNEL
@ SPELL_FLAME_BURST_EFFECT
@ SPELL_FLAME_BURST
@ SPELL_PARASITIC_SHADOWFIEND_2
@ SPELL_SUMMON_CAGE_TRAP_8
@ SPELL_DEATHSWORN_DOOR_CHANNEL
@ SPELL_AKAMA_DOOR_CHANNEL
@ SPELL_ARCANE_EXPLOSION
@ SPELL_SUMMON_PARASITIC_SHADOWFIENDS
@ SPELL_TELEPORT_VISUAL
@ SPELL_AGONIZING_FLAMES_SELECTOR
@ SPELL_THROW_GLAIVE
@ SPELL_DARK_BARRAGE
@ SPELL_THROW_GLAIVE2
@ SPELL_SHADOW_STRIKE
@ SPELL_CAGE_TRAP
@ SPELL_FIREBALL
@ SPELL_FLAME_CRASH_GROUND
@ SPELL_DEMON_FORM
@ SPELL_SUMMON_CAGE_TRAP_4
@ SPELL_MAIEV_DOWN
@ SPELL_SHADOW_DEMON_PASSIVE
@ SPELL_DEMON_TRANSFORM_1
@ SPELL_BLAZE_SUMMON
@ SPELL_SUMMON_MAIEV
@ SPELL_REMOVE_PARASITIC_SHADOWFIEND
@ SPELL_FLAME_BLAST
@ SPELL_DEMON_TRANSFORM_2
@ SPELL_SUMMON_CAGE_TRAP_2
@ SPELL_SUMMON_CAGE_TRAP_3
@ SPELL_EYE_BLAST_TRIGGER
@ SPELL_TELEPORT_MAIEV
@ SPELL_PARASITIC_SHADOWFIEND
@ SPELL_FLAME_TEAR_OF_AZZINOTH
@ SPELL_FRENZY
@ SPELL_PARALYZE
@ SPELL_CHAIN_LIGHTNING
@ SPELL_CAGED_TRAP_TELEPORT
@ SPELL_BERSERK
@ SPELL_DEATH
@ SPELL_QUIET_SUICIDE
@ SPELL_CAGE_TRAP_SUMMON
@ SPELL_AKAMA_TELEPORT
@ SPELL_AKAMA_DOOR_FAIL
@ SPELL_SUMMON_GLAIVE
@ SPELL_EYE_BLAST
@ SPELL_DEMON_FIRE
@ SPELL_SUMMON_CAGE_TRAP_5
@ SPELL_SUMMON_TEAR_OF_AZZINOTH
@ SPELL_SUMMON_SHADOWDEMON
@ SPELL_BLAZE
@ SPELL_DEMON_TRANSFORM_3
Position const IllidanDBTargetPoints[4]
Position const AkamaTeleportPositions[2]
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:91
uint32 GetTickNumber() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
Unit * GetCaster() const
Aura * GetAura() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
Definition: SpellScript.h:2129
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Unit * GetUnitOwner() const
HookList< EffectApplyHandler > OnEffectApply
Definition: SpellScript.h:2024
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void JustSummoned(Creature *summon) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
bool operator()(Unit *unit) const
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool IsInBoundary(Position const *who=nullptr) const
Definition: CreatureAI.cpp:426
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void SetBoundary(CreatureBoundary const *boundary, bool negativeBoundaries=false)
Definition: CreatureAI.cpp:446
Creature *const me
Definition: CreatureAI.h:61
void LoadEquipment(int8 id=1, bool force=false)
Definition: Creature.cpp:1946
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetImmuneToNPC(bool apply) override
Definition: Creature.h:173
void SetImmuneToAll(bool apply) override
Definition: Creature.h:167
void SetCanDualWield(bool value) override
Definition: Creature.cpp:1940
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void CancelEventGroup(uint32 group)
Definition: EventMap.cpp:153
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
bool IsInPhase(uint8 phase) const
Definition: EventMap.h:217
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition: EventMap.cpp:175
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
CreatureBoundary const * GetBossBoundary(uint32 id) const
EncounterState GetBossState(uint32 id) const
GameObject * GetGameObject(uint32 type)
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
PlayerList const & GetPlayers() const
Definition: Map.h:367
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveCloserAndStop(uint32 id, Unit *target, float distance)
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Unit * GetProcTarget() const
Definition: Unit.h:495
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Definition: SpellScript.h:873
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void DespawnEntry(uint32 entry)
void DespawnIf(T const &predicate)
void Summon(Creature const *summon)
void DoAction(int32 info, Predicate &&predicate, uint16 max=0)
SummonWarglaiveEvent(Unit *owner)
bool Execute(uint64, uint32) override
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
virtual void DoAction(int32)
Definition: UnitAI.h:72
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
virtual bool CanAIAttack(Unit const *) const
Definition: UnitAI.h:57
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
bool IsWithinMeleeRange(Unit const *obj) const
Definition: Unit.h:699
void SetControlled(bool apply, UnitState state)
Definition: Unit.cpp:10911
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
UnitAI * GetAI() const
Definition: Unit.h:660
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetSheath(SheathState sheathed)
Definition: Unit.cpp:5630
void SetEmoteState(Emote emote)
Definition: Unit.h:852
uint32 GetDisplayId() const
Definition: Unit.h:1567
uint32 GetNativeDisplayId() const
Definition: Unit.h:1570
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:780
uint64 GetHealth() const
Definition: Unit.h:776
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
Unit * GetVictim() const
Definition: Unit.h:715
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition: Unit.cpp:11711
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
void PlayDirectSound(uint32 soundId, Player const *target=nullptr, uint32 broadcastTextId=0) const
Definition: Object.cpp:3592
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition: Object.cpp:2170
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
EventProcessor m_Events
Definition: Object.h:777
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void OnRemoveDummy(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void SetDest(SpellDestination &dest)
void SetDest(SpellDestination &dest)
void Register() override
void HandleScriptEffect(SpellEffIndex)
void Register() override
void OnPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void OnPeriodic(AuraEffect const *)
void OnPeriodic(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
void HandleScriptEffect(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void Register() override
void Register() override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes)
void FilterTargets(std::list< WorldObject * > &targets)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleBlaze(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
bool Load() override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes)
void HandleEffectApply(AuraEffect const *, AuraEffectHandleModes)
void Register() override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
constexpr void SetOrientation(float orientation)
Definition: Position.h:71
float GetAbsoluteAngle(float x, float y) const
Definition: Position.h:125
constexpr void Relocate(float x, float y)
Definition: Position.h:63
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void SetCombatMovement(bool allowMovement)
void ResetThreatList(Unit *who=nullptr)
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void RelocateOffset(Position const &offset)
Definition: Spell.cpp:122
void Relocate(Position const &pos)
Definition: Spell.cpp:111
void KilledUnit(Unit *victim) override
void SummonedCreatureDies(Creature *summon, Unit *) override
void JustSummoned(Creature *summon) override
void ChangeOrientation(float orientation)
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
boss_illidan_stormrage(Creature *creature)
void JustDied(Unit *) override
void JustEngagedWith(Unit *who) override
void Reset() override
void EnterEvadeMode(EvadeReason) override
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32 diff) override
void DoAction(int32 actionId) override
void ScheduleEvents(uint8 phase, uint8 group)
void DoAction(int32 actionId) override
void UpdateAI(uint32 diff) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void MovementInform(uint32 type, uint32 pointId) override
void JustSummoned(Creature *summon) override
void EnterEvadeMode(EvadeReason) override
ObjectGuid _spiritOfOlumGUID
uint32 GetData(uint32) const override
bool CanAIAttack(Unit const *who) const override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
ObjectGuid _spiritOfUdaloGUID
void Reset() override
InstanceScript * _instance
void ChangeOrientation(float orientation)
npc_akama_illidan(Creature *creature)
void Reset() override
TaskScheduler _scheduler
void JustSummoned(Creature *summon) override
npc_blade_of_azzinoth(Creature *creature)
InstanceScript * _instance
void UpdateAI(uint32 diff) override
TaskScheduler _scheduler
void UpdateAI(uint32 diff) override
npc_cage_trap_trigger(Creature *creature)
void Reset() override
void Reset() override
InstanceScript * _instance
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
npc_flame_of_azzinoth(Creature *creature)
npc_illidan_db_target(Creature *creature)
void JustSummoned(Creature *summon) override
void MovementInform(uint32 type, uint32 pointId) override
void Reset() override
npc_illidan_generic_fire(Creature *creature)
void UpdateAI(uint32) override
InstanceScript * _instance
InstanceScript * _instance
void Reset() override
npc_illidari_elite(Creature *creature)
bool CanAIAttack(Unit const *who) const override
npc_maiev(Creature *creature)
EventMap _events
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void DoAction(int32 actionId) override
void JustAppeared() override
InstanceScript * _instance
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
npc_parasitic_shadowfiend(Creature *creature)
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
InstanceScript * _instance
ObjectGuid _targetGUID
void SetGUID(ObjectGuid const &guid, int32) override
npc_shadow_demon(Creature *creature)
void UpdateAI(uint32 diff) override
void Reset() override
InstanceScript * _instance
TaskScheduler _scheduler