TrinityCore
trial_of_the_crusader.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "GameObject.h"
20#include "InstanceScript.h"
21#include "Map.h"
22#include "MotionMaster.h"
23#include "Player.h"
24#include "ScriptedCreature.h"
25#include "ScriptedGossip.h"
26#include "SpellInfo.h"
27#include "SpellScript.h"
28#include "TemporarySummon.h"
30#include "Weather.h"
31
33{
34 // Highlord Tirion Fordring
52
53 // Varian Wrynn
61
62 // Garrosh
70
71 // Wilfred Fizzlebang
76
77 // The Lich King Voice
80
81 // The Lich King
83
84 // Highlord Tirion Fordring (Anu'barak)
87};
88
90{
98};
99
101{
140
142{
147 MENUID_LK = 10693
149
150constexpr Position BarretSpawnPosition = { 559.1528f, 90.55729f, 395.2734f, 5.078908f };
151constexpr Position WilfredSpawnPosition = { 563.6007f, 208.5278f, 395.2696f, 4.729842f };
152constexpr Position JaraxxusSpawnPosition = { 563.8264f, 140.6563f, 393.9861f, 4.694936f };
153constexpr Position PortalTargetSpawnPosition = { 563.6597f, 139.7569f, 399.2507f, 4.712389f };
154constexpr Position PurpleGroundSpawnPosition = { 563.6858f, 139.4323f, 393.9862f, 4.694936f };
155constexpr Position ArthasPortalSpawnPosition = { 563.6996f, 175.9826f, 394.5042f, 4.694936f };
156constexpr Position LichKingSpawnPosition = { 563.5712f, 174.8351f, 394.4954f, 4.712389f };
157constexpr Position CorpseTeleportPosition = { 631.9390f, 136.5040f, 142.5540f, 0.803332f };
158
160{
161 { 563.9358f, 229.8299f, 394.8061f, 4.694936f }, // Gormok \ Icehowl
162 { 564.2802f, 233.1322f, 394.7897f, 1.621917f }, // Dreadscale
163};
164
166{
167 { 783.9305f, 132.9722f, 142.6711f, 3.141593f }, // 0 - Anub'arak Spawn Location (sniffed)
168 { 695.240051f, 137.834824f, 142.200000f, 0 }, // 1 - Anub'arak move point location
169 { 694.886353f, 102.484665f, 142.119614f, 0 }, // 3 - Nerub Spawn
170 { 694.500671f, 185.363968f, 142.117905f, 0 }, // 5 - Nerub Spawn
171 { 731.987244f, 83.3824690f, 142.119614f, 0 }, // 2 - Nerub Spawn
172 { 740.184509f, 193.443390f, 142.117584f, 0 } // 4 - Nerub Spawn
173};
174
175//constexpr Position EndSpawnLoc[] =
176//{
177// { 648.9167f, 131.0208f, 141.6161f, 0.f }, // 0 - Highlord Tirion Fordring
178// { 649.1614f, 142.0399f, 141.3057f, 0.f }, // 1 - Argent Mage
179// { 644.6250f, 149.2743f, 140.6015f, 5.f } // 2 - Portal to Dalaran
180//};
181
182// ToDo: Remove it in nexts rewrites
184{
185 { 559.257996f, 90.266197f, 395.122986f, 0.0f }, // 0 Barrent
186 { 563.672974f, 139.57100f, 393.837006f, 0.0f }, // 1 Center
187 { 563.833008f, 187.244995f, 394.50000f, 0.0f }, // 2 Backdoor
188 { 577.347839f, 195.338888f, 395.14000f, 0.0f }, // 3 - Right
189 { 550.955933f, 195.338888f, 395.14000f, 0.0f }, // 4 - Left
190 { 563.833008f, 195.244995f, 394.585561f, 0.0f }, // 5 - Center
191 { 573.500000f, 180.500000f, 395.14f, 0.0f }, // 6 Move 0 Right
192 { 553.5f, 180.5f, 400.5521f, 0 }, // 7 Move 0 Left
193 { 573.0f, 170.0f, 400.5521f, 0 }, // 8 Move 1 Right
194 { 549.5139f, 170.1389f, 394.7965f, 5.009095f }, // 9 Move 1 Left
195 { 563.8f, 216.1f, 395.1f, 0 }, // 10 Behind the door
196
197 { 575.042358f, 195.260727f, 395.137146f, 0 }, // 5
198 { 552.248901f, 195.331955f, 395.132658f, 0 }, // 6
199 { 573.342285f, 195.515823f, 395.135956f, 0 }, // 7
200 { 554.239929f, 195.825577f, 395.137909f, 0 }, // 8
201 { 571.042358f, 195.260727f, 395.137146f, 0 }, // 9
202 { 556.720581f, 195.015472f, 395.132658f, 0 }, // 10
203 { 569.534119f, 195.214478f, 395.139526f, 0 }, // 11
204 { 569.231201f, 195.941071f, 395.139526f, 0 }, // 12
205 { 558.811610f, 195.985779f, 394.671661f, 0 }, // 13
206 { 567.641724f, 195.351501f, 394.659943f, 0 }, // 14
207 { 560.633972f, 195.391708f, 395.137543f, 0 }, // 15
208 { 565.816956f, 195.477921f, 395.136810f, 0 } // 16
209};
210
212{
213public:
214 ArthasPortalEvent(Unit* owner) : BasicEvent(), _owner(owner) { }
215
216 bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override
217 {
220 return true;
221 }
222
223private:
225};
226
228{
229 npc_barrett_toc(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
230
232 {
234 fordring->AI()->DoAction(action);
237 }
238
239 bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
240 {
241 switch (menuId)
242 {
244 if (gossipListId == GOSSIPID_FAIL)
246 else
248 break;
249 case MENUID_JARAXXUS:
250 if (gossipListId == GOSSIPID_FAIL)
251 {
253 jaraxxus->AI()->DoAction(ACTION_JARAXXUS_ENGAGE);
255 CloseGossipMenuFor(player);
256 return true;
257 }
258 else
260 break;
262 if (gossipListId == GOSSIPID_FAIL)
264 else
266 break;
267 case MENUID_VALKYR:
268 if (gossipListId == GOSSIPID_FAIL)
270 else
272 break;
273 case MENUID_LK:
275 break;
276 default:
277 return false;
278 }
279
280 CloseGossipMenuFor(player);
281 return true;
282 }
283
284 void MovementInform(uint32 type, uint32 pointId) override
285 {
286 if (type != SPLINE_CHAIN_MOTION_TYPE)
287 return;
288
289 if (pointId == POINT_BARRETT_DESPAWN)
291 }
292
293private:
295};
296
298{
299 boss_lich_king_toc(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
300
301 void Reset() override
302 {
306 }
307
308 void MovementInform(uint32 type, uint32 pointId) override
309 {
310 if (type != SPLINE_CHAIN_MOTION_TYPE)
311 return;
312
313 if (pointId == POINT_MIDDLE)
315 }
316
317 void UpdateAI(uint32 diff) override
318 {
319 _events.Update(diff);
320
321 while (uint32 eventId = _events.ExecuteEvent())
322 {
323 switch (eventId)
324 {
325 case EVENT_START_MOVE:
327 break;
333 fordring->AI()->DoAction(ACTION_LK_EVENT_FINISHED);
335 floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
337 break;
338 case EVENT_EMOTE_TALK:
342 break;
346 break;
349 break;
350 case EVENT_START_TALK:
354 break;
355 default:
356 break;
357 }
358 }
359 }
360
361private:
364};
365
367{
368 npc_tirion_toc(Creature* creature) : ScriptedAI(creature), _instance (creature->GetInstanceScript()), _factionLeaderData(0), _summons(me),
369 _jormungarsSummoned(false), _icehowlSummoned(false) { }
370
371 void Reset() override
372 {
373 _events.Reset();
375 _jormungarsSummoned = false;
376 _icehowlSummoned = false;
378 }
379
380 void JustSummoned(Creature* summoned) override
381 {
382 _summons.Summon(summoned);
383 }
384
386 {
392 {
396 }
403 }
404
405 void DoAction(int32 action) override
406 {
407 switch (action)
408 {
412 break;
415 break;
418 return;
419 _jormungarsSummoned = true;
424 break;
427 return;
428 _icehowlSummoned = true;
433 break;
435 _jormungarsSummoned = false;
436 _icehowlSummoned = false;
439 break;
444 break;
447 break;
450 break;
453 break;
455 {
458 if (Creature* otherFactionLeader = _instance->GetCreature(data))
459 otherFactionLeader->AI()->DoAction(ACTION_START_CHAMPIONS);
461 break;
462 }
465 break;
467 {
469 if (Creature* otherFactionLeader = _instance->GetCreature(data))
470 otherFactionLeader->AI()->DoAction(ACTION_START_CHAMPIONS_ENGAGE);
472 break;
473 }
476 break;
479 break;
482 break;
486 break;
491 break;
494 if (Creature* factionLeader = _instance->GetCreature(_factionLeaderData))
495 factionLeader->AI()->DoAction(ACTION_VALKYR_DEFEATED);
498 break;
502 break;
508 break;
511 break;
512 default:
513 break;
514 }
515 }
516
517 void EnterEvadeMode(EvadeReason /*why*/) override
518 {
519 // Needed when using hotswap
521 }
522
523 void UpdateAI(uint32 diff) override
524 {
525 _events.Update(diff);
526
527 while (uint32 eventId = _events.ExecuteEvent())
528 {
529 switch(eventId)
530 {
533 if (Creature* factionLeader = _instance->GetCreature(_factionLeaderData))
534 factionLeader->AI()->DoAction(ACTION_START_GORMOK);
536 break;
540 break;
544 break;
547 break;
550 break;
554 break;
558 break;
562 break;
565 break;
569 varian->AI()->DoAction(ACTION_JARAXXUS_DEFEATED);
571 garrosh->AI()->DoAction(ACTION_JARAXXUS_DEFEATED);
573 break;
577 break;
581 break;
585 break;
589 break;
590 case EVENT_OPEN_GATE:
592 break;
593 case EVENT_SAY_ARTHAS:
595 break;
598 lkVoice->AI()->Talk(LK_VOICE_SAY_CHALLENGE);
600 arthasPortal->m_Events.AddEventAtOffset(new ArthasPortalEvent(arthasPortal), 3s);
602 break;
605 lkVoice->AI()->Talk(LK_VOICE_SAY_SOULS_WILL_BE_MINE);
606 break;
609 break;
611 if (Creature* factitonController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1]))
612 factitonController->AI()->SetData(0, _instance->GetData(DATA_TEAM)); // will be changed to DoAction soon
614 break;
616 if (Creature* factitonController = _instance->GetCreature(DATA_FACTION_CRUSADERS))
617 factitonController->AI()->SetData(1, NOT_STARTED); // will be changed to DoAction soon
618 break;
619 default:
620 break;
621 }
622 }
623 }
624
625private:
632};
633
635{
637
638 void Reset() override
639 {
642 me->SetDisableGravity(true);
643 }
644
645 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
646 {
647 if (spellInfo->Id == SPELL_OPEN_PORTAL)
648 {
649 _scheduler.Schedule(2s, [this](TaskContext /*wilfredPortal*/)
650 {
653 });
654 }
655 }
656
657 void UpdateAI(uint32 diff) override
658 {
659 _scheduler.Update(diff);
660 }
661
662private:
664};
665
667{
668 npc_fizzlebang_toc(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
669
670 void Reset() override
671 {
673 _events.Reset();
675 }
676
677 void MovementInform(uint32 type, uint32 pointId) override
678 {
679 if (type == SPLINE_CHAIN_MOTION_TYPE && pointId == POINT_SUMMON)
680 {
686 }
687 }
688
689 void UpdateAI(uint32 diff) override
690 {
691 _events.Update(diff);
692
693 while (uint32 eventId = _events.ExecuteEvent())
694 {
695 switch (eventId)
696 {
697 case EVENT_START_MOVE:
699 break;
700 case EVENT_OBLIVION:
706 break;
709 fordring->AI()->DoAction(ACTION_SUMMON_JARAXXUS);
714 break;
715 case EVENT_SET_TARGET:
717 me->SetTarget(jaraxxus->GetGUID());
719 break;
723 break;
724 case EVENT_LAST_TALK:
727 fordring->AI()->DoAction(ACTION_KILL_JARAXXUS);
728 break;
729 case EVENT_EMOTE_TALK:
731 break;
734 break;
735 default:
736 break;
737 }
738 }
739 }
740
741private:
744};
745
747{
748 npc_garrosh_toc(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
749
750 void DoAction(int32 action) override
751 {
752 switch (action)
753 {
756 break;
759 break;
762 break;
765 break;
768 break;
771 break;
774 break;
775 default:
776 break;
777 }
778 }
779
780 void UpdateAI(uint32 diff) override
781 {
782 _events.Update(diff);
783
784 while (uint32 eventId = _events.ExecuteEvent())
785 {
786 switch (eventId)
787 {
790 break;
793 break;
797 break;
798 case EVENT_NO_MERCY:
800 break;
803 break;
804 default:
805 break;
806 }
807 }
808 }
809
810private:
813};
814
816{
817 npc_varian_toc(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
818
819 void DoAction(int32 action) override
820 {
821 switch (action)
822 {
825 break;
828 break;
831 break;
834 break;
837 break;
840 break;
843 break;
844 default:
845 break;
846 }
847 }
848
849 void UpdateAI(uint32 diff) override
850 {
851 _events.Update(diff);
852
853 while (uint32 eventId = _events.ExecuteEvent())
854 {
855 switch (eventId)
856 {
859 break;
860 case EVENT_COME_PIGS:
862 break;
866 break;
867 case EVENT_NO_MERCY:
869 break;
872 break;
873 default:
874 break;
875 }
876 }
877 }
878
879private:
882};
883
884// 69016 - Corpse Teleport
886{
887 void HandleTeleport(SpellEffIndex /*effIndex*/)
888 {
890 }
891
892 void Register() override
893 {
895 }
896};
897
899{
908}
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
@ SPLINE_CHAIN_MOTION_TYPE
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
void CloseGossipMenuFor(Player *player)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_STATE_TALK
@ EMOTE_ONESHOT_NONE
@ EMOTE_ONESHOT_TALK_NO_SHEATHE
@ SPELL_EFFECT_DUMMY
@ GO_DESTRUCTIBLE_DAMAGED
@ ALLIANCE
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
EvadeReason
Definition: UnitAICommon.h:30
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ SPELL_OPEN_PORTAL
Definition: boss_muru.cpp:65
Yells
bool Execute(uint64, uint32) override
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
Creature *const me
Definition: CreatureAI.h:61
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetTarget(ObjectGuid const &guid) override
Definition: Creature.cpp:3419
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
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
EncounterState GetBossState(uint32 id) const
GameObject * GetGameObject(uint32 type)
void SetZoneWeather(uint32 zoneId, WeatherState weatherId, float intensity)
Definition: Map.cpp:3962
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
uint32 const Id
Definition: SpellInfo.h:325
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
Definition: Unit.h:627
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetEmoteState(Emote emote)
Definition: Unit.h:852
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
Map * GetMap() const
Definition: Object.h:624
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
@ WEATHER_STATE_MEDIUM_SNOW
Definition: Weather.h:54
@ WEATHER_STATE_LIGHT_SNOW
Definition: Weather.h:53
@ WEATHER_STATE_FOG
Definition: Weather.h:48
bool IsHeroic() const
boss_lich_king_toc(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32 diff) override
bool OnGossipSelect(Player *player, uint32 menuId, uint32 gossipListId) override
InstanceScript * _instance
void SendActionToTirion(uint32 action)
void MovementInform(uint32 type, uint32 pointId) override
npc_barrett_toc(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
npc_fizzlebang_toc(Creature *creature)
void UpdateAI(uint32 diff) override
npc_garrosh_toc(Creature *creature)
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
InstanceScript * _instance
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_open_portal_target_toc(Creature *creature)
void UpdateAI(uint32 diff) override
InstanceScript * _instance
void JustSummoned(Creature *summoned) override
void EnterEvadeMode(EvadeReason) override
npc_tirion_toc(Creature *creature)
void DoAction(int32 action) override
npc_varian_toc(Creature *creature)
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
InstanceScript * _instance
@ DATA_MAIN_GATE
constexpr Position AnubarakLoc[]
constexpr Position NorthrendBeastsSpawnPositions[]
constexpr Position JaraxxusSpawnPosition
constexpr Position WilfredSpawnPosition
@ GARROSH_SAY_FACTION_DEAD
@ VARIAN_SAY_COME_PIGS
@ SAY_STAGE_4_07
@ VARIAN_SAY_FACTION_DEAD
@ WILFRED_SAY_OBLIVION
@ TIRION_SAY_WORK_TOGETHER
@ LK_VOICE_SAY_SOULS_WILL_BE_MINE
@ TIRION_SAY_BEASTS_WIPE
@ VARIAN_SAY_FIGHT_GLORY
@ TIRION_SAY_KILL_JARAXXUS
@ SAY_STAGE_4_06
@ TIRION_SAY_ICEHOWL
@ VARIAN_SAY_BEASTS
@ GARROSH_SAY_NO_MERCY
@ WILFRED_SAY_DEAD
@ GARROSH_SAY_VALKYR_DEAD
@ GARROSH_SAY_ALLIANCE_DOGS
@ TIRION_SAY_BEASTS_DONE
@ TIRION_SAY_UNITED
@ TIRION_SAY_WILFRED
@ TIRION_SAY_ALLOW_COMBAT
@ GARROSH_SAY_BEASTS
@ TIRION_SAY_JORMUNGARS
@ TIRION_SAY_WELCOME
@ GARROSH_SAY_DEMAND_JUSTICE
@ VARIAN_SAY_DEMAND_JUSTICE
@ TIRION_SAY_CALM_DOWN
@ LK_VOICE_SAY_CHALLENGE
@ TIRION_SAY_TRAGIC_VICTORY
@ TIRION_SAY_CHAMPIONS
@ VARIAN_SAY_VALKYR_DEAD
@ WILFRED_SAY_MASTER
@ TIRION_SAY_GAME_BEGIN
@ TIRION_SAY_ARTHAS
@ TIRION_SAY_LAMENT
@ GARROSH_SAY_KILLED
@ VARIAN_SAY_KILLED
@ WILFRED_SAY_INTRO
@ TIRION_SAY_GORMOK
@ MENUID_FACTION_CHAMPIONS
@ MENUID_NORTHREND_BEASTS
constexpr Position BarretSpawnPosition
@ AREA_TRIAL_OF_THE_CRUSADER
@ POINT_BARRETT_DESPAWN
@ SPLINE_INITIAL_MOVEMENT
constexpr Position PurpleGroundSpawnPosition
constexpr Position ArthasPortalSpawnPosition
constexpr Position ToCCommonLoc[]
void AddSC_trial_of_the_crusader()
constexpr Position CorpseTeleportPosition
@ EVENT_SUMMON_BARRET
@ EVENT_SUMMON_CHAMPIONS
@ EVENT_BREAK_PLATFORM
@ EVENT_START_MOVE
@ EVENT_EMOTE_SHEATHE
@ EVENT_KILL_JARAXXUS
@ EVENT_EXCLAMATION
@ EVENT_GORMOK_INTRO
@ EVENT_START_TALK
@ EVENT_TIRION_LAMENT
@ EVENT_GORMOK_EXCLAMATION
@ EVENT_EMOTE_KNEEL
@ EVENT_TRAGIC_VICTORY
@ EVENT_START_CALL_WILFRED
@ EVENT_ALLIANCE_DOGS
@ EVENT_VALKYR_DEAD
@ EVENT_START_CHAMPIONS
@ EVENT_SUMMON_VALKYR
@ EVENT_SPAWM_GORMOK
@ EVENT_DEMAND_JUSTICE
@ EVENT_REMOVE_EMOTE_TALK
@ EVENT_LICH_KING_SAY_CHALLENGE
@ EVENT_LICH_KING_SAY_SOULS
@ EVENT_SAY_ARTHAS
@ EVENT_EMOTE_TALK
@ EVENT_TIRION_CALM_DOWN
@ EVENT_ALLOW_COMBAT
@ EVENT_EMOTE_EXCLAMATION
@ EVENT_SUMMON_JARAXXUS
@ EVENT_SUMMON_WILFRED
@ EVENT_SET_TARGET
@ EVENT_SUMMON_LICH_KING
constexpr Position PortalTargetSpawnPosition
constexpr Position LichKingSpawnPosition
@ NPC_CHAMPIONS_CONTROLLER
@ NPC_PURPLE_GROUND
@ NPC_DREADSCALE
@ NPC_WILFRED_PORTAL
@ NPC_LIGHT_ESSENCE
@ NPC_DARK_ESSENCE
@ NPC_BARRETT_LK
@ NPC_BARRETT_JARAXXUS
@ NPC_JARAXXUS
@ NPC_BARRETT_VALKYR
@ NPC_LICH_KING
@ NPC_ARTHAS_PORTAL
@ NPC_FIZZLEBANG
@ NPC_BARRETT_BEASTS
@ NPC_BARRETT_FACTION
@ NPC_BARRETT_BEASTS_HC
@ SPELL_ARTHAS_PORTAL
@ SPELL_DESTROY_FLOOR_KNOCKUP
@ SPELL_LK_FROST_NOVA
@ SPELL_CORPSE_TELEPORT
@ SPELL_WILFRED_PORTAL
@ ACTION_START_JORMUNGARS
@ ACTION_START_CHAMPIONS_ENGAGE
@ ACTION_FACTION_WIPE
@ ACTION_JARAXXUS_WIPE
@ ACTION_SAY_KILLED_PLAYER
@ ACTION_NORTHREND_BEASTS_DEFEATED
@ ACTION_START_JARAXXUS_EVENT
@ ACTION_START_VALKYR_ENGAGE
@ ACTION_NORTHREND_BEASTS_WIPE
@ ACTION_SUMMON_JARAXXUS
@ ACTION_JARAXXUS_DEFEATED
@ ACTION_JARAXXUS_ENGAGE
@ ACTION_START_GORMOK
@ ACTION_LK_EVENT_FINISHED
@ ACTION_START_LK_EVENT
@ ACTION_START_VALKYR
@ ACTION_CHAMPIONS_DEFEATED
@ ACTION_START_GORMOK_FAIL
@ ACTION_START_ICEHOWL
@ ACTION_VALKYR_DEFEATED
@ ACTION_KILL_JARAXXUS
@ ACTION_VALKYR_WIPE
@ ACTION_START_CHAMPIONS
@ DATA_TWIN_VALKIRIES
@ DATA_COLISEUM_FLOOR
@ DATA_JARAXXUS
@ DATA_NORTHREND_BEASTS
@ DATA_LICH_KING
@ DATA_VARIAN
@ DATA_FACTION_CRUSADERS
@ DATA_FORDRING
@ DATA_LICH_KING_VOICE
@ DATA_GARROSH
#define RegisterTrialOfTheCrusaderCreatureAI(ai_name)