TrinityCore
instance_halls_of_reflection.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 "halls_of_reflection.h"
19#include "Containers.h"
20#include "InstanceScript.h"
21#include "Map.h"
22#include "PhasingHandler.h"
23#include "Player.h"
24#include "ScriptedCreature.h"
25#include "ScriptMgr.h"
26#include "TemporarySummon.h"
27#include "Transport.h"
28
30{
31 { DATA_FALRIC, {{ 1992 }} },
32 { DATA_MARWYN, {{ 1993 }} },
33 { DATA_THE_LICH_KING_ESCAPE, {{ 1990 }} }
34};
35
36Position const JainaSpawnPos = { 5236.659f, 1929.894f, 707.7781f, 0.8726646f }; // Jaina Spawn Position
37Position const SylvanasSpawnPos = { 5236.667f, 1929.906f, 707.7781f, 0.8377581f }; // Sylvanas Spawn Position (sniffed)
38Position const JainaSpawnPos2 = { 5549.011f, 2257.041f, 733.0120f, 1.153993f }; // Jaina Spawn Position 2
39Position const SylvanasSpawnPos2 = { 5549.29f, 2257.353f, 733.0943f, 0.8901179f }; // Sylvanas Spawn Position 2 (sniffed)
40Position const KorelnOrLoralenSpawnPos = { 5232.68f, 1931.46f, 707.7781f, 0.8377581f };
41
43{
44 { 5557.017f, 2266.103f, 733.0943f, 3.892084f }, // 0 - Spawn (Horde)
45 { 5552.733f, 2262.718f, 733.0110f, 4.009696f } // 1 - Spawn (Alliance)
46};
47
49{
50 { 5309.577f, 2042.668f, 707.7781f, 4.694936f },
51 { 5295.885f, 2040.342f, 707.7781f, 5.078908f },
52 { 5340.836f, 1992.458f, 707.7781f, 2.757620f },
53 { 5325.072f, 1977.597f, 707.7781f, 2.076942f },
54 { 5277.365f, 1993.229f, 707.7781f, 0.401426f },
55 { 5275.479f, 2001.135f, 707.7781f, 0.174533f },
56 { 5302.448f, 2042.222f, 707.7781f, 4.904375f },
57 { 5343.293f, 1999.384f, 707.7781f, 2.914700f },
58 { 5295.635f, 1973.757f, 707.7781f, 1.186824f },
59 { 5311.031f, 1972.229f, 707.7781f, 1.640610f },
60 { 5275.076f, 2008.724f, 707.7781f, 6.213372f },
61 { 5316.701f, 2041.550f, 707.7781f, 4.502949f },
62 { 5344.150f, 2007.168f, 707.7781f, 3.159046f },
63 { 5319.158f, 1973.998f, 707.7781f, 1.919862f },
64 { 5302.247f, 1972.415f, 707.7781f, 1.378810f },
65 { 5277.739f, 2016.882f, 707.7781f, 5.969026f },
66 { 5322.964f, 2040.288f, 707.7781f, 4.345870f },
67 { 5343.467f, 2015.951f, 707.7781f, 3.490659f },
68 { 5313.820f, 1978.146f, 707.7781f, 1.745329f },
69 { 5279.649f, 2004.656f, 707.7781f, 0.069814f },
70 { 5306.057f, 2037.002f, 707.7781f, 4.817109f },
71 { 5337.865f, 2003.403f, 707.7781f, 2.984513f },
72 { 5299.434f, 1979.009f, 707.7781f, 1.239184f },
73 { 5312.752f, 2037.122f, 707.7781f, 4.590216f },
74 { 5335.724f, 1996.859f, 707.7781f, 2.740167f },
75 { 5280.632f, 2012.156f, 707.7781f, 6.056293f },
76 { 5320.369f, 1980.125f, 707.7781f, 2.007129f },
77 { 5306.572f, 1977.474f, 707.7781f, 1.500983f },
78 { 5336.599f, 2017.278f, 707.7781f, 3.473205f },
79 { 5282.897f, 2019.597f, 707.7781f, 5.881760f },
80 { 5318.704f, 2036.108f, 707.7781f, 4.223697f },
81 { 5280.513f, 1997.842f, 707.7781f, 0.296706f },
82 { 5337.833f, 2010.057f, 707.7781f, 3.228859f },
83 { 5299.250f, 2035.998f, 707.7781f, 5.026548f }
84};
85
86Position const UtherQuelDalarPos = { 5302.001f, 1988.698f, 707.7781f, 3.700098f };
87
89{
90 public:
92
94 {
96 {
100
101 _teamInInstance = 0;
102 _waveCount = 0;
106
107 events.Reset();
108 }
109
110 void OnPlayerEnter(Player* player) override
111 {
112 if (!_teamInInstance)
113 _teamInInstance = player->GetTeam();
114
116 {
117 SpawnGunship();
118
121 }
122 }
123
124 void OnCreatureCreate(Creature* creature) override
125 {
126 switch (creature->GetEntry())
127 {
128 case NPC_JAINA_INTRO:
130 JainaOrSylvanasIntroGUID = creature->GetGUID();
131 break;
132 case NPC_KORELN:
133 case NPC_LORALEN:
136 KorelnOrLoralenGUID = creature->GetGUID();
137 break;
139 TheLichkingIntroGUID = creature->GetGUID();
140 break;
141 case NPC_FALRIC:
142 FalricGUID = creature->GetGUID();
143 break;
144 case NPC_MARWYN:
145 MarwynGUID = creature->GetGUID();
146 break;
149 break;
151 FrostswornGeneralGUID = creature->GetGUID();
153 PhasingHandler::AddPhase(creature, 170, true);
154 else
155 PhasingHandler::RemovePhase(creature, 170, true);
156 break;
157 case NPC_JAINA_ESCAPE:
160 break;
162 TheLichKingEscapeGUID = creature->GetGUID();
163 break;
166 CaptainGUID = creature->GetGUID();
167 break;
169 if (!creature->GetTransport())
170 break;
171 [[fallthrough]];
173 GunshipCannonGUIDs.insert(creature->GetGUID());
174 break;
176 IcewallTargetGUID = creature->GetGUID();
177 break;
178 case NPC_UTHER:
179 UtherGUID = creature->GetGUID();
180 break;
181 default:
182 break;
183 }
184 }
185
186 void OnCreatureRemove(Creature* creature) override
187 {
188 switch (creature->GetEntry())
189 {
191 case NPC_WAVE_FOOTMAN:
193 case NPC_WAVE_PRIEST:
194 case NPC_WAVE_MAGE:
195 {
196 uint32 internalWaveId = creature->AI()->GetData(0);
197 waveGuidList[internalWaveId].erase(creature->GetGUID());
198 break;
199 }
202 break;
205 GunshipCannonGUIDs.erase(creature->GetGUID());
206 break;
207 default:
208 break;
209 }
210 }
211
213 {
214 if (!_teamInInstance)
215 {
216 Map::PlayerList const& players = instance->GetPlayers();
217 if (!players.isEmpty())
218 if (Player* player = players.begin()->GetSource())
219 _teamInInstance = player->GetTeam();
220 }
221
222 switch (entry)
223 {
227 if (_teamInInstance == HORDE)
228 return 0;
229 break;
234 return 0;
235 break;
236 default:
237 break;
238 }
239
240 return entry;
241 }
242
244 {
245 switch (go->GetEntry())
246 {
247 case GO_FROSTMOURNE:
248 FrostmourneGUID = go->GetGUID();
251 break;
252 case GO_ENTRANCE_DOOR:
254 break;
258 break;
262 break;
263 case GO_CAVE_IN:
264 CaveInGUID = go->GetGUID();
265 break;
268 GunshipGUID = go->GetGUID();
269 break;
273 go->SetRespawnTime(DAY);
274 GunshipStairGUIDs.insert(go->GetGUID());
275 break;
281 break;
282 case GO_ICE_WALL:
284 IcewallGUID = go->GetGUID();
285 break;
286 default:
287 break;
288 }
289 }
290
292 {
293 switch (go->GetEntry())
294 {
297 GunshipStairGUIDs.erase(go->GetGUID());
298 break;
299 default:
300 break;
301 }
302 }
303
304 bool SetBossState(uint32 type, EncounterState state) override
305 {
306 if (!InstanceScript::SetBossState(type, state))
307 return false;
308
309 switch (type)
310 {
311 case DATA_FALRIC:
312 if (state == DONE)
313 {
314 ++_waveCount;
316 }
317 break;
318 case DATA_MARWYN:
319 if (state == DONE)
320 {
322 bunny->CastSpell(bunny, SPELL_START_HALLS_OF_REFLECTION_QUEST_AE, true);
323
324 if (Creature* korelnOrLoralen = instance->GetCreature(KorelnOrLoralenGUID))
325 korelnOrLoralen->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
326
331 PhasingHandler::RemovePhase(general, 170, true);
332
333 SpawnGunship();
335 }
336 break;
338 switch (state)
339 {
340 case NOT_STARTED:
341 break;
342 case IN_PROGRESS:
344 jainaOrSylvanas->AI()->DoAction(ACTION_START_PREFIGHT);
345 break;
346 case DONE:
349
351
353 {
354 lichking->CastSpell(nullptr, SPELL_ACHIEV_CHECK, true);
355 lichking->DespawnOrUnsummon(1ms);
356 }
357 break;
358 case FAIL:
360 jainaOrSylvanas->DespawnOrUnsummon(10s);
361
362 if (Creature* icewallTarget = instance->GetCreature(IcewallTargetGUID))
363 icewallTarget->DespawnOrUnsummon();
364
366 icewall->Delete();
367
369 break;
370 default:
371 break;
372 }
373 break;
374 default:
375 break;
376 }
377
378 return true;
379 }
380
382 {
383 // don't spawn gunship twice
384 if (!GunshipGUID.IsEmpty())
385 return;
386
387 if (!_teamInInstance)
388 {
389 Map::PlayerList const& players = instance->GetPlayers();
390 if (!players.isEmpty())
391 if (Player* player = players.begin()->GetSource())
392 _teamInInstance = player->GetTeam();
393 }
394
396 gunship->EnableMovement(GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE);
397 }
398
400 {
401 if (!_teamInInstance)
402 {
403 Map::PlayerList const& players = instance->GetPlayers();
404 if (!players.isEmpty())
405 if (Player* player = players.begin()->GetSource())
406 _teamInInstance = player->GetTeam();
407 }
408
410 {
413 }
414 else
415 {
418 }
419 }
420
421 void SetData(uint32 type, uint32 data) override
422 {
423 switch (type)
424 {
425 case DATA_INTRO_EVENT:
426 if (data == IN_PROGRESS)
427 {
429 {
431 {
434 }
435 else
436 {
439 }
440 }
441 }
442 _introState = data;
443 break;
444 case DATA_WAVE_COUNT:
445 if (_waveCount && data == NOT_STARTED)
446 ProcessEvent(nullptr, EVENT_DO_WIPE, nullptr);
447 break;
449 if (data == DONE)
452 break;
454 if (data == IN_PROGRESS)
455 {
457 {
459 bunny->CastSpell(nullptr, SPELL_ESSENCE_OF_CAPTURED);
461 }
462 }
463 _quelDelarState = data;
464 break;
465 default:
466 break;
467 }
468 }
469
470 void SetGuidData(uint32 type, ObjectGuid data) override
471 {
472 switch (type)
473 {
476 break;
477 default:
478 break;
479 }
480 }
481
482 // wave scheduling, checked when wave npcs die
483 void OnUnitDeath(Unit* unit) override
484 {
485 Creature* creature = unit->ToCreature();
486 if (!creature)
487 return;
488
489 switch (creature->GetEntry())
490 {
492 case NPC_WAVE_FOOTMAN:
494 case NPC_WAVE_PRIEST:
495 case NPC_WAVE_MAGE:
496 {
497 uint32 waveId = creature->AI()->GetData(0);
498 for (ObjectGuid guid : waveGuidList[waveId])
499 {
500 if (Creature* npc = instance->GetCreature(guid))
501 if (npc->IsAlive())
502 return;
503 }
504
505 ++_waveCount;
507 break;
508 }
509 }
510 }
511
512 void Update(uint32 diff) override
513 {
514 if (!instance->HavePlayers())
515 return;
516
517 events.Update(diff);
518
519 switch (events.ExecuteEvent())
520 {
521 case EVENT_NEXT_WAVE:
522 ProcessEvent(nullptr, EVENT_ADD_WAVE, nullptr);
523 break;
526 break;
529 break;
530 }
531 }
532
533 void ProcessEvent(WorldObject* /*obj*/, uint32 eventId, WorldObject* /*invoker*/) override
534 {
535 switch (eventId)
536 {
537 // spawning all wave npcs at once
542 {
543 std::list<uint32> possibilityList, tempList;
544 uint32 posIndex = 0;
545
546 possibilityList.push_back(NPC_WAVE_MERCENARY);
547 possibilityList.push_back(NPC_WAVE_FOOTMAN);
548 possibilityList.push_back(NPC_WAVE_RIFLEMAN);
549 possibilityList.push_back(NPC_WAVE_PRIEST);
550 possibilityList.push_back(NPC_WAVE_MAGE);
551
552 // iterate each wave
553 for (uint8 i = GetBossState(DATA_FALRIC) == DONE ? 4 : 0; i < 8; ++i)
554 {
555 tempList = possibilityList;
556
557 ObjectGuid bossGuid = i <= 3 ? FalricGUID : MarwynGUID;
558
559 if (!i)
561 else if (i < 6 && i != 3)
563
564 for (uint32 entry : tempList)
565 {
566 if (Creature* boss = instance->GetCreature(bossGuid))
567 {
568 if (Creature* temp = boss->SummonCreature(entry, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN))
569 {
570 temp->AI()->SetData(0, i);
571 waveGuidList[i].insert(temp->GetGUID());
572 }
573 }
574
575 ++posIndex;
576 }
577 }
578 }
580 break;
581 case EVENT_ADD_WAVE:
585
586 if (_waveCount % 5)
587 {
588 uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2);
589 for (ObjectGuid guid : waveGuidList[internalWaveId])
590 {
591 if (Creature* temp = instance->GetCreature(guid))
592 {
593 temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, false);
594 temp->SetUninteractible(false);
595 temp->SetImmuneToAll(false);
596 temp->AI()->DoZoneInCombat(temp);
597 }
598 }
599 }
600 else
601 {
602 uint32 bossIndex = (_waveCount / 5) - 1;
603 if (GetBossState(DATA_FALRIC + bossIndex) != DONE)
604 {
605 if (Creature* boss = instance->GetCreature(bossIndex ? MarwynGUID : FalricGUID))
606 boss->AI()->DoAction(ACTION_ENTER_COMBAT);
607 }
608 else if (_waveCount != 10)
609 {
610 ++_waveCount;
612 }
613 }
614 break;
615 case EVENT_DO_WIPE:
616 _waveCount = 0;
617 events.Reset();
621
622 if (Creature* falric = instance->GetCreature(FalricGUID))
623 falric->SetVisible(false);
624 if (Creature* marwyn = instance->GetCreature(MarwynGUID))
625 marwyn->SetVisible(false);
626 // despawn wave npcs
627 for (uint8 i = 0; i < 8; ++i)
628 {
629 for (ObjectGuid guid : waveGuidList[i])
630 if (Creature* creature = instance->GetCreature(guid))
631 creature->DespawnOrUnsummon(1ms);
632 waveGuidList[i].clear();
633 }
634 break;
635 // Gunship Outro
638 break;
639
641 gunship->EnableMovement(false);
642
644 jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL);
645
646 if (Creature* captain = instance->GetCreature(CaptainGUID))
647 captain->AI()->Talk(SAY_CAPTAIN_FIRE);
648
649 for (ObjectGuid guid : GunshipCannonGUIDs)
650 {
651 uint32 entry = guid.GetEntry();
653 if (Creature* cannon = instance->GetCreature(guid))
654 cannon->CastSpell(cannon, SPELL_GUNSHIP_CANNON_FIRE, true);
655 }
656 break;
659 gunship->EnableMovement(false);
660
661 for (ObjectGuid guid : GunshipStairGUIDs)
662 if (GameObject* stairs = instance->GetGameObject(guid))
663 stairs->SetRespawnTime(DAY);
664
666 jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL_2);
667
668 if (Creature* captain = instance->GetCreature(CaptainGUID))
669 captain->AI()->Talk(SAY_CAPTAIN_FINAL);
670
671 break;
672 default:
673 break;
674 }
675 }
676
677 uint32 GetData(uint32 type) const override
678 {
679 switch (type)
680 {
681 case DATA_WAVE_COUNT:
682 return _waveCount;
684 return _teamInInstance;
685 case DATA_INTRO_EVENT:
686 return _introState;
690 return _quelDelarState;
691 default:
692 break;
693 }
694
695 return 0;
696 }
697
698 ObjectGuid GetGuidData(uint32 type) const override
699 {
700 switch (type)
701 {
702 case DATA_FALRIC:
703 return FalricGUID;
704 case DATA_MARWYN:
705 return MarwynGUID;
710 case DATA_FROSTMOURNE:
711 return FrostmourneGUID;
715 return KorelnOrLoralenGUID;
718 case DATA_GUNSHIP:
719 return GunshipGUID;
720 case DATA_ICEWALL:
721 return IcewallGUID;
723 return IcewallTargetGUID;
727 return UtherGUID;
730 default:
731 break;
732 }
733
734 return ObjectGuid::Empty;
735 }
736
737 void AfterDataLoad() override
738 {
740 {
743 }
744
747 }
748
749 private:
759
765
771
774
782
785 };
786
788 {
790 }
791};
792
794{
796}
@ NPC_WORLD_TRIGGER
@ DAY
Definition: Common.h:31
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
@ GO_JUST_DEACTIVATED
Definition: GameObject.h:159
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
std::set< ObjectGuid > GuidSet
Definition: ObjectGuid.h:393
@ ALLIANCE
@ HORDE
@ GO_FLAG_NODESPAWN
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_LOCKED
#define sTransportMgr
Definition: TransportMgr.h:183
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
#define DataHeader
uint32 const EncounterCount
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 SetLootState(LootState s, Unit *unit=nullptr)
void SetRespawnTime(int32 respawn)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void LoadDungeonEncounterData(T const &encounters)
void DoUpdateWorldState(int32 worldStateId, int32 value)
void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
InstanceMap * instance
EncounterState GetBossState(uint32 id) const
void SetHeaders(std::string const &dataHeaders)
bool isEmpty() const
Definition: LinkedList.h:110
iterator begin()
Definition: MapRefManager.h:34
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, Milliseconds duration=0ms, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty, SmoothPhasingInfo const *smoothPhasingInfo=nullptr)
Definition: Object.cpp:1836
bool HavePlayers() const
Definition: Map.h:357
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:3489
PlayerList const & GetPlayers() const
Definition: Map.h:367
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
Transport * GetTransport(ObjectGuid const &guid)
Definition: Map.cpp:3499
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
bool IsEmpty() const
Definition: ObjectGuid.h:319
uint64 LowType
Definition: ObjectGuid.h:278
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void RemovePhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
Team GetTeam() const
Definition: Player.h:2235
FROM * GetSource() const
Definition: Reference.h:96
virtual uint32 GetData(uint32) const
Definition: UnitAI.h:73
Definition: Unit.h:627
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
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
TransportBase * GetTransport() const
Definition: Object.h:750
InstanceScript * GetInstanceScript(InstanceMap *map) const override
@ DATA_TEAM_IN_INSTANCE
@ NPC_KORELN
@ NPC_LORALEN
#define HoRScriptName
@ DATA_GUNSHIP
@ DATA_FROSTSWORN_GENERAL
@ DATA_INTRO_EVENT
@ DATA_KORELN_LORALEN
@ DATA_ICEWALL_TARGET
@ DATA_QUEL_DELAR_INVOKER
@ DATA_QUEL_DELAR_EVENT
@ DATA_UTHER_QUEL_DELAR
@ DATA_ESCAPE_LEADER
@ DATA_WAVE_COUNT
@ DATA_ICEWALL
@ DATA_MARWYN
@ DATA_FALRIC
@ DATA_FROSTMOURNE
@ DATA_FROSTMOURNE_ALTAR_BUNNY
@ DATA_IMPENETRABLE_DOOR
@ DATA_THE_LICH_KING_ESCAPE
@ EVENT_SPAWN_WAVES
@ EVENT_SPAWN_ESCAPE_EVENT
@ EVENT_QUEL_DELAR_SUMMON_UTHER
@ EVENT_NEXT_WAVE
@ EVENT_ADD_WAVE
@ EVENT_DO_WIPE
@ SPELL_ACHIEV_CHECK
@ WORLD_STATE_HOR_WAVES_ENABLED
@ WORLD_STATE_HOR_WAVE_COUNT
@ SPELL_GUNSHIP_CANNON_FIRE
@ SPELL_ESSENCE_OF_CAPTURED
@ SPELL_START_HALLS_OF_REFLECTION_QUEST_AE
@ SPELL_SPIRIT_ACTIVATE
@ ACTION_GUNSHIP_ARRIVAL_2
@ ACTION_START_PREFIGHT
@ ACTION_GUNSHIP_ARRIVAL
@ ACTION_ENTER_COMBAT
@ NPC_THE_LICH_KING_ESCAPE
@ NPC_JUSTIN_BARTLETT
@ NPC_JAINA_INTRO
@ NPC_THE_LICH_KING_INTRO
@ NPC_JAINA_ESCAPE
@ NPC_SYLVANAS_INTRO
@ NPC_SYLVANAS_ESCAPE
@ NPC_WAVE_FOOTMAN
@ NPC_WAVE_PRIEST
@ NPC_GUNSHIP_CANNON_HORDE
@ NPC_FALRIC
@ NPC_WAVE_MAGE
@ NPC_WAVE_MERCENARY
@ NPC_KORM_BLACKSCAR
@ NPC_ICE_WALL_TARGET
@ NPC_WAVE_RIFLEMAN
@ NPC_MARWYN
@ NPC_FROSTSWORN_GENERAL
@ NPC_FROSTMOUNRE_ALTAR_BUNNY
@ GO_THE_CAPTAIN_CHEST_HORDE_HEROIC
@ GO_CAVE_IN
@ GO_ORGRIMS_HAMMER_STAIRS
@ GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC
@ GO_SHADOW_THRONE_DOOR
@ GO_FROSTMOURNE
@ GO_ICE_WALL
@ GO_THE_SKYBREAKER
@ GO_ORGRIMS_HAMMER
@ GO_ENTRANCE_DOOR
@ GO_IMPENETRABLE_DOOR
@ GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL
@ GO_THE_SKYBREAKER_STAIRS
@ GO_THE_CAPTAIN_CHEST_HORDE_NORMAL
@ EVENT_GUNSHIP_ARRIVAL_2
@ EVENT_GUNSHIP_ARRIVAL
@ SAY_CAPTAIN_FINAL
@ SAY_CAPTAIN_FIRE
void AddSC_instance_halls_of_reflection()
Position const KorelnOrLoralenSpawnPos
Position const SpawnPos[]
Position const JainaSpawnPos2
Position const SylvanasSpawnPos
Position const UtherQuelDalarPos
Position const SylvanasSpawnPos2
DungeonEncounterData const encounters[]
Position const TheLichKingEscapePosition[]
Position const JainaSpawnPos
void RandomResize(C &container, std::size_t requestedSize)
Definition: Containers.h:67
@ NPC_UTHER
Definition: npc_arthas.cpp:45
void ProcessEvent(WorldObject *, uint32 eventId, WorldObject *) override