TrinityCore
Loading...
Searching...
No Matches
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 "ScriptedCreature.h"
24#include "ScriptMgr.h"
25#include "TemporarySummon.h"
26#include "Transport.h"
27
29{
30 { DATA_FALRIC, {{ 1992 }} },
31 { DATA_MARWYN, {{ 1993 }} },
32 { DATA_THE_LICH_KING_ESCAPE, {{ 1990 }} }
33};
34
35Position const JainaSpawnPos = { 5236.659f, 1929.894f, 707.7781f, 0.8726646f }; // Jaina Spawn Position
36Position const SylvanasSpawnPos = { 5236.667f, 1929.906f, 707.7781f, 0.8377581f }; // Sylvanas Spawn Position (sniffed)
37Position const JainaSpawnPos2 = { 5549.011f, 2257.041f, 733.0120f, 1.153993f }; // Jaina Spawn Position 2
38Position const SylvanasSpawnPos2 = { 5549.29f, 2257.353f, 733.0943f, 0.8901179f }; // Sylvanas Spawn Position 2 (sniffed)
39Position const KorelnOrLoralenSpawnPos = { 5232.68f, 1931.46f, 707.7781f, 0.8377581f };
40
42{
43 { 5557.017f, 2266.103f, 733.0943f, 3.892084f }, // 0 - Spawn (Horde)
44 { 5552.733f, 2262.718f, 733.0110f, 4.009696f } // 1 - Spawn (Alliance)
45};
46
48{
49 { 5309.577f, 2042.668f, 707.7781f, 4.694936f },
50 { 5295.885f, 2040.342f, 707.7781f, 5.078908f },
51 { 5340.836f, 1992.458f, 707.7781f, 2.757620f },
52 { 5325.072f, 1977.597f, 707.7781f, 2.076942f },
53 { 5277.365f, 1993.229f, 707.7781f, 0.401426f },
54 { 5275.479f, 2001.135f, 707.7781f, 0.174533f },
55 { 5302.448f, 2042.222f, 707.7781f, 4.904375f },
56 { 5343.293f, 1999.384f, 707.7781f, 2.914700f },
57 { 5295.635f, 1973.757f, 707.7781f, 1.186824f },
58 { 5311.031f, 1972.229f, 707.7781f, 1.640610f },
59 { 5275.076f, 2008.724f, 707.7781f, 6.213372f },
60 { 5316.701f, 2041.550f, 707.7781f, 4.502949f },
61 { 5344.150f, 2007.168f, 707.7781f, 3.159046f },
62 { 5319.158f, 1973.998f, 707.7781f, 1.919862f },
63 { 5302.247f, 1972.415f, 707.7781f, 1.378810f },
64 { 5277.739f, 2016.882f, 707.7781f, 5.969026f },
65 { 5322.964f, 2040.288f, 707.7781f, 4.345870f },
66 { 5343.467f, 2015.951f, 707.7781f, 3.490659f },
67 { 5313.820f, 1978.146f, 707.7781f, 1.745329f },
68 { 5279.649f, 2004.656f, 707.7781f, 0.069814f },
69 { 5306.057f, 2037.002f, 707.7781f, 4.817109f },
70 { 5337.865f, 2003.403f, 707.7781f, 2.984513f },
71 { 5299.434f, 1979.009f, 707.7781f, 1.239184f },
72 { 5312.752f, 2037.122f, 707.7781f, 4.590216f },
73 { 5335.724f, 1996.859f, 707.7781f, 2.740167f },
74 { 5280.632f, 2012.156f, 707.7781f, 6.056293f },
75 { 5320.369f, 1980.125f, 707.7781f, 2.007129f },
76 { 5306.572f, 1977.474f, 707.7781f, 1.500983f },
77 { 5336.599f, 2017.278f, 707.7781f, 3.473205f },
78 { 5282.897f, 2019.597f, 707.7781f, 5.881760f },
79 { 5318.704f, 2036.108f, 707.7781f, 4.223697f },
80 { 5280.513f, 1997.842f, 707.7781f, 0.296706f },
81 { 5337.833f, 2010.057f, 707.7781f, 3.228859f },
82 { 5299.250f, 2035.998f, 707.7781f, 5.026548f }
83};
84
85Position const UtherQuelDalarPos = { 5302.001f, 1988.698f, 707.7781f, 3.700098f };
86
88{
89 public:
91
93 {
107
108 void OnPlayerEnter(Player* /*player*/) override
109 {
111 {
112 SpawnGunship();
113
116 }
117 }
118
119 void OnCreatureCreate(Creature* creature) override
120 {
121 switch (creature->GetEntry())
122 {
123 case NPC_JAINA_INTRO:
125 JainaOrSylvanasIntroGUID = creature->GetGUID();
126 break;
127 case NPC_KORELN:
128 case NPC_LORALEN:
131 KorelnOrLoralenGUID = creature->GetGUID();
132 break;
134 TheLichkingIntroGUID = creature->GetGUID();
135 break;
136 case NPC_FALRIC:
137 FalricGUID = creature->GetGUID();
138 break;
139 case NPC_MARWYN:
140 MarwynGUID = creature->GetGUID();
141 break;
144 break;
146 FrostswornGeneralGUID = creature->GetGUID();
148 PhasingHandler::AddPhase(creature, 170, true);
149 else
150 PhasingHandler::RemovePhase(creature, 170, true);
151 break;
152 case NPC_JAINA_ESCAPE:
155 break;
157 TheLichKingEscapeGUID = creature->GetGUID();
158 break;
161 CaptainGUID = creature->GetGUID();
162 break;
164 if (!creature->GetTransport())
165 break;
166 [[fallthrough]];
168 GunshipCannonGUIDs.insert(creature->GetGUID());
169 break;
171 IcewallTargetGUID = creature->GetGUID();
172 break;
173 case NPC_UTHER:
174 UtherGUID = creature->GetGUID();
175 break;
176 default:
177 break;
178 }
179 }
180
181 void OnCreatureRemove(Creature* creature) override
182 {
183 switch (creature->GetEntry())
184 {
186 case NPC_WAVE_FOOTMAN:
188 case NPC_WAVE_PRIEST:
189 case NPC_WAVE_MAGE:
190 {
191 uint32 internalWaveId = creature->AI()->GetData(0);
192 waveGuidList[internalWaveId].erase(creature->GetGUID());
193 break;
194 }
197 break;
200 GunshipCannonGUIDs.erase(creature->GetGUID());
201 break;
202 default:
203 break;
204 }
205 }
206
208 {
209 switch (entry)
210 {
215 return 0;
216 break;
221 return 0;
222 break;
223 default:
224 break;
225 }
226
227 return entry;
228 }
229
231 {
232 switch (go->GetEntry())
233 {
234 case GO_FROSTMOURNE:
235 FrostmourneGUID = go->GetGUID();
238 break;
239 case GO_ENTRANCE_DOOR:
241 break;
245 break;
249 break;
250 case GO_CAVE_IN:
251 CaveInGUID = go->GetGUID();
252 break;
255 GunshipGUID = go->GetGUID();
256 break;
260 go->SetRespawnTime(DAY);
261 GunshipStairGUIDs.insert(go->GetGUID());
262 break;
268 break;
269 case GO_ICE_WALL:
271 IcewallGUID = go->GetGUID();
272 break;
273 default:
274 break;
275 }
276 }
277
279 {
280 switch (go->GetEntry())
281 {
284 GunshipStairGUIDs.erase(go->GetGUID());
285 break;
286 default:
287 break;
288 }
289 }
290
291 bool SetBossState(uint32 type, EncounterState state) override
292 {
293 if (!InstanceScript::SetBossState(type, state))
294 return false;
295
296 switch (type)
297 {
298 case DATA_FALRIC:
299 if (state == DONE)
300 {
301 ++_waveCount;
303 }
304 break;
305 case DATA_MARWYN:
306 if (state == DONE)
307 {
309 bunny->CastSpell(bunny, SPELL_START_HALLS_OF_REFLECTION_QUEST_AE, true);
310
311 if (Creature* korelnOrLoralen = instance->GetCreature(KorelnOrLoralenGUID))
312 korelnOrLoralen->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
313
318 PhasingHandler::RemovePhase(general, 170, true);
319
320 SpawnGunship();
322 }
323 break;
325 switch (state)
326 {
327 case NOT_STARTED:
328 break;
329 case IN_PROGRESS:
331 jainaOrSylvanas->AI()->DoAction(ACTION_START_PREFIGHT);
332 break;
333 case DONE:
336
338
340 {
341 lichking->CastSpell(nullptr, SPELL_ACHIEV_CHECK, true);
342 lichking->DespawnOrUnsummon(1ms);
343 }
344 break;
345 case FAIL:
347 jainaOrSylvanas->DespawnOrUnsummon(10s);
348
349 if (Creature* icewallTarget = instance->GetCreature(IcewallTargetGUID))
350 icewallTarget->DespawnOrUnsummon();
351
353 icewall->Delete();
354
356 break;
357 default:
358 break;
359 }
360 break;
361 default:
362 break;
363 }
364
365 return true;
366 }
367
369 {
370 // don't spawn gunship twice
371 if (!GunshipGUID.IsEmpty())
372 return;
373
375 gunship->EnableMovement(GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE);
376 }
377
391
392 void SetData(uint32 type, uint32 data) override
393 {
394 switch (type)
395 {
396 case DATA_INTRO_EVENT:
397 if (data == IN_PROGRESS)
398 {
400 {
402 {
405 }
406 else
407 {
410 }
411 }
412 }
413 _introState = data;
414 break;
415 case DATA_WAVE_COUNT:
416 if (_waveCount && data == NOT_STARTED)
417 ProcessEvent(nullptr, EVENT_DO_WIPE, nullptr);
418 break;
420 if (data == DONE)
423 break;
425 if (data == IN_PROGRESS)
426 {
428 {
430 bunny->CastSpell(nullptr, SPELL_ESSENCE_OF_CAPTURED);
432 }
433 }
434 _quelDelarState = data;
435 break;
436 default:
437 break;
438 }
439 }
440
441 void SetGuidData(uint32 type, ObjectGuid data) override
442 {
443 switch (type)
444 {
447 break;
448 default:
449 break;
450 }
451 }
452
453 // wave scheduling, checked when wave npcs die
454 void OnUnitDeath(Unit* unit) override
455 {
456 Creature* creature = unit->ToCreature();
457 if (!creature)
458 return;
459
460 switch (creature->GetEntry())
461 {
463 case NPC_WAVE_FOOTMAN:
465 case NPC_WAVE_PRIEST:
466 case NPC_WAVE_MAGE:
467 {
468 uint32 waveId = creature->AI()->GetData(0);
469 for (ObjectGuid guid : waveGuidList[waveId])
470 {
471 if (Creature* npc = instance->GetCreature(guid))
472 if (npc->IsAlive())
473 return;
474 }
475
476 ++_waveCount;
478 break;
479 }
480 }
481 }
482
483 void Update(uint32 diff) override
484 {
485 if (!instance->HavePlayers())
486 return;
487
488 events.Update(diff);
489
490 switch (events.ExecuteEvent())
491 {
492 case EVENT_NEXT_WAVE:
493 ProcessEvent(nullptr, EVENT_ADD_WAVE, nullptr);
494 break;
497 break;
500 break;
501 }
502 }
503
504 void ProcessEvent(WorldObject* /*obj*/, uint32 eventId, WorldObject* /*invoker*/) override
505 {
506 switch (eventId)
507 {
508 // spawning all wave npcs at once
513 {
514 std::list<uint32> possibilityList, tempList;
515 uint32 posIndex = 0;
516
517 possibilityList.push_back(NPC_WAVE_MERCENARY);
518 possibilityList.push_back(NPC_WAVE_FOOTMAN);
519 possibilityList.push_back(NPC_WAVE_RIFLEMAN);
520 possibilityList.push_back(NPC_WAVE_PRIEST);
521 possibilityList.push_back(NPC_WAVE_MAGE);
522
523 // iterate each wave
524 for (uint8 i = GetBossState(DATA_FALRIC) == DONE ? 4 : 0; i < 8; ++i)
525 {
526 tempList = possibilityList;
527
528 ObjectGuid bossGuid = i <= 3 ? FalricGUID : MarwynGUID;
529
530 if (!i)
532 else if (i < 6 && i != 3)
534
535 for (uint32 entry : tempList)
536 {
537 if (Creature* boss = instance->GetCreature(bossGuid))
538 {
539 if (Creature* temp = boss->SummonCreature(entry, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN))
540 {
541 temp->AI()->SetData(0, i);
542 waveGuidList[i].insert(temp->GetGUID());
543 }
544 }
545
546 ++posIndex;
547 }
548 }
549 }
551 break;
552 case EVENT_ADD_WAVE:
556
557 if (_waveCount % 5)
558 {
559 uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2);
560 for (ObjectGuid guid : waveGuidList[internalWaveId])
561 {
562 if (Creature* temp = instance->GetCreature(guid))
563 {
564 temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, false);
565 temp->SetUninteractible(false);
566 temp->SetImmuneToAll(false);
567 temp->AI()->DoZoneInCombat(temp);
568 }
569 }
570 }
571 else
572 {
573 uint32 bossIndex = (_waveCount / 5) - 1;
574 if (GetBossState(DATA_FALRIC + bossIndex) != DONE)
575 {
576 if (Creature* boss = instance->GetCreature(bossIndex ? MarwynGUID : FalricGUID))
577 boss->AI()->DoAction(ACTION_ENTER_COMBAT);
578 }
579 else if (_waveCount != 10)
580 {
581 ++_waveCount;
583 }
584 }
585 break;
586 case EVENT_DO_WIPE:
587 _waveCount = 0;
588 events.Reset();
592
593 if (Creature* falric = instance->GetCreature(FalricGUID))
594 falric->SetVisible(false);
595 if (Creature* marwyn = instance->GetCreature(MarwynGUID))
596 marwyn->SetVisible(false);
597 // despawn wave npcs
598 for (uint8 i = 0; i < 8; ++i)
599 {
600 for (ObjectGuid guid : waveGuidList[i])
601 if (Creature* creature = instance->GetCreature(guid))
602 creature->DespawnOrUnsummon(1ms);
603 waveGuidList[i].clear();
604 }
605 break;
606 // Gunship Outro
609 break;
610
612 gunship->EnableMovement(false);
613
615 jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL);
616
617 if (Creature* captain = instance->GetCreature(CaptainGUID))
618 captain->AI()->Talk(SAY_CAPTAIN_FIRE);
619
620 for (ObjectGuid guid : GunshipCannonGUIDs)
621 {
622 uint32 entry = guid.GetEntry();
624 if (Creature* cannon = instance->GetCreature(guid))
625 cannon->CastSpell(cannon, SPELL_GUNSHIP_CANNON_FIRE, true);
626 }
627 break;
630 gunship->EnableMovement(false);
631
632 for (ObjectGuid guid : GunshipStairGUIDs)
633 if (GameObject* stairs = instance->GetGameObject(guid))
634 stairs->SetRespawnTime(DAY);
635
637 jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL_2);
638
639 if (Creature* captain = instance->GetCreature(CaptainGUID))
640 captain->AI()->Talk(SAY_CAPTAIN_FINAL);
641
642 break;
643 default:
644 break;
645 }
646 }
647
648 uint32 GetData(uint32 type) const override
649 {
650 switch (type)
651 {
652 case DATA_WAVE_COUNT:
653 return _waveCount;
655 return instance->GetTeamInInstance();
656 case DATA_INTRO_EVENT:
657 return _introState;
661 return _quelDelarState;
662 default:
663 break;
664 }
665
666 return 0;
667 }
668
669 ObjectGuid GetGuidData(uint32 type) const override
670 {
671 switch (type)
672 {
673 case DATA_FALRIC:
674 return FalricGUID;
675 case DATA_MARWYN:
676 return MarwynGUID;
681 case DATA_FROSTMOURNE:
682 return FrostmourneGUID;
686 return KorelnOrLoralenGUID;
689 case DATA_GUNSHIP:
690 return GunshipGUID;
691 case DATA_ICEWALL:
692 return IcewallGUID;
694 return IcewallTargetGUID;
698 return UtherGUID;
701 default:
702 break;
703 }
704
705 return ObjectGuid::Empty;
706 }
707
708 void AfterDataLoad() override
709 {
711 {
714 }
715
718 }
719
720 private:
730
736
741
744
752
755 };
756
761};
762
@ DAY
Definition Common.h:34
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
@ GO_JUST_DEACTIVATED
Definition GameObject.h:159
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_DEAD_DESPAWN
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:432
@ ALLIANCE
@ HORDE
@ GO_FLAG_NODESPAWN
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_LOCKED
#define sTransportMgr
@ UNIT_NPC_FLAG_QUESTGIVER
#define DataHeader
uint32 const EncounterCount
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
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 SetLootState(LootState s, Unit *unit=nullptr)
void SetRespawnTime(int32 respawn)
Team GetTeamInInstance() const
Definition Map.h:903
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void DoUpdateWorldState(int32 worldStateId, int32 value)
void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
InstanceMap * instance
void SetHeaders(std::string_view dataHeaders)
void LoadDungeonEncounterData(std::span< DungeonEncounterData const > encounters)
EncounterState GetBossState(uint32 id) const
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:1186
bool HavePlayers() const
Definition Map.h:393
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3552
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:3542
Transport * GetTransport(ObjectGuid const &guid)
Definition Map.cpp:3562
static ObjectGuid const Empty
Definition ObjectGuid.h:314
bool IsEmpty() const
Definition ObjectGuid.h:362
uint64 LowType
Definition ObjectGuid.h:321
void Clear()
Definition ObjectGuid.h:329
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void RemovePhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
virtual uint32 GetData(uint32 id) const
Definition UnitAI.h:74
Definition Unit.h:635
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
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
TransportBase * GetTransport() const
Definition Object.h:537
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_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