TrinityCore
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 "CreatureAIImpl.h"
24#include "EventProcessor.h"
25#include "GridNotifiersImpl.h"
26#include "MotionMaster.h"
27#include "ObjectAccessor.h"
28#include "PassiveAI.h"
29#include "PhasingHandler.h"
30#include "Player.h"
31#include "ScriptMgr.h"
32#include "ScriptedCreature.h"
33#include "ScriptedGossip.h"
34#include "SpellAuras.h"
35#include "SpellScript.h"
36#include "TemporarySummon.h"
37
39{
41};
42
44{
46};
47
49{
51};
52
54{
57};
58
60{
61public:
62 scene_demonhunter_intro() : SceneScript("scene_demonhunter_intro") { }
63
64 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
65 {
67 }
68
69 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
70 {
72 }
73};
74
75// 196030 - Start: Quest Invis
77{
78 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
79 {
81 }
82
83 void Register() override
84 {
86 }
87};
88
90{
92
94
102
107
109{
110 // Kayn
113
114 // Path before Jump
120
121 // Path after Jump
127
131};
132
134{
138};
139
141{
147};
148
149Position const WrathWarriorSpawnPosition = { 1081.9166f, 3183.8716f, 26.335993f };
150Position const KaynJumpPos = { 1172.17f, 3202.55f, 54.3479f };
151Position const KaynDoubleJumpPosition = { 1094.2384f, 3186.058f, 28.81562f };
152Position const JayceJumpPos = { 1119.24f, 3203.42f, 38.1061f };
153Position const AllariJumpPos = { 1120.08f, 3197.2f, 36.8502f };
154Position const KorvasJumpPos = { 1117.89f, 3196.24f, 36.2158f };
155Position const SevisJumpPos = { 1120.74f, 3199.47f, 37.5157f };
156Position const CyanaJumpPos = { 1120.34f, 3194.28f, 36.4321f };
157
158// 93011 - Kayn Sunfury
160{
162
163 void OnQuestAccept(Player* player, Quest const* quest) override
164 {
166 {
169 Conversation::CreateConversation(CONVO_THE_INVASION_BEGINS, player, *player, player->GetGUID(), nullptr, false);
170 }
171 }
172
173 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
174 {
175 if (pathId == PATH_KAYN_ATTACK_DEMON)
176 {
177 Creature* wrathWarrior = me->FindNearestCreatureWithOptions(100.0f, { .CreatureId = NPC_WRATH_WARRIOR_INVASION_BEGINS, .IgnorePhases = true, .OwnerGuid = me->GetOwnerGUID() });
178 if (!wrathWarrior)
179 return;
180
181 me->SetFacingToObject(wrathWarrior);
182
184 wrathWarrior->KillSelf();
185
186 _scheduler.Schedule(600ms, [this](TaskContext /*context*/)
187 {
188 me->GetMotionMaster()->MovePath(PATH_KAYN_AFTER_DEMON, false);
189 });
190 }
191 else if (pathId == PATH_KAYN_AFTER_DEMON)
193 }
194
195 void MovementInform(uint32 type, uint32 pointId) override
196 {
197 if (type != EFFECT_MOTION_TYPE)
198 return;
199
200 if (pointId == POINT_KAYN_TRIGGER_DOUBLE_JUMP)
201 {
202 TempSummon* summon = me->ToTempSummon();
203 if (!summon)
204 return;
205 WorldObject* summoner = summon->GetSummoner();
206 if (!summoner)
207 return;
208 Player* summonerPlayer = summoner->ToPlayer();
209 if (!summonerPlayer)
210 return;
211
216 }
217 else if (pointId == POINT_KAYN_MOVE_TO_DEMON)
218 {
221 }
222 }
223
224 void UpdateAI(uint32 diff) override
225 {
226 _scheduler.Update(diff);
227 }
228
229private:
231};
232
233// 98228 - Jayce Darkweaver
235{
237
238 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
239 {
240 if (pathId == PATH_JAYCE_INVASION_BEGINS)
241 {
244 }
245 else if (pathId == PATH_JAYCE_JUMP_INVASION_BEGINS)
247 }
248
249 void MovementInform(uint32 type, uint32 pointId) override
250 {
251 if (type != EFFECT_MOTION_TYPE)
252 return;
253
254 if (pointId == POINT_ILLIDARI_LAND_POS)
255 {
258 }
259 }
260};
261
262// 98227 - Allari the Souleater
264{
266
267 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
268 {
269 if (pathId == PATH_ALLARI_INVASION_BEGINS)
270 {
273 }
274 else if (pathId == PATH_ALLARI_JUMP_INVASION_BEGINS)
276 }
277
278 void MovementInform(uint32 type, uint32 pointId) override
279 {
280 if (type != EFFECT_MOTION_TYPE)
281 return;
282
283 if (pointId == POINT_ILLIDARI_LAND_POS)
284 {
287 }
288 }
289};
290
291// 98292 - Korvas Bloodthorn
293{
295
296 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
297 {
298 if (pathId == PATH_KORVAS_INVASION_BEGINS)
299 {
302 }
303 else if (pathId == PATH_KORVAS_JUMP_INVASION_BEGINS)
305 }
306
307 void MovementInform(uint32 type, uint32 pointId) override
308 {
309 if (type != EFFECT_MOTION_TYPE)
310 return;
311
312 if (pointId == POINT_ILLIDARI_LAND_POS)
313 {
316 }
317 }
318};
319
320// 99918 - Sevis Brightflame
322{
324
325 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
326 {
327 if (pathId == PATH_SEVIS_INVASION_BEGINS)
328 {
331 }
332 else if (pathId == PATH_SEVIS_JUMP_INVASION_BEGINS)
334 }
335
336 void MovementInform(uint32 type, uint32 pointId) override
337 {
338 if (type != EFFECT_MOTION_TYPE)
339 return;
340
341 if (pointId == POINT_ILLIDARI_LAND_POS)
342 {
345 }
346 }
347};
348
349// 98290 - Cyana Nightglaive
351{
353
354 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
355 {
356 if (pathId == PATH_CYANA_INVASION_BEGINS)
357 {
360 }
361 else if (pathId == PATH_CYANA_JUMP_INVASION_BEGINS)
363 }
364
365 void MovementInform(uint32 type, uint32 pointId) override
366 {
367 if (type != EFFECT_MOTION_TYPE)
368 return;
369
370 if (pointId == POINT_ILLIDARI_LAND_POS)
371 {
374 }
375 }
376};
377
378// 922 - The Invasion Begins
380{
381public:
382 conversation_the_invasion_begins() : ConversationScript("conversation_the_invasion_begins") { }
383
385 {
388
391 };
392
394 {
397 };
398
399 void OnConversationCreate(Conversation* conversation, Unit* creator) override
400 {
401 Creature* kaynObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_KAYN_SUNFURY_INVASION_BEGINS, .IgnorePhases = true });
402 Creature* jayceObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_JAYCE_DARKWEAVER_INVASION_BEGINS, .IgnorePhases = true });
403 Creature* allariaObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_ALLARI_THE_SOULEATER_INVASION_BEGINS, .IgnorePhases = true });
404 Creature* cyanaObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_CYANA_NIGHTGLAIVE_INVASION_BEGINS, .IgnorePhases = true });
405 Creature* korvasObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_INVASION_BEGINS, .IgnorePhases = true });
406 Creature* sevisObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_INVASION_BEGINS, .IgnorePhases = true });
407 if (!kaynObject || !jayceObject || !allariaObject || !cyanaObject || !korvasObject || !sevisObject)
408 return;
409
410 TempSummon* kaynClone = kaynObject->SummonPersonalClone(kaynObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
411 TempSummon* jayceClone = jayceObject->SummonPersonalClone(jayceObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
412 TempSummon* allariaClone = allariaObject->SummonPersonalClone(allariaObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
413 TempSummon* cyanaClone = cyanaObject->SummonPersonalClone(cyanaObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
414 TempSummon* korvasClone = korvasObject->SummonPersonalClone(korvasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
415 TempSummon* sevisClone = sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
416 if (!kaynClone || !jayceClone || !allariaClone || !cyanaClone || !korvasClone || !sevisClone)
417 return;
418
419 _jayceGUID = jayceClone->GetGUID();
420 _allariGUID = allariaClone->GetGUID();
421 _cyanaGUID = cyanaClone->GetGUID();
422 _sevisGUID = sevisClone->GetGUID();
423 allariaClone->SetAIAnimKitId(ANIM_DH_RUN_ALLARI);
425
428 conversation->Start();
429 }
430
431 void OnConversationStart(Conversation* conversation) override
432 {
433 LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale();
434
435 if (Milliseconds const* illidariFacingLineStarted = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_TRIGGER_FACING))
436 _events.ScheduleEvent(EVENT_ILLIDARI_FACE_PLAYERS, *illidariFacingLineStarted);
437
438 if (Milliseconds const* illidariStartPathLineStarted = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_START_PATH))
439 _events.ScheduleEvent(EVENT_ILLIDARI_START_PATH, *illidariStartPathLineStarted);
440 }
441
442 static void StartCloneChannel(ObjectGuid guid, Conversation* conversation)
443 {
444 Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner());
445 if (!privateObjectOwner)
446 return;
447
448 Creature* clone = ObjectAccessor::GetCreature(*conversation, guid);
449 if (!clone)
450 return;
451
452 clone->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
453 }
454
455 static void StartCloneMovement(ObjectGuid cloneGUID, uint32 pathId, uint32 animKit, Conversation* conversation)
456 {
457 Creature* clone = ObjectAccessor::GetCreature(*conversation, cloneGUID);
458 if (!clone)
459 return;
460
461 clone->InterruptNonMeleeSpells(true);
462 clone->GetMotionMaster()->MovePath(pathId, false);
463 if (animKit)
464 clone->SetAIAnimKitId(animKit);
465 }
466
467 void OnConversationUpdate(Conversation* conversation, uint32 diff) override
468 {
469 _events.Update(diff);
470
471 switch (_events.ExecuteEvent())
472 {
474 {
475 StartCloneChannel(conversation->GetActorUnit(CONVO_ACTOR_IDX_KAYN)->GetGUID(), conversation);
476 StartCloneChannel(conversation->GetActorUnit(CONVO_ACTOR_IDX_KORVAS)->GetGUID(), conversation);
477 StartCloneChannel(_jayceGUID, conversation);
478 StartCloneChannel(_allariGUID, conversation);
479 StartCloneChannel(_cyanaGUID, conversation);
480 StartCloneChannel(_sevisGUID, conversation);
481 break;
482 }
484 {
485 Creature* kaynClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_KAYN);
486 if (!kaynClone)
487 break;
488
489 Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner());
490 if (!privateObjectOwner)
491 return;
492
493 Player* player = privateObjectOwner->ToPlayer();
494 if (!player)
495 return;
496
497 kaynClone->PlayObjectSound(SOUND_METAL_WEAPON_UNSHEATH, kaynClone->GetGUID(), player);
501 kaynClone->SetSheath(SHEATH_STATE_MELEE);
503
509 break;
510 }
511 default:
512 break;
513 }
514 }
515
516private:
522};
523
524// 98459 - Kayn Sunfury
525// 98458 - Jayce Darkweaver
526// 98456 - Allari the Souleater
527// 98460 - Korvas Bloodthorn
528// 99919 - Sevis Brightflame
529// 98457 - Cyana Nightglaive
531{
533
535 {
538 };
539
541 {
544 };
545
547 {
548 std::list<Unit*> targetList;
551 Cell::VisitAllObjects(me, searcher, 100.0f);
552 targetList.remove_if([](Unit* possibleTarget)
553 {
554 return possibleTarget->isAttackingPlayer();
555 });
557 }
558
560 {
561 _oocScheduler.Schedule(200ms, [this](TaskContext context)
562 {
563 Unit* target = GetNextTarget();
564 if (!target)
565 {
566 context.Repeat(500ms);
567 return;
568 }
569 AttackStart(target);
570 });
571 }
572
573 void JustAppeared() override
574 {
576 }
577
578 void Reset() override
579 {
580 _events.Reset();
581 }
582
583 void JustEngagedWith(Unit* /*who*/) override
584 {
587 }
588
589 void EnterEvadeMode(EvadeReason why) override
590 {
591 // manualling calling it to not move to home position but move to next target instead
592 _EnterEvadeMode(why);
593 Reset();
595 }
596
597 void UpdateAI(uint32 diff) override
598 {
599 if (!UpdateVictim())
600 {
601 _oocScheduler.Update(diff);
602 return;
603 }
604
605 _events.Update(diff);
606
608 return;
609
610 switch (_events.ExecuteEvent())
611 {
615 break;
616 case EVENT_FEL_RUSH:
619 break;
620 default:
621 break;
622 }
623 }
624
625private:
628};
629
631{
633
638
640
645
647
650
654};
655
656// 98229 - Kayn Sunfury
658{
660
661 void OnQuestAccept(Player* player, Quest const* quest) override
662 {
664 {
666 Creature* kaynObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = NPC_KAYN_SUNFURY_ASHTONGUE, .IgnorePhases = true });
667 Creature* korvasObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_ASHTONGUE, .IgnorePhases = true });
668 if (!kaynObject || !korvasObject)
669 return;
670
671 TempSummon* kaynClone = kaynObject->SummonPersonalClone(kaynObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
672 TempSummon* korvasClone = korvasObject->SummonPersonalClone(korvasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
673 if (!kaynClone || !korvasClone)
674 return;
675
678 }
679 }
680};
681
682// 98229 - Kayn Sunfury
684{
686
687 void JustAppeared() override
688 {
689 Creature* korvasObject = GetClosestCreatureWithOptions(me, 10.0f, { .CreatureId = NPC_KORVAS_BLOODTHORN_ASHTONGUE, .IgnorePhases = true, .PrivateObjectOwnerGuid = me->GetPrivateObjectOwner()});
690 if (!korvasObject)
691 return;
692
693 ObjectGuid korvasGuid = korvasObject->GetGUID();
694
695 _scheduler.Schedule(1s, [this, korvasGuid](TaskContext task)
696 {
697 Unit* privateObjectOwner = ObjectAccessor::GetUnit(*me, me->GetPrivateObjectOwner());
698 if (!privateObjectOwner)
699 return;
700
701 Unit* korvas = ObjectAccessor::GetUnit(*me, korvasGuid);
702 if (!korvas)
703 return;
704
706 me->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
707 korvas->CastSpell(privateObjectOwner, SPELL_TRACK_TARGET_IN_CHANNEL, false);
708
709 task.Schedule(6s, [this, korvasGuid](TaskContext task)
710 {
712
713 task.Schedule(6s, [this, korvasGuid](TaskContext task)
714 {
715 Creature* korvas = ObjectAccessor::GetCreature(*me, korvasGuid);
716 if (!korvas)
717 return;
718
719 if (!korvas->IsAIEnabled())
720 return;
721
726 me->DespawnOrUnsummon(10s);
727
728 task.Schedule(2s, [this, korvasGuid](TaskContext /*task*/)
729 {
730 Creature* korvas = ObjectAccessor::GetCreature(*me, korvasGuid);
731 if (!korvas)
732 return;
733
734 korvas->InterruptNonMeleeSpells(true);
737 korvas->DespawnOrUnsummon(12s);
738 });
739 });
740 });
741 });
742 }
743
744 void UpdateAI(uint32 diff) override
745 {
746 _scheduler.Update(diff);
747 }
748
749private:
751};
752
754{
755 if (creature->IsPrivateObject())
756 return new npc_kayn_sunfury_ashtongue_intro_private(creature);
757 return new npc_kayn_sunfury_ashtongue_intro(creature);
758};
759
760// 1053 - Enter the Illidari: Ashtongue
762{
763public:
764 scene_enter_the_illidari_ashtongue() : SceneScript("scene_enter_the_illidari_ashtongue") { }
765
766 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
767 {
768 Creature* sevisObject = GetClosestCreatureWithOptions(player, 30.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_ASHTONGUE, .IgnorePhases = true });
769 if (!sevisObject)
770 return;
771
772 TempSummon* sevisClone = sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
773 if (!sevisClone)
774 return;
775
776 sevisClone->CastSpell(player, SPELL_TRACK_TARGET_IN_CHANNEL, false);
777 sevisClone->DespawnOrUnsummon(15s);
778 }
779
780 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
781 {
782 if (triggerName == "SEEFELSABERCREDIT")
784 else if (triggerName == "UPDATEPHASE")
786 }
787};
788
789// 99916 - Sevis Brightflame (Ashtongue Gateway)
791{
793
794 void JustAppeared() override
795 {
796 _scheduler.Schedule(1s, [this](TaskContext task)
797 {
799
800 task.Schedule(2s, [this](TaskContext task)
801 {
804
805 task.Schedule(3s, [this](TaskContext /*task*/)
806 {
809 });
810 });
811 });
812 }
813
814 void UpdateAI(uint32 diff) override
815 {
816 _scheduler.Update(diff);
817 }
818
819private:
821};
822
824{
825 if (creature->IsPrivateObject())
827 return new NullCreatureAI(creature);
828};
829
830// 200255 - Accepting Felsaber Gift
832{
834 {
836 }
837
838 void Register() override
839 {
841 }
842};
843
844// 32 - Mardum - Trigger KillCredit for Quest "Enter the Illidari: Ashtongue"
846{
848
849 void OnUnitEnter(Unit* unit) override
850 {
851 Player* player = unit->ToPlayer();
853 return;
854
856 }
857};
858
860{
863
866
867// 1077 - Enter the Illidari: Coilskar
869{
870public:
871 scene_enter_the_illidari_coilskar() : SceneScript("scene_enter_the_illidari_coilskar") { }
872
873 void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
874 {
876 Creature* sevisObject = GetClosestCreatureWithOptions(player, 30.0f, { .CreatureId = NPC_SEVIS_BRIGHTFLAME_COILSKAR, .IgnorePhases = true });
877 if (!sevisObject)
878 return;
879
880 sevisObject->SummonPersonalClone(sevisObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
881 }
882};
883
884// 99917 - Sevis Brightflame (Coilskar Gateway)
886{
888
889 void JustAppeared() override
890 {
891 TempSummon* summon = me->ToTempSummon();
892 if (!summon)
893 return;
894
895 Unit* summoner = summon->GetSummonerUnit();
896 if (!summoner)
897 return;
898
899 me->SetFacingToObject(summoner);
900 me->DespawnOrUnsummon(14s);
901
902 _scheduler.Schedule(1s, [this](TaskContext task)
903 {
905
906 task.Schedule(2s, [this](TaskContext task)
907 {
910
911 task.Schedule(3s, [this](TaskContext /*task*/)
912 {
914 });
915 });
916 });
917 }
918
919 void UpdateAI(uint32 diff) override
920 {
921 _scheduler.Update(diff);
922 }
923
924private:
926};
927
929{
930 if (creature->IsPrivateObject())
932 return new NullCreatureAI(creature);
933};
934
936{
938
940
942
943 // Inquisitor Baleful text
947
948 // Inquisitor Baleful events
953
954 // Inquisitor Baleful points
957
958 // Inquisitor Baleful actions
960
961 // Inquisitor Baleful spells
969
970 // Baleful Infernal Coloss
973
974 // Baleful Beaming Eye
978
980{
981public:
983
984 bool Execute(uint64, uint32) override
985 {
986 Unit* target = _owner->AI()->SelectTarget(SelectTargetMethod::Random, 0, 150.0f, true);
988 return true;
989 }
990
991private:
993};
994
995Position const BalefulAegisPos = { 592.4335f, 2433.1067f, -62.91178f };
996
997// 93105 - Inquisitor Baleful
999{
1001
1002 void JustAppeared() override
1003 {
1004 // Blizz use a personal spawn for every DH on Quest: 39049 which leads to issues
1005 TempSummon* balefulColoss = me->SummonCreature(NPC_COLOSSAL_INFERNAL_BALEFUL, 523.4045f, 2428.4113f, -117.0033f, 0.10887321f, TEMPSUMMON_MANUAL_DESPAWN, 0s);
1006 if (!balefulColoss)
1007 return;
1008
1009 _balefulColossGUID = balefulColoss->GetGUID();
1010 }
1011
1012 void JustEngagedWith(Unit* /*who*/) override
1013 {
1018 }
1019
1020 void DoAction(int32 action) override
1021 {
1022 if (action == ACTION_BALEFUL_AEGIS_DOWN)
1024 }
1025
1026 void MovementInform(uint32 type, uint32 pointId) override
1027 {
1028 if (type != POINT_MOTION_TYPE)
1029 return;
1030
1031 if (pointId == POINT_BALEFUL_AEGIS_UP)
1032 me->SetFacingTo(0.19842f);
1033 else if (pointId == POINT_BALEFUL_AEGIS_DOWN)
1035 }
1036
1037 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
1038 {
1039 if (!_castedLegionAegis && me->HealthBelowPctDamaged(60, damage))
1040 {
1042 {
1043 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 1s);
1044 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 4s);
1045 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 8s);
1046 balefulColoss->m_Events.AddEventAtOffset(new BalefulColossSmashEvent(balefulColoss), 13s);
1047 }
1048
1053 _castedLegionAegis = true;
1054 }
1055 }
1056
1057 void Reset() override
1058 {
1059 _castedLegionAegis = false;
1060 _events.Reset();
1061 }
1062
1063 void JustDied(Unit* /*killer*/) override
1064 {
1067
1069 balefulColoss->KillSelf();
1070
1071 for (ObjectGuid tapperGUID : me->GetTapList())
1072 {
1073 if (Player* tapper = ObjectAccessor::GetPlayer(*me, tapperGUID))
1074 {
1075 tapper->CastSpell(tapper, SPELL_BALEFUL_KILL_CREDIT, false);
1076 tapper->CastSpell(tapper, SPELL_BALEFUL_TAKING_POWER, false);
1077 }
1078 }
1079 }
1080
1081 void UpdateAI(uint32 diff) override
1082 {
1083 if (!UpdateVictim())
1084 return;
1085
1086 _events.Update(diff);
1087
1089 return;
1090
1091 while (uint32 eventId = _events.ExecuteEvent())
1092 {
1093 switch (eventId)
1094 {
1098 break;
1102 break;
1106 break;
1107 default:
1108 break;
1109 }
1110 }
1111 }
1112
1113private:
1117};
1118
1119// 99160 - Beaming Eye
1121{
1123
1124 void JustAppeared() override
1125 {
1128 // ToDo: rotation isn't changing orientation, turnspeed should be random
1130 }
1131};
1132
1133// 192665 - Legion Aegis
1135{
1136 void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1137 {
1138 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
1139 {
1140 if (UnitAI* ai = GetTarget()->GetAI())
1141 ai->DoAction(ACTION_BALEFUL_AEGIS_DOWN);
1142 }
1143 }
1144
1145 void Register() override
1146 {
1148 }
1149};
1150
1151// 192709 - Infernal Smash
1153{
1154 bool Validate(SpellInfo const* /*spellInfo*/) override
1155 {
1157 }
1158
1160 {
1162 }
1163
1164 void Register() override
1165 {
1167 }
1168};
1169
1170// 195058 - Beaming Gaze (selector)
1172{
1173 bool Validate(SpellInfo const* /*spellInfo*/) override
1174 {
1176 }
1177
1178 void SummonBeamingEye(Unit* origin, float angle)
1179 {
1180 Position dest = origin->GetPosition();
1181 origin->MovePositionToFirstCollision(dest, 6.5f, angle);
1182 dest.m_positionZ += 0.35f;
1183 origin->CastSpell(dest, SPELL_BALEFUL_BEAMING_EYE_SUMMON, true);
1184 }
1185
1187 {
1188 Unit* hitUnit = GetHitUnit();
1189 SummonBeamingEye(hitUnit, float(M_PI));
1190 SummonBeamingEye(hitUnit, float(-M_PI) / 4.0f);
1191 SummonBeamingEye(hitUnit, float(M_PI) / 4.0f);
1192 }
1193
1194 void Register() override
1195 {
1197 }
1198};
1199
1201{
1206
1211
1216
1217 ANIM_DH_WALK_DAZED = 1078
1219
1220// 94377 - Cyana Nightglaive
1222{
1224
1225 void JustAppeared() override
1226 {
1227 me->DespawnOrUnsummon(19s);
1228
1229 _scheduler.Schedule(2s + 500ms, [this](TaskContext task)
1230 {
1232
1233 task.Schedule(3s, [this](TaskContext /*task*/)
1234 {
1235 me->GetMotionMaster()->MovePath(PATH_CYANA_NIGHTGLAIVE_FREED, false);
1236 });
1237 });
1238 }
1239
1240 void UpdateAI(uint32 diff) override
1241 {
1242 _scheduler.Update(diff);
1243 }
1244
1245private:
1247};
1248
1250{
1251 if (creature->IsPrivateObject())
1252 return new npc_cyana_nightglaive_freed_private(creature);
1253 return new NullCreatureAI(creature);
1254};
1255
1256// 93117 - Izal Whitemoon
1258{
1260
1261 void JustAppeared() override
1262 {
1263 me->DespawnOrUnsummon(18s);
1264
1265 _scheduler.Schedule(2s, [this](TaskContext task)
1266 {
1268
1269 task.Schedule(3s, [this](TaskContext /*task*/)
1270 {
1271 me->GetMotionMaster()->MovePath(PATH_CYANA_NIGHTGLAIVE_FREED, false);
1272 });
1273 });
1274 }
1275
1276 void UpdateAI(uint32 diff) override
1277 {
1278 _scheduler.Update(diff);
1279 }
1280
1281private:
1283};
1284
1286{
1287 if (creature->IsPrivateObject())
1288 return new npc_izal_whitemoon_freed_private(creature);
1289 return new NullCreatureAI(creature);
1290};
1291
1292// 94400 - Belath Dawnblade
1294{
1296
1297 void JustAppeared() override
1298 {
1299 me->DespawnOrUnsummon(5min); // wtf blizz
1300
1301 _scheduler.Schedule(3s, [this](TaskContext task)
1302 {
1304
1305 task.Schedule(6s, [this](TaskContext /*task*/)
1306 {
1307 me->GetMotionMaster()->MovePath(PATH_BELATH_DAWNBLADE_FREED, false);
1308 });
1309 });
1310 }
1311
1312 void UpdateAI(uint32 diff) override
1313 {
1314 _scheduler.Update(diff);
1315 }
1316
1317private:
1319};
1320
1322{
1323 if (creature->IsPrivateObject())
1324 return new npc_belath_dawnblade_freed_private(creature);
1325 return new NullCreatureAI(creature);
1326};
1327
1328// 93230 - Mannethrel Darkstar
1330{
1332
1333 void JustAppeared() override
1334 {
1335 me->DespawnOrUnsummon(28s);
1336
1337 _scheduler.Schedule(2s, [this](TaskContext task)
1338 {
1340
1341 task.Schedule(6s, [this](TaskContext /*task*/)
1342 {
1345 });
1346 });
1347 }
1348
1349 void UpdateAI(uint32 diff) override
1350 {
1351 _scheduler.Update(diff);
1352 }
1353
1354private:
1356};
1357
1359{
1360 if (creature->IsPrivateObject())
1361 return new npc_mannethrel_darkstar_freed_private(creature);
1362 return new NullCreatureAI(creature);
1363};
1364
1365// 204711 - Set Them Free: Cyana Nightglaive Freed Kill Credit
1366// 204714 - Set Them Free: Izal Whitemoon Freed Kill Credit
1367// 204712 - Set Them Free: Belath Dawnblade Freed Kill Credit
1368// 204715 - Set Them Free: Mannethrel Darkstar Freed Kill Credit
1369template<uint32 CreatureId>
1371{
1373 {
1374 if (Player* player = GetCaster()->ToPlayer())
1375 {
1376 Creature* staticObject = GetClosestCreatureWithOptions(player, 10.0f, { .CreatureId = CreatureId, .IgnorePhases = true });
1377 if (!staticObject)
1378 return;
1379
1380 staticObject->SummonPersonalClone(staticObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1381 }
1382 }
1383
1384 void Register() override
1385 {
1387 }
1388};
1389
1391{
1393
1396
1399
1402
1407
1409
1411
1413
1420
1423
1425};
1426
1427Position const SevisBrightflameShivarraGatewayPosition = { 1587.9618f, 2543.091f, 62.18399f, 3.49967908f };
1428
1429// 99915 - Sevis Brightflame (Shivarra Gateway)
1431{
1433
1434 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
1435 {
1436 if (menuId == GOSSIP_MENU_SACRIFICE_PLAYER && gossipListId == GOSSIP_OPTION_SACRIFICE_PLAYER)
1437 {
1438 CloseGossipMenuFor(player);
1439 player->CastSpell(nullptr, SPELL_SEVIS_SACRIFICE_ME, false);
1440 return true;
1441 }
1442 else if (menuId == GOSSIP_MENU_SACRIFICE_SEVIS && gossipListId == GOSSIP_OPTION_SACRIFICE_SEVIS)
1443 {
1444 CloseGossipMenuFor(player);
1445 player->CastSpell(me, SPELL_SACRIFICE_SEVIS, false);
1446 return true;
1447 }
1448 return false;
1449 }
1450
1451 void DoAction(int32 param) override
1452 {
1453 switch (param)
1454 {
1457 break;
1459 SacrificeSelf();
1460 break;
1461 default:
1462 break;
1463 }
1464 }
1465
1467 {
1470
1471 _scheduler.Schedule(1s, [this](TaskContext task)
1472 {
1473 me->KillSelf();
1474
1476 task.Schedule(2s, [this](TaskContext task)
1477 {
1480
1481 if (_soulMissileCounter < 3)
1482 task.Repeat(2s);
1483 });
1484 });
1485 }
1486
1488 {
1489 me->DespawnOrUnsummon(22s);
1491
1492 _scheduler.Schedule(1s, [this](TaskContext task)
1493 {
1494 TempSummon* summon = me->ToTempSummon();
1495 if (!summon)
1496 return;
1497
1498 Unit* summoner = summon->GetSummonerUnit();
1499 if (!summoner)
1500 return;
1501
1502 me->GetMotionMaster()->MoveCloserAndStop(POINT_SEVIS_GATEWAY_SHIVARRA, summoner, 2.0f);
1503
1504 task.Schedule(2s, [this](TaskContext task)
1505 {
1509
1510 task.Schedule(2s, [this](TaskContext task)
1511 {
1513
1514 task.Schedule(5s, [this](TaskContext task)
1515 {
1517
1518 task.Schedule(3s, [this](TaskContext task)
1519 {
1522
1523 task.Schedule(2s, [this](TaskContext /*task*/)
1524 {
1525 me->GetMotionMaster()->MovePath(PATH_SEVIS_GATEWAY_SHIVARRA, false);
1526 });
1527 });
1528 });
1529 });
1530 });
1531 });
1532 }
1533
1534 void UpdateAI(uint32 diff) override
1535 {
1536 _scheduler.Update(diff);
1537 }
1538
1539private:
1542};
1543
1544// EventID 47550
1546{
1547public:
1548 event_sevis_sacrifice_player() : EventScript("event_sevis_sacrifice_player") { }
1549
1550 void OnTrigger(WorldObject* /*object*/, WorldObject* invoker, uint32 /*eventId*/) override
1551 {
1553 {
1554 if (Player* player = invoker->ToPlayer())
1555 {
1556 player->KilledMonsterCredit(NPC_SEVIS_BRIGHTFLAME_SHIVARRA);
1557 player->CastSpell(nullptr, SPELL_SEVIS_KILLED_ME_AURA, false);
1558 }
1559 creature->AI()->DoAction(ACTION_SACRIFICE_PLAYER);
1560 }
1561 }
1562};
1563
1564// EventID 47549
1566{
1567public:
1568 event_sevis_sacrifice_self() : EventScript("event_sevis_sacrifice_self") { }
1569
1570 void OnTrigger(WorldObject* /*object*/, WorldObject* invoker, uint32 /*eventId*/) override
1571 {
1573 {
1574 if (Player* player = invoker->ToPlayer())
1575 player->KilledMonsterCredit(NPC_SEVIS_BRIGHTFLAME_SHIVARRA);
1576 creature->AI()->DoAction(ACTION_SACRIFICE_SEVIS);
1577 }
1578 }
1579};
1580
1581// XX - Mardum - Trigger Conversation for Quest "Enter the Illidari: Shivarra"
1583{
1585
1586 void OnUnitEnter(Unit* unit) override
1587 {
1588 Player* player = unit->ToPlayer();
1589 if (!player || !player->HasAura(SPELL_SEVIS_KILLED_ME_AURA))
1590 return;
1591
1592 player->CastSpell(nullptr, SPELL_TRIGGER_SHIVARRA_CONV_WHEN_DEAD, true);
1593 }
1594};
1595
1596// 38765 - Enter the Illidari: Shivarra
1598{
1599public:
1600 quest_enter_the_illidari_shivarra() : QuestScript("quest_enter_the_illidari_shivarra") { }
1601
1602 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1603 {
1604 if (newStatus == QUEST_STATUS_NONE)
1605 {
1608 }
1609 }
1610};
1611
1613{
1614 // Creature
1625
1626 // AISelector
1628 new FactoryCreatureScript<CreatureAI, &SevisBrightflameAshtongueGatewayAISelector>("npc_sevis_brightflame_ashtongue_gateway_private");
1629 new FactoryCreatureScript<CreatureAI, &SevisBrightflameCoilskarGatewayAISelector>("npc_sevis_brightflame_coilskar_gateway_private");
1630 new FactoryCreatureScript<CreatureAI, &CyanaNightglaiveFreedAISelector>("npc_cyana_nightglaive_freed_private");
1631 new FactoryCreatureScript<CreatureAI, &IzalWhitemoonFreedAISelector>("npc_izal_whitemoon_freed_private");
1632 new FactoryCreatureScript<CreatureAI, &BelathDawnbladeFreedAISelector>("npc_belath_dawnblade_freed_private");
1633 new FactoryCreatureScript<CreatureAI, &MannethrelDarkstarFreedAISelector>("npc_mannethrel_darkstar_freed_private");
1634
1635 // AreaTrigger
1638
1639 // EventScript
1642
1643 // Conversation
1645
1646 // Scene
1650
1651 // Spells
1660 RegisterSpellScriptWithArgs(spell_freed_killcredit_set_them_free<NPC_MANNETHREL_DARKSTAR_FREED>, "spell_mannethrel_darkstar_killcredit_set_them_free");
1661
1662 // Quests
1664};
LocaleConstant
Definition: Common.h:48
#define M_PI
Definition: Common.h:115
First const & RAND(First const &first, Second const &second, Rest const &... rest)
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::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ ROTATE_DIRECTION_RIGHT
@ ROTATE_DIRECTION_LEFT
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
QuestStatus
Definition: QuestDef.h:141
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
@ QUEST_STATUS_NONE
Definition: QuestDef.h:142
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
#define RegisterAreaTriggerAI(ai_name)
Definition: ScriptMgr.h:1416
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition: ScriptMgr.h:1368
Creature * GetClosestCreatureWithOptions(WorldObject *source, float maxSearchRange, FindCreatureOptions const &options)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_3
Definition: SharedDefines.h:33
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ 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
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#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
NPCFlags
Non Player Character flags.
Definition: UnitDefines.h:295
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
DamageEffectType
Definition: UnitDefines.h:131
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:83
@ UNIT_STATE_CASTING
Definition: Unit.h:270
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
Unit * GetTarget() const
BalefulColossSmashEvent(Creature *owner)
bool Execute(uint64, uint32) override
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)
Definition: CreatureAI.cpp:56
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:299
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:373
void SetReactState(ReactStates st)
Definition: Creature.h:160
GuidUnorderedSet const & GetTapList() const
Definition: Creature.h:282
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetDisplayId(uint32 displayId, bool setNative=false) override
Definition: Creature.cpp:3402
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void Reset()
Definition: EventMap.cpp:21
void MoveJumpWithGravity(Position const &pos, float speedXY, float gravity, uint32 id=EVENT_JUMP, bool hasOrientation=false, JumpArrivalCastArgs const *arrivalCast=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr)
void MoveRotate(uint32 id, RotateDirection direction, Optional< Milliseconds > time={}, Optional< float > turnSpeed={}, Optional< float > totalTurnAngle={})
Makes the Unit turn in place.
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={}, bool generatePath=true)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
static bool OnConditionChange(WorldObject *object, bool updateVisibility=true)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: Player.cpp:16680
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition: Player.cpp:16093
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
void RemoveRewardedQuest(uint32 questId, bool update=true)
Definition: Player.cpp:16113
uint32 GetQuestId() const
Definition: QuestDef.h:587
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
TaskContext & Schedule(std::chrono::duration< Rep, Period > time, TaskScheduler::task_handler_t task)
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)
WorldObject * GetSummoner() const
Unit * GetSummonerUnit() const
Definition: UnitAI.h:50
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void PlayOneShotAnimKitId(uint16 animKitId)
Definition: Unit.cpp:10529
ObjectGuid GetOwnerGUID() const override
Definition: Unit.h:1170
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
bool isAttackingPlayer() const
Definition: Unit.cpp:5863
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
TempSummon * ToTempSummon()
Definition: Unit.h:1756
void SetSheath(SheathState sheathed)
Definition: Unit.cpp:5630
void SetEmoteState(Emote emote)
Definition: Unit.h:852
bool IsAIEnabled() const
Definition: Unit.h:658
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
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
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition: Unit.h:921
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
void SetMountDisplayId(uint32 mountDisplayId)
Definition: Unit.h:900
void SetAIAnimKitId(uint16 animKitId)
Definition: Unit.cpp:10543
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:2048
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
Definition: Object.cpp:2157
ObjectGuid GetPrivateObjectOwner() const
Definition: Object.h:785
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition: Object.cpp:3482
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
bool IsPrivateObject() const
Definition: Object.h:784
void PlayObjectSound(int32 soundKitId, ObjectGuid targetObject, Player const *target=nullptr, int32 broadcastTextId=0) const
Definition: Object.cpp:3608
static void StartCloneMovement(ObjectGuid cloneGUID, uint32 pathId, uint32 animKit, Conversation *conversation)
void OnConversationCreate(Conversation *conversation, Unit *creator) override
void OnConversationUpdate(Conversation *conversation, uint32 diff) override
void OnConversationStart(Conversation *conversation) override
static void StartCloneChannel(ObjectGuid guid, Conversation *conversation)
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 OnSceneComplete(Player *player, uint32, SceneTemplate const *) override
Definition: zone_mardum.cpp:69
void OnSceneStart(Player *player, uint32, SceneTemplate const *) override
Definition: zone_mardum.cpp:64
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)
Definition: zone_mardum.cpp:78
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) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:203
float m_positionZ
Definition: Position.h:55
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
at_enter_the_illidari_ashtongue_allari_killcredit(AreaTrigger *areatrigger)
at_enter_the_illidari_shivarra_conversation(AreaTrigger *areatrigger)
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
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 EnterEvadeMode(EvadeReason why) override
npc_illidari_fighting_invasion_begins(Creature *creature)
void JustEngagedWith(Unit *) override
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
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
MardumSpellData
Definition: zone_mardum.cpp:39
@ SPELL_START_DEMON_HUNTER_PLAY_SCENE
Definition: zone_mardum.cpp:40
Position const SevisBrightflameShivarraGatewayPosition
Position const WrathWarriorSpawnPosition
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
MardumQuestData
Definition: zone_mardum.cpp:44
@ QUEST_DEMON_HUNTER_INTRO_TRACKER
Definition: zone_mardum.cpp:45
Position const KaynDoubleJumpPosition
Position const JayceJumpPos
CreatureAI * BelathDawnbladeFreedAISelector(Creature *creature)
TheInvasionBeginsAnimKitsData
@ ANIM_DH_RUN
@ ANIM_DH_WINGS
@ ANIM_DH_RUN_ALLARI
CreatureAI * SevisBrightflameAshtongueGatewayAISelector(Creature *creature)
MardumSoundData
Definition: zone_mardum.cpp:54
@ SOUND_SPELL_DOUBLE_JUMP
Definition: zone_mardum.cpp:56
@ SOUND_METAL_WEAPON_UNSHEATH
Definition: zone_mardum.cpp:55
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
CreatureAI * SevisBrightflameCoilskarGatewayAISelector(Creature *creature)
TheInvasionBeginsQuestData
Definition: zone_mardum.cpp:90
@ SPELL_DEMON_HUNTER_GLIDE_STATE
@ NPC_KAYN_SUNFURY_INVASION_BEGINS
Definition: zone_mardum.cpp:95
@ NPC_JAYCE_DARKWEAVER_INVASION_BEGINS
Definition: zone_mardum.cpp:96
@ NPC_SEVIS_BRIGHTFLAME_INVASION_BEGINS
@ NPC_ALLARI_THE_SOULEATER_INVASION_BEGINS
Definition: zone_mardum.cpp:97
@ NPC_CYANA_NIGHTGLAIVE_INVASION_BEGINS
Definition: zone_mardum.cpp:98
@ QUEST_THE_INVASION_BEGINS
Definition: zone_mardum.cpp:91
@ CONVO_THE_INVASION_BEGINS
Definition: zone_mardum.cpp:93
@ NPC_KORVAS_BLOODTHORN_INVASION_BEGINS
Definition: zone_mardum.cpp:99
@ 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
Definition: zone_mardum.cpp:49
@ CONVO_DEMONHUNTER_INTRO_START
Definition: zone_mardum.cpp:50
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
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