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 {
207
208 // Creatures
210
213
218
219 // GameObjects
229
231
232 // 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 {
413 default:
414 return entry;
415 }
416 }
417
418 void OnCreatureRemove(Creature* creature) override
419 {
421
422 switch (creature->GetEntry())
423 {
424 case NPC_XT_TOY_PILE:
425 for (uint8 i = 0; i < 4; ++i)
426 {
427 if (XTToyPileGUIDs[i] == creature->GetGUID())
428 {
430 break;
431 }
432 }
433 break;
434 case NPC_STEELBREAKER:
435 case NPC_MOLGEIM:
436 case NPC_BRUNDIR:
437 AddMinion(creature, false);
438 break;
439 default:
440 break;
441 }
442 }
443
444 void OnGameObjectCreate(GameObject* gameObject) override
445 {
447
448 switch (gameObject->GetEntry())
449 {
452 KologarnChestGUID = gameObject->GetGUID();
453 break;
455 KologarnBridgeGUID = gameObject->GetGUID();
457 HandleGameObject(ObjectGuid::Empty, false, gameObject);
458 break;
461 break;
464 CacheOfStormsGUID = gameObject->GetGUID();
465 break;
468 CacheOfStormsHardmodeGUID = gameObject->GetGUID();
469 break;
472 HodirRareCacheGUID = gameObject->GetGUID();
473 break;
475 case GO_HODIR_CHEST:
476 HodirChestGUID = gameObject->GetGUID();
477 break;
478 case GO_MIMIRON_TRAM:
479 MimironTramGUID = gameObject->GetGUID();
480 break;
482 LeviathanGateGUID = gameObject->GetGUID();
484 gameObject->SetGoState(GO_STATE_DESTROYED);
485 break;
487 BrainRoomDoorGUIDs[0] = gameObject->GetGUID();
488 break;
490 BrainRoomDoorGUIDs[1] = gameObject->GetGUID();
491 break;
493 BrainRoomDoorGUIDs[2] = gameObject->GetGUID();
494 break;
498 gameObject->SetFlag(GO_FLAG_IN_USE);
499 break;
503 gameObject->SetGoState(GO_STATE_ACTIVE);
504 break;
505 default:
506 break;
507 }
508 }
509
510 void OnUnitDeath(Unit* unit) override
511 {
512 Creature* creature = unit->ToCreature();
513 if (!creature)
514 return;
515
516 switch (creature->GetEntry())
517 {
522 case NPC_MANGROVE_ENT:
526 if (!conSpeedAtory)
527 {
529 conSpeedAtory = true;
530 }
531 break;
532 case NPC_IRONBRANCH:
533 case NPC_STONEBARK:
534 case NPC_BRIGHTLEAF:
535 if (!lumberjacked)
536 {
538 lumberjacked = true;
539 }
540 break;
541 default:
542 break;
543 }
544 }
545
546 void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId, WorldObject* /*invoker*/) override
547 {
548 switch (eventId)
549 {
550 // Flame Leviathan's Tower Event triggers
552 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
553 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_STORM_DESTROYED);
554 break;
556 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
557 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FROST_DESTROYED);
558 break;
560 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
561 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_FLAMES_DESTROYED);
562 break;
564 if (Creature* flameLeviathan = GetCreature(DATA_FLAME_LEVIATHAN))
565 flameLeviathan->AI()->DoAction(ACTION_TOWER_OF_LIFE_DESTROYED);
566 break;
567
568 // Hodir Event triggers
570 if (Creature* hodir = GetCreature(DATA_HODIR))
571 hodir->AI()->DoAction(ACTION_INITIAL_AGGRO_HODIR);
572 break;
574 if (Creature* hodir = GetCreature(DATA_HODIR))
575 hodir->AI()->DoAction(ACTION_CACHE_SHATTERED);
576 if (GameObject* hodirRareCache = instance->GetGameObject(HodirRareCacheGUID))
577 hodirRareCache->ActivateObject(GameObjectActions::Despawn, 0);
578 break;
580 if (Creature* hodir = GetCreature(DATA_HODIR))
581 hodir->AI()->DoAction(ACTION_FLASH_FREEZE_FINISHED);
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))
645 hodirRareCache->ActivateObject(GameObjectActions::MakeActive, 0);
647 hodirChest->ActivateObject(GameObjectActions::MakeActive, 0);
648
650 }
651 break;
652 case DATA_THORIM:
653 if (state == DONE)
654 {
655 if (Creature* thorim = GetCreature(DATA_THORIM))
656 {
658 {
659 cache->SetTapList(thorim->GetTapList());
660 cache->SetRespawnTime(cache->GetRespawnDelay());
661 cache->RemoveFlag(GO_FLAG_LOCKED);
662 cache->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
663 cache->RemoveFlag(GO_FLAG_NODESPAWN);
664 }
665 }
666
668 }
669 else
670 {
673 }
674 break;
675 case DATA_ALGALON:
676 if (state == DONE)
677 {
679 gift->SetRespawnTime(gift->GetRespawnDelay());
680 // get item level (recheck weapons)
681 Map::PlayerList const& players = instance->GetPlayers();
682 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
683 if (Player* player = itr->GetSource())
684 for (uint8 slot = EQUIPMENT_SLOT_MAINHAND; slot <= EQUIPMENT_SLOT_OFFHAND; ++slot)
685 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
686 if (item->GetItemLevel(player) > _maxWeaponItemLevel)
687 _maxWeaponItemLevel = item->GetItemLevel(player);
688 }
689 else if (state == IN_PROGRESS)
690 {
691 _algalonFirstIntro = false;
692 // get item level (armor cannot be swapped in combat)
693 Map::PlayerList const& players = instance->GetPlayers();
694 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
695 {
696 if (Player* player = itr->GetSource())
697 {
698 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
699 {
700 if (slot == EQUIPMENT_SLOT_TABARD || slot == EQUIPMENT_SLOT_BODY)
701 continue;
702
703 if (Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
704 {
705 if (slot >= EQUIPMENT_SLOT_MAINHAND && slot <= EQUIPMENT_SLOT_OFFHAND)
706 {
707 if (item->GetItemLevel(player) > _maxWeaponItemLevel)
708 _maxWeaponItemLevel = item->GetItemLevel(player);
709 }
710 else if (item->GetItemLevel(player) > _maxArmorItemLevel)
711 _maxArmorItemLevel = item->GetItemLevel(player);
712 }
713 }
714 }
715 }
716 }
717 break;
718 }
719
720 return true;
721 }
722
723 void SetData(uint32 type, uint32 data) override
724 {
725 switch (type)
726 {
727 case DATA_COLOSSUS:
728 ColossusData = data;
729 if (data >= 2 && GetBossState(DATA_FLAME_LEVIATHAN) == NOT_STARTED)
730 {
732 }
733 break;
734 case DATA_UNBROKEN:
735 Unbroken = data != 0;
736 break;
737 case DATA_ILLUSION:
738 illusion = data;
739 break;
741 IsDriveMeCrazyEligible = data ? true : false;
742 break;
744 _algalonSummoned = true;
745 break;
746 default:
747 break;
748 }
749 }
750
751 void SetGuidData(uint32 /*type*/, ObjectGuid /*data*/) override
752 {
753 }
754
755 ObjectGuid GetGuidData(uint32 data) const override
756 {
757 switch (data)
758 {
759 // XT-002 Deconstructor
760 case DATA_TOY_PILE_0:
761 case DATA_TOY_PILE_1:
762 case DATA_TOY_PILE_2:
763 case DATA_TOY_PILE_3:
764 return XTToyPileGUIDs[data - DATA_TOY_PILE_0];
765
766 // Assembly of Iron
768 return AssemblyGUIDs[0];
769 case DATA_MOLGEIM:
770 return AssemblyGUIDs[1];
771 case DATA_BRUNDIR:
772 return AssemblyGUIDs[2];
773
774 // Freya
775 case DATA_BRIGHTLEAF:
776 return ElderGUIDs[0];
777 case DATA_IRONBRANCH:
778 return ElderGUIDs[1];
779 case DATA_STONEBARK:
780 return ElderGUIDs[2];
781
782 // Mimiron
784 return MimironVehicleGUIDs[0];
785 case DATA_VX_001:
786 return MimironVehicleGUIDs[1];
788 return MimironVehicleGUIDs[2];
789
790 // Yogg-Saron
792 return BrainRoomDoorGUIDs[0];
794 return BrainRoomDoorGUIDs[1];
796 return BrainRoomDoorGUIDs[2];
797 case DATA_FREYA_YS:
798 return KeeperGUIDs[0];
799 case DATA_HODIR_YS:
800 return KeeperGUIDs[1];
801 case DATA_THORIM_YS:
802 return KeeperGUIDs[2];
803 case DATA_MIMIRON_YS:
804 return KeeperGUIDs[3];
805 }
806
807 return InstanceScript::GetGuidData(data);
808 }
809
810 uint32 GetData(uint32 type) const override
811 {
812 switch (type)
813 {
814 case DATA_COLOSSUS:
815 return ColossusData;
816 case DATA_UNBROKEN:
817 return uint32(Unbroken);
818 case DATA_ILLUSION:
819 return illusion;
821 return keepersCount;
822 default:
823 break;
824 }
825
826 return 0;
827 }
828
829 bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const*, Unit const* /* = nullptr */, uint32 /* = 0 */) override
830 {
831 switch (criteriaId)
832 {
840 return illusion == CHAMBER_ILLUSION;
843 return illusion == ICECROWN_ILLUSION;
873 return false;
874 }
875
876 return false;
877 }
878
893
894 void Update(uint32 diff) override
895 {
896 if (_events.Empty())
897 return;
898
899 _events.Update(diff);
900
901 while (uint32 eventId = _events.ExecuteEvent())
902 {
903 switch (eventId)
904 {
906 // Eject all players from vehicles and make them untargetable.
907 // They will be despawned after a while
908 for (auto const& vehicleGuid : LeviathanVehicleGUIDs)
909 if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid))
910 DespawnLeviatanVehicle(vehicleCreature);
911 break;
913 if (Creature* leviathan = GetCreature(DATA_FLAME_LEVIATHAN))
914 leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
916 gameObject->SetGoState(GO_STATE_DESTROYED);
917 break;
918 }
919 }
920 }
921
922 void DespawnLeviatanVehicle(Creature* vehicleCreature)
923 {
924 if (Vehicle* vehicle = vehicleCreature->GetVehicleKit())
925 {
926 vehicle->RemoveAllPassengers();
927 vehicleCreature->SetUninteractible(true);
928 vehicleCreature->DespawnOrUnsummon(5min);
929 }
930 }
931
932 void UpdateDoorState(GameObject* door) override
933 {
934 // Leviathan doors are set to EncounterStateForOpenDoor::NotInProgress except the one it uses to enter the room
935 // which has to be set to EncounterStateForOpenDoor::Done
936 if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f)
938 else
940 }
941
942 void AddDoor(GameObject* door, bool add) override
943 {
944 // Leviathan doors are South except the one it uses to enter the room
945 // which is North and should not be used for boundary checks in BossAI::IsInBoundary()
946 if (door->GetEntry() == GO_LEVIATHAN_DOOR && door->GetPositionX() > 400.f)
947 {
948 if (add)
950 else
952
953 if (add)
954 UpdateDoorState(door);
955 }
956 else
957 InstanceScript::AddDoor(door, add);
958 }
959
960 private:
969 };
970
972 {
973 return new instance_ulduar_InstanceMapScript(map);
974 }
975};
976
978{
979 new instance_ulduar();
980}
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:718
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:730
@ EQUIPMENT_SLOT_TABARD
Definition Player.h:733
@ EQUIPMENT_SLOT_END
Definition Player.h:734
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:731
@ EQUIPMENT_SLOT_START
Definition Player.h:714
constexpr uint8 INVENTORY_SLOT_BAG_0
Definition Player.h:706
@ TEAM_HORDE
@ 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:190
void SetReactState(ReactStates st)
Definition Creature.h:180
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:235
void SetTapList(GuidUnorderedSet tapList)
Definition Creature.h:313
void Update(uint32 time)
Definition EventMap.h:77
bool Empty() const
Definition EventMap.h:105
EventId ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void SetGoState(GOState state)
void SetFlag(GameObjectFlags flags)
Definition GameObject.h:283
TeamId GetTeamIdInInstance() const
Definition Map.cpp:3441
Team GetTeamInInstance() const
Definition Map.h:908
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:185
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:1191
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3588
PlayerList const & GetPlayers() const
Definition Map.h:408
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:3578
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:528
UlduarKeeperDespawnEvent(Creature *owner, Milliseconds despawnTimerOffset=500ms)
bool Execute(uint64, uint32) override
virtual void DoAction(int32 param)
Definition UnitAI.h:73
Definition Unit.h:647
void SetUninteractible(bool apply)
Definition Unit.cpp:8583
Vehicle * GetVehicleKit() const
Definition Unit.h:1798
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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:513
@ STORMWIND_ILLUSION
Definition ulduar.h:514
@ CHAMBER_ILLUSION
Definition ulduar.h:512
@ EVENT_DESPAWN_LEVIATHAN_VEHICLES
Definition ulduar.h:506
@ ACTION_INIT_ALGALON
Definition ulduar.h:505
@ EVENT_LEVIATHAN_BREAK_DOOR
Definition ulduar.h:507
@ 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:492
@ MAX_HERALD_WEAPON_ITEMLEVEL
Definition ulduar.h:494
@ MAX_HERALD_ARMOR_ITEMLEVEL
Definition ulduar.h:493
@ SPELL_TELEPORT_KEEPER_VISUAL
Definition ulduar.h:500
@ SPELL_LUMBERJACKED_CREDIT
Definition ulduar.h:499
@ DATA_SARA
Definition ulduar.h:431
@ DATA_MIMIRON_ELEVATOR
Definition ulduar.h:425
@ DATA_SIGILDOOR_02
Definition ulduar.h:444
@ DATA_TOY_PILE_3
Definition ulduar.h:411
@ DATA_MIMIRON_BUTTON
Definition ulduar.h:427
@ DATA_MOLGEIM
Definition ulduar.h:416
@ DATA_DRIVE_ME_CRAZY
Definition ulduar.h:438
@ DATA_THORIM_LEVER
Definition ulduar.h:456
@ DATA_RAZORSCALE_CONTROL
Definition ulduar.h:405
@ DATA_DELLORAH
Definition ulduar.h:467
@ DATA_RUNIC_DOOR
Definition ulduar.h:459
@ DATA_BRUNDIR
Definition ulduar.h:417
@ DATA_ILLUSION
Definition ulduar.h:437
@ DATA_TOY_PILE_0
Definition ulduar.h:408
@ DATA_RUNE_GIANT
Definition ulduar.h:458
@ DATA_BRANN_BRONZEBEARD_INTRO
Definition ulduar.h:465
@ DATA_STONE_DOOR
Definition ulduar.h:460
@ DATA_LORE_KEEPER_OF_NORGANNON
Definition ulduar.h:466
@ DATA_SIGILDOOR_01
Definition ulduar.h:443
@ DATA_BRONZEBEARD_RADIO
Definition ulduar.h:468
@ DATA_XT002_HEART
Definition ulduar.h:412
@ DATA_THORIM_HARDMODE
Definition ulduar.h:461
@ DATA_EXPEDITION_COMMANDER
Definition ulduar.h:404
@ DATA_STEELBREAKER
Definition ulduar.h:415
@ DATA_LEVIATHAN_MK_II
Definition ulduar.h:420
@ DATA_AZEROTH
Definition ulduar.h:452
@ DATA_BRANN_BRONZEBEARD_ALG
Definition ulduar.h:450
@ DATA_MIMIRON_YS
Definition ulduar.h:436
@ DATA_KEEPERS_COUNT
Definition ulduar.h:439
@ DATA_TOY_PILE_1
Definition ulduar.h:409
@ DATA_FREYA_YS
Definition ulduar.h:433
@ DATA_VX_001
Definition ulduar.h:421
@ DATA_SIF
Definition ulduar.h:455
@ DATA_BRAIN_OF_YOGG_SARON
Definition ulduar.h:432
@ DATA_UNIVERSE_FLOOR_02
Definition ulduar.h:447
@ DATA_THORIM_CONTROLLER
Definition ulduar.h:462
@ DATA_MIMIRON_WORLD_TRIGGER
Definition ulduar.h:424
@ DATA_UNIVERSE_GLOBE
Definition ulduar.h:448
@ DATA_GIFT_OF_THE_OBSERVER
Definition ulduar.h:451
@ DATA_UNIVERSE_FLOOR_01
Definition ulduar.h:446
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:442
@ DATA_SIGILDOOR_03
Definition ulduar.h:445
@ DATA_RUNIC_COLOSSUS
Definition ulduar.h:457
@ DATA_TOY_PILE_2
Definition ulduar.h:410
@ DATA_VOICE_OF_YOGG_SARON
Definition ulduar.h:430
@ DATA_THORIM_YS
Definition ulduar.h:435
@ DATA_AERIAL_COMMAND_UNIT
Definition ulduar.h:422
@ DATA_ALGALON_TRAPDOOR
Definition ulduar.h:449
@ DATA_COMPUTER
Definition ulduar.h:423
@ DATA_HODIR_YS
Definition ulduar.h:434
@ DATA_COLOSSUS
Definition ulduar.h:401
@ 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_INITIAL_AGGRO_HODIR
Definition ulduar.h:334
@ EVENT_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:330
@ EVENT_HODIRS_PROTECTIVE_GAZE_PROC
Definition ulduar.h:338
@ EVENT_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:333
@ EVENT_CACHE_SHATTERED
Definition ulduar.h:335
@ EVENT_FLASH_FREEZE_FINISHED
Definition ulduar.h:336
@ EVENT_ACTIVATE_SANITY_WELL
Definition ulduar.h:337
@ EVENT_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:332
@ EVENT_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:331
@ WORLD_STATE_ULDUAR_TEAM_IN_INSTANCE
Definition ulduar.h:478
@ WORLD_STATE_YOGG_SARON_KEEPERS
Definition ulduar.h:486
@ 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_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_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_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_FREYA
Definition ulduar.h:81
@ NPC_MERCENARY_CAPTAIN_A
Definition ulduar.h:175
@ 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_THORIM_CONTROLLER
Definition ulduar.h:195
@ NPC_RUNIC_COLOSSUS
Definition ulduar.h:180
@ NPC_VX_001
Definition ulduar.h:121
@ NPC_MANGROVE_ENT
Definition ulduar.h:164
@ 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_SALVAGED_CHOPPER
Definition ulduar.h:62
@ NPC_GUARDIAN_OF_LIFE
Definition ulduar.h:167
@ NPC_MIMIRON_YS
Definition ulduar.h:208
@ 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_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_FREYA_ACHIEVE_TRIGGER
Definition ulduar.h:170
@ NPC_MIMIRON
Definition ulduar.h:78
@ NPC_SALVAGED_DEMOLISHER
Definition ulduar.h:60
@ ACTION_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:345
@ ACTION_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:343
@ ACTION_MOVE_TO_CENTER_POSITION
Definition ulduar.h:347
@ ACTION_FLASH_FREEZE_FINISHED
Definition ulduar.h:350
@ ACTION_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:346
@ ACTION_INITIAL_AGGRO_HODIR
Definition ulduar.h:348
@ ACTION_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:344
@ ACTION_CACHE_SHATTERED
Definition ulduar.h:349
#define UlduarScriptName
Definition ulduar.h:26
@ CRITERIA_C_O_U_VEZAX_25
Definition ulduar.h:394
@ CRITERIA_C_O_U_THORIM_10
Definition ulduar.h:377
@ CRITERIA_C_O_U_THORIM_25
Definition ulduar.h:391
@ CRITERIA_C_O_U_IRON_COUNCIL_25
Definition ulduar.h:387
@ CRITERIA_WAITS_DREAMING_CHAMBER_25
Definition ulduar.h:359
@ CRITERIA_C_O_U_KOLOGARN_10
Definition ulduar.h:374
@ CRITERIA_C_O_U_IGNIS_25
Definition ulduar.h:384
@ CRITERIA_WAITS_DREAMING_STORMWIND_25
Definition ulduar.h:358
@ CRITERIA_DRIVE_ME_CRAZY_25
Definition ulduar.h:365
@ CRITERIA_C_O_U_XT002_10
Definition ulduar.h:372
@ CRITERIA_C_O_U_AURIAYA_10
Definition ulduar.h:375
@ CRITERIA_C_O_U_MIMIRON_10
Definition ulduar.h:379
@ CRITERIA_WAITS_DREAMING_STORMWIND_10
Definition ulduar.h:361
@ CRITERIA_WAITS_DREAMING_ICECROWN_10
Definition ulduar.h:363
@ CRITERIA_C_O_U_XT002_25
Definition ulduar.h:386
@ CRITERIA_C_O_U_LEVIATHAN_10
Definition ulduar.h:369
@ CRITERIA_C_O_U_IGNIS_10
Definition ulduar.h:370
@ CRITERIA_C_O_U_YOGG_SARON_10
Definition ulduar.h:381
@ CRITERIA_CON_SPEED_ATORY
Definition ulduar.h:355
@ CRITERIA_C_O_U_HODIR_25
Definition ulduar.h:390
@ CRITERIA_C_O_U_VEZAX_10
Definition ulduar.h:380
@ CRITERIA_C_O_U_FREYA_10
Definition ulduar.h:378
@ CRITERIA_C_O_U_KOLOGARN_25
Definition ulduar.h:388
@ CRITERIA_C_O_U_RAZORSCALE_25
Definition ulduar.h:385
@ CRITERIA_WAITS_DREAMING_CHAMBER_10
Definition ulduar.h:362
@ CRITERIA_C_O_U_RAZORSCALE_10
Definition ulduar.h:371
@ CRITERIA_C_O_U_HODIR_10
Definition ulduar.h:376
@ CRITERIA_LUMBERJACKED
Definition ulduar.h:356
@ CRITERIA_DRIVE_ME_CRAZY_10
Definition ulduar.h:364
@ CRITERIA_HERALD_OF_TITANS
Definition ulduar.h:366
@ CRITERIA_C_O_U_LEVIATHAN_25
Definition ulduar.h:383
@ CRITERIA_C_O_U_AURIAYA_25
Definition ulduar.h:389
@ CRITERIA_WAITS_DREAMING_ICECROWN_25
Definition ulduar.h:360
@ CRITERIA_C_O_U_FREYA_25
Definition ulduar.h:392
@ CRITERIA_C_O_U_YOGG_SARON_25
Definition ulduar.h:395
@ CRITERIA_C_O_U_IRON_COUNCIL_10
Definition ulduar.h:373
@ CRITERIA_C_O_U_MIMIRON_25
Definition ulduar.h:393