TrinityCore
Loading...
Searching...
No Matches
zone_mardum.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 "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "CellImpl.h"
21#include "Containers.h"
22#include "Conversation.h"
23#include "ConversationAI.h"
24#include "CreatureAIImpl.h"
25#include "EventProcessor.h"
26#include "GridNotifiersImpl.h"
27#include "MapUtils.h"
28#include "MotionMaster.h"
29#include "ObjectAccessor.h"
30#include "PathGenerator.h"
31#include "PassiveAI.h"
32#include "PhasingHandler.h"
33#include "Player.h"
34#include "ScriptMgr.h"
35#include "ScriptedCreature.h"
36#include "ScriptedGossip.h"
37#include "SpellAuras.h"
38#include "SpellMgr.h"
39#include "SpellScript.h"
40#include "TemporarySummon.h"
41
46
51
56
62
64{
65public:
66 scene_demonhunter_intro() : SceneScript("scene_demonhunter_intro") { }
67
68 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
69 {
71 }
72
73 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
74 {
76 }
77};
78
79// 196030 - Start: Quest Invis
92
111
136
143
152
153Position const WrathWarriorSpawnPosition = { 1081.9166f, 3183.8716f, 26.335993f };
154Position const KaynJumpPos = { 1172.17f, 3202.55f, 54.3479f };
155Position const KaynDoubleJumpPosition = { 1094.2384f, 3186.058f, 28.81562f };
156Position const JayceJumpPos = { 1119.24f, 3203.42f, 38.1061f };
157Position const AllariJumpPos = { 1120.08f, 3197.2f, 36.8502f };
158Position const KorvasJumpPos = { 1117.89f, 3196.24f, 36.2158f };
159Position const SevisJumpPos = { 1120.74f, 3199.47f, 37.5157f };
160Position const CyanaJumpPos = { 1120.34f, 3194.28f, 36.4321f };
161
162// 93011 - Kayn Sunfury
164{
166
167 void OnQuestAccept(Player* player, Quest const* quest) override
168 {
170 {
173 Conversation::CreateConversation(CONVO_THE_INVASION_BEGINS, player, *player, player->GetGUID(), nullptr, false);
174 }
175 }
176
177 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
178 {
179 if (pathId == PATH_KAYN_ATTACK_DEMON)
180 {
181 Creature* wrathWarrior = me->FindNearestCreatureWithOptions(100.0f, { .CreatureId = NPC_WRATH_WARRIOR_INVASION_BEGINS, .IgnorePhases = true, .OwnerGuid = me->GetOwnerGUID() });
182 if (!wrathWarrior)
183 return;
184
185 me->SetFacingToObject(wrathWarrior);
186
188 wrathWarrior->KillSelf();
189
190 _scheduler.Schedule(600ms, [this](TaskContext const& /*context*/)
191 {
192 me->GetMotionMaster()->MovePath(PATH_KAYN_AFTER_DEMON, false);
193 });
194 }
195 else if (pathId == PATH_KAYN_AFTER_DEMON)
197 }
198
199 void MovementInform(uint32 type, uint32 pointId) override
200 {
201 if (type != EFFECT_MOTION_TYPE)
202 return;
203
204 if (pointId == POINT_KAYN_TRIGGER_DOUBLE_JUMP)
205 {
206 TempSummon* summon = me->ToTempSummon();
207 if (!summon)
208 return;
209 WorldObject* summoner = summon->GetSummoner();
210 if (!summoner)
211 return;
212 Player* summonerPlayer = summoner->ToPlayer();
213 if (!summonerPlayer)
214 return;
215
220 }
221 else if (pointId == POINT_KAYN_MOVE_TO_DEMON)
222 {
225 }
226 }
227
228 void UpdateAI(uint32 diff) override
229 {
230 _scheduler.Update(diff);
231 }
232
233private:
235};
236
237// 98228 - Jayce Darkweaver
239{
241
242 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
243 {
244 if (pathId == PATH_JAYCE_INVASION_BEGINS)
245 {
248 }
249 else if (pathId == PATH_JAYCE_JUMP_INVASION_BEGINS)
251 }
252
253 void MovementInform(uint32 type, uint32 pointId) override
254 {
255 if (type != EFFECT_MOTION_TYPE)
256 return;
257
258 if (pointId == POINT_ILLIDARI_LAND_POS)
259 {
262 }
263 }
264};
265
266// 98227 - Allari the Souleater
268{
270
271 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
272 {
273 if (pathId == PATH_ALLARI_INVASION_BEGINS)
274 {
277 }
278 else if (pathId == PATH_ALLARI_JUMP_INVASION_BEGINS)
280 }
281
282 void MovementInform(uint32 type, uint32 pointId) override
283 {
284 if (type != EFFECT_MOTION_TYPE)
285 return;
286
287 if (pointId == POINT_ILLIDARI_LAND_POS)
288 {
291 }
292 }
293};
294
295// 98292 - Korvas Bloodthorn
297{
299
300 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
301 {
302 if (pathId == PATH_KORVAS_INVASION_BEGINS)
303 {
306 }
307 else if (pathId == PATH_KORVAS_JUMP_INVASION_BEGINS)
309 }
310
311 void MovementInform(uint32 type, uint32 pointId) override
312 {
313 if (type != EFFECT_MOTION_TYPE)
314 return;
315
316 if (pointId == POINT_ILLIDARI_LAND_POS)
317 {
320 }
321 }
322};
323
324// 99918 - Sevis Brightflame
326{
328
329 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
330 {
331 if (pathId == PATH_SEVIS_INVASION_BEGINS)
332 {
335 }
336 else if (pathId == PATH_SEVIS_JUMP_INVASION_BEGINS)
338 }
339
340 void MovementInform(uint32 type, uint32 pointId) override
341 {
342 if (type != EFFECT_MOTION_TYPE)
343 return;
344
345 if (pointId == POINT_ILLIDARI_LAND_POS)
346 {
349 }
350 }
351};
352
353// 98290 - Cyana Nightglaive
355{
357
358 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
359 {
360 if (pathId == PATH_CYANA_INVASION_BEGINS)
361 {
364 }
365 else if (pathId == PATH_CYANA_JUMP_INVASION_BEGINS)
367 }
368
369 void MovementInform(uint32 type, uint32 pointId) override
370 {
371 if (type != EFFECT_MOTION_TYPE)
372 return;
373
374 if (pointId == POINT_ILLIDARI_LAND_POS)
375 {
378 }
379 }
380};
381
382// 922 - The Invasion Begins
384{
385public:
387
396
402
403 void OnCreate(Unit* creator) override
404 {
405 Creature* kaynObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_KAYN_SUNFURY_INVASION_BEGINS, .IgnorePhases = true });
406 Creature* jayceObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_JAYCE_DARKWEAVER_INVASION_BEGINS, .IgnorePhases = true });
407 Creature* allariaObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_ALLARI_THE_SOULEATER_INVASION_BEGINS, .IgnorePhases = true });
408 Creature* cyanaObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_CYANA_NIGHTGLAIVE_INVASION_BEGINS, .IgnorePhases = true });
409 Creature* korvasObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_INVASION_BEGINS, .IgnorePhases = true });
410 Creature* sevisObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_INVASION_BEGINS, .IgnorePhases = true });
411 if (!kaynObject || !jayceObject || !allariaObject || !cyanaObject || !korvasObject || !sevisObject)
412 return;
413
414 TempSummon* kaynClone = kaynObject->SummonPersonalClone(kaynObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
415 TempSummon* jayceClone = jayceObject->SummonPersonalClone(jayceObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
416 TempSummon* allariaClone = allariaObject->SummonPersonalClone(allariaObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
417 TempSummon* cyanaClone = cyanaObject->SummonPersonalClone(cyanaObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
418 TempSummon* korvasClone = korvasObject->SummonPersonalClone(korvasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
419 TempSummon* sevisClone = sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
420 if (!kaynClone || !jayceClone || !allariaClone || !cyanaClone || !korvasClone || !sevisClone)
421 return;
422
423 _jayceGUID = jayceClone->GetGUID();
424 _allariGUID = allariaClone->GetGUID();
425 _cyanaGUID = cyanaClone->GetGUID();
426 _sevisGUID = sevisClone->GetGUID();
427 allariaClone->SetAIAnimKitId(ANIM_DH_RUN_ALLARI);
429
433 }
434
435 void OnStart() override
436 {
438
439 if (Milliseconds const* illidariFacingLineStarted = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_TRIGGER_FACING))
440 _events.ScheduleEvent(EVENT_ILLIDARI_FACE_PLAYERS, *illidariFacingLineStarted);
441
442 if (Milliseconds const* illidariStartPathLineStarted = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_START_PATH))
443 _events.ScheduleEvent(EVENT_ILLIDARI_START_PATH, *illidariStartPathLineStarted);
444 }
445
447 {
449 if (!privateObjectOwner)
450 return;
451
453 if (!clone)
454 return;
455
456 clone->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
457 }
458
459 void StartCloneMovement(ObjectGuid cloneGUID, uint32 pathId, uint32 animKit)
460 {
462 if (!clone)
463 return;
464
465 clone->InterruptNonMeleeSpells(true);
466 clone->GetMotionMaster()->MovePath(pathId, false);
467 if (animKit)
468 clone->SetAIAnimKitId(animKit);
469 }
470
471 void OnUpdate(uint32 diff) override
472 {
473 _events.Update(diff);
474
475 switch (_events.ExecuteEvent())
476 {
478 {
485 break;
486 }
488 {
490 if (!kaynClone)
491 break;
492
494 if (!privateObjectOwner)
495 return;
496
497 Player* player = privateObjectOwner->ToPlayer();
498 if (!player)
499 return;
500
501 kaynClone->PlayObjectSound(SOUND_METAL_WEAPON_UNSHEATH, kaynClone->GetGUID(), player);
505 kaynClone->SetSheath(SHEATH_STATE_MELEE);
507
513 break;
514 }
515 default:
516 break;
517 }
518 }
519
520private:
526};
527
528// 98459 - Kayn Sunfury
529// 98458 - Jayce Darkweaver
530// 98456 - Allari the Souleater
531// 98460 - Korvas Bloodthorn
532// 99919 - Sevis Brightflame
533// 98457 - Cyana Nightglaive
535{
537
543
549
551 {
552 std::list<Unit*> targetList;
555 Cell::VisitAllObjects(me, searcher, 100.0f);
556 targetList.remove_if([](Unit* possibleTarget)
557 {
558 return possibleTarget->isAttackingPlayer();
559 });
561 }
562
564 {
565 _oocScheduler.Schedule(200ms, [this](TaskContext& context)
566 {
567 Unit* target = GetNextTarget();
568 if (!target)
569 {
570 context.Repeat(500ms);
571 return;
572 }
573 AttackStart(target);
574 });
575 }
576
577 void JustAppeared() override
578 {
580 }
581
582 void Reset() override
583 {
584 _events.Reset();
585 }
586
587 void JustEngagedWith(Unit* /*who*/) override
588 {
591 }
592
593 void EnterEvadeMode(EvadeReason why) override
594 {
595 // manualling calling it to not move to home position but move to next target instead
596 _EnterEvadeMode(why);
597 Reset();
599 }
600
601 void UpdateAI(uint32 diff) override
602 {
603 if (!UpdateVictim())
604 {
605 _oocScheduler.Update(diff);
606 return;
607 }
608
609 _events.Update(diff);
610
612 return;
613
614 switch (_events.ExecuteEvent())
615 {
619 break;
620 case EVENT_FEL_RUSH:
623 break;
624 default:
625 break;
626 }
627 }
628
629private:
632};
633
659
660// 98229 - Kayn Sunfury
662{
664
665 void OnQuestAccept(Player* player, Quest const* quest) override
666 {
668 {
670 Creature* kaynObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = NPC_KAYN_SUNFURY_ASHTONGUE, .IgnorePhases = true });
671 Creature* korvasObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_ASHTONGUE, .IgnorePhases = true });
672 if (!kaynObject || !korvasObject)
673 return;
674
675 TempSummon* kaynClone = kaynObject->SummonPersonalClone(kaynObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
676 TempSummon* korvasClone = korvasObject->SummonPersonalClone(korvasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
677 if (!kaynClone || !korvasClone)
678 return;
679
682 }
683 }
684};
685
686// 98229 - Kayn Sunfury
688{
690
691 void JustAppeared() override
692 {
693 Creature* korvasObject = GetClosestCreatureWithOptions(me, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_ASHTONGUE, .IgnorePhases = true, .PrivateObjectOwnerGuid = me->GetPrivateObjectOwner()});
694 if (!korvasObject)
695 return;
696
697 ObjectGuid korvasGuid = korvasObject->GetGUID();
698
699 _scheduler.Schedule(1s, [this, korvasGuid](TaskContext& task)
700 {
701 Unit* privateObjectOwner = ObjectAccessor::GetUnit(*me, me->GetPrivateObjectOwner());
702 if (!privateObjectOwner)
703 return;
704
705 Unit* korvas = ObjectAccessor::GetUnit(*me, korvasGuid);
706 if (!korvas)
707 return;
708
710 me->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
711 korvas->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
712
713 task.Schedule(6s, [this, korvasGuid](TaskContext& task)
714 {
716
717 task.Schedule(6s, [this, korvasGuid](TaskContext& task)
718 {
719 Creature* korvas = ObjectAccessor::GetCreature(*me, korvasGuid);
720 if (!korvas)
721 return;
722
723 if (!korvas->IsAIEnabled())
724 return;
725
730 me->DespawnOrUnsummon(10s);
731
732 task.Schedule(2s, [this, korvasGuid](TaskContext const& /*task*/)
733 {
734 Creature* korvas = ObjectAccessor::GetCreature(*me, korvasGuid);
735 if (!korvas)
736 return;
737
738 korvas->InterruptNonMeleeSpells(true);
741 korvas->DespawnOrUnsummon(12s);
742 });
743 });
744 });
745 });
746 }
747
748 void UpdateAI(uint32 diff) override
749 {
750 _scheduler.Update(diff);
751 }
752
753private:
755};
756
758{
759 if (creature->IsPrivateObject())
760 return new npc_kayn_sunfury_ashtongue_intro_private(creature);
761 return new npc_kayn_sunfury_ashtongue_intro(creature);
762}
763
764// 1053 - Enter the Illidari: Ashtongue
766{
767public:
768 scene_enter_the_illidari_ashtongue() : SceneScript("scene_enter_the_illidari_ashtongue") { }
769
770 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
771 {
772 Creature* sevisObject = GetClosestCreatureWithOptions(player, 30.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_ASHTONGUE, .IgnorePhases = true });
773 if (!sevisObject)
774 return;
775
776 TempSummon* sevisClone = sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
777 if (!sevisClone)
778 return;
779
780 sevisClone->CastSpell(player, SPELL_TRACK_TARGET_IN_CHANNEL, false);
781 sevisClone->DespawnOrUnsummon(15s);
782 }
783
784 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
785 {
786 if (triggerName == "SEEFELSABERCREDIT")
788 else if (triggerName == "UPDATEPHASE")
790 }
791};
792
793// 99916 - Sevis Brightflame (Ashtongue Gateway)
795{
797
798 void JustAppeared() override
799 {
800 _scheduler.Schedule(1s, [this](TaskContext& task)
801 {
803
804 task.Schedule(2s, [this](TaskContext& task)
805 {
808
809 task.Schedule(3s, [this](TaskContext const& /*task*/)
810 {
813 });
814 });
815 });
816 }
817
818 void UpdateAI(uint32 diff) override
819 {
820 _scheduler.Update(diff);
821 }
822
823private:
825};
826
828{
829 if (creature->IsPrivateObject())
831 return new NullCreatureAI(creature);
832}
833
834// 200255 - Accepting Felsaber Gift
847
848// 32 - Mardum - Trigger KillCredit for Quest "Enter the Illidari: Ashtongue"
862
870
871// 1077 - Enter the Illidari: Coilskar
873{
874public:
875 scene_enter_the_illidari_coilskar() : SceneScript("scene_enter_the_illidari_coilskar") { }
876
877 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
878 {
880 Creature* sevisObject = GetClosestCreatureWithOptions(player, 30.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_COILSKAR, .IgnorePhases = true });
881 if (!sevisObject)
882 return;
883
884 sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
885 }
886};
887
888// 99917 - Sevis Brightflame (Coilskar Gateway)
890{
892
893 void JustAppeared() override
894 {
895 TempSummon* summon = me->ToTempSummon();
896 if (!summon)
897 return;
898
899 Unit* summoner = summon->GetSummonerUnit();
900 if (!summoner)
901 return;
902
903 me->SetFacingToObject(summoner);
904 me->DespawnOrUnsummon(14s);
905
906 _scheduler.Schedule(1s, [this](TaskContext& task)
907 {
909
910 task.Schedule(2s, [this](TaskContext& task)
911 {
914
915 task.Schedule(3s, [this](TaskContext const& /*task*/)
916 {
918 });
919 });
920 });
921 }
922
923 void UpdateAI(uint32 diff) override
924 {
925 _scheduler.Update(diff);
926 }
927
928private:
930};
931
933{
934 if (creature->IsPrivateObject())
936 return new NullCreatureAI(creature);
937}
938
982
984{
985public:
987
988 bool Execute(uint64, uint32) override
989 {
990 Unit* target = _owner->AI()->SelectTarget(SelectTargetMethod::Random, 0, 150.0f, true);
992 return true;
993 }
994
995private:
997};
998
999Position const BalefulAegisPos = { 592.4335f, 2433.1067f, -62.91178f };
1000
1001// 93105 - Inquisitor Baleful
1003{
1005
1006 void JustAppeared() override
1007 {
1008 // Blizz use a personal spawn for every DH on Quest: 39049 which leads to issues
1009 TempSummon* balefulColoss = me->SummonCreature(NPC_COLOSSAL_INFERNAL_BALEFUL, 523.4045f, 2428.4113f, -117.0033f, 0.10887321f, TEMPSUMMON_MANUAL_DESPAWN, 0s);
1010 if (!balefulColoss)
1011 return;
1012
1013 _balefulColossGUID = balefulColoss->GetGUID();
1014 }
1015
1023
1024 void DoAction(int32 action) override
1025 {
1026 if (action == ACTION_BALEFUL_AEGIS_DOWN)
1028 }
1029
1030 void MovementInform(uint32 type, uint32 pointId) override
1031 {
1032 if (type != POINT_MOTION_TYPE)
1033 return;
1034
1035 if (pointId == POINT_BALEFUL_AEGIS_UP)
1036 me->SetFacingTo(0.19842f);
1037 else if (pointId == POINT_BALEFUL_AEGIS_DOWN)
1039 }
1040
1041 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1042 {
1043 if (!_castedLegionAegis && me->HealthBelowPctDamaged(60, damage))
1044 {
1046 {
1047 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 1s);
1048 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 4s);
1049 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 8s);
1050 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 13s);
1051 }
1052
1057 _castedLegionAegis = true;
1058 }
1059 }
1060
1061 void Reset() override
1062 {
1063 _castedLegionAegis = false;
1064 _events.Reset();
1065 }
1066
1067 void JustDied(Unit* /*killer*/) override
1068 {
1071
1073 balefulColoss->KillSelf();
1074
1075 for (ObjectGuid tapperGUID : me->GetTapList())
1076 {
1077 if (Player* tapper = ObjectAccessor::GetPlayer(*me, tapperGUID))
1078 {
1079 tapper->CastSpell(tapper, SPELL_BALEFUL_KILL_CREDIT, false);
1080 tapper->CastSpell(tapper, SPELL_BALEFUL_TAKING_POWER, false);
1081 }
1082 }
1083 }
1084
1085 void UpdateAI(uint32 diff) override
1086 {
1087 if (!UpdateVictim())
1088 return;
1089
1090 _events.Update(diff);
1091
1093 return;
1094
1095 while (uint32 eventId = _events.ExecuteEvent())
1096 {
1097 switch (eventId)
1098 {
1102 break;
1106 break;
1110 break;
1111 default:
1112 break;
1113 }
1114 }
1115 }
1116
1117private:
1121};
1122
1123// 99160 - Beaming Eye
1125{
1127
1128 void JustAppeared() override
1129 {
1132 // ToDo: rotation isn't changing orientation, turnspeed should be random
1134 }
1135};
1136
1137// 192665 - Legion Aegis
1139{
1140 void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1141 {
1142 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
1143 {
1144 if (UnitAI* ai = GetTarget()->GetAI())
1145 ai->DoAction(ACTION_BALEFUL_AEGIS_DOWN);
1146 }
1147 }
1148
1153};
1154
1155// 192709 - Infernal Smash
1173
1174// 195058 - Beaming Gaze (selector)
1176{
1177 bool Validate(SpellInfo const* /*spellInfo*/) override
1178 {
1180 }
1181
1182 void SummonBeamingEye(Unit* origin, float angle)
1183 {
1184 Position dest = origin->GetPosition();
1185 origin->MovePositionToFirstCollision(dest, 6.5f, angle);
1186 dest.m_positionZ += 0.35f;
1187 origin->CastSpell(dest, SPELL_BALEFUL_BEAMING_EYE_SUMMON, true);
1188 }
1189
1191 {
1192 Unit* hitUnit = GetHitUnit();
1193 SummonBeamingEye(hitUnit, float(M_PI));
1194 SummonBeamingEye(hitUnit, float(-M_PI) / 4.0f);
1195 SummonBeamingEye(hitUnit, float(M_PI) / 4.0f);
1196 }
1197
1202};
1203
1223
1224// 94377 - Cyana Nightglaive
1226{
1228
1229 void JustAppeared() override
1230 {
1231 me->DespawnOrUnsummon(19s);
1232
1233 _scheduler.Schedule(2s + 500ms, [this](TaskContext& task)
1234 {
1236
1237 task.Schedule(3s, [this](TaskContext const& /*task*/)
1238 {
1239 me->GetMotionMaster()->MovePath(PATH_CYANA_NIGHTGLAIVE_FREED, false);
1240 });
1241 });
1242 }
1243
1244 void UpdateAI(uint32 diff) override
1245 {
1246 _scheduler.Update(diff);
1247 }
1248
1249private:
1251};
1252
1254{
1255 if (creature->IsPrivateObject())
1256 return new npc_cyana_nightglaive_freed_private(creature);
1257 return new NullCreatureAI(creature);
1258}
1259
1260// 93117 - Izal Whitemoon
1262{
1264
1265 void JustAppeared() override
1266 {
1267 me->DespawnOrUnsummon(18s);
1268
1269 _scheduler.Schedule(2s, [this](TaskContext& task)
1270 {
1272
1273 task.Schedule(3s, [this](TaskContext const& /*task*/)
1274 {
1275 me->GetMotionMaster()->MovePath(PATH_CYANA_NIGHTGLAIVE_FREED, false);
1276 });
1277 });
1278 }
1279
1280 void UpdateAI(uint32 diff) override
1281 {
1282 _scheduler.Update(diff);
1283 }
1284
1285private:
1287};
1288
1290{
1291 if (creature->IsPrivateObject())
1292 return new npc_izal_whitemoon_freed_private(creature);
1293 return new NullCreatureAI(creature);
1294}
1295
1296// 94400 - Belath Dawnblade
1298{
1300
1301 void JustAppeared() override
1302 {
1303 me->DespawnOrUnsummon(5min); // wtf blizz
1304
1305 _scheduler.Schedule(3s, [this](TaskContext& task)
1306 {
1308
1309 task.Schedule(6s, [this](TaskContext const& /*task*/)
1310 {
1311 me->GetMotionMaster()->MovePath(PATH_BELATH_DAWNBLADE_FREED, false);
1312 });
1313 });
1314 }
1315
1316 void UpdateAI(uint32 diff) override
1317 {
1318 _scheduler.Update(diff);
1319 }
1320
1321private:
1323};
1324
1326{
1327 if (creature->IsPrivateObject())
1328 return new npc_belath_dawnblade_freed_private(creature);
1329 return new NullCreatureAI(creature);
1330}
1331
1332// 93230 - Mannethrel Darkstar
1334{
1336
1337 void JustAppeared() override
1338 {
1339 me->DespawnOrUnsummon(28s);
1340
1341 _scheduler.Schedule(2s, [this](TaskContext& task)
1342 {
1344
1345 task.Schedule(6s, [this](TaskContext const& /*task*/)
1346 {
1349 });
1350 });
1351 }
1352
1353 void UpdateAI(uint32 diff) override
1354 {
1355 _scheduler.Update(diff);
1356 }
1357
1358private:
1360};
1361
1363{
1364 if (creature->IsPrivateObject())
1365 return new npc_mannethrel_darkstar_freed_private(creature);
1366 return new NullCreatureAI(creature);
1367}
1368
1369// 204711 - Set Them Free: Cyana Nightglaive Freed Kill Credit
1370// 204714 - Set Them Free: Izal Whitemoon Freed Kill Credit
1371// 204712 - Set Them Free: Belath Dawnblade Freed Kill Credit
1372// 204715 - Set Them Free: Mannethrel Darkstar Freed Kill Credit
1373template<uint32 CreatureId>
1375{
1377 {
1378 if (Player* player = GetCaster()->ToPlayer())
1379 {
1380 Creature* staticObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = CreatureId, .IgnorePhases = true });
1381 if (!staticObject)
1382 return;
1383
1384 staticObject->SummonPersonalClone(staticObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1385 }
1386 }
1387
1392};
1393
1430
1431Position const SevisBrightflameShivarraGatewayPosition = { 1587.9618f, 2543.091f, 62.18399f, 3.49967908f };
1432
1433// 99915 - Sevis Brightflame (Shivarra Gateway)
1435{
1437
1438 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
1439 {
1440 if (menuId == GOSSIP_MENU_SACRIFICE_PLAYER && gossipListId == GOSSIP_OPTION_SACRIFICE_PLAYER)
1441 {
1442 CloseGossipMenuFor(player);
1443 player->CastSpell(nullptr, SPELL_SEVIS_SACRIFICE_ME, false);
1444 return true;
1445 }
1446 else if (menuId == GOSSIP_MENU_SACRIFICE_SEVIS && gossipListId == GOSSIP_OPTION_SACRIFICE_SEVIS)
1447 {
1448 CloseGossipMenuFor(player);
1449 player->CastSpell(me, SPELL_SACRIFICE_SEVIS, false);
1450 return true;
1451 }
1452 return false;
1453 }
1454
1455 void DoAction(int32 param) override
1456 {
1457 switch (param)
1458 {
1461 break;
1463 SacrificeSelf();
1464 break;
1465 default:
1466 break;
1467 }
1468 }
1469
1471 {
1474
1475 _scheduler.Schedule(1s, [this](TaskContext& task)
1476 {
1477 me->KillSelf();
1478
1480 task.Schedule(2s, [this](TaskContext& task)
1481 {
1484
1485 if (_soulMissileCounter < 3)
1486 task.Repeat(2s);
1487 });
1488 });
1489 }
1490
1492 {
1493 me->DespawnOrUnsummon(22s);
1495
1496 _scheduler.Schedule(1s, [this](TaskContext& task)
1497 {
1498 TempSummon* summon = me->ToTempSummon();
1499 if (!summon)
1500 return;
1501
1502 Unit* summoner = summon->GetSummonerUnit();
1503 if (!summoner)
1504 return;
1505
1506 me->GetMotionMaster()->MoveCloserAndStop(POINT_SEVIS_GATEWAY_SHIVARRA, summoner, 2.0f);
1507
1508 task.Schedule(2s, [this](TaskContext& task)
1509 {
1513
1514 task.Schedule(2s, [this](TaskContext& task)
1515 {
1517
1518 task.Schedule(5s, [this](TaskContext& task)
1519 {
1521
1522 task.Schedule(3s, [this](TaskContext& task)
1523 {
1526
1527 task.Schedule(2s, [this](TaskContext const& /*task*/)
1528 {
1529 me->GetMotionMaster()->MovePath(PATH_SEVIS_GATEWAY_SHIVARRA, false);
1530 });
1531 });
1532 });
1533 });
1534 });
1535 });
1536 }
1537
1538 void UpdateAI(uint32 diff) override
1539 {
1540 _scheduler.Update(diff);
1541 }
1542
1543private:
1546};
1547
1548// EventID 47550
1550{
1551public:
1552 event_sevis_sacrifice_player() : EventScript("event_sevis_sacrifice_player") { }
1553
1554 void OnTrigger(WorldObject* /*object*/, WorldObject* invoker, uint32 /*eventId*/) override
1555 {
1557 {
1558 if (Player* player = invoker->ToPlayer())
1559 {
1560 player->KilledMonsterCredit(NPC_SEVIS_BRIGHTFLAME_SHIVARRA);
1561 player->CastSpell(nullptr, SPELL_SEVIS_KILLED_ME_AURA, false);
1562 }
1563 creature->AI()->DoAction(ACTION_SACRIFICE_PLAYER);
1564 }
1565 }
1566};
1567
1568// EventID 47549
1570{
1571public:
1572 event_sevis_sacrifice_self() : EventScript("event_sevis_sacrifice_self") { }
1573
1574 void OnTrigger(WorldObject* /*object*/, WorldObject* invoker, uint32 /*eventId*/) override
1575 {
1577 {
1578 if (Player* player = invoker->ToPlayer())
1579 player->KilledMonsterCredit(NPC_SEVIS_BRIGHTFLAME_SHIVARRA);
1580 creature->AI()->DoAction(ACTION_SACRIFICE_SEVIS);
1581 }
1582 }
1583};
1584
1585// XX - Mardum - Trigger Conversation for Quest "Enter the Illidari: Shivarra"
1587{
1589
1590 void OnUnitEnter(Unit* unit) override
1591 {
1592 Player* player = unit->ToPlayer();
1593 if (!player || !player->HasAura(SPELL_SEVIS_KILLED_ME_AURA))
1594 return;
1595
1596 player->CastSpell(nullptr, SPELL_TRIGGER_SHIVARRA_CONV_WHEN_DEAD, true);
1597 }
1598};
1599
1600// 38765 - Enter the Illidari: Shivarra
1602{
1603public:
1604 quest_enter_the_illidari_shivarra() : QuestScript("quest_enter_the_illidari_shivarra") { }
1605
1606 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1607 {
1608 if (newStatus == QUEST_STATUS_NONE)
1609 {
1612 }
1613 }
1614};
1615
1632
1633Position const RockslideCavePosition = { 1237.1528f, 1642.6180f, 103.1518f, 5.8055872f };
1634
1635// 191097 - Give Me Sight Beyond Sight: Periodic Trigger Dummy
1637{
1638 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1639 {
1640 Player* player = GetCaster()->ToPlayer();
1641 if (!player || !player->HasAura(SPELL_DH_SPECTRAL_SIGHT))
1642 return;
1643
1644 float angleToWall = player->GetAbsoluteAngle(RockslideCavePosition);
1645 float playerOrientation = player->GetOrientation();
1646 if (playerOrientation >= Position::NormalizeOrientation(angleToWall - float(M_PI) / 4) && playerOrientation <= Position::NormalizeOrientation(angleToWall + float(M_PI) / 4))
1647 {
1651 }
1652 }
1653
1658};
1659
1681
1701
1702// 39495 - Hidden No More
1704{
1705public:
1706 quest_hidden_no_more() : QuestScript("quest_hidden_no_more") { }
1707
1708 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1709 {
1710 if (newStatus == QUEST_STATUS_NONE)
1711 {
1712 player->CastSpell(nullptr, SPELL_ABANDON_HIDDEN_NO_MORE, true);
1713 }
1714 }
1715};
1716
1717// 96436 - Jayce Darkweaver
1719{
1721
1722 void OnQuestAccept(Player* player, Quest const* quest) override
1723 {
1724 if (quest->GetQuestId() == QUEST_HIDDEN_NO_MORE)
1726 }
1727
1728 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
1729 {
1731 {
1736 CloseGossipMenuFor(player);
1737 }
1738 return true;
1739 }
1740};
1741
1748
1749std::unordered_map<std::string_view, HiddenNoMorePathDelay> HiddenNoMorePathMap = {
1750 { "CrypticHollowDh01", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_01, 554ms, 2990ms } },
1751 { "CrypticHollowDh02", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_02, 270ms, 1690ms } },
1752 { "CrypticHollowDh03", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_03, 554ms, 1690ms } },
1753 { "CrypticHollowDh04", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_04, 554ms, 2990ms } },
1754 { "CrypticHollowDh05", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_05, 402ms, 2990ms } },
1755 { "CrypticHollowCoilskar01", { PATH_CRYPTIC_HOLLOW_COILSKAR_01, 0ms, 1521ms } },
1756 { "CrypticHollowCoilskar02", { PATH_CRYPTIC_HOLLOW_COILSKAR_02, 0ms, 2024ms } },
1757 { "CrypticHollowCoilskar03", { PATH_CRYPTIC_HOLLOW_COILSKAR_03, 0ms, 1521ms } },
1758 { "CrypticHollowAshtongue01", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_01, 0ms, 1521ms } },
1759 { "CrypticHollowAshtongue02", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_02, 0ms, 1521ms } },
1760 { "CrypticHollowAshtongue03", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_03, 0ms, 1521ms } },
1761};
1762
1763constexpr Position JaycePrepareJump = { 1263.948f, 1632.9402f, 102.08563f };
1764constexpr Position JayceJumpPosition = { 1245.257f, 1639.049f, 101.223f };
1765
1766// 96436 - Jayce Darkweaver
1768{
1770
1771 void JustAppeared() override
1772 {
1773 Player* player = me->GetDemonCreatorPlayer();
1774 if (!player)
1775 return;
1776
1779
1780 Creature* shivarraObject = me->FindNearestCreatureWithOptions(25.0f, { .CreatureId = NPC_SHIVARRA_CRYPTIC_HOLLOW, .IgnorePhases = true });
1781 if (!shivarraObject)
1782 return;
1783
1784 Creature* shivarraClone = shivarraObject->SummonPersonalClone(shivarraObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1785 if (!shivarraClone)
1786 return;
1787
1788 _scheduler.Schedule(4s, [this, shivarraGuid = shivarraClone->GetGUID()](TaskContext& task)
1789 {
1790 Creature* shivarraClone = ObjectAccessor::GetCreature(*me, shivarraGuid);
1791 if (!shivarraClone)
1792 return;
1793
1794 shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT, 4, 2000);
1795 shivarraClone->SetEmoteState(EMOTE_STATE_READY_SPELL_OMNI);
1796 task.Schedule(3s, [this, shivarraGuid](TaskContext const& /*task*/)
1797 {
1798 Creature* shivarraClone = ObjectAccessor::GetCreature(*me, shivarraGuid);
1799 if (!shivarraClone)
1800 return;
1801
1802 shivarraClone->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
1803 shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT2, 4, 1000);
1804 shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT3, 4, 2000);
1805 shivarraClone->DespawnOrUnsummon(1s);
1806 });
1807 });
1808
1809 for (std::pair<std::string_view const, HiddenNoMorePathDelay>& npcPair : HiddenNoMorePathMap)
1810 {
1811 Creature* originalObject = me->FindNearestCreatureWithOptions(25.0f, { .StringId = npcPair.first, .IgnorePhases = true });
1812 if (!originalObject)
1813 continue;
1814
1815 Creature* clone = originalObject->SummonPersonalClone(originalObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, me->GetDemonCreatorPlayer());
1816 if (!clone)
1817 continue;
1818
1819 _cloneGuids.push_back(clone->GetGUID());
1821 }
1822 }
1823
1824 void OnChannelFinished(SpellInfo const* spell) override
1825 {
1826 if (spell->Id != SPELL_COSMETIC_EYE_BEAM_01_MALE)
1827 return;
1828
1829 Player* player = me->GetDemonCreatorPlayer();
1830
1833 _scheduler.Schedule(1s, [this](TaskContext const& /*task*/)
1834 {
1835 me->GetMotionMaster()->MovePoint(POINT_JAYCE_DARKWEAVER_PREPARE_JUMP, JaycePrepareJump);
1836 for (ObjectGuid const& guid : _cloneGuids)
1837 {
1838 Creature* clone = ObjectAccessor::GetCreature(*me, guid);
1839 if (!clone)
1840 continue;
1841
1843 }
1844 });
1845 }
1846
1847 void MovementInform(uint32 type, uint32 pointId) override
1848 {
1849 if (type != EFFECT_MOTION_TYPE && type != POINT_MOTION_TYPE)
1850 return;
1851
1853 me->GetMotionMaster()->MoveJump(POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE, JayceJumpPosition, 20.0f, 4.0f);
1854 else if (pointId == POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE)
1855 {
1856 me->GetMotionMaster()->MovePath(PATH_JAYCE_DARKWEAVER_RUN_INTO_CAVE, false);
1857 me->DespawnOrUnsummon(5s);
1858 }
1859 }
1860
1861 void UpdateAI(uint32 diff) override
1862 {
1863 _scheduler.Update(diff);
1864 }
1865
1866private:
1868 std::vector<ObjectGuid> _cloneGuids;
1869};
1870
1872{
1873 if (creature->IsPrivateObject())
1875 return new npc_jayce_darkweaver_cryptic_hollow(creature);
1876}
1877
1879{
1881
1883 {
1885 return pathDelay;
1886 return nullptr;
1887 }
1888
1889 void DoAction(int32 param) override
1890 {
1891 HiddenNoMorePathDelay const* pathDelay = GetPathDelay();
1892 if (!pathDelay)
1893 return;
1894
1895 switch (param)
1896 {
1898 {
1899 _scheduler.Schedule(pathDelay->MoveDelay, [this, pathDelay](TaskContext const& /*task*/)
1900 {
1901 me->GetMotionMaster()->MovePath(pathDelay->PathId, false);
1902 me->DespawnOrUnsummon(6s);
1903 });
1904 break;
1905 }
1906 default:
1907 break;
1908 }
1909 }
1910
1911 void UpdateAI(uint32 diff) override
1912 {
1913 _scheduler.Update(diff);
1914 }
1915
1916protected:
1918};
1919
1921{
1922 if (creature->IsPrivateObject())
1923 return new npc_basic_hidden_no_more_private(creature);
1924 return new NullCreatureAI(creature);
1925}
1926
1927// 101787 - Demon Hunter
1928// 101788 - Demon Hunter
1929// 101789 - Demon Hunter
1930// 101790 - Demon Hunter
1932{
1934
1935 void DoAction(int32 param) override
1936 {
1937 HiddenNoMorePathDelay const* pathDelay = GetPathDelay();
1938 if (!pathDelay)
1939 return;
1940
1941 switch (param)
1942 {
1944 {
1945 _scheduler.Schedule(pathDelay->ActionDelay, [this](TaskContext const& /*task*/)
1946 {
1947 me->CastSpell(me, (me->GetGender() == GENDER_FEMALE ? SPELL_COSMETIC_EYE_BEAM_01_FEMALE : SPELL_COSMETIC_EYE_BEAM_01_MALE), false);
1948 });
1949 break;
1950 }
1952 {
1954 _scheduler.Schedule(pathDelay->MoveDelay, [this, pathDelay](TaskContext const& /*task*/)
1955 {
1956 me->GetMotionMaster()->MovePath(pathDelay->PathId, false);
1957 me->DespawnOrUnsummon(6s);
1958 });
1959 break;
1960 }
1961 default:
1962 break;
1963 }
1964 }
1965};
1966
1968{
1969 if (creature->IsPrivateObject())
1970 return new npc_demon_hunter_hidden_no_more_private(creature);
1971 return new NullCreatureAI(creature);
1972}
1973
2004
2005// 96441 - Fel Lord Caza
2007{
2009
2017
2018 void Reset() override
2019 {
2020 _events.Reset();
2022 }
2023
2024 void JustDied(Unit* /*killer*/) override
2025 {
2028
2029 for (ObjectGuid tapperGUID : me->GetTapList())
2030 {
2031 if (Player* tapper = ObjectAccessor::GetPlayer(*me, tapperGUID))
2032 tapper->CastSpell(tapper, SPELL_FEL_LORD_CAZA_KILL_CREDIT, false);
2033 }
2034 }
2035
2036 void OnSpellCast(SpellInfo const* spell) override
2037 {
2040 }
2041
2042 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
2043 {
2044 if (spellInfo->Id == SPELL_AREATRIGGER_DUMMY_FEL_LORD_CAZA && target->GetTypeId() == TYPEID_PLAYER && !me->IsInCombat())
2045 me->AI()->AttackStart(target->ToUnit());
2046 }
2047
2048 void UpdateAI(uint32 diff) override
2049 {
2050 if (!UpdateVictim())
2051 return;
2052
2053 _events.Update(diff);
2054
2056 return;
2057
2058 while (uint32 eventId = _events.ExecuteEvent())
2059 {
2060 switch (eventId)
2061 {
2064 break;
2067 break;
2072 break;
2073 default:
2074 break;
2075 }
2076
2078 return;
2079 }
2080 }
2081
2082 void DoAction(int32 param) override
2083 {
2084 if (param != ACTION_CAZA_AXE_RETRIEVED)
2085 return;
2086
2090 }
2091
2092 void SetGUID(ObjectGuid const& guid, int32 id) override
2093 {
2094 if (id != DATA_CAZA_AXE_TARGET_GUID)
2095 return;
2096
2097 _axeTarget = guid;
2098 }
2099
2100 ObjectGuid GetGUID(int32 id) const override
2101 {
2102 if (id != DATA_CAZA_AXE_TARGET_GUID)
2103 return ObjectGuid::Empty;
2104
2105 return _axeTarget;
2106 }
2107
2108private:
2111};
2112
2113// ID - 169
2115{
2117
2118 void OnUnitEnter(Unit* unit) override
2119 {
2120 Player* player = unit->ToPlayer();
2121 if (!player || player->IsGameMaster())
2122 return;
2123
2124 Creature* caza = player->FindNearestCreature(NPC_FEL_LORD_CAZA, 100.0f);
2125 if (!caza || caza->isDead())
2126 return;
2127
2128 // This should have a cooldown of 2 minutes
2130 }
2131};
2132
2133// 197180 - Fel Infusion
2134// ID - 5315
2136{
2138
2139 void OnUnitEnter(Unit* unit) override
2140 {
2141 if (!unit->IsPlayer())
2142 return;
2143
2144 Unit* caster = at->GetCaster();
2145 if (!caster)
2146 return;
2147
2149 }
2150};
2151
2152// 196959 - Throw Axe
2153// ID - 5295
2155{
2157
2158 void OnInitialize() override
2159 {
2160 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE);
2161 if (!spellInfo)
2162 return;
2163
2164 Unit* caster = at->GetCaster();
2165 if (!caster)
2166 return;
2167
2169 if (!axeTarget)
2170 return;
2171
2172 Position destPos = at->GetFirstCollisionPosition(spellInfo->GetMaxRange(false, caster), at->GetRelativeAngle(axeTarget));
2173 PathGenerator path(at);
2174
2175 path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
2176
2177 at->InitSplines(path.GetPath());
2178 }
2179
2180 void OnUnitEnter(Unit* unit) override
2181 {
2182 if (Unit* caster = at->GetCaster())
2183 if (caster->IsValidAttackTarget(unit))
2185 }
2186};
2187
2188// 196889 - Throw Axe
2212
2213// 210103 - (Serverside/Non-DB2) Hidden No More: Fel Lord Caza Dies 02
2215{
2216 bool Validate(SpellInfo const* /*spellInfo*/) override
2217 {
2219 }
2220
2221 void HandleHitTarget(SpellEffIndex /*effIndex*/) const
2222 {
2223 Unit* target = GetHitUnit();
2226 .TriggeringSpell = GetSpell()
2227 });
2228 }
2229
2234};
2235
2236// 196892 - Disarmed
2249
2251{
2252 // Creature
2264
2265 // AISelector
2267 new FactoryCreatureScript<CreatureAI, &SevisBrightflameAshtongueGatewayAISelector>("npc_sevis_brightflame_ashtongue_gateway_private");
2268 new FactoryCreatureScript<CreatureAI, &SevisBrightflameCoilskarGatewayAISelector>("npc_sevis_brightflame_coilskar_gateway_private");
2269 new FactoryCreatureScript<CreatureAI, &CyanaNightglaiveFreedAISelector>("npc_cyana_nightglaive_freed_private");
2270 new FactoryCreatureScript<CreatureAI, &IzalWhitemoonFreedAISelector>("npc_izal_whitemoon_freed_private");
2271 new FactoryCreatureScript<CreatureAI, &BelathDawnbladeFreedAISelector>("npc_belath_dawnblade_freed_private");
2272 new FactoryCreatureScript<CreatureAI, &MannethrelDarkstarFreedAISelector>("npc_mannethrel_darkstar_freed_private");
2273 new FactoryCreatureScript<CreatureAI, &JayceDarkweaverCrypticHollowAISelector>("npc_jayce_darkweaver_cryptic_hollow");
2274 new FactoryCreatureScript<CreatureAI, &DemonHunterHiddenNoMoreAISelector>("npc_demon_hunter_hidden_no_more_private");
2275 new FactoryCreatureScript<CreatureAI, &BasicHiddenNoMoreAISelector>("npc_basic_hidden_no_more_private");
2276
2277 // AreaTrigger
2283
2284 // EventScript
2287
2288 // Conversation
2290
2291 // Scene
2295
2296 // Quests
2299
2300 // Spells
2310 RegisterSpellScriptWithArgs(spell_freed_killcredit_set_them_free<NPC_MANNETHREL_DARKSTAR_FREED>, "spell_mannethrel_darkstar_killcredit_set_them_free");
2314}
LocaleConstant
Definition Common.h:51
#define M_PI
Definition Common.h:118
First const & RAND(First const &first, Second const &second, Rest const &... rest)
@ DIFFICULTY_NONE
Definition DBCEnums.h:933
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ ROTATE_DIRECTION_RIGHT
@ ROTATE_DIRECTION_LEFT
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
@ TEMPSUMMON_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
QuestStatus
Definition QuestDef.h:146
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
@ QUEST_STATUS_NONE
Definition QuestDef.h:147
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1382
#define RegisterConversationAI(ai_name)
Definition ScriptMgr.h:1437
Creature * GetClosestCreatureWithOptions(WorldObject *source, float maxSearchRange, FindCreatureOptions const &options)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_3
@ EFFECT_1
@ EFFECT_0
@ TARGET_UNIT_SRC_AREA_ENTRY
@ EMOTE_STATE_READY1H
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_SCHOOL_IMMUNITY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_MOD_MELEE_HASTE_3
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
#define sSpellMgr
Definition SpellMgr.h:812
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
NPCFlags
Non Player Character flags.
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
DamageEffectType
@ SHEATH_STATE_MELEE
Definition UnitDefines.h:83
@ UNIT_STATE_CASTING
Definition Unit.h:276
AreaTrigger *const at
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
void InitSplines(std::vector< G3D::Vector3 > const &splinePoints, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
uint32 GetSpellId() const
Unit * GetCaster() const
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
Unit * GetTarget() const
BalefulColossSmashEvent(Creature *owner)
bool Execute(uint64, uint32) override
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
TypeID GetTypeId() const
Definition BaseEntity.h:166
Conversation *const conversation
void AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const &actorGuid)
LocaleConstant GetPrivateObjectOwnerLocale() const
static Conversation * CreateConversation(uint32 conversationEntry, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr, bool autoStart=true)
Milliseconds const * GetLineStartTime(LocaleConstant locale, int32 lineId) const
Unit * GetActorUnit(uint32 actorIdx) const
Creature * GetActorCreature(uint32 actorIdx) const
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Creature *const me
Definition CreatureAI.h:63
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:388
void SetReactState(ReactStates st)
Definition Creature.h:174
GuidUnorderedSet const & GetTapList() const
Definition Creature.h:304
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
std::string_view GetStringId(StringIdType type) const
Definition Creature.h:277
void SetDisplayId(uint32 displayId, bool setNative=false) override
CreatureAI * AI() const
Definition Creature.h:228
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
void MoveJump(uint32 id, Position const &pos, std::variant< std::monostate, float, Milliseconds > speedOrTime={}, Optional< float > minHeight={}, Optional< float > maxHeight={}, MovementFacingTarget const &facing={}, bool orientationFixed=false, bool unlimitedSpeed=false, Optional< float > speedMultiplier={}, JumpArrivalCastArgs const *arrivalCast=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MoveRotate(uint32 id, RotateDirection direction, Optional< Milliseconds > time={}, Optional< float > turnSpeed={}, Optional< float > totalTurnAngle={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
Makes the Unit turn in place.
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
Unit * ToUnit()
Definition Object.h:116
Movement::PointsArray const & GetPath() const
bool CalculatePath(float srcX, float srcY, float srcZ, float destX, float destY, float destZ, bool forceDest=false)
static bool OnConditionChange(WorldObject *object, bool updateVisibility=true)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition Player.cpp:16679
bool IsGameMaster() const
Definition Player.h:1309
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition Player.cpp:16005
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
void RemoveRewardedQuest(uint32 questId, bool update=true)
Definition Player.cpp:16038
uint32 GetQuestId() const
Definition QuestDef.h:637
float GetMaxRange(bool positive=false, WorldObject const *caster=nullptr, Spell *spell=nullptr) const
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Spell * GetSpell() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
TaskContext & Schedule(TaskScheduler::duration_t time, TaskScheduler::task_handler_t task)
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
WorldObject * GetSummoner() const
Unit * GetSummonerUnit() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void SetGUID(ObjectGuid const &guid, int32 id)
Definition UnitAI.h:76
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
virtual ObjectGuid GetGUID(int32 id) const
Definition UnitAI.h:77
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 DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
Player * GetDemonCreatorPlayer() const
Definition Unit.cpp:6197
void PlayOneShotAnimKitId(uint16 animKitId)
Definition Unit.cpp:11160
ObjectGuid GetOwnerGUID() const override
Definition Unit.h:1191
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3231
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
bool isAttackingPlayer() const
Definition Unit.cpp:6048
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
TempSummon * ToTempSummon()
Definition Unit.h:1828
UnitAI * GetAI() const
Definition Unit.h:668
void SetSheath(SheathState sheathed)
Definition Unit.cpp:5813
void SetEmoteState(Emote emote)
Definition Unit.h:865
bool IsAIEnabled() const
Definition Unit.h:666
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:793
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition Unit.cpp:12342
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.h:936
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void SetMountDisplayId(uint32 mountDisplayId)
Definition Unit.h:914
bool IsInCombat() const
Definition Unit.h:1058
void SetAIAnimKitId(uint16 animKitId)
Definition Unit.cpp:11174
bool isDead() const
Definition Unit.h:1187
TempSummon * SummonPersonalClone(Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, Player *privateObjectOwner=nullptr)
Definition Object.cpp:1421
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
Definition Object.cpp:1526
ObjectGuid GetPrivateObjectOwner() const
Definition Object.h:569
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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:1398
bool IsPrivateObject() const
Definition Object.h:568
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
void MovePositionToFirstCollision(Position &pos, float dist, float angle) const
Definition Object.cpp:2828
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:432
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2762
void PlayObjectSound(int32 soundKitId, ObjectGuid targetObject, Player const *target=nullptr, int32 broadcastTextId=0) const
Definition Object.cpp:2954
conversation_the_invasion_begins(Conversation *conversation)
void StartCloneMovement(ObjectGuid cloneGUID, uint32 pathId, uint32 animKit)
void OnCreate(Unit *creator) override
void OnUpdate(uint32 diff) override
void StartCloneChannel(ObjectGuid guid)
void OnTrigger(WorldObject *, WorldObject *invoker, uint32) override
void OnTrigger(WorldObject *, WorldObject *invoker, uint32) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnSceneComplete(Player *player, uint32, SceneTemplate const *) override
void OnSceneStart(Player *player, uint32, SceneTemplate const *) override
void OnSceneTriggerEvent(Player *player, uint32, SceneTemplate const *, std::string const &triggerName) override
void OnSceneStart(Player *player, uint32, SceneTemplate const *) override
void OnSceneStart(Player *player, uint32, SceneTemplate const *) override
void HandleHitTarget(SpellEffIndex)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleHitTarget(SpellEffIndex) const
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
void FilterTargets(std::list< WorldObject * > &targets)
void SummonBeamingEye(Unit *origin, float angle)
bool Validate(SpellInfo const *) override
void HandleRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Definition MapUtils.h:37
TriggerCastFlags TriggerFlags
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:203
constexpr float GetPositionX() const
Definition Position.h:87
float m_positionZ
Definition Position.h:66
constexpr float GetPositionY() const
Definition Position.h:88
float GetRelativeAngle(float x, float y) const
Definition Position.h:147
static float NormalizeOrientation(float o)
Definition Position.cpp:207
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:136
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
at_enter_the_illidari_ashtongue_allari_killcredit(AreaTrigger *areatrigger)
at_enter_the_illidari_shivarra_conversation(AreaTrigger *areatrigger)
void OnUnitEnter(Unit *unit) override
void OnUnitEnter(Unit *unit) override
void OnUnitEnter(Unit *unit) override
npc_allari_the_souleater_invasion_begins(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void WaypointPathEnded(uint32, uint32 pathId) override
npc_baleful_beaming_eye(Creature *creature)
void JustAppeared() override
HiddenNoMorePathDelay const * GetPathDelay()
void UpdateAI(uint32 diff) override
npc_basic_hidden_no_more_private(Creature *creature)
void DoAction(int32 param) override
void UpdateAI(uint32 diff) override
npc_belath_dawnblade_freed_private(Creature *creature)
npc_cyana_nightglaive_freed_private(Creature *creature)
void UpdateAI(uint32 diff) override
void WaypointPathEnded(uint32, uint32 pathId) override
void MovementInform(uint32 type, uint32 pointId) override
npc_cyana_nightglaive_invasion_begins(Creature *creature)
void DoAction(int32 param) override
npc_demon_hunter_hidden_no_more_private(Creature *creature)
void JustEngagedWith(Unit *) override
ObjectGuid GetGUID(int32 id) const override
npc_fel_lord_caza_cryptic_hollow(Creature *creature)
void DoAction(int32 param) override
void OnSpellCast(SpellInfo const *spell) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void SetGUID(ObjectGuid const &guid, int32 id) override
void EnterEvadeMode(EvadeReason why) override
npc_illidari_fighting_invasion_begins(Creature *creature)
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
void MovementInform(uint32 type, uint32 pointId) override
void DoAction(int32 action) override
npc_inquisitor_baleful_molten_shore(Creature *creature)
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
npc_izal_whitemoon_freed_private(Creature *creature)
void UpdateAI(uint32 diff) override
npc_jayce_darkweaver_cryptic_hollow_private(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void OnChannelFinished(SpellInfo const *spell) override
npc_jayce_darkweaver_cryptic_hollow(Creature *creature)
void OnQuestAccept(Player *player, Quest const *quest) override
bool OnGossipSelect(Player *player, uint32 menuId, uint32 gossipListId) override
void MovementInform(uint32 type, uint32 pointId) override
npc_jayce_darkweaver_invasion_begins(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void UpdateAI(uint32 diff) override
npc_kayn_sunfury_ashtongue_intro_private(Creature *creature)
void OnQuestAccept(Player *player, Quest const *quest) override
npc_kayn_sunfury_ashtongue_intro(Creature *creature)
void UpdateAI(uint32 diff) override
void OnQuestAccept(Player *player, Quest const *quest) override
void MovementInform(uint32 type, uint32 pointId) override
void WaypointPathEnded(uint32, uint32 pathId) override
npc_kayn_sunfury_invasion_begins(Creature *creature)
npc_korvas_bloodthorn_invasion_begins(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void WaypointPathEnded(uint32, uint32 pathId) override
void UpdateAI(uint32 diff) override
npc_mannethrel_darkstar_freed_private(Creature *creature)
npc_sevis_brightflame_ashtongue_gateway_private(Creature *creature)
npc_sevis_brightflame_coilskar_gateway_private(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void WaypointPathEnded(uint32, uint32 pathId) override
npc_sevis_brightflame_invasion_begins(Creature *creature)
bool OnGossipSelect(Player *player, uint32 menuId, uint32 gossipListId) override
void DoAction(int32 param) override
npc_sevis_brightflame_shivarra_gateway(Creature *creature)
void UpdateAI(uint32 diff) override
Position const RockslideCavePosition
MardumSpellData
@ SPELL_START_DEMON_HUNTER_PLAY_SCENE
CreatureAI * BasicHiddenNoMoreAISelector(Creature *creature)
HiddenNoMorePaths
@ PATH_CRYPTIC_HOLLOW_ASHTONGUE_01
@ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_04
@ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_02
@ PATH_CRYPTIC_HOLLOW_COILSKAR_03
@ PATH_CRYPTIC_HOLLOW_ASHTONGUE_02
@ PATH_CRYPTIC_HOLLOW_ASHTONGUE_03
@ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_03
@ POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE
@ POINT_JAYCE_DARKWEAVER_PREPARE_JUMP
@ PATH_JAYCE_DARKWEAVER_RUN_INTO_CAVE
@ PATH_CRYPTIC_HOLLOW_COILSKAR_01
@ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_05
@ PATH_CRYPTIC_HOLLOW_COILSKAR_02
@ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_01
HiddenNoMoreData
@ ACTION_HIDDEN_NO_MORE_EYEBEAM
@ ACTION_HIDDEN_NO_MORE_MOVE
@ SAY_JAYCE_ATTACK_ILLIDARI
@ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT2
@ SPELL_COSMETIC_EYE_BEAM_01_FEMALE
@ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT
@ NPC_ROCKSLIDE_KILLCREDIT
@ NPC_JAYCE_CRYPTIC_HOLLOW
@ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT3
@ QUEST_HIDDEN_NO_MORE
@ NPC_SHIVARRA_CRYPTIC_HOLLOW
@ SPELL_COSMETIC_EYE_BEAM_01_MALE
@ SPELL_ABANDON_HIDDEN_NO_MORE
Position const SevisBrightflameShivarraGatewayPosition
Position const WrathWarriorSpawnPosition
CreatureAI * DemonHunterHiddenNoMoreAISelector(Creature *creature)
Position const AllariJumpPos
Position const KaynJumpPos
ETIAshtongueIntroData
@ PATH_SEVIS_BRIGHTFLAME_GATEWAY
@ SAY_SEVIS_SAY_FIND_ALLARI
@ NPC_ALLARI_SOULEATER_ASHTONGUE
@ SAY_KAYN_ACTIVATE_GATEWAY
@ NPC_KAYN_SUNFURY_ASHTONGUE
@ SAY_KORVAS_SLAY_MORE_DEMONS
@ SPELL_VISUAL_KIT_SEVIS_MOUNT
@ SPELL_ASHTONGUE_FELLSABER_KILL_CREDIT
@ DISPLAY_ID_SEVIS_MOUNT
@ QUEST_ENTER_THE_ILLIDARI_ASHTONGUE
@ SPELL_CAST_MOUNT_DH_FELSABER
@ SAY_KAYN_CUT_A_HOLE
@ NPC_SEVIS_BRIGHTFLAME_ASHTONGUE
@ NPC_KORVAS_BLOODTHORN_ASHTONGUE
@ PATH_KAYN_SUNFURY_NEAR_TELEPORT
@ PATH_KORVAS_BLOODTHORN_NEAR_TELEPORT
ETICoilskarIntroData
@ PATH_SEVIS_BRIGHTFLAME_COILSKAR
@ SAY_SEVIS_SAY_MEET_AT_LAST_GATEWAY
@ NPC_SEVIS_BRIGHTFLAME_COILSKAR
std::unordered_map< std::string_view, HiddenNoMorePathDelay > HiddenNoMorePathMap
MardumQuestData
@ QUEST_DEMON_HUNTER_INTRO_TRACKER
Position const KaynDoubleJumpPosition
Position const JayceJumpPos
CreatureAI * BelathDawnbladeFreedAISelector(Creature *creature)
TheInvasionBeginsAnimKitsData
@ ANIM_DH_RUN
@ ANIM_DH_WINGS
@ ANIM_DH_RUN_ALLARI
CreatureAI * JayceDarkweaverCrypticHollowAISelector(Creature *creature)
CreatureAI * SevisBrightflameAshtongueGatewayAISelector(Creature *creature)
MardumSoundData
@ SOUND_SPELL_DOUBLE_JUMP
@ SOUND_METAL_WEAPON_UNSHEATH
TheInvasionBeginsVisualData
@ SPELL_VISUAL_KIT_WRATH_WARRIOR_DIE
@ SPELL_VISUAL_KIT_KAYN_WINGS
@ SPELL_VISUAL_KIT_KAYN_DOUBLE_JUMP
@ SPELL_VISUAL_KIT_KORVAS_JUMP
@ SPELL_VISUAL_KIT_KAYN_GLIDE
FelLordCazaData
@ SAY_FEL_LORD_CAZA_THROW_AXE
@ EVENT_CAZA_SWEEPING_SLASH
@ SPELL_FEL_LORD_CAZA_DIES
@ DATA_CAZA_AXE_TARGET_GUID
@ EVENT_CAZA_THROW_AXE_JUMP
@ SPELL_FEL_LORD_CAZA_FEL_INFUSION
@ SPELL_FEL_LORD_CAZA_VIOLENT_FEL_ENERGY
@ SPELL_FEL_LORD_CAZA_THROW_AXE_KNOCKBACK
@ SPELL_FEL_LORD_CAZA_TAKING_POWER
@ ACTION_CAZA_AXE_RETRIEVED
@ SAY_FEL_LORD_CAZA_AGGRO
@ SPELL_FEL_LORD_CAZA_KILL_CREDIT
@ SAY_FEL_LORD_CAZA_DEATH
@ SPELL_FEL_LORD_CAZA_SWEEPING_SLASH
@ NPC_FEL_LORD_CAZA
@ SPELL_AREATRIGGER_DUMMY_FEL_LORD_CAZA
@ SPELL_FEL_LORD_CAZA_THROW_AXE_MISSILE
@ EVENT_CAZA_FEL_INFUSION
@ SPELL_FEL_LORD_CAZA_THROW_AXE_JUMP
CreatureAI * SevisBrightflameCoilskarGatewayAISelector(Creature *creature)
GiveMeSightBeyondSightData
@ QUEST_GIVE_ME_SIGHT_BEYOND_SIGHT
@ GOSSIP_MENU_USE_SPECTRAL_SIGHT
@ KILLCREDIT_FACE_THE_CAVE
@ GOSSIP_OPTION_USE_SPECTRAL_SIGHT
@ SAY_JAYCE_USE_SPECTRAL_SIGHT
@ SPELL_GIVE_ME_SIGHT_PERIODIC_DUMMY
@ KILLCREDIT_SPEAK_WITH_JAYCE
@ SPELL_DH_SPECTRAL_SIGHT
@ SPELL_GIVE_ME_SIGHT_PERIODIC_AURA
TheInvasionBeginsQuestData
@ SPELL_DEMON_HUNTER_GLIDE_STATE
@ NPC_KAYN_SUNFURY_INVASION_BEGINS
@ NPC_JAYCE_DARKWEAVER_INVASION_BEGINS
@ NPC_SEVIS_BRIGHTFLAME_INVASION_BEGINS
@ NPC_ALLARI_THE_SOULEATER_INVASION_BEGINS
@ NPC_CYANA_NIGHTGLAIVE_INVASION_BEGINS
@ QUEST_THE_INVASION_BEGINS
@ CONVO_THE_INVASION_BEGINS
@ NPC_KORVAS_BLOODTHORN_INVASION_BEGINS
@ NPC_WRATH_WARRIOR_INVASION_BEGINS
@ SPELL_THE_INVASION_BEGINS
@ SPELL_TRACK_TARGET_IN_CHANNEL
void AddSC_zone_mardum()
EyeOnThePrizeData
@ SPELL_BALEFUL_COLOSS_INFERNAL_SMASH
@ SAY_BALEFUL_AGGRO
@ SPELL_BALEFUL_COLOSS_INFERNAL_SMASH_CAST
@ SAY_BALEFUL_AEGIS
@ SPELL_BALEFUL_BEAMING_GAZE
@ ACTION_BALEFUL_AEGIS_DOWN
@ DISPLAYID_BALEFUL_EYE
@ EVENT_BALEFUL_INCITE_MADNESS
@ QUEST_EYE_ON_THE_PRIZE
@ POINT_BALEFUL_AEGIS_UP
@ SPELL_BALEFUL_TAKING_POWER
@ SPELL_BALEFUL_BEAMING_EYE_CREATE_AT
@ NPC_COLOSSAL_INFERNAL_BALEFUL
@ SPELL_BALEFUL_MIND_SPIKE
@ SAY_BALEFUL_DEATH
@ SPELL_BALEFUL_INCITE_MADNESS
@ SPELL_BALEFUL_LEGION_AEGIS
@ SPELL_BALEFUL_BEAMING_EYE_SUMMON
@ EVENT_BALEFUL_MIND_SPIKE
@ EVENT_BALEFUL_COLOSS_INFERNAL_SMASH
@ SPELL_BALEFUL_KILL_CREDIT
@ POINT_BALEFUL_AEGIS_DOWN
@ EVENT_BALEFUL_BEAMING_GAZE
@ SPELL_BALEFUL_DIE_KNOCKBACK
Position const SevisJumpPos
TheInvasionsBeginsWaypointData
@ POINT_KAYN_TRIGGER_DOUBLE_JUMP
@ POINT_KAYN_MOVE_TO_DEMON
@ PATH_KORVAS_INVASION_BEGINS
@ PATH_KAYN_ATTACK_DEMON
@ PATH_JAYCE_INVASION_BEGINS
@ PATH_KAYN_AFTER_DEMON
@ PATH_CYANA_INVASION_BEGINS
@ POINT_ILLIDARI_LAND_POS
@ PATH_SEVIS_JUMP_INVASION_BEGINS
@ PATH_CYANA_JUMP_INVASION_BEGINS
@ PATH_JAYCE_JUMP_INVASION_BEGINS
@ PATH_ALLARI_JUMP_INVASION_BEGINS
@ PATH_ALLARI_INVASION_BEGINS
@ PATH_SEVIS_INVASION_BEGINS
@ PATH_KORVAS_JUMP_INVASION_BEGINS
CreatureAI * CyanaNightglaiveFreedAISelector(Creature *creature)
CreatureAI * KaynSunfuryNearLegionBannerAISelector(Creature *creature)
Position const KorvasJumpPos
CreatureAI * IzalWhitemoonFreedAISelector(Creature *creature)
MardumConversationData
@ CONVO_DEMONHUNTER_INTRO_START
constexpr Position JaycePrepareJump
Position const BalefulAegisPos
CreatureAI * MannethrelDarkstarFreedAISelector(Creature *creature)
Position const CyanaJumpPos
SetThemFreeData
@ PATH_BELATH_DAWNBLADE_FREED
@ NPC_BELATH_DAWNBLADE_FREED
@ SAY_BELATH_DAWNBLADE_FREED
@ ANIM_DH_WALK_DAZED
@ SAY_MANNETHRE_DARKSTAR_FREED
@ PATH_MANNETHREL_DARKSTAR_FREED
@ PATH_CYANA_NIGHTGLAIVE_FREED
@ SAY_IZAL_WHITEMOON_FREED
@ SAY_CYANA_NIGHTGLAIVE_FREED
@ PATH_IZAL_WHITEMOON_FREED
@ NPC_CYANA_NIGHTGLAIVE_FREED
@ NPC_MANNETHREL_DARKSTAR_FREED
@ NPC_IZAL_WHITEMOON_FREED
constexpr Position JayceJumpPosition
ETIShivarraData
@ SPELL_SEVIS_CHAOS_STRIKE
@ SPELL_TRIGGER_SHIVARRA_CONV_WHEN_DEAD
@ ANIM_KIT_SWING_WEAPON
@ GOSSIP_OPTION_SACRIFICE_SEVIS
@ NPC_SEVIS_BRIGHTFLAME_SHIVARRA
@ GOSSIP_OPTION_SACRIFICE_PLAYER
@ SPELL_SEVIS_SOUL_MISSILE_02
@ ACTION_SACRIFICE_SEVIS
@ SAY_SEVIS_GET_SACRIFICED
@ ANIM_KIT_ONESHOT_GET_HIT
@ PATH_SEVIS_GATEWAY_SHIVARRA
@ SPELL_VISUAL_SACRIFICE_PLAYER
@ ANIM_KIT_SALUTE
@ QUEST_SEVIS_SACRIFICE_TRACKER
@ SPELL_SEVIS_KILLED_ME_AURA
@ POINT_SEVIS_GATEWAY_SHIVARRA
@ ANIM_KIT_KNEEL
@ GOSSIP_MENU_SACRIFICE_PLAYER
@ GOSSIP_MENU_SACRIFICE_SEVIS
@ SPELL_SACRIFICE_SEVIS
@ ACTION_SACRIFICE_PLAYER
@ SPELL_SEVIS_SACRIFICE_ME
@ SAY_SEVIS_PLAYER_SACRIFICE