TrinityCore
Loading...
Searching...
No Matches
instance_ulduar.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 "ulduar.h"
19#include "AreaBoundary.h"
20#include "CreatureAI.h"
21#include "EventMap.h"
22#include "GameObject.h"
23#include "InstanceScript.h"
24#include "Item.h"
25#include "Map.h"
26#include "Player.h"
27#include "ScriptMgr.h"
28#include "TemporarySummon.h"
29#include "Vehicle.h"
30
32{
33 { DATA_FLAME_LEVIATHAN, new RectangleBoundary(148.0f, 401.3f, -155.0f, 90.0f) },
34 { DATA_IGNIS, new RectangleBoundary(495.0f, 680.0f, 90.0f, 400.0f) },
35 { DATA_RAZORSCALE, new RectangleBoundary(370.0f, 810.0f, -542.0f, -55.0f) },
36 { DATA_XT002, new RectangleBoundary(755.0f, 940.0f, -125.0f, 95.0f) },
37 { DATA_ASSEMBLY_OF_IRON, new CircleBoundary(Position(1587.2f, 121.0f), 90.0f) },
38 { DATA_ALGALON, new CircleBoundary(Position(1632.668f, -307.7656f), 45.0f) },
39 { DATA_ALGALON, new ZRangeBoundary(410.0f, 470.0f) },
40 { DATA_HODIR, new EllipseBoundary(Position(2001.5f, -240.0f), 50.0f, 75.0f) },
41 // Thorim sets boundaries dynamically
42 { DATA_FREYA, new RectangleBoundary(2094.6f, 2520.0f, -250.0f, 200.0f) },
43 { DATA_MIMIRON, new CircleBoundary(Position(2744.0f, 2569.0f), 70.0f) },
44 { DATA_VEZAX, new RectangleBoundary(1740.0f, 1930.0f, 31.0f, 228.0f) },
45 { DATA_YOGG_SARON, new CircleBoundary(Position(1980.42f, -27.68f), 105.0f) }
46};
47
48static constexpr DoorData doorData[] =
49{
72};
73
80
116
138
140{
141 { DATA_FLAME_LEVIATHAN, {{ 1132 }} },
142 { DATA_IGNIS, {{ 1136 }} },
143 { DATA_RAZORSCALE, {{ 1139 }} },
144 { DATA_XT002, {{ 1142 }} },
145 { DATA_ASSEMBLY_OF_IRON, {{ 1140 }} },
146 { DATA_KOLOGARN, {{ 1137 }} },
147 { DATA_AURIAYA, {{ 1131 }} },
148 { DATA_HODIR, {{ 1135 }} },
149 { DATA_THORIM, {{ 1141 }} },
150 { DATA_FREYA, {{ 1133 }} },
151 { DATA_MIMIRON, {{ 1138 }} },
152 { DATA_VEZAX, {{ 1134 }} },
153 { DATA_YOGG_SARON, {{ 1143 }} },
154 { DATA_ALGALON, {{ 1130 }} },
155 { DATA_BRIGHTLEAF, {{ 1164 }} },
156 { DATA_IRONBRANCH, {{ 1165 }} },
157 { DATA_STONEBARK, {{ 1166 }} }
158};
159
160UlduarKeeperDespawnEvent::UlduarKeeperDespawnEvent(Creature* owner, Milliseconds despawnTimerOffset) : _owner(owner), _despawnTimer(despawnTimerOffset)
161{
162}
163
164bool UlduarKeeperDespawnEvent::Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
165{
168 return true;
169}
170
172{
173 public:
175
177 {
206
207 // Creatures
209
212
217
218 // GameObjects
228
230
231 // Miscellaneous
241
242 void OnPlayerEnter(Player* /*player*/) override
243 {
244 if (_summonAlgalon)
245 {
246 _summonAlgalon = false;
249 algalon->AI()->DoAction(ACTION_INIT_ALGALON);
250 else
251 algalon->SetImmuneToPC(false);
252 }
253
254 // Keepers at Observation Ring
256 {
259 }
261 {
264 }
266 {
269 }
271 {
274 }
275
276 // Keepers in Yogg-Saron's room
277 if (_summonYSKeeper[0])
279 if (_summonYSKeeper[1])
281 if (_summonYSKeeper[2])
283 if (_summonYSKeeper[3])
285 }
286
287 void OnCreatureCreate(Creature* creature) override
288 {
290
291 switch (creature->GetEntry())
292 {
297 DespawnLeviatanVehicle(creature);
298 else
299 LeviathanVehicleGUIDs.push_back(creature->GetGUID());
300 break;
301
302 // XT-002 Deconstructor
303 case NPC_XT_TOY_PILE:
304 for (uint8 i = 0; i < 4; ++i)
305 {
306 if (!XTToyPileGUIDs[i])
307 {
308 XTToyPileGUIDs[i] = creature->GetGUID();
309 break;
310 }
311 }
312 break;
313
314 // Assembly of Iron
315 case NPC_STEELBREAKER:
316 AssemblyGUIDs[0] = creature->GetGUID();
317 AddMinion(creature, true);
318 break;
319 case NPC_MOLGEIM:
320 AssemblyGUIDs[1] = creature->GetGUID();
321 AddMinion(creature, true);
322 break;
323 case NPC_BRUNDIR:
324 AssemblyGUIDs[2] = creature->GetGUID();
325 AddMinion(creature, true);
326 break;
327
328 // Freya
329 case NPC_IRONBRANCH:
330 ElderGUIDs[0] = creature->GetGUID();
332 creature->DespawnOrUnsummon();
333 break;
334 case NPC_BRIGHTLEAF:
335 ElderGUIDs[1] = creature->GetGUID();
337 creature->DespawnOrUnsummon();
338 break;
339 case NPC_STONEBARK:
340 ElderGUIDs[2] = creature->GetGUID();
342 creature->DespawnOrUnsummon();
343 break;
345 FreyaAchieveTriggerGUID = creature->GetGUID();
346 break;
347
348 // Mimiron
350 MimironVehicleGUIDs[0] = creature->GetGUID();
351 break;
352 case NPC_VX_001:
353 MimironVehicleGUIDs[1] = creature->GetGUID();
354 break;
356 MimironVehicleGUIDs[2] = creature->GetGUID();
357 break;
358
359 // Yogg-Saron
360 case NPC_FREYA_YS:
361 KeeperGUIDs[0] = creature->GetGUID();
362 _summonYSKeeper[0] = false;
363 ++keepersCount;
365 break;
366 case NPC_HODIR_YS:
367 KeeperGUIDs[1] = creature->GetGUID();
368 _summonYSKeeper[1] = false;
369 ++keepersCount;
371 break;
372 case NPC_THORIM_YS:
373 KeeperGUIDs[2] = creature->GetGUID();
374 _summonYSKeeper[2] = false;
375 ++keepersCount;
377 break;
378 case NPC_MIMIRON_YS:
379 KeeperGUIDs[3] = creature->GetGUID();
380 _summonYSKeeper[3] = false;
381 ++keepersCount;
383 break;
384 case NPC_SANITY_WELL:
385 creature->SetReactState(REACT_PASSIVE);
386 break;
387
388 // Algalon
396 if (Creature* algalon = GetCreature(DATA_ALGALON))
397 algalon->AI()->JustSummoned(creature);
398 break;
399 }
400
402 }
403
404 uint32 GetCreatureEntry(ObjectGuid::LowType /*guidLow*/, CreatureData const* data) override
405 {
406 uint32 entry = data->id;
407 switch (entry)
408 {
429 default:
430 return entry;
431 }
432 }
433
434 void OnCreatureRemove(Creature* creature) override
435 {
437
438 switch (creature->GetEntry())
439 {
440 case NPC_XT_TOY_PILE:
441 for (uint8 i = 0; i < 4; ++i)
442 {
443 if (XTToyPileGUIDs[i] == creature->GetGUID())
444 {
446 break;
447 }
448 }
449 break;
450 case NPC_STEELBREAKER:
451 case NPC_MOLGEIM:
452 case NPC_BRUNDIR:
453 AddMinion(creature, false);
454 break;
455 default:
456 break;
457 }
458 }
459
460 void OnGameObjectCreate(GameObject* gameObject) override
461 {
463
464 switch (gameObject->GetEntry())
465 {
468 KologarnChestGUID = gameObject->GetGUID();
469 break;
471 KologarnBridgeGUID = gameObject->GetGUID();
473 HandleGameObject(ObjectGuid::Empty, false, gameObject);
474 break;
477 break;
480 CacheOfStormsGUID = gameObject->GetGUID();
481 break;
484 CacheOfStormsHardmodeGUID = gameObject->GetGUID();
485 break;
488 HodirRareCacheGUID = gameObject->GetGUID();
489 break;
491 case GO_HODIR_CHEST:
492 HodirChestGUID = gameObject->GetGUID();
493 break;
494 case GO_MIMIRON_TRAM:
495 MimironTramGUID = gameObject->GetGUID();
496 break;
498 LeviathanGateGUID = gameObject->GetGUID();
500 gameObject->SetGoState(GO_STATE_DESTROYED);
501 break;
503 BrainRoomDoorGUIDs[0] = gameObject->GetGUID();
504 break;
506 BrainRoomDoorGUIDs[1] = gameObject->GetGUID();
507 break;
509 BrainRoomDoorGUIDs[2] = gameObject->GetGUID();
510 break;
514 gameObject->SetFlag(GO_FLAG_IN_USE);
515 break;
519 gameObject->SetGoState(GO_STATE_ACTIVE);
520 break;
521 default:
522 break;
523 }
524 }
525
526 void OnUnitDeath(Unit* unit) override
527 {
528 Creature* creature = unit->ToCreature();
529 if (!creature)
530 return;
531
532 switch (creature->GetEntry())
533 {
538 case NPC_MANGROVE_ENT:
542 if (!conSpeedAtory)
543 {
545 conSpeedAtory = true;
546 }
547 break;
548 case NPC_IRONBRANCH:
549 case NPC_STONEBARK:
550 case NPC_BRIGHTLEAF:
551 if (!lumberjacked)
552 {
554 lumberjacked = true;
555 }
556 break;
557 default:
558 break;
559 }
560 }
561
562 void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId, WorldObject* /*invoker*/) override
563 {
564 switch (eventId)
565 {
566 // Flame Leviathan's Tower Event triggers
568 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
569 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_STORM_DESTROYED);
570 break;
572 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
573 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FROST_DESTROYED);
574 break;
576 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
577 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FLAMES_DESTROYED);
578 break;
580 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
581 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED);
582 break;
583
584 // Yogg-Saron Event triggers
586 if (Creature* freya = instance->GetCreature(KeeperGUIDs[0]))
587 freya->AI()->DoAction(4/*ACTION_SANITY_WELLS*/);
588 break;
590 if (Creature* hodir = instance->GetCreature(KeeperGUIDs[1]))
591 hodir->AI()->DoAction(5/*ACTION_FLASH_FREEZE*/);
592 break;
593 }
594 }
595
596 bool SetBossState(uint32 type, EncounterState state) override
597 {
598 if (!InstanceScript::SetBossState(type, state))
599 return false;
600
601 switch (type)
602 {
604 if (state == DONE)
606 break;
607 case DATA_IGNIS:
608 case DATA_RAZORSCALE:
609 case DATA_XT002:
611 case DATA_AURIAYA:
612 case DATA_VEZAX:
613 case DATA_YOGG_SARON:
614 break;
615 case DATA_MIMIRON:
616 if (state == DONE)
618 break;
619 case DATA_FREYA:
620 if (state == DONE)
622 break;
623 case DATA_IRONBRANCH:
624 case DATA_STONEBARK:
625 case DATA_BRIGHTLEAF:
628 trigger->CastSpell(trigger, SPELL_LUMBERJACKED_CREDIT, true);
629 break;
630 case DATA_KOLOGARN:
631 if (state == DONE)
632 {
634 {
635 gameObject->SetRespawnTime(gameObject->GetRespawnDelay());
636 gameObject->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
637 }
639 }
640 break;
641 case DATA_HODIR:
642 if (state == DONE)
643 {
644 if (GameObject* HodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
646 HodirRareCache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
648 HodirChest->SetRespawnTime(HodirChest->GetRespawnDelay());
649
651 }
652 break;
653 case DATA_THORIM:
654 if (state == DONE)
655 {
656 if (Creature* thorim = GetCreature(DATA_THORIM))
657 {
659 {
660 cache->SetTapList(thorim->GetTapList());
661 cache->SetRespawnTime(cache->GetRespawnDelay());
662 cache->RemoveFlag(GO_FLAG_LOCKED);
663 cache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
664 cache->RemoveFlag(GO_FLAG_NODESPAWN);
665 }
666 }
667
669 }
670 else
671 {
674 }
675 break;
676 case DATA_ALGALON:
677 if (state == DONE)
678 {
680 gift->SetRespawnTime(gift->GetRespawnDelay());
681 // get item level (recheck weapons)
682 Map::PlayerList const& players = instance->GetPlayers();
683 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
684 if (Player* player = itr->GetSource())
685 for (uint8 slot = EQUIPMENT_SLOT_MAINHAND; slot <= EQUIPMENT_SLOT_OFFHAND; ++slot)
686 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
687 if (item->GetItemLevel(player) > _maxWeaponItemLevel)
688 _maxWeaponItemLevel = item->GetItemLevel(player);
689 }
690 else if (state == IN_PROGRESS)
691 {
692 _algalonFirstIntro = false;
693 // get item level (armor cannot be swapped in combat)
694 Map::PlayerList const& players = instance->GetPlayers();
695 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
696 {
697 if (Player* player = itr->GetSource())
698 {
699 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
700 {
701 if (slot == EQUIPMENT_SLOT_TABARD || slot == EQUIPMENT_SLOT_BODY)
702 continue;
703
704 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
705 {
706 if (slot >= EQUIPMENT_SLOT_MAINHAND && slot <= EQUIPMENT_SLOT_OFFHAND)
707 {
708 if (item->GetItemLevel(player) > _maxWeaponItemLevel)
709 _maxWeaponItemLevel = item->GetItemLevel(player);
710 }
711 else if (item->GetItemLevel(player) > _maxArmorItemLevel)
712 _maxArmorItemLevel = item->GetItemLevel(player);
713 }
714 }
715 }
716 }
717 }
718 break;
719 }
720
721 return true;
722 }
723
724 void SetData(uint32 type, uint32 data) override
725 {
726 switch (type)
727 {
728 case DATA_COLOSSUS:
729 ColossusData = data;
730 if (data >= 2 && GetBossState(DATA_FLAME_LEVIATHAN) == NOT_STARTED)
731 {
733 }
734 break;
736 HodirRareCacheData = data;
738 {
739 if (Creature* hodir = GetCreature(DATA_HODIR))
741 hodir->RemoveGameObject(gameObject, false);
742 }
743 break;
744 case DATA_UNBROKEN:
745 Unbroken = data != 0;
746 break;
747 case DATA_ILLUSION:
748 illusion = data;
749 break;
751 IsDriveMeCrazyEligible = data ? true : false;
752 break;
754 _algalonSummoned = true;
755 break;
756 default:
757 break;
758 }
759 }
760
761 void SetGuidData(uint32 /*type*/, ObjectGuid /*data*/) override
762 {
763 }
764
765 ObjectGuid GetGuidData(uint32 data) const override
766 {
767 switch (data)
768 {
769 // XT-002 Deconstructor
770 case DATA_TOY_PILE_0:
771 case DATA_TOY_PILE_1:
772 case DATA_TOY_PILE_2:
773 case DATA_TOY_PILE_3:
774 return XTToyPileGUIDs[data - DATA_TOY_PILE_0];
775
776 // Assembly of Iron
778 return AssemblyGUIDs[0];
779 case DATA_MOLGEIM:
780 return AssemblyGUIDs[1];
781 case DATA_BRUNDIR:
782 return AssemblyGUIDs[2];
783
784 // Freya
785 case DATA_BRIGHTLEAF:
786 return ElderGUIDs[0];
787 case DATA_IRONBRANCH:
788 return ElderGUIDs[1];
789 case DATA_STONEBARK:
790 return ElderGUIDs[2];
791
792 // Mimiron
794 return MimironVehicleGUIDs[0];
795 case DATA_VX_001:
796 return MimironVehicleGUIDs[1];
798 return MimironVehicleGUIDs[2];
799
800 // Yogg-Saron
802 return BrainRoomDoorGUIDs[0];
804 return BrainRoomDoorGUIDs[1];
806 return BrainRoomDoorGUIDs[2];
807 case DATA_FREYA_YS:
808 return KeeperGUIDs[0];
809 case DATA_HODIR_YS:
810 return KeeperGUIDs[1];
811 case DATA_THORIM_YS:
812 return KeeperGUIDs[2];
813 case DATA_MIMIRON_YS:
814 return KeeperGUIDs[3];
815 }
816
817 return InstanceScript::GetGuidData(data);
818 }
819
820 uint32 GetData(uint32 type) const override
821 {
822 switch (type)
823 {
824 case DATA_COLOSSUS:
825 return ColossusData;
827 return HodirRareCacheData;
828 case DATA_UNBROKEN:
829 return uint32(Unbroken);
830 case DATA_ILLUSION:
831 return illusion;
833 return keepersCount;
834 default:
835 break;
836 }
837
838 return 0;
839 }
840
841 bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const*, Unit const* /* = nullptr */, uint32 /* = 0 */) override
842 {
843 switch (criteriaId)
844 {
852 return illusion == CHAMBER_ILLUSION;
855 return illusion == ICECROWN_ILLUSION;
885 return false;
886 }
887
888 return false;
889 }
890
905
906 void Update(uint32 diff) override
907 {
908 if (_events.Empty())
909 return;
910
911 _events.Update(diff);
912
913 while (uint32 eventId = _events.ExecuteEvent())
914 {
915 switch (eventId)
916 {
918 // Eject all players from vehicles and make them untargetable.
919 // They will be despawned after a while
920 for (auto const& vehicleGuid : LeviathanVehicleGUIDs)
921 if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid))
922 DespawnLeviatanVehicle(vehicleCreature);
923 break;
925 if (Creature* leviathan = GetCreature(DATA_FLAME_LEVIATHAN))
926 leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
928 gameObject->SetGoState(GO_STATE_DESTROYED);
929 break;
930 }
931 }
932 }
933
934 void DespawnLeviatanVehicle(Creature* vehicleCreature)
935 {
936 if (Vehicle* vehicle = vehicleCreature->GetVehicleKit())
937 {
938 vehicle->RemoveAllPassengers();
939 vehicleCreature->SetUninteractible(true);
940 vehicleCreature->DespawnOrUnsummon(5min);
941 }
942 }
943
944 void UpdateDoorState(GameObject* door) override
945 {
946 // Leviathan doors are set to EncounterStateForOpenDoor::NotInProgress except the one it uses to enter the room
947 // which has to be set to EncounterStateForOpenDoor::Done
948 if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f)
950 else
952 }
953
954 void AddDoor(GameObject* door, bool add) override
955 {
956 // Leviathan doors are South except the one it uses to enter the room
957 // which is North and should not be used for boundary checks in BossAI::IsInBoundary()
958 if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f)
959 {
960 if (add)
962 else
964
965 if (add)
966 UpdateDoorState(door);
967 }
968 else
969 InstanceScript::AddDoor(door, add);
970 }
971
972 private:
981 };
982
984 {
985 return new instance_ulduar_InstanceMapScript(map);
986 }
987};
988
990{
991 new instance_ulduar();
992}
uint8_t uint8
Definition Define.h:156
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
EncounterState
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:434
@ EQUIPMENT_SLOT_BODY
Definition Player.h:732
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:744
@ EQUIPMENT_SLOT_TABARD
Definition Player.h:747
@ EQUIPMENT_SLOT_END
Definition Player.h:748
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:745
@ EQUIPMENT_SLOT_START
Definition Player.h:728
#define INVENTORY_SLOT_BAG_0
Definition Player.h:723
@ HORDE
@ GO_FLAG_NODESPAWN
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_IN_USE
@ GO_FLAG_LOCKED
@ GO_STATE_READY
@ GO_STATE_DESTROYED
@ GO_STATE_ACTIVE
@ REACT_PASSIVE
#define DataHeader
Position const AlgalonLandPos
Position const ObservationRingKeepersPos[4]
Position const YSKeepersPos[4]
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void SetImmuneToPC(bool apply) override
Definition Creature.h:184
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:228
void SetTapList(GuidUnorderedSet tapList)
Definition Creature.h:305
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
bool Empty() const
Definition EventMap.h:89
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void SetGoState(GOState state)
void SetFlag(GameObjectFlags flags)
Definition GameObject.h:277
Team GetTeamInInstance() const
Definition Map.h:903
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
virtual void OnCreatureCreate(Creature *creature) override
void DoCloseDoorOrButton(ObjectGuid guid)
Creature * GetCreature(uint32 type)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void DoUpdateWorldState(int32 worldStateId, int32 value)
virtual void OnCreatureRemove(Creature *creature) override
virtual ObjectGuid GetGuidData(uint32 type) const override
BossInfo * GetBossInfo(uint32 id)
void LoadObjectData(std::span< ObjectData const > creatureData, std::span< ObjectData const > gameObjectData)
InstanceMap * instance
void SetHeaders(std::string_view dataHeaders)
void LoadDungeonEncounterData(std::span< DungeonEncounterData const > encounters)
void AddMinion(Creature *minion, bool add)
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
virtual void OnGameObjectCreate(GameObject *go) override
virtual void AddDoor(GameObject *door, bool add)
void LoadMinionData(std::span< MinionData const > data)
void LoadDoorData(std::span< DoorData const > data)
GameObject * GetGameObject(uint32 type)
void LoadBossBoundaries(BossBoundaryData const &data)
virtual void UpdateDoorState(GameObject *door)
Definition Item.h:179
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
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3552
PlayerList const & GetPlayers() const
Definition Map.h:403
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:3542
static ObjectGuid const Empty
Definition ObjectGuid.h:314
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
iterator end()
Definition RefManager.h:36
iterator begin()
Definition RefManager.h:35
Milliseconds _despawnTimer
Definition ulduar.h:515
UlduarKeeperDespawnEvent(Creature *owner, Milliseconds despawnTimerOffset=500ms)
bool Execute(uint64, uint32) override
virtual void DoAction(int32 param)
Definition UnitAI.h:73
Definition Unit.h:635
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
Vehicle * GetVehicleKit() const
Definition Unit.h:1782
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
InstanceScript * GetInstanceScript(InstanceMap *map) const override
#define MAX_ENCOUNTER
static constexpr ObjectData creatureData[]
static constexpr ObjectData objectData[]
static constexpr MinionData minionData[]
static constexpr DoorData doorData[]
void AddSC_instance_ulduar()
static BossBoundaryData const boundaries
static constexpr DungeonEncounterData encounters[]
std::array< GuidSet, static_cast< uint8 >(EncounterDoorBehavior::Max)> door
constexpr float GetPositionX() const
Definition Position.h:87
uint32 id
Definition SpawnData.h:135
bool SetBossState(uint32 type, EncounterState state) override
void OnCreatureRemove(Creature *creature) override
void DespawnLeviatanVehicle(Creature *vehicleCreature)
bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const *, Unit const *, uint32) override
uint32 GetCreatureEntry(ObjectGuid::LowType, CreatureData const *data) override
void SetData(uint32 type, uint32 data) override
void ProcessEvent(WorldObject *, uint32 eventId, WorldObject *) override
ObjectGuid GetGuidData(uint32 data) const override
void OnCreatureCreate(Creature *creature) override
void OnGameObjectCreate(GameObject *gameObject) override
void AddDoor(GameObject *door, bool add) override
@ ICECROWN_ILLUSION
Definition ulduar.h:500
@ STORMWIND_ILLUSION
Definition ulduar.h:501
@ CHAMBER_ILLUSION
Definition ulduar.h:499
@ EVENT_DESPAWN_LEVIATHAN_VEHICLES
Definition ulduar.h:493
@ ACTION_INIT_ALGALON
Definition ulduar.h:492
@ EVENT_LEVIATHAN_BREAK_DOOR
Definition ulduar.h:494
@ DATA_KOLOGARN
Definition ulduar.h:42
@ DATA_ASSEMBLY_OF_IRON
Definition ulduar.h:41
@ DATA_HODIR
Definition ulduar.h:44
@ DATA_STONEBARK
Definition ulduar.h:53
@ DATA_ALGALON
Definition ulduar.h:50
@ DATA_FLAME_LEVIATHAN
Definition ulduar.h:37
@ DATA_VEZAX
Definition ulduar.h:48
@ DATA_BRIGHTLEAF
Definition ulduar.h:51
@ DATA_XT002
Definition ulduar.h:40
@ DATA_RAZORSCALE
Definition ulduar.h:39
@ DATA_AURIAYA
Definition ulduar.h:43
@ DATA_MIMIRON
Definition ulduar.h:47
@ DATA_YOGG_SARON
Definition ulduar.h:49
@ DATA_THORIM
Definition ulduar.h:45
@ DATA_IGNIS
Definition ulduar.h:38
@ DATA_IRONBRANCH
Definition ulduar.h:52
@ DATA_FREYA
Definition ulduar.h:46
@ DATA_UNBROKEN
Definition ulduar.h:479
@ MAX_HERALD_WEAPON_ITEMLEVEL
Definition ulduar.h:481
@ MAX_HERALD_ARMOR_ITEMLEVEL
Definition ulduar.h:480
@ SPELL_TELEPORT_KEEPER_VISUAL
Definition ulduar.h:487
@ SPELL_LUMBERJACKED_CREDIT
Definition ulduar.h:486
@ DATA_SARA
Definition ulduar.h:428
@ DATA_MIMIRON_ELEVATOR
Definition ulduar.h:422
@ DATA_SIGILDOOR_02
Definition ulduar.h:441
@ DATA_TOY_PILE_3
Definition ulduar.h:405
@ DATA_MIMIRON_BUTTON
Definition ulduar.h:424
@ DATA_MOLGEIM
Definition ulduar.h:410
@ DATA_DRIVE_ME_CRAZY
Definition ulduar.h:435
@ DATA_THORIM_LEVER
Definition ulduar.h:453
@ DATA_RAZORSCALE_CONTROL
Definition ulduar.h:399
@ DATA_DELLORAH
Definition ulduar.h:464
@ DATA_RUNIC_DOOR
Definition ulduar.h:456
@ DATA_BRUNDIR
Definition ulduar.h:411
@ DATA_ILLUSION
Definition ulduar.h:434
@ DATA_TOY_PILE_0
Definition ulduar.h:402
@ DATA_RUNE_GIANT
Definition ulduar.h:455
@ DATA_BRANN_BRONZEBEARD_INTRO
Definition ulduar.h:462
@ DATA_STONE_DOOR
Definition ulduar.h:457
@ DATA_LORE_KEEPER_OF_NORGANNON
Definition ulduar.h:463
@ DATA_SIGILDOOR_01
Definition ulduar.h:440
@ DATA_BRONZEBEARD_RADIO
Definition ulduar.h:465
@ DATA_XT002_HEART
Definition ulduar.h:406
@ DATA_THORIM_HARDMODE
Definition ulduar.h:458
@ DATA_EXPEDITION_COMMANDER
Definition ulduar.h:398
@ DATA_STEELBREAKER
Definition ulduar.h:409
@ DATA_LEVIATHAN_MK_II
Definition ulduar.h:417
@ DATA_AZEROTH
Definition ulduar.h:449
@ DATA_BRANN_BRONZEBEARD_ALG
Definition ulduar.h:447
@ DATA_MIMIRON_YS
Definition ulduar.h:433
@ DATA_KEEPERS_COUNT
Definition ulduar.h:436
@ DATA_TOY_PILE_1
Definition ulduar.h:403
@ DATA_FREYA_YS
Definition ulduar.h:430
@ DATA_HODIR_RARE_CACHE
Definition ulduar.h:414
@ DATA_VX_001
Definition ulduar.h:418
@ DATA_SIF
Definition ulduar.h:452
@ DATA_BRAIN_OF_YOGG_SARON
Definition ulduar.h:429
@ DATA_UNIVERSE_FLOOR_02
Definition ulduar.h:444
@ DATA_THORIM_CONTROLLER
Definition ulduar.h:459
@ DATA_MIMIRON_WORLD_TRIGGER
Definition ulduar.h:421
@ DATA_UNIVERSE_GLOBE
Definition ulduar.h:445
@ DATA_GIFT_OF_THE_OBSERVER
Definition ulduar.h:448
@ DATA_UNIVERSE_FLOOR_01
Definition ulduar.h:443
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:439
@ DATA_SIGILDOOR_03
Definition ulduar.h:442
@ DATA_RUNIC_COLOSSUS
Definition ulduar.h:454
@ DATA_TOY_PILE_2
Definition ulduar.h:404
@ DATA_VOICE_OF_YOGG_SARON
Definition ulduar.h:427
@ DATA_THORIM_YS
Definition ulduar.h:432
@ DATA_AERIAL_COMMAND_UNIT
Definition ulduar.h:419
@ DATA_ALGALON_TRAPDOOR
Definition ulduar.h:446
@ DATA_COMPUTER
Definition ulduar.h:420
@ DATA_HODIR_YS
Definition ulduar.h:431
@ DATA_COLOSSUS
Definition ulduar.h:395
@ GO_DOODAD_UL_SIGILDOOR_03
Definition ulduar.h:319
@ GO_DOODAD_UL_UNIVERSEGLOBE01
Definition ulduar.h:322
@ GO_MIMIRON_ELEVATOR
Definition ulduar.h:295
@ GO_HODIR_ICE_DOOR
Definition ulduar.h:276
@ GO_BRAIN_ROOM_DOOR_2
Definition ulduar.h:311
@ GO_XT_002_DOOR
Definition ulduar.h:259
@ GO_HODIR_RARE_CACHE_OF_WINTER
Definition ulduar.h:277
@ GO_DOODAD_UL_SIGILDOOR_01
Definition ulduar.h:317
@ GO_BRAIN_ROOM_DOOR_3
Definition ulduar.h:312
@ GO_LEVIATHAN_GATE
Definition ulduar.h:248
@ GO_THORIM_RUNIC_DOOR
Definition ulduar.h:287
@ GO_GIFT_OF_THE_OBSERVER_10
Definition ulduar.h:324
@ GO_ARCHIVUM_DOOR
Definition ulduar.h:263
@ GO_KOLOGARN_BRIDGE
Definition ulduar.h:268
@ GO_THORIM_LEVER
Definition ulduar.h:290
@ GO_CACHE_OF_STORMS_HARDMODE_25
Definition ulduar.h:286
@ GO_THORIM_ENCOUNTER_DOOR
Definition ulduar.h:289
@ GO_VEZAX_DOOR
Definition ulduar.h:306
@ GO_BRAIN_ROOM_DOOR_1
Definition ulduar.h:310
@ GO_RAZOR_HARPOON_4
Definition ulduar.h:255
@ GO_DOODAD_UL_SIGILDOOR_02
Definition ulduar.h:318
@ GO_IRON_COUNCIL_DOOR
Definition ulduar.h:262
@ GO_HODIR_RARE_CACHE_OF_WINTER_HERO
Definition ulduar.h:278
@ GO_CELESTIAL_PLANETARIUM_ACCESS_25
Definition ulduar.h:316
@ GO_HODIR_ENTRANCE
Definition ulduar.h:274
@ GO_THORIM_STONE_DOOR
Definition ulduar.h:288
@ GO_DOODAD_UL_ULDUAR_TRAPDOOR_03
Definition ulduar.h:323
@ GO_HODIR_CHEST
Definition ulduar.h:280
@ GO_KOLOGARN_CHEST
Definition ulduar.h:267
@ GO_CACHE_OF_STORMS_HARDMODE_10
Definition ulduar.h:284
@ GO_THORIM_DARK_IRON_PORTCULLIS
Definition ulduar.h:291
@ GO_LEVIATHAN_DOOR
Definition ulduar.h:247
@ GO_HODIR_CHEST_HERO
Definition ulduar.h:279
@ GO_YOGG_SARON_DOOR
Definition ulduar.h:309
@ GO_CACHE_OF_STORMS_10
Definition ulduar.h:283
@ GO_RAZOR_HARPOON_3
Definition ulduar.h:254
@ GO_RAZOR_HARPOON_2
Definition ulduar.h:253
@ GO_DOODAD_UL_UNIVERSEFLOOR_01
Definition ulduar.h:320
@ GO_MIMIRON_BUTTON
Definition ulduar.h:296
@ GO_MIMIRON_DOOR_3
Definition ulduar.h:299
@ GO_CACHE_OF_STORMS_25
Definition ulduar.h:285
@ GO_MIMIRON_DOOR_1
Definition ulduar.h:297
@ GO_HODIR_DOOR
Definition ulduar.h:275
@ GO_RAZOR_HARPOON_1
Definition ulduar.h:252
@ GO_GIFT_OF_THE_OBSERVER_25
Definition ulduar.h:325
@ GO_KOLOGARN_CHEST_HERO
Definition ulduar.h:266
@ GO_CELESTIAL_PLANETARIUM_ACCESS_10
Definition ulduar.h:315
@ GO_DOODAD_UL_UNIVERSEFLOOR_02
Definition ulduar.h:321
@ GO_MIMIRON_TRAM
Definition ulduar.h:294
@ GO_MIMIRON_DOOR_2
Definition ulduar.h:298
@ GO_ANCIENT_GATE_OF_THE_KEEPERS
Definition ulduar.h:271
@ EVENT_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:330
@ EVENT_HODIRS_PROTECTIVE_GAZE_PROC
Definition ulduar.h:335
@ EVENT_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:333
@ EVENT_ACTIVATE_SANITY_WELL
Definition ulduar.h:334
@ EVENT_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:332
@ EVENT_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:331
@ ACTION_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:342
@ ACTION_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:340
@ ACTION_MOVE_TO_CENTER_POSITION
Definition ulduar.h:344
@ ACTION_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:343
@ ACTION_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:341
@ WORLD_STATE_YOGG_SARON_KEEPERS
Definition ulduar.h:471
@ NPC_VEZAX
Definition ulduar.h:82
@ NPC_BRIGHTLEAF
Definition ulduar.h:138
@ NPC_NATURES_BLADE
Definition ulduar.h:166
@ NPC_FLAME_LEVIATHAN
Definition ulduar.h:112
@ NPC_COMPUTER
Definition ulduar.h:134
@ NPC_MOLGEIM
Definition ulduar.h:69
@ NPC_FIELD_MEDIC_PENNY
Definition ulduar.h:156
@ NPC_LEVIATHAN_MKII
Definition ulduar.h:120
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition ulduar.h:239
@ NPC_HODIR_OBSERVATION_RING
Definition ulduar.h:200
@ NPC_BRUNDIR
Definition ulduar.h:70
@ NPC_GUARDIAN_LASHER
Definition ulduar.h:162
@ NPC_AMIRA_BLAZEWEAVER
Definition ulduar.h:150
@ NPC_MIMIRON_OBSERVATION_RING
Definition ulduar.h:203
@ NPC_XT_TOY_PILE
Definition ulduar.h:67
@ NPC_UNLEASHED_DARK_MATTER
Definition ulduar.h:241
@ NPC_HEART_OF_DECONSTRUCTOR
Definition ulduar.h:100
@ NPC_IRONROOT_LASHER
Definition ulduar.h:165
@ NPC_MISGUIDED_NYMPH
Definition ulduar.h:161
@ NPC_BATTLE_PRIEST_ELIZA
Definition ulduar.h:154
@ NPC_BRAIN_OF_YOGG_SARON
Definition ulduar.h:219
@ NPC_WORLD_TRIGGER_MIMIRON
Definition ulduar.h:133
@ NPC_HIGH_EXPLORER_DELLORAH
Definition ulduar.h:110
@ NPC_YOGG_SARON
Definition ulduar.h:83
@ NPC_THORIM_YS
Definition ulduar.h:209
@ NPC_SARA
Definition ulduar.h:198
@ NPC_FOREST_SWARMER
Definition ulduar.h:163
@ NPC_SISSY_FLAMECUFFS
Definition ulduar.h:153
@ NPC_FREYA
Definition ulduar.h:81
@ NPC_MERCENARY_CAPTAIN_A
Definition ulduar.h:175
@ NPC_EIVI_NIGHTFEATHER
Definition ulduar.h:144
@ NPC_THORIM
Definition ulduar.h:80
@ NPC_STONEBARK
Definition ulduar.h:139
@ NPC_SANITY_WELL
Definition ulduar.h:226
@ NPC_EXPEDITION_COMMANDER
Definition ulduar.h:91
@ NPC_ALGALON
Definition ulduar.h:84
@ NPC_XT002
Definition ulduar.h:66
@ NPC_FREYA_OBSERVATION_RING
Definition ulduar.h:201
@ NPC_HODIR_YS
Definition ulduar.h:207
@ NPC_MERCENARY_SOLDIER_H
Definition ulduar.h:178
@ NPC_RUNE_GIANT
Definition ulduar.h:181
@ NPC_THORIM_OBSERVATION_RING
Definition ulduar.h:202
@ NPC_HODIR
Definition ulduar.h:79
@ NPC_RAZORSCALE_CONTROLLER
Definition ulduar.h:95
@ NPC_BRANN_BRONZEBEARD_INTRO
Definition ulduar.h:104
@ NPC_BRONZEBEARD_RADIO
Definition ulduar.h:111
@ NPC_SALVAGED_SIEGE_ENGINE
Definition ulduar.h:61
@ NPC_AERIAL_COMMAND_UNIT
Definition ulduar.h:122
@ NPC_KAR_GREYCLOUD
Definition ulduar.h:143
@ NPC_THORIM_CONTROLLER
Definition ulduar.h:195
@ NPC_RUNIC_COLOSSUS
Definition ulduar.h:180
@ NPC_MISSY_FLAMECUFFS
Definition ulduar.h:152
@ NPC_VX_001
Definition ulduar.h:121
@ NPC_MANGROVE_ENT
Definition ulduar.h:164
@ NPC_BATTLE_PRIEST_GINA
Definition ulduar.h:155
@ NPC_IGNIS
Definition ulduar.h:63
@ NPC_LORE_KEEPER_OF_NORGANNON
Definition ulduar.h:109
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition ulduar.h:240
@ NPC_SPIRITWALKER_YONA
Definition ulduar.h:147
@ NPC_SALVAGED_CHOPPER
Definition ulduar.h:62
@ NPC_ELEMENTALIST_MAHFUUN
Definition ulduar.h:148
@ NPC_GUARDIAN_OF_LIFE
Definition ulduar.h:167
@ NPC_MIMIRON_YS
Definition ulduar.h:208
@ NPC_TOR_GREYCLOUD
Definition ulduar.h:142
@ NPC_STEELBREAKER
Definition ulduar.h:68
@ NPC_VOICE_OF_YOGG_SARON
Definition ulduar.h:204
@ NPC_AZEROTH
Definition ulduar.h:232
@ NPC_MERCENARY_CAPTAIN_H
Definition ulduar.h:176
@ NPC_KOLOGARN
Definition ulduar.h:71
@ NPC_IRONBRANCH
Definition ulduar.h:137
@ NPC_AURIAYA
Definition ulduar.h:77
@ NPC_SIF
Definition ulduar.h:193
@ NPC_RAZORSCALE
Definition ulduar.h:64
@ NPC_SPIRITWALKER_TARA
Definition ulduar.h:146
@ NPC_ELLIE_NIGHTFEATHER
Definition ulduar.h:145
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition ulduar.h:238
@ NPC_MERCENARY_SOLDIER_A
Definition ulduar.h:177
@ NPC_FREYA_YS
Definition ulduar.h:206
@ NPC_BRANN_BRONZBEARD_ALG
Definition ulduar.h:231
@ NPC_CORRUPTED_SERVITOR
Definition ulduar.h:160
@ NPC_VEESHA_BLAZEWEAVER
Definition ulduar.h:151
@ NPC_FREYA_ACHIEVE_TRIGGER
Definition ulduar.h:170
@ NPC_MIMIRON
Definition ulduar.h:78
@ NPC_ELEMENTALIST_AVUUN
Definition ulduar.h:149
@ NPC_SALVAGED_DEMOLISHER
Definition ulduar.h:60
@ NPC_FIELD_MEDIC_JESSI
Definition ulduar.h:157
#define UlduarScriptName
Definition ulduar.h:26
@ CRITERIA_C_O_U_VEZAX_25
Definition ulduar.h:388
@ CRITERIA_C_O_U_THORIM_10
Definition ulduar.h:371
@ CRITERIA_C_O_U_THORIM_25
Definition ulduar.h:385
@ CRITERIA_C_O_U_IRON_COUNCIL_25
Definition ulduar.h:381
@ CRITERIA_WAITS_DREAMING_CHAMBER_25
Definition ulduar.h:353
@ CRITERIA_C_O_U_KOLOGARN_10
Definition ulduar.h:368
@ CRITERIA_C_O_U_IGNIS_25
Definition ulduar.h:378
@ CRITERIA_WAITS_DREAMING_STORMWIND_25
Definition ulduar.h:352
@ CRITERIA_DRIVE_ME_CRAZY_25
Definition ulduar.h:359
@ CRITERIA_C_O_U_XT002_10
Definition ulduar.h:366
@ CRITERIA_C_O_U_AURIAYA_10
Definition ulduar.h:369
@ CRITERIA_C_O_U_MIMIRON_10
Definition ulduar.h:373
@ CRITERIA_WAITS_DREAMING_STORMWIND_10
Definition ulduar.h:355
@ CRITERIA_WAITS_DREAMING_ICECROWN_10
Definition ulduar.h:357
@ CRITERIA_C_O_U_XT002_25
Definition ulduar.h:380
@ CRITERIA_C_O_U_LEVIATHAN_10
Definition ulduar.h:363
@ CRITERIA_C_O_U_IGNIS_10
Definition ulduar.h:364
@ CRITERIA_C_O_U_YOGG_SARON_10
Definition ulduar.h:375
@ CRITERIA_CON_SPEED_ATORY
Definition ulduar.h:349
@ CRITERIA_C_O_U_HODIR_25
Definition ulduar.h:384
@ CRITERIA_C_O_U_VEZAX_10
Definition ulduar.h:374
@ CRITERIA_C_O_U_FREYA_10
Definition ulduar.h:372
@ CRITERIA_C_O_U_KOLOGARN_25
Definition ulduar.h:382
@ CRITERIA_C_O_U_RAZORSCALE_25
Definition ulduar.h:379
@ CRITERIA_WAITS_DREAMING_CHAMBER_10
Definition ulduar.h:356
@ CRITERIA_C_O_U_RAZORSCALE_10
Definition ulduar.h:365
@ CRITERIA_C_O_U_HODIR_10
Definition ulduar.h:370
@ CRITERIA_LUMBERJACKED
Definition ulduar.h:350
@ CRITERIA_DRIVE_ME_CRAZY_10
Definition ulduar.h:358
@ CRITERIA_HERALD_OF_TITANS
Definition ulduar.h:360
@ CRITERIA_C_O_U_LEVIATHAN_25
Definition ulduar.h:377
@ CRITERIA_C_O_U_AURIAYA_25
Definition ulduar.h:383
@ CRITERIA_WAITS_DREAMING_ICECROWN_25
Definition ulduar.h:354
@ CRITERIA_C_O_U_FREYA_25
Definition ulduar.h:386
@ CRITERIA_C_O_U_YOGG_SARON_25
Definition ulduar.h:389
@ CRITERIA_C_O_U_IRON_COUNCIL_10
Definition ulduar.h:367
@ CRITERIA_C_O_U_MIMIRON_25
Definition ulduar.h:387