AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
instance_ulduar::instance_ulduar_InstanceMapScript Struct Reference
Inheritance diagram for instance_ulduar::instance_ulduar_InstanceMapScript:
InstanceScript ZoneScript

Public Member Functions

 instance_ulduar_InstanceMapScript (Map *map)
 
void Initialize () override
 
void FillInitialWorldStates (WorldPackets::WorldState::InitWorldStates &packet) override
 
uint32 AlgalonMinutesLeft () const
 
void ExpireAlgalonCountdown ()
 
void DespawnLeviathanGauntlet ()
 
void UnlockLeviathanVehicles ()
 
void SpawnObservationRingKeepers ()
 
void SpawnLeviathanOutro (bool justKilled)
 
void StartLeviathanOutroSequence ()
 
void PlayBrannRhydianLine (uint8 index)
 
void OnPlayerEnter (Player *player) override
 
bool IsEncounterInProgress () const override
 
void ProcessEvent (WorldObject *, uint32 eventId) override
 
bool SetBossState (uint32 type, EncounterState state) override
 
void OnCreatureCreate (Creature *creature) override
 
void OnCreatureEvade (Creature *creature) override
 
void OpenIfDone (uint32 encounter, GameObject *go, GOState state)
 
GameObject * GetHodirChest (bool hardmode)
 
void OnGameObjectCreate (GameObject *gameObject) override
 
void respawnHodirHardmodeChest ()
 
void setChestsLootable (uint32 boss)
 
void SetData (uint32 type, uint32 data) override
 
ObjectGuid GetGuidData (uint32 data) const override
 
uint32 GetData (uint32 type) const override
 
void OnUnitDeath (Unit *unit) override
 
void Load (char const *data) override
 
void Update (uint32 diff) override
 
void SpawnLeviathanEncounterVehicles (uint8 mode)
 
void SummonLeviathanVehicle (uint32 entry, uint32 index)
 
void ScheduleLeviathanVehicleRespawn (Creature *vehicle)
 
bool CheckAchievementCriteriaMeet (uint32 criteria_id, Player const *, Unit const *, uint32) override
 
bool CheckRequiredBosses (uint32 bossId, Player const *player) const override
 
- Public Member Functions inherited from InstanceScript
 InstanceScript (Map *map)
 
 ~InstanceScript () override
 
virtual void CreatureLooted (Creature *, LootType)
 
virtual std::string GetSaveData ()
 
void SaveToDB ()
 
void OnCreatureCreate (Creature *creature) override
 
void OnCreatureRemove (Creature *creature) override
 
void OnGameObjectCreate (GameObject *go) override
 
void OnGameObjectRemove (GameObject *go) override
 
ObjectGuid GetObjectGuid (uint32 type) const
 
ObjectGuid GetGuidData (uint32 type) const override
 
Creature * GetCreature (uint32 type)
 
GameObject * GetGameObject (uint32 type)
 
virtual void OnPlayerLeave (Player *)
 
virtual void OnPlayerAreaUpdate (Player *, uint32, uint32)
 
virtual void OnPlayerInWaterStateUpdate (Player *, bool)
 
void HandleGameObject (ObjectGuid guid, bool open, GameObject *go=nullptr)
 Open or close a GameObject by GUID.
 
void HandleGameObject (uint32 type, bool open)
 Open or close a GameObject registered via LoadObjectData.
 
void DoUseDoorOrButton (ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
 
void DoRespawnGameObject (ObjectGuid guid, uint32 timeToDespawn=MINUTE)
 
void DoRespawnGameObject (uint32 type)
 
void DoRespawnCreature (ObjectGuid guid, bool force=false)
 
void DoRespawnCreature (uint32 type, bool force=false)
 
void DoUpdateWorldState (uint32 worldstateId, uint32 worldstateValue)
 
void DoSendNotifyToInstance (char const *format,...)
 
void DoUpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void DoStartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void DoStopTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void DoRemoveAurasDueToSpellOnPlayers (uint32 spell)
 
void DoCastSpellOnPlayers (uint32 spell)
 
void DoCastSpellOnPlayer (Player *player, uint32 spell, bool includePets, bool includeControlled)
 
bool ServerAllowsTwoSideGroups ()
 
EncounterState GetBossState (uint32 id) const
 
void RegisterBossSpawn (ObjectGuid::LowType spawnId, uint32 bossId)
 
bool IsBossSpawnDone (ObjectGuid::LowType spawnId) const
 
CreatureBoundary const * GetBossBoundary (uint32 id) const
 
BossInfo const * GetBossInfo (uint32 id) const
 
uint32 GetPersistentData (uint32 index) const
 
void StorePersistentData (uint32 index, uint32 data)
 
bool _SkipCheckRequiredBosses (Player const *player=nullptr) const
 
void SetCompletedEncountersMask (uint32 newMask, bool save)
 
uint32 GetCompletedEncounterMask () const
 
void SendEncounterUnit (uint32 type, Unit *unit=nullptr, uint8 param1=0, uint8 param2=0)
 
uint32 GetEncounterCount () const
 
void MarkAreaTriggerDone (uint32 id)
 
void ResetAreaTriggerDone (uint32 id)
 
bool IsAreaTriggerDone (uint32 id) const
 
virtual void DoAction (int32)
 
void DoForAllMinions (uint32 id, std::function< void(Creature *)> exec)
 
void StoreGameObjectState (ObjectGuid::LowType spawnId, uint8 state)
 
uint8 GetStoredGameObjectState (ObjectGuid::LowType spawnId) const
 
void LoadInstanceSavedGameobjectStateData ()
 
bool IsBossDone (uint32 bossId) const
 
bool AllBossesDone () const
 
bool AllBossesDone (std::initializer_list< uint32 > bossIds) const
 
TeamId GetTeamIdInInstance () const
 
void SetTeamIdInInstance (TeamId teamId)
 
bool IsTwoFactionInstance () const
 
- Public Member Functions inherited from ZoneScript
 ZoneScript ()
 
virtual ~ZoneScript ()
 
virtual uint32 GetCreatureEntry (ObjectGuid::LowType, CreatureData const *data)
 
virtual uint32 GetGameObjectEntry (ObjectGuid::LowType, uint32 entry)
 
virtual void SetGuidData (uint32, ObjectGuid)
 
virtual uint64 GetData64 (uint32) const
 
virtual void SetData64 (uint32, uint64)
 

Public Attributes

ObjectGuid _leviathanVisualTowers [4][2]
 
ObjectGuid _repairSGUID [2]
 
bool _leviathanTowers [4]
 
std::vector< LeviathanVehicle > _leviathanVehicles
 
uint8 _leviathanVehicleMode
 
bool _leviathanVehiclesUsable
 
GuidUnorderedSet _leviathanGauntletGUIDs
 
GuidUnorderedSet _leviathanBeaconGUIDs
 
GuidList _leviathanCrewGUIDs
 
bool _leviathanOutroSpawned
 
bool _leviathanSequenceStarted
 
ObjectGuid _formationRhydianGUID
 
ObjectGuid _leviathanMachineGUID
 
bool _hmHodir
 
Position const triggerAncientGatePosition = { 1883.65f, 269.272f, 418.406f }
 
EventMap _events
 
bool _mimironTramUsed
 
bool _algalonArrivalPending
 
- Public Attributes inherited from InstanceScript
Map * instance
 
TaskScheduler scheduler
 

Additional Inherited Members

- Static Public Member Functions inherited from InstanceScript
static std::string GetBossStateName (uint8 state)
 
- Protected Member Functions inherited from InstanceScript
void SetHeaders (std::string const &dataHeaders)
 
void SetBossNumber (uint32 number)
 
void SetPersistentDataCount (uint32 number)
 
void LoadBossBoundaries (BossBoundaryData const &data)
 
void LoadDoorData (DoorData const *data)
 
void LoadMinionData (MinionData const *data)
 
void LoadObjectData (ObjectData const *creatureData, ObjectData const *gameObjectData)
 
void LoadSummonData (ObjectData const *data)
 
void SetSummoner (Creature *creature)
 
void AddObject (Creature *obj, bool add=true)
 
void RemoveObject (Creature *obj)
 
void AddObject (GameObject *obj, bool add=true)
 
void RemoveObject (GameObject *obj)
 
void AddObject (WorldObject *obj, uint32 type, bool add=true)
 
void RemoveObject (WorldObject *obj, uint32 type)
 
void AddDoor (GameObject *door, bool add=true)
 
void RemoveDoor (GameObject *door)
 
void AddMinion (Creature *minion, bool add=true)
 
void RemoveMinion (Creature *minion)
 
void UpdateDoorState (GameObject *door)
 
void UpdateMinionState (Creature *minion, EncounterState state)
 
bool ReadSaveDataHeaders (std::istringstream &data)
 
void ReadSaveDataBossStates (std::istringstream &data)
 
void ReadSavePersistentData (std::istringstream &data)
 
virtual void ReadSaveDataMore (std::istringstream &)
 
void WriteSaveDataHeaders (std::ostringstream &data)
 
void WriteSaveDataBossStates (std::ostringstream &data)
 
void WritePersistentData (std::ostringstream &data)
 
virtual void WriteSaveDataMore (std::ostringstream &)
 

Detailed Description

Constructor & Destructor Documentation

◆ instance_ulduar_InstanceMapScript()

instance_ulduar::instance_ulduar_InstanceMapScript::instance_ulduar_InstanceMapScript ( Map *  map)
inline
223 : InstanceScript(map)
224 {
232 Initialize();
233 };
#define DataHeader
Definition blackrock_depths.h:23
Definition InstanceScript.h:143
void SetBossNumber(uint32 number)
Definition InstanceScript.h:311
void LoadSummonData(ObjectData const *data)
Definition InstanceScript.cpp:228
void SetPersistentDataCount(uint32 number)
Definition InstanceScript.h:312
void LoadDoorData(DoorData const *data)
Definition InstanceScript.cpp:192
void LoadBossBoundaries(BossBoundaryData const &data)
Definition InstanceScript.cpp:162
void SetHeaders(std::string const &dataHeaders)
Definition InstanceScript.cpp:169
void LoadObjectData(ObjectData const *creatureData, ObjectData const *gameObjectData)
Definition InstanceScript.cpp:204
constexpr auto MAX_ENCOUNTER
Definition instance_blackrock_depths.cpp:26
ObjectData const creatureData[]
Definition instance_ulduar.cpp:102
DoorData const doorData[]
Definition instance_ulduar.cpp:32
ObjectData const gameobjectData[]
Definition instance_ulduar.cpp:148
BossBoundaryData const boundaries
Definition instance_ulduar.cpp:195
ObjectData const summonData[]
Definition instance_ulduar.cpp:188
@ MAX_PERSISTENT_DATA
Definition magisters_terrace.h:39
void Initialize() override
Definition instance_ulduar.cpp:261

References boundaries, creatureData, DataHeader, doorData, gameobjectData, Initialize(), InstanceScript::LoadBossBoundaries(), InstanceScript::LoadDoorData(), InstanceScript::LoadObjectData(), InstanceScript::LoadSummonData(), MAX_ENCOUNTER, MAX_PERSISTENT_DATA, InstanceScript::SetBossNumber(), InstanceScript::SetHeaders(), InstanceScript::SetPersistentDataCount(), and summonData.

Member Function Documentation

◆ AlgalonMinutesLeft()

uint32 instance_ulduar::instance_ulduar_InstanceMapScript::AlgalonMinutesLeft ( ) const
inline
301 {
302 uint32 now = uint32(GameTime::GetGameTime().count());
304 if (deadline <= now)
305 return 0;
306 return std::min<uint32>((deadline - now + MINUTE - 1) / MINUTE, TIMER_ALGALON_MINUTES);
307 }
constexpr auto MINUTE
Definition Common.h:47
std::uint32_t uint32
Definition Define.h:107
uint32 GetPersistentData(uint32 index) const
Definition InstanceScript.h:260
Seconds GetGameTime()
Definition GameTime.cpp:39
@ PERSISTENT_DATA_ALGALON_DEADLINE
Definition ulduar.h:363
@ TIMER_ALGALON_MINUTES
Definition ulduar.h:425

References GameTime::GetGameTime(), InstanceScript::GetPersistentData(), MINUTE, PERSISTENT_DATA_ALGALON_DEADLINE, and TIMER_ALGALON_MINUTES.

Referenced by Load(), and Update().

◆ CheckAchievementCriteriaMeet()

bool instance_ulduar::instance_ulduar_InstanceMapScript::CheckAchievementCriteriaMeet ( uint32  criteria_id,
Player const *  ,
Unit const *  ,
uint32   
)
inlineoverridevirtual

Reimplemented from InstanceScript.

1277 {
1279 switch (criteria_id)
1280 {
1281 case 10042:
1282 case 10352:
1283 return (mask & (1 << BOSS_LEVIATHAN)) == 0;
1284 case 10342:
1285 case 10355:
1286 return (mask & (1 << BOSS_IGNIS)) == 0;
1287 case 10340:
1288 case 10353:
1289 return (mask & (1 << BOSS_RAZORSCALE)) == 0;
1290 case 10341:
1291 case 10354:
1292 return (mask & (1 << BOSS_XT002)) == 0;
1293 case 10598:
1294 case 10599:
1295 return (mask & (1 << BOSS_ASSEMBLY)) == 0;
1296 case 10348:
1297 case 10357:
1298 return (mask & (1 << BOSS_KOLOGARN)) == 0;
1299 case 10351:
1300 case 10363:
1301 return (mask & (1 << BOSS_AURIAYA)) == 0;
1302 case 10439:
1303 case 10719:
1304 return (mask & (1 << BOSS_HODIR)) == 0;
1305 case 10403:
1306 case 10404:
1307 return (mask & (1 << BOSS_THORIM)) == 0;
1308 case 10582:
1309 case 10583:
1310 return (mask & (1 << BOSS_FREYA)) == 0;
1311 case 10347:
1312 case 10361:
1313 return (mask & (1 << BOSS_MIMIRON)) == 0;
1314 case 10349:
1315 case 10362:
1316 return (mask & (1 << BOSS_VEZAX)) == 0;
1317 case 10350:
1318 case 10364:
1319 return (mask & (1 << BOSS_YOGGSARON)) == 0;
1320 }
1321 return false;
1322 }
@ PERSISTENT_DATA_C_OF_ULDUAR_MASK
Definition ulduar.h:358
@ BOSS_IGNIS
Definition ulduar.h:32
@ BOSS_LEVIATHAN
Definition ulduar.h:31
@ BOSS_RAZORSCALE
Definition ulduar.h:33
@ BOSS_YOGGSARON
Definition ulduar.h:43
@ BOSS_HODIR
Definition ulduar.h:38
@ BOSS_KOLOGARN
Definition ulduar.h:36
@ BOSS_THORIM
Definition ulduar.h:39
@ BOSS_FREYA
Definition ulduar.h:40
@ BOSS_AURIAYA
Definition ulduar.h:37
@ BOSS_XT002
Definition ulduar.h:34
@ BOSS_MIMIRON
Definition ulduar.h:41
@ BOSS_VEZAX
Definition ulduar.h:42
@ BOSS_ASSEMBLY
Definition ulduar.h:35

References BOSS_ASSEMBLY, BOSS_AURIAYA, BOSS_FREYA, BOSS_HODIR, BOSS_IGNIS, BOSS_KOLOGARN, BOSS_LEVIATHAN, BOSS_MIMIRON, BOSS_RAZORSCALE, BOSS_THORIM, BOSS_VEZAX, BOSS_XT002, BOSS_YOGGSARON, InstanceScript::GetPersistentData(), and PERSISTENT_DATA_C_OF_ULDUAR_MASK.

◆ CheckRequiredBosses()

bool instance_ulduar::instance_ulduar_InstanceMapScript::CheckRequiredBosses ( uint32  bossId,
Player const *  player 
) const
inlineoverridevirtual

Reimplemented from InstanceScript.

1325 {
1326 if (_SkipCheckRequiredBosses(player))
1327 return true;
1328
1329 switch (bossId)
1330 {
1331 case BOSS_YOGGSARON:
1333 return false;
1334 break;
1335 default:
1336 break;
1337 }
1338
1339 return true;
1340 }
@ DONE
Definition InstanceScript.h:61
EncounterState GetBossState(uint32 id) const
Definition InstanceScript.h:252
bool _SkipCheckRequiredBosses(Player const *player=nullptr) const
Definition InstanceScript.cpp:401

References InstanceScript::_SkipCheckRequiredBosses(), BOSS_VEZAX, BOSS_YOGGSARON, DONE, and InstanceScript::GetBossState().

◆ DespawnLeviathanGauntlet()

void instance_ulduar::instance_ulduar_InstanceMapScript::DespawnLeviathanGauntlet ( )
inline
317 {
318 for (ObjectGuid const& guid : _leviathanGauntletGUIDs)
319 if (Creature* creature = instance->GetCreature(guid))
320 creature->DespawnOrUnsummon(0ms, 7_days);
322
323 for (ObjectGuid const& guid : _leviathanBeaconGUIDs)
324 if (GameObject* beacon = instance->GetGameObject(guid))
325 beacon->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true);
326 _leviathanBeaconGUIDs.clear();
327 }
@ GO_DESTRUCTIBLE_DESTROYED
Definition SharedDefines.h:1633
Definition Creature.h:47
Definition GameObject.h:125
Creature * GetCreature(uint32 type)
Definition InstanceScript.cpp:126
Map * instance
Definition InstanceScript.h:149
GameObject * GetGameObject(uint32 type)
Definition InstanceScript.cpp:131
Definition ObjectGuid.h:121
GuidUnorderedSet _leviathanGauntletGUIDs
Definition instance_ulduar.cpp:242
GuidUnorderedSet _leviathanBeaconGUIDs
Definition instance_ulduar.cpp:243

References _leviathanBeaconGUIDs, _leviathanGauntletGUIDs, Map::GetCreature(), Map::GetGameObject(), GO_DESTRUCTIBLE_DESTROYED, and InstanceScript::instance.

Referenced by SetBossState().

◆ ExpireAlgalonCountdown()

void instance_ulduar::instance_ulduar_InstanceMapScript::ExpireAlgalonCountdown ( )
inline
310 {
312 if (Creature* algalon = GetCreature(BOSS_ALGALON))
313 algalon->AI()->DoAction(ACTION_DESPAWN_ALGALON);
314 }
void SetData(uint32 type, uint32 data) override
Definition instance_ulduar.cpp:962
@ ACTION_DESPAWN_ALGALON
Definition ulduar.h:419
@ BOSS_ALGALON
Definition ulduar.h:44
@ DATA_ALGALON_DEFEATED
Definition ulduar.h:105

References ACTION_DESPAWN_ALGALON, BOSS_ALGALON, DATA_ALGALON_DEFEATED, InstanceScript::GetCreature(), and SetData().

Referenced by Load(), and Update().

◆ FillInitialWorldStates()

void instance_ulduar::instance_ulduar_InstanceMapScript::FillInitialWorldStates ( WorldPackets::WorldState::InitWorldStates &  packet)
inlineoverridevirtual

Reimplemented from InstanceScript.

288 {
289 uint32 algalonTimer =
291 packet.Worldstates.reserve(2);
292 packet.Worldstates.emplace_back(
294 (algalonTimer && algalonTimer <= TIMER_ALGALON_MINUTES) ? 1 : 0);
295 packet.Worldstates.emplace_back(
297 std::min<uint32>(algalonTimer, TIMER_ALGALON_MINUTES));
298 }
@ WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED
Definition WorldStateDefines.h:567
@ WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER
Definition WorldStateDefines.h:566
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
@ PERSISTENT_DATA_ALGALON_TIMER
Definition ulduar.h:357

References InstanceScript::GetPersistentData(), PERSISTENT_DATA_ALGALON_TIMER, TIMER_ALGALON_MINUTES, WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED, and WorldPackets::WorldState::InitWorldStates::Worldstates.

◆ GetData()

uint32 instance_ulduar::instance_ulduar_InstanceMapScript::GetData ( uint32  type) const
inlineoverridevirtual

Reimplemented from ZoneScript.

1115 {
1116 switch (type)
1117 {
1123
1124 case DATA_MAGE_BARRIER:
1125 return GetPersistentData(
1127
1128 case DATA_CALL_TRAM:
1129 return _mimironTramUsed;
1130 }
1131
1132 return 0;
1133 }
bool _mimironTramUsed
Definition instance_ulduar.cpp:258
bool _leviathanTowers[4]
Definition instance_ulduar.cpp:238
@ PERSISTENT_DATA_MAGE_BARRIER
Definition ulduar.h:359
@ EVENT_TOWER_OF_STORM_DESTROYED
Definition ulduar.h:401
@ EVENT_TOWER_OF_LIFE_DESTROYED
Definition ulduar.h:404
@ EVENT_TOWER_OF_FLAMES_DESTROYED
Definition ulduar.h:403
@ EVENT_TOWER_OF_FROST_DESTROYED
Definition ulduar.h:402
@ DATA_MAGE_BARRIER
Definition ulduar.h:146
@ DATA_CALL_TRAM
Definition ulduar.h:121

References _leviathanTowers, _mimironTramUsed, DATA_CALL_TRAM, DATA_MAGE_BARRIER, EVENT_TOWER_OF_FLAMES_DESTROYED, EVENT_TOWER_OF_FROST_DESTROYED, EVENT_TOWER_OF_LIFE_DESTROYED, EVENT_TOWER_OF_STORM_DESTROYED, InstanceScript::GetPersistentData(), and PERSISTENT_DATA_MAGE_BARRIER.

◆ GetGuidData()

ObjectGuid instance_ulduar::instance_ulduar_InstanceMapScript::GetGuidData ( uint32  data) const
inlineoverridevirtual

Reimplemented from ZoneScript.

1100 {
1101 switch (data)
1102 {
1103 // Flame Leviathan
1105 return _repairSGUID[0];
1107 return _repairSGUID[1];
1108
1109 }
1110
1111 return GetObjectGuid(data);
1112 }
ObjectGuid GetObjectGuid(uint32 type) const
Definition InstanceScript.cpp:109
ObjectGuid _repairSGUID[2]
Definition instance_ulduar.cpp:237
@ DATA_REPAIR_STATION1
Definition ulduar.h:65
@ DATA_REPAIR_STATION2
Definition ulduar.h:66

References _repairSGUID, DATA_REPAIR_STATION1, DATA_REPAIR_STATION2, and InstanceScript::GetObjectGuid().

◆ GetHodirChest()

GameObject * instance_ulduar::instance_ulduar_InstanceMapScript::GetHodirChest ( bool  hardmode)
inline
761 {
762 if (hardmode)
763 {
765 return go;
767 }
768
770 return go;
772 }
@ DATA_HODIR_CHEST_NORMAL
Definition ulduar.h:140
@ DATA_HODIR_CHEST_NORMAL_HERO
Definition ulduar.h:142
@ DATA_HODIR_CHEST_HARD
Definition ulduar.h:141
@ DATA_HODIR_CHEST_HARD_HERO
Definition ulduar.h:143

References DATA_HODIR_CHEST_HARD, DATA_HODIR_CHEST_HARD_HERO, DATA_HODIR_CHEST_NORMAL, DATA_HODIR_CHEST_NORMAL_HERO, and InstanceScript::GetGameObject().

Referenced by ProcessEvent(), respawnHodirHardmodeChest(), setChestsLootable(), and SetData().

◆ Initialize()

void instance_ulduar::instance_ulduar_InstanceMapScript::Initialize ( )
inlineoverridevirtual

Reimplemented from InstanceScript.

262 {
263 // Flame Leviathan
264 for (uint8 i = 0; i < 4; ++i)
265 _leviathanTowers[i] = true;
266
267 _leviathanVehicles.clear();
271 _leviathanBeaconGUIDs.clear();
272 _leviathanCrewGUIDs.clear();
277
278 // Hodir
279 _hmHodir = true; // If players fail the Hardmode then becomes false
280
281 // Shared
282 _events.Reset();
283 _mimironTramUsed = false;
285 }
std::uint8_t uint8
Definition Define.h:109
void Reset()
Definition EventMap.cpp:21
void Clear()
Definition ObjectGuid.h:141
uint8 _leviathanVehicleMode
Definition instance_ulduar.cpp:240
GuidList _leviathanCrewGUIDs
Definition instance_ulduar.cpp:244
ObjectGuid _leviathanMachineGUID
Definition instance_ulduar.cpp:248
EventMap _events
Definition instance_ulduar.cpp:257
bool _algalonArrivalPending
Definition instance_ulduar.cpp:259
bool _leviathanSequenceStarted
Definition instance_ulduar.cpp:246
ObjectGuid _formationRhydianGUID
Definition instance_ulduar.cpp:247
bool _leviathanVehiclesUsable
Definition instance_ulduar.cpp:241
bool _hmHodir
Definition instance_ulduar.cpp:251
bool _leviathanOutroSpawned
Definition instance_ulduar.cpp:245
std::vector< LeviathanVehicle > _leviathanVehicles
Definition instance_ulduar.cpp:239
@ VEHICLE_POS_NONE
Definition ulduar.h:372

References _algalonArrivalPending, _events, _formationRhydianGUID, _hmHodir, _leviathanBeaconGUIDs, _leviathanCrewGUIDs, _leviathanGauntletGUIDs, _leviathanMachineGUID, _leviathanOutroSpawned, _leviathanSequenceStarted, _leviathanTowers, _leviathanVehicleMode, _leviathanVehicles, _leviathanVehiclesUsable, _mimironTramUsed, ObjectGuid::Clear(), EventMap::Reset(), and VEHICLE_POS_NONE.

Referenced by instance_ulduar_InstanceMapScript().

◆ IsEncounterInProgress()

bool instance_ulduar::instance_ulduar_InstanceMapScript::IsEncounterInProgress ( ) const
inlineoverridevirtual

Reimplemented from InstanceScript.

549 {
550 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
551 {
552 if (GetBossState(i) == IN_PROGRESS)
553 return true;
554 }
555
556 // Leviathan does not use IN_PROGRESS type, instead SPECIAL is set and never reset,
557 // Check if he is in combat.
559 if (l->IsInCombat())
560 return true;
561
562 return false;
563 }
@ IN_PROGRESS
Definition InstanceScript.h:59
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2442

References BOSS_LEVIATHAN, InstanceScript::GetBossState(), Map::GetCreature(), InstanceScript::GetObjectGuid(), IN_PROGRESS, InstanceScript::instance, and MAX_ENCOUNTER.

◆ Load()

void instance_ulduar::instance_ulduar_InstanceMapScript::Load ( char const *  data)
inlineoverridevirtual

Reimplemented from InstanceScript.

1185 {
1187
1188 uint32 algalonTimer =
1190 if (algalonTimer == TIMER_ALGALON_SUMMONED)
1191 {
1195 algalonTimer = TIMER_ALGALON_TO_SUMMON;
1196 }
1197
1198 if (!algalonTimer || algalonTimer > TIMER_ALGALON_MINUTES
1200 return;
1201
1204 uint32(GameTime::GetGameTime().count()) + algalonTimer * MINUTE);
1205
1206 uint32 minutesLeft = AlgalonMinutesLeft();
1207 if (!minutesLeft)
1208 {
1210 return;
1211 }
1212
1217 }
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:70
virtual void Load(char const *data)
Definition InstanceScript.cpp:475
void StorePersistentData(uint32 index, uint32 data)
Definition InstanceScript.cpp:446
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
Definition InstanceScript.cpp:645
uint32 AlgalonMinutesLeft() const
Definition instance_ulduar.cpp:300
void ExpireAlgalonCountdown()
Definition instance_ulduar.cpp:309
@ TIMER_ALGALON_SUMMONED
Definition ulduar.h:424
@ EVENT_UPDATE_ALGALON_TIMER
Definition ulduar.h:415
@ TIMER_ALGALON_TO_SUMMON
Definition ulduar.h:423

References _events, AlgalonMinutesLeft(), BOSS_ALGALON, DONE, InstanceScript::DoUpdateWorldState(), EVENT_UPDATE_ALGALON_TIMER, ExpireAlgalonCountdown(), InstanceScript::GetBossState(), GameTime::GetGameTime(), InstanceScript::GetPersistentData(), InstanceScript::Load(), MINUTE, PERSISTENT_DATA_ALGALON_DEADLINE, PERSISTENT_DATA_ALGALON_TIMER, EventMap::RescheduleEvent(), InstanceScript::StorePersistentData(), TIMER_ALGALON_MINUTES, TIMER_ALGALON_SUMMONED, TIMER_ALGALON_TO_SUMMON, WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, and WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED.

◆ OnCreatureCreate()

void instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate ( Creature *  creature)
inlineoverridevirtual

These creatures are summoned by something else than Algalon but need to be controlled/despawned by him - so they need to be registered in his summon list

Reimplemented from ZoneScript.

666 {
668
669 switch (creature->GetEntry())
670 {
671 case NPC_KOLOGARN:
673 {
674 creature->SetDisableGravity(true);
675 creature->SetPosition(creature->GetHomePosition());
677 creature->SetHealth(0);
679 creature->ReplaceAllDynamicFlags(0);
680 creature->SetCorpseDelay(7 * DAY);
681 creature->SetCorpseRemoveTime(7 * DAY);
683 creature->StopMovingOnCurrentPos();
684 }
685 break;
686 case NPC_ALGALON:
687 {
689 if (!algalonTimer || (algalonTimer == TIMER_ALGALON_DEFEATED && GetBossState(BOSS_ALGALON) == DONE))
690 {
692 creature->DespawnOrUnsummon();
693 }
694 else if (algalonTimer == TIMER_ALGALON_DEFEATED)
695 {
697 creature->AI()->DoAction(ACTION_START_INTRO);
698 scheduler.Schedule(6s, [this, guid = creature->GetGUID()](TaskContext /*context*/)
699 {
700 if (Creature* algalon = instance->GetCreature(guid))
701 algalon->AI()->DoAction(ACTION_DESPAWN_ALGALON);
702 });
703 }
704 else if (_algalonArrivalPending)
705 {
707 creature->AI()->DoAction(ACTION_START_INTRO);
708 }
709 break;
710 }
711 // Gone for good once Flame Leviathan is defeated
717 creature->DespawnOrUnsummon(0ms, 7_days);
718 else
719 _leviathanGauntletGUIDs.insert(creature->GetGUID());
720 break;
723 {
724 // Waypoint patrols survive the kill (sniffed); only the static spawns are cleared
725 CreatureData const* data = creature->GetCreatureData();
726 if (data && data->movementType == WAYPOINT_MOTION_TYPE)
727 break;
729 creature->DespawnOrUnsummon(0ms, 7_days);
730 else
731 _leviathanGauntletGUIDs.insert(creature->GetGUID());
732 break;
733 }
741 if (Creature* algalon = GetCreature(BOSS_ALGALON))
742 algalon->AI()->JustSummoned(creature);
743 break;
744 }
745 }
constexpr auto DAY
Definition Common.h:49
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:35
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:282
@ ACTION_START_INTRO
Definition boss_nightbane.cpp:57
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition Creature.cpp:1972
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:349
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3366
CreatureData const * GetCreatureData() const
Definition Creature.h:208
void SetCorpseRemoveTime(uint32 delay)
Definition Creature.cpp:3902
void SetCorpseDelay(uint32 delay)
Definition Creature.h:73
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2221
CreatureAI * AI() const
Definition Creature.h:143
void OnCreatureCreate(Creature *creature) override
Definition InstanceScript.cpp:75
bool IsBossDone(uint32 bossId) const
Definition InstanceScript.h:300
TaskScheduler scheduler
Definition InstanceScript.h:308
uint32 GetEntry() const
Definition Object.h:123
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:120
Definition TaskScheduler.h:422
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
Definition TaskScheduler.h:233
virtual void DoAction(int32)
Definition UnitAI.h:217
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:775
void SetHealth(uint32 val)
Definition Unit.cpp:12020
void StopMovingOnCurrentPos()
Definition Unit.cpp:12748
void SetDisableGravity(bool disable)
Definition Unit.cpp:16208
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:754
void SetStandState(uint8 state)
Definition Unit.cpp:12801
Definition CreatureData.h:370
uint8 movementType
Definition CreatureData.h:382
@ TIMER_ALGALON_DEFEATED
Definition ulduar.h:422
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition ulduar.h:251
@ NPC_UNLEASHED_DARK_MATTER
Definition ulduar.h:253
@ NPC_ALGALON
Definition ulduar.h:186
@ NPC_ULDUAR_COLOSSUS
Definition ulduar.h:231
@ NPC_DEFENDER_GENERATED
Definition ulduar.h:234
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition ulduar.h:252
@ NPC_ULDUAR_GAUNTLET_GENERATOR
Definition ulduar.h:233
@ NPC_KOLOGARN
Definition ulduar.h:174
@ NPC_IRONWORK_CANNON
Definition ulduar.h:232
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition ulduar.h:250
@ NPC_RUNEFORGED_SENTRY
Definition ulduar.h:236
@ NPC_STEELFORGED_DEFENDER
Definition ulduar.h:230

References _algalonArrivalPending, _leviathanGauntletGUIDs, ACTION_START_INTRO, Creature::AI(), BOSS_ALGALON, BOSS_KOLOGARN, BOSS_LEVIATHAN, Corpse, DAY, Creature::DespawnOrUnsummon(), UnitAI::DoAction(), DONE, InstanceScript::GetBossState(), InstanceScript::GetCreature(), Creature::GetCreatureData(), Object::GetEntry(), Object::GetGUID(), Creature::GetHomePosition(), InstanceScript::GetPersistentData(), InstanceScript::IsBossDone(), CreatureData::movementType, NPC_ALGALON, NPC_ALGALON_STALKER_ASTEROID_TARGET_01, NPC_ALGALON_STALKER_ASTEROID_TARGET_02, NPC_ALGALON_VOID_ZONE_VISUAL_STALKER, NPC_DEFENDER_GENERATED, NPC_IRONWORK_CANNON, NPC_KOLOGARN, NPC_RUNEFORGED_SENTRY, NPC_STEELFORGED_DEFENDER, NPC_ULDUAR_COLOSSUS, NPC_ULDUAR_GAUNTLET_GENERATOR, NPC_UNLEASHED_DARK_MATTER, InstanceScript::OnCreatureCreate(), PERSISTENT_DATA_ALGALON_TIMER, Unit::ReplaceAllDynamicFlags(), TaskScheduler::Schedule(), InstanceScript::scheduler, Creature::SetCorpseDelay(), Creature::SetCorpseRemoveTime(), Creature::setDeathState(), Unit::SetDisableGravity(), Unit::SetHealth(), Creature::SetPosition(), Unit::SetStandState(), Unit::SetUnitFlag(), Unit::StopMovingOnCurrentPos(), TIMER_ALGALON_DEFEATED, UNIT_FLAG_NOT_SELECTABLE, UNIT_STAND_STATE_STAND, and WAYPOINT_MOTION_TYPE.

◆ OnCreatureEvade()

void instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureEvade ( Creature *  creature)
inlineoverridevirtual

Reimplemented from ZoneScript.

748 {
749 // The map re-summons Algalon 20s after his hard-reset evade; the new one replays the arrival
750 if (creature->GetEntry() == NPC_ALGALON && GetBossState(BOSS_ALGALON) != DONE)
752 }

References _algalonArrivalPending, BOSS_ALGALON, DONE, InstanceScript::GetBossState(), Object::GetEntry(), and NPC_ALGALON.

◆ OnGameObjectCreate()

void instance_ulduar::instance_ulduar_InstanceMapScript::OnGameObjectCreate ( GameObject *  gameObject)
inlineoverridevirtual

Reimplemented from ZoneScript.

775 {
777
778 if ((gameObject->GetEntry() >= GO_STORM_BEACON_FIRST && gameObject->GetEntry() <= GO_STORM_BEACON_LAST)
780 {
782 {
783 // Deferred: this hook runs before the object is in world, where SetDestructibleState
784 // cannot swap the collision model and AddToWorld would re-enable collision
785 scheduler.Schedule(1ms, [this, guid = gameObject->GetGUID()](TaskContext /*context*/)
786 {
787 if (GameObject* beacon = instance->GetGameObject(guid))
788 beacon->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true);
789 });
790 }
791 else
792 _leviathanBeaconGUIDs.insert(gameObject->GetGUID());
793 return;
794 }
795
796 switch (gameObject->GetEntry())
797 {
798 // Flame Leviathan
800 {
801 if (_repairSGUID[0])
802 _repairSGUID[1] = gameObject->GetGUID();
803 else
804 _repairSGUID[0] = gameObject->GetGUID();
805 break;
806 }
809 _leviathanVisualTowers[3][0] = gameObject->GetGUID();
810 break;
813 _leviathanVisualTowers[0][0] = gameObject->GetGUID();
814 break;
817 _leviathanVisualTowers[2][0] = gameObject->GetGUID();
818 break;
821 _leviathanVisualTowers[1][0] = gameObject->GetGUID();
822 break;
825 _leviathanVisualTowers[3][1] = gameObject->GetGUID();
826 break;
829 _leviathanVisualTowers[0][1] = gameObject->GetGUID();
830 break;
833 _leviathanVisualTowers[2][1] = gameObject->GetGUID();
834 break;
837 _leviathanVisualTowers[1][1] = gameObject->GetGUID();
838 break;
842 break;
847 gameObject->DespawnOrUnsummon(0ms, 7_days);
848 break;
851 break;
852 case GO_KEEPERS_GATE:
855 break;
856 // Mimiron, Hodir, Vezax
858 gameObject->EnableCollision(false);
859 break;
860 case GO_SNOW_MOUND:
861 gameObject->EnableCollision(false);
862 break;
863 // Hodir loot chests: spawned locked via gameobject_template_addon,
864 // unlocked by setChestsLootable() when the encounter is defeated
870 {
872 gameObject->SetLootRecipient(instance);
873 }
874 break;
875 // Mimiron Tram
876 case GO_MIMIRON_TRAM:
878 _mimironTramUsed = true;
879 break;
880 // Algalon the Observer
885 break;
891 gameObject->EnableCollision(false);
892 break;
895 gameObject->SetGoState(GO_STATE_ACTIVE);
896 break;
899 gameObject->SetGoState(GO_STATE_ACTIVE);
900 break;
901 // Herbs
902 case 191019: // Adder's Tongue
903 case 190176: // Frost Lotus
904 case 190171: // Lichbloom
905 case 190170: // Talandra's Rose
906 case 189973: // Goldclover
908 gameObject->SetRespawnTime(7 * DAY);
909 break;
910 // Freya Loot
911 case 194324:
912 case 194325:
913 case 194326:
914 case 194327:
915 case 194328:
916 case 194329:
917 case 194330:
918 case 194331:
919 gameObject->SetLootRecipient(instance);
920 break;
921 }
922 }
@ GO_STATE_READY
Definition GameObjectData.h:709
@ GO_STATE_ACTIVE
Definition GameObjectData.h:708
@ GO_STATE_ACTIVE_ALTERNATIVE
Definition GameObjectData.h:710
@ GO_FLAG_NOT_SELECTABLE
Definition SharedDefines.h:1611
@ GO_FLAG_IN_USE
Definition SharedDefines.h:1607
@ GO_FLAG_LOCKED
Definition SharedDefines.h:1608
void SetGoState(GOState state)
Definition GameObject.cpp:2582
void SetGameObjectFlag(GameObjectFlags flags)
Definition GameObject.h:224
void EnableCollision(bool enable)
Definition GameObject.cpp:2709
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1403
void SetLootRecipient(Creature *creature)
Definition GameObject.cpp:2751
void RemoveGameObjectFlag(GameObjectFlags flags)
Definition GameObject.h:225
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forcedRespawnTime=0s)
Definition GameObject.cpp:1043
void OnGameObjectCreate(GameObject *go) override
Definition InstanceScript.cpp:96
bool AllBossesDone() const
Definition InstanceScript.cpp:832
void OpenIfDone(uint32 encounter, GameObject *go, GOState state)
Definition instance_ulduar.cpp:754
ObjectGuid _leviathanVisualTowers[4][2]
Definition instance_ulduar.cpp:236
@ PERSISTENT_DATA_LEVIATHAN_VEHICLES_USABLE
Definition ulduar.h:362
@ MAGE_BARRIER_LOWERED
Definition ulduar.h:375
@ GO_DOODAD_UL_SIGILDOOR_03
Definition ulduar.h:343
@ GO_DOODAD_UL_UNIVERSEGLOBE01
Definition ulduar.h:346
@ GO_MIMIRON_ELEVATOR
Definition ulduar.h:309
@ GO_DOODAD_UL_SIGILDOOR_01
Definition ulduar.h:341
@ GO_KOLOGARN_BRIDGE
Definition ulduar.h:295
@ GO_LEVIATHAN_DOORS
Definition ulduar.h:276
@ GO_THORIMS_TARGETTING_CRYSTAL
Definition ulduar.h:283
@ GO_HODIR_CHEST_NORMAL
Definition ulduar.h:263
@ GO_DOODAD_UL_SIGILDOOR_02
Definition ulduar.h:342
@ GO_MIMIRONS_TARGETTING_CRYSTAL
Definition ulduar.h:280
@ GO_FREYAS_GENERATOR
Definition ulduar.h:285
@ GO_STORM_BEACON_FIRST
Definition ulduar.h:288
@ GO_HODIR_CHEST_NORMAL_HERO
Definition ulduar.h:264
@ GO_HODIRS_GENERATOR
Definition ulduar.h:286
@ GO_CELESTIAL_PLANETARIUM_ACCESS_25
Definition ulduar.h:340
@ GO_DOODAD_UL_ULDUAR_TRAPDOOR_03
Definition ulduar.h:347
@ GO_HODIR_CHEST_HARD_HERO
Definition ulduar.h:266
@ GO_DOODAD_UL_UNIVERSEFLOOR_01
Definition ulduar.h:344
@ GO_KEEPERS_GATE
Definition ulduar.h:296
@ GO_ULDUAR_PROTECTIVE_BUBBLE
Definition ulduar.h:279
@ GO_THORIMS_GENERATOR
Definition ulduar.h:287
@ GO_REPAIR_STATION_TRAP
Definition ulduar.h:275
@ GO_HODIRS_TARGETTING_CRYSTAL
Definition ulduar.h:282
@ GO_SNOW_MOUND
Definition ulduar.h:318
@ GO_STORM_BEACON_LAST
Definition ulduar.h:289
@ GO_MIMIRONS_GENERATOR
Definition ulduar.h:284
@ GO_HODIR_CHEST_HARD
Definition ulduar.h:265
@ GO_STORM_BEACON_FORMATION_GROUNDS
Definition ulduar.h:290
@ GO_CELESTIAL_PLANETARIUM_ACCESS_10
Definition ulduar.h:339
@ GO_DOODAD_UL_UNIVERSEFLOOR_02
Definition ulduar.h:345
@ GO_MIMIRON_TRAM
Definition ulduar.h:300
@ GO_FREYAS_TARGETTING_CRYSTAL
Definition ulduar.h:281

References _leviathanBeaconGUIDs, _leviathanVisualTowers, _mimironTramUsed, _repairSGUID, InstanceScript::AllBossesDone(), BOSS_FREYA, BOSS_HODIR, BOSS_KOLOGARN, BOSS_LEVIATHAN, BOSS_MIMIRON, BOSS_THORIM, DAY, GameObject::DespawnOrUnsummon(), DONE, GameObject::EnableCollision(), InstanceScript::GetBossState(), Object::GetEntry(), Object::GetGUID(), InstanceScript::GetPersistentData(), GO_CELESTIAL_PLANETARIUM_ACCESS_10, GO_CELESTIAL_PLANETARIUM_ACCESS_25, GO_DOODAD_UL_SIGILDOOR_01, GO_DOODAD_UL_SIGILDOOR_02, GO_DOODAD_UL_SIGILDOOR_03, GO_DOODAD_UL_ULDUAR_TRAPDOOR_03, GO_DOODAD_UL_UNIVERSEFLOOR_01, GO_DOODAD_UL_UNIVERSEFLOOR_02, GO_DOODAD_UL_UNIVERSEGLOBE01, GO_FLAG_IN_USE, GO_FLAG_LOCKED, GO_FLAG_NOT_SELECTABLE, GO_FREYAS_GENERATOR, GO_FREYAS_TARGETTING_CRYSTAL, GO_HODIR_CHEST_HARD, GO_HODIR_CHEST_HARD_HERO, GO_HODIR_CHEST_NORMAL, GO_HODIR_CHEST_NORMAL_HERO, GO_HODIRS_GENERATOR, GO_HODIRS_TARGETTING_CRYSTAL, GO_KEEPERS_GATE, GO_KOLOGARN_BRIDGE, GO_LEVIATHAN_DOORS, GO_MIMIRON_ELEVATOR, GO_MIMIRON_TRAM, GO_MIMIRONS_GENERATOR, GO_MIMIRONS_TARGETTING_CRYSTAL, GO_REPAIR_STATION_TRAP, GO_SNOW_MOUND, GO_STATE_ACTIVE, GO_STATE_ACTIVE_ALTERNATIVE, GO_STATE_READY, GO_STORM_BEACON_FIRST, GO_STORM_BEACON_FORMATION_GROUNDS, GO_STORM_BEACON_LAST, GO_THORIMS_GENERATOR, GO_THORIMS_TARGETTING_CRYSTAL, GO_ULDUAR_PROTECTIVE_BUBBLE, InstanceScript::instance, InstanceScript::IsBossDone(), MAGE_BARRIER_LOWERED, InstanceScript::OnGameObjectCreate(), OpenIfDone(), PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_LEVIATHAN_VEHICLES_USABLE, PERSISTENT_DATA_MAGE_BARRIER, GameObject::RemoveGameObjectFlag(), TaskScheduler::Schedule(), InstanceScript::scheduler, GameObject::SetGameObjectFlag(), GameObject::SetGoState(), GameObject::SetLootRecipient(), and GameObject::SetRespawnTime().

◆ OnPlayerEnter()

void instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter ( Player *  player)
inlineoverridevirtual

Reimplemented from InstanceScript.

513 {
515 SpawnLeviathanOutro(false);
516 // The salvaged vehicles wait for the raid at the Expedition Base Camp, they are not tied to Brann's intro.
517 // Keyed on the mode rather than on the pool being empty: a pool whose wrecks are all pending replacement
518 // is empty too, and respawning over it would leave the camp with a double set once the timers fire.
521
522 // mimiron tram:
523 if (GameObject* MimironTram = GetGameObject(DATA_MIMIRON_TRAM))
524 {
525 player->UpdateVisibilityOf(MimironTram);
526 if (StaticTransport* t = MimironTram->ToStaticTransport())
527 {
529 if (!go->GetTransport())
530 t->AddPassenger(go, true);
532 if (!go->GetTransport())
533 t->AddPassenger(go, true);
534 }
535 }
536
538
539 // Only covers an instance reload: after a wipe the map re-summons Algalon itself 20s after
540 // the evade, so wait long enough for that respawn to land first.
542 if (!GetCreature(BOSS_ALGALON) && algalonTimer
543 && (algalonTimer <= TIMER_ALGALON_MINUTES || algalonTimer == TIMER_ALGALON_TO_SUMMON)
546 }
@ SPECIAL
Definition InstanceScript.h:62
bool HasTimeUntilEvent(EventId eventId) const
Definition EventMap.cpp:209
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:48
StaticTransport * ToStaticTransport()
Definition GameObject.h:344
void UpdateVisibilityOf(WorldObject *target)
Definition PlayerUpdates.cpp:1740
Definition Transport.h:120
void SpawnLeviathanOutro(bool justKilled)
Definition instance_ulduar.cpp:355
void SpawnLeviathanEncounterVehicles(uint8 mode)
Definition instance_ulduar.cpp:1386
void SpawnObservationRingKeepers()
Definition instance_ulduar.cpp:342
@ VEHICLE_POS_START
Definition ulduar.h:370
@ EVENT_RESUMMON_ALGALON
Definition ulduar.h:416
@ DATA_MIMIRON_TRAM
Definition ulduar.h:83
@ DATA_MIMIRON_ACTIVATE_TRAM
Definition ulduar.h:84
@ DATA_MIMIRON_TRAM_ROCKET_BOOSTER
Definition ulduar.h:85

References _events, _leviathanVehicleMode, BOSS_ALGALON, BOSS_LEVIATHAN, DATA_MIMIRON_ACTIVATE_TRAM, DATA_MIMIRON_TRAM, DATA_MIMIRON_TRAM_ROCKET_BOOSTER, EVENT_RESUMMON_ALGALON, InstanceScript::GetBossState(), InstanceScript::GetCreature(), InstanceScript::GetGameObject(), InstanceScript::GetPersistentData(), EventMap::HasTimeUntilEvent(), InstanceScript::IsBossDone(), PERSISTENT_DATA_ALGALON_TIMER, EventMap::ScheduleEvent(), SpawnLeviathanEncounterVehicles(), SpawnLeviathanOutro(), SpawnObservationRingKeepers(), SPECIAL, TIMER_ALGALON_MINUTES, TIMER_ALGALON_TO_SUMMON, GameObject::ToStaticTransport(), Player::UpdateVisibilityOf(), VEHICLE_POS_NONE, and VEHICLE_POS_START.

◆ OnUnitDeath()

void instance_ulduar::instance_ulduar_InstanceMapScript::OnUnitDeath ( Unit *  unit)
inlineoverridevirtual

Reimplemented from ZoneScript.

1136 {
1137 if (Creature* creature = unit->ToCreature())
1139
1140 // Feeds on Tears achievement
1141 if (unit->IsPlayer())
1142 {
1144 if (Creature* algalon = GetCreature(BOSS_ALGALON))
1145 algalon->AI()->DoAction(ACTION_FEEDS_ON_TEARS_FAILED);
1146 }
1147 else if (unit->IsCreature() && unit->GetAreaId() == AREA_THE_CONSERVATORY_OF_LIFE)
1148 {
1149 uint32 conspeedatory =
1151 if (GameTime::GetGameTime().count() > (conspeedatory + DAY))
1152 {
1155 21597 /*CON-SPEED-ATORY_TIMED_CRITERIA*/);
1157 GameTime::GetGameTime().count());
1158 }
1159 }
1160
1161 // achievement Champion/Conqueror of Ulduar
1162 if (unit->IsPlayer())
1163 for (uint8 i = 0; i <= 12; ++i)
1164 {
1165 bool inCombat = false;
1166 if (i == BOSS_LEVIATHAN)
1167 {
1169 if (c->IsInCombat())
1170 inCombat = true;
1171 }
1172 else
1173 inCombat = (GetBossState(i) == IN_PROGRESS);
1174
1175 uint32 mask =
1177 if (inCombat && (mask & (1 << i)) == 0)
1180 mask | (1 << i));
1181 }
1182 }
@ AREA_THE_CONSERVATORY_OF_LIFE
Definition AreaDefines.h:165
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:110
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition InstanceScript.cpp:689
bool IsPlayer() const
Definition Object.h:207
bool IsCreature() const
Definition Object.h:211
Creature * ToCreature()
Definition Object.h:212
uint32 GetAreaId() const
Definition Object.cpp:3186
void ScheduleLeviathanVehicleRespawn(Creature *vehicle)
Definition instance_ulduar.cpp:1430
@ PERSISTENT_DATA_CONSPEEDATORY
Definition ulduar.h:355
@ ACTION_FEEDS_ON_TEARS_FAILED
Definition ulduar.h:417

References ACHIEVEMENT_TIMED_TYPE_EVENT, ACTION_FEEDS_ON_TEARS_FAILED, AREA_THE_CONSERVATORY_OF_LIFE, BOSS_ALGALON, BOSS_LEVIATHAN, DAY, InstanceScript::DoStartTimedAchievement(), WorldObject::GetAreaId(), InstanceScript::GetBossState(), InstanceScript::GetCreature(), GameTime::GetGameTime(), InstanceScript::GetPersistentData(), IN_PROGRESS, Object::IsCreature(), Object::IsPlayer(), PERSISTENT_DATA_C_OF_ULDUAR_MASK, PERSISTENT_DATA_CONSPEEDATORY, ScheduleLeviathanVehicleRespawn(), InstanceScript::StorePersistentData(), and Object::ToCreature().

◆ OpenIfDone()

void instance_ulduar::instance_ulduar_InstanceMapScript::OpenIfDone ( uint32  encounter,
GameObject *  go,
GOState  state 
)
inline
755 {
756 if (GetBossState(encounter) == DONE)
757 go->SetGoState(state);
758 }

References DONE, InstanceScript::GetBossState(), and GameObject::SetGoState().

Referenced by OnGameObjectCreate().

◆ PlayBrannRhydianLine()

void instance_ulduar::instance_ulduar_InstanceMapScript::PlayBrannRhydianLine ( uint8  index)
inline
496 {
497 auto const& line = BrannRhydianDialogue[index];
498 Creature* speaker = line.rhydian
501 if (speaker)
502 speaker->AI()->Talk(line.textGroup);
503
504 uint8 const next = static_cast<uint8>(index + 1);
505 if (next < static_cast<uint8>(sizeof(BrannRhydianDialogue) / sizeof(BrannRhydianDialogue[0])))
506 scheduler.Schedule(line.nextDelay, [this, next](TaskContext /*context*/)
507 {
509 });
510 }
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr, Milliseconds delay=0ms)
Causes the creature to talk/say the text assigned to their entry in the creature_text database table.
Definition CreatureAI.cpp:67
static struct @311 BrannRhydianDialogue[]
void PlayBrannRhydianLine(uint8 index)
Definition instance_ulduar.cpp:495
@ DATA_BRANN_FORMATION_GROUNDS
Definition ulduar.h:158

References _formationRhydianGUID, Creature::AI(), BrannRhydianDialogue, DATA_BRANN_FORMATION_GROUNDS, Map::GetCreature(), InstanceScript::GetCreature(), InstanceScript::instance, PlayBrannRhydianLine(), TaskScheduler::Schedule(), InstanceScript::scheduler, and CreatureAI::Talk().

Referenced by PlayBrannRhydianLine(), and StartLeviathanOutroSequence().

◆ ProcessEvent()

void instance_ulduar::instance_ulduar_InstanceMapScript::ProcessEvent ( WorldObject *  ,
uint32  eventId 
)
inlineoverridevirtual

Reimplemented from ZoneScript.

566 {
567 // destory towers
569 SetData(eventId, 0);
570 else if (eventId == EVENT_HODIR_SHATTER_CHEST)
571 {
572 if (GameObject* go = GetHodirChest(true))
573 {
574 go->SetGoState(GO_STATE_ACTIVE);
575 scheduler.Schedule(3s, [this](TaskContext /*context*/)
576 {
579 });
580 }
581 }
582 }
GameObject * GetHodirChest(bool hardmode)
Definition instance_ulduar.cpp:760
@ EVENT_HODIR_SHATTER_CHEST
Definition ulduar.h:407
@ TYPE_HODIR_HM_FAIL
Definition ulduar.h:52

References BOSS_HODIR, DONE, EVENT_HODIR_SHATTER_CHEST, EVENT_TOWER_OF_FLAMES_DESTROYED, EVENT_TOWER_OF_LIFE_DESTROYED, InstanceScript::GetBossState(), GetHodirChest(), GO_STATE_ACTIVE, TaskScheduler::Schedule(), InstanceScript::scheduler, SetData(), and TYPE_HODIR_HM_FAIL.

Referenced by SetData().

◆ respawnHodirHardmodeChest()

void instance_ulduar::instance_ulduar_InstanceMapScript::respawnHodirHardmodeChest ( )
inline
927 {
929 return;
930
931 _hmHodir = true;
932
933 if (GameObject* go = GetHodirChest(true))
934 go->Respawn();
935 }

References _hmHodir, BOSS_HODIR, DONE, InstanceScript::GetBossState(), and GetHodirChest().

Referenced by SetData().

◆ ScheduleLeviathanVehicleRespawn()

void instance_ulduar::instance_ulduar_InstanceMapScript::ScheduleLeviathanVehicleRespawn ( Creature *  vehicle)
1431{
1432 // The Expedition Base Camp keeps its motor pool stocked. The trigger that ends it is the pool itself being
1433 // relocated to the Formation Grounds on the first Reset() after the boss has been engaged, not the raid
1434 // driving up there: for the whole first attempt wrecks are still replaced back at the camp. From the
1435 // relocation on, a wreck stays where it fell and only the next reset lays out a fresh set
1437 return;
1438
1439 for (auto itr = _leviathanVehicles.begin(); itr != _leviathanVehicles.end(); ++itr)
1440 {
1441 if (itr->guid != vehicle->GetGUID())
1442 continue;
1443
1444 uint32 entry = itr->entry;
1445 uint32 index = itr->index;
1446 _leviathanVehicles.erase(itr);
1447
1448 // A replacement rolls out of the camp 40 seconds after the wreck has decayed
1450 scheduler.Schedule(respawnDelay, [this, entry, index](TaskContext /*context*/)
1451 {
1453 SummonLeviathanVehicle(entry, index);
1454 });
1455
1456 return;
1457 }
1458}
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
uint32 GetCorpseDelay() const
Definition Creature.h:75
constexpr Seconds LEVIATHAN_VEHICLE_RESPAWN_DELAY
Definition instance_ulduar.cpp:201
void SummonLeviathanVehicle(uint32 entry, uint32 index)
Definition instance_ulduar.cpp:1418

References Creature::GetCorpseDelay(), Object::GetGUID(), LEVIATHAN_VEHICLE_RESPAWN_DELAY, and VEHICLE_POS_START.

Referenced by OnUnitDeath().

◆ SetBossState()

bool instance_ulduar::instance_ulduar_InstanceMapScript::SetBossState ( uint32  type,
EncounterState  state 
)
inlineoverridevirtual

Reimplemented from InstanceScript.

585 {
586 if (!InstanceScript::SetBossState(type, state))
587 return false;
588
589 switch (type)
590 {
591 case BOSS_LEVIATHAN:
592 if (state == DONE)
593 {
594 instance->DoForAllPlayers([&](Player* player)
595 {
596 if (Creature* vehicleCreature = player->GetVehicleCreatureBase())
597 vehicleCreature->DespawnOrUnsummon();
598 });
599
601 go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
602
605 }
606 break;
607 case BOSS_MIMIRON:
608 if (state == IN_PROGRESS)
609 _mimironTramUsed = true;
610 [[fallthrough]];
611 case BOSS_HODIR:
612 case BOSS_THORIM:
613 case BOSS_FREYA:
615 {
616 scheduler.Schedule(45s, [this](TaskContext /*context*/)
617 {
619 trigger->AI()->Talk(EMOTE_ANCIENT_GATE_UNLOCKED);
620 });
621 }
622 if (type == BOSS_HODIR && state == DONE)
624 if (state == DONE)
625 for (uint8 i = KEEPER_FREYA; i <= KEEPER_THORIM; ++i)
626 if (ObservationRingKeeperBoss[i] == type)
630 break;
631 case BOSS_YOGGSARON:
632 // Sara despawns the unchosen keepers on pull, bring them back after a wipe
633 if (state == NOT_STARTED)
635 break;
636 default:
637 break;
638 }
639
640 // take care of herbs
641 if (type == BOSS_FREYA && state == DONE)
642 {
643 std::list<GameObject*> goList;
644 if (Creature* freya = GetCreature(BOSS_FREYA))
645 {
646 freya->GetGameObjectListWithEntryInGrid(goList, { 191019, 190176, 190171, 190170, 189973 }, 333.0f);
647
648 for (GameObject* herb : goList)
649 herb->SetRespawnTime(7 * DAY);
650 }
651 }
652
653 if (type > BOSS_LEVIATHAN && type < MAX_ENCOUNTER && state == IN_PROGRESS)
654 {
655 instance->DoForAllPlayers([&](Player* player)
656 {
657 if (Creature* vehicleCreature = player->GetVehicleCreatureBase())
658 vehicleCreature->DespawnOrUnsummon();
659 });
660 }
661
662 return true;
663 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
@ NOT_STARTED
Definition InstanceScript.h:58
virtual bool SetBossState(uint32 id, EncounterState state)
Definition InstanceScript.cpp:406
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:3364
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, bool visibleBySummonerOnly=false)
Definition Object.cpp:2253
Definition Player.h:1086
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:14709
static Position const ObservationRingKeepersPos[4]
Definition instance_ulduar.cpp:61
static uint32 const ObservationRingKeeperBoss[4]
Definition instance_ulduar.cpp:81
static uint32 const ObservationRingKeeperEntry[4]
Definition instance_ulduar.cpp:69
Position const triggerAncientGatePosition
Definition instance_ulduar.cpp:254
void setChestsLootable(uint32 boss)
Definition instance_ulduar.cpp:937
void DespawnLeviathanGauntlet()
Definition instance_ulduar.cpp:316
@ NPC_ANCIENT_GATE_WORLD_TRIGGER
Definition ulduar.h:434
@ KEEPER_THORIM
Definition ulduar.h:442
@ EMOTE_ANCIENT_GATE_UNLOCKED
Definition ulduar.h:435
@ KEEPER_FREYA
Definition ulduar.h:439
@ DATA_LEVIATHAN_DOORS
Definition ulduar.h:68

References _mimironTramUsed, InstanceScript::AllBossesDone(), BOSS_FREYA, BOSS_HODIR, BOSS_LEVIATHAN, BOSS_MIMIRON, BOSS_THORIM, BOSS_YOGGSARON, DATA_LEVIATHAN_DOORS, DAY, DespawnLeviathanGauntlet(), Map::DoForAllPlayers(), DONE, EMOTE_ANCIENT_GATE_UNLOCKED, InstanceScript::GetCreature(), InstanceScript::GetGameObject(), Unit::GetVehicleCreatureBase(), GO_STATE_ACTIVE_ALTERNATIVE, IN_MILLISECONDS, IN_PROGRESS, InstanceScript::instance, KEEPER_FREYA, KEEPER_THORIM, MAX_ENCOUNTER, NOT_STARTED, NPC_ANCIENT_GATE_WORLD_TRIGGER, ObservationRingKeeperBoss, ObservationRingKeeperEntry, ObservationRingKeepersPos, TaskScheduler::Schedule(), InstanceScript::scheduler, InstanceScript::SetBossState(), setChestsLootable(), SpawnLeviathanOutro(), SpawnObservationRingKeepers(), Map::SummonCreature(), and triggerAncientGatePosition.

◆ setChestsLootable()

void instance_ulduar::instance_ulduar_InstanceMapScript::setChestsLootable ( uint32  boss)
inline
938 {
939 if (boss)
940 {
941 switch (boss)
942 {
943 case BOSS_HODIR:
944 if (_hmHodir)
945 {
946 if (GameObject* go = GetHodirChest(true))
947 {
948 go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
949 go->SetLootRecipient(instance);
950 }
951 }
952 if (GameObject* go = GetHodirChest(false))
953 {
954 go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
955 go->SetLootRecipient(instance);
956 }
957 break;
958 }
959 }
960 }

References _hmHodir, BOSS_HODIR, GetHodirChest(), GO_FLAG_NOT_SELECTABLE, and InstanceScript::instance.

Referenced by SetBossState().

◆ SetData()

void instance_ulduar::instance_ulduar_InstanceMapScript::SetData ( uint32  type,
uint32  data 
)
inlineoverridevirtual

Reimplemented from ZoneScript.

963 {
964 switch (type)
965 {
968 break;
970 if (GameObject* go = GetHodirChest(true))
971 {
972 _hmHodir = false;
973 go->DespawnOrUnsummon(0ms, 7_days);
974 }
975 break;
979 break;
981 if (Creature* sara = GetCreature(DATA_SARA))
982 sara->AI()->DoAction(ACTION_SARA_UPDATE_SUMMON_KEEPERS);
983 break;
988 {
990 for (uint8 i = 0; i < 2; ++i)
991 {
993 {
994 gameObject->SetGoState(GO_STATE_ACTIVE);
995 }
996 }
997 return;
998 }
999
1000 case DATA_VEHICLE_SPAWN:
1002 return;
1004 // Archmage Pentarus has just answered Brann, the crews get a moment to reach the vehicles
1005 scheduler.Schedule(3s, [this](TaskContext /*context*/)
1006 {
1008 });
1009 return;
1017 return;
1022 type == DATA_ALGALON_DEFEATED
1027 return;
1028 // Achievement
1029 case DATA_DWARFAGEDDON:
1032 return;
1033 case DATA_CALL_TRAM:
1034 if (GameObject* MimironTram = GetGameObject(DATA_MIMIRON_TRAM))
1035 if (StaticTransport* t = MimironTram->ToStaticTransport())
1036 {
1037 if (data == 0 && t->GetGoState() == GO_STATE_ACTIVE && t->GetPathProgress() == t->GetPauseTime())
1038 {
1039 MimironTram->SetGoState(GO_STATE_READY);
1041 rocketBooster->SetGoState(GO_STATE_ACTIVE);
1042 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1043 activateTramButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1044 if (GameObject* callTramCenterButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_CENTER))
1045 callTramCenterButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1046 scheduler.Schedule(30s, [this](TaskContext /*context*/)
1047 {
1049 turnaround1->UseDoorOrButton();
1051 rocketBooster->SetGoState(GO_STATE_READY);
1052 }).Schedule(60s, [this](TaskContext /*context*/)
1053 {
1054 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1055 activateTramButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1056 if (GameObject* callTramMimironButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_MIMIRON))
1057 callTramMimironButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1058 });
1059 }
1060 if (data == 1 && t->GetGoState() == GO_STATE_READY && t->GetPathProgress() == 0)
1061 {
1062 MimironTram->SetGoState(GO_STATE_ACTIVE);
1064 rocketBooster->SetGoState(GO_STATE_ACTIVE);
1065 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1066 activateTramButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1067 if (GameObject* callTramMimironButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_MIMIRON))
1068 callTramMimironButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1069 scheduler.Schedule(33s, [this](TaskContext /*context*/)
1070 {
1072 turnaround2->UseDoorOrButton();
1074 rocketBooster->SetGoState(GO_STATE_READY);
1075 }).Schedule(63s, [this](TaskContext /*context*/)
1076 {
1077 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1078 activateTramButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1079 if (GameObject* callTramCenterButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_CENTER))
1080 callTramCenterButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1081 });
1082 }
1083 }
1084 break;
1087 cr->TextEmote("Go to your vehicles!", nullptr, true);
1088 break;
1094 break;
1095 }
1096
1097 }
@ ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET
Definition DBCEnums.h:113
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition DBCEnums.h:142
void CancelEvent(EventId eventId)
Definition EventMap.cpp:160
void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition InstanceScript.cpp:680
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:2447
void respawnHodirHardmodeChest()
Definition instance_ulduar.cpp:926
void ProcessEvent(WorldObject *, uint32 eventId) override
Definition instance_ulduar.cpp:565
void UnlockLeviathanVehicles()
Definition instance_ulduar.cpp:331
@ EVENT_KEEPER_TELEPORTED
Definition ulduar.h:431
@ SPELL_DWARFAGEDDON
Definition ulduar.h:445
@ ACTION_SARA_UPDATE_SUMMON_KEEPERS
Definition ulduar.h:438
@ DATA_SARA
Definition ulduar.h:129
@ DATA_BRANN_MEMOTESAY
Definition ulduar.h:147
@ DATA_BRANN_BASE_CAMP
Definition ulduar.h:149
@ DATA_MIMIRON_CALL_TRAM_CENTER
Definition ulduar.h:86
@ DATA_LEVIATHAN_VEHICLES_USABLE
Definition ulduar.h:69
@ DATA_MIMIRON_CALL_TRAM_MIMIRON
Definition ulduar.h:87
@ DATA_MIMIRON_TRAM_TURNAROUND_1
Definition ulduar.h:88
@ DATA_DESPAWN_ALGALON
Definition ulduar.h:104
@ DATA_BRANN_EASY_MODE
Definition ulduar.h:148
@ DATA_MIMIRON_TRAM_TURNAROUND_2
Definition ulduar.h:89
@ TYPE_HODIR_HM_RESET
Definition ulduar.h:54
@ DATA_VEHICLE_SPAWN
Definition ulduar.h:62
@ DATA_DWARFAGEDDON
Definition ulduar.h:116
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:103

References _events, _hmHodir, _leviathanTowers, _leviathanVisualTowers, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, ACTION_SARA_UPDATE_SUMMON_KEEPERS, EventMap::CancelEvent(), DATA_ALGALON_DEFEATED, DATA_ALGALON_SUMMON_STATE, DATA_BRANN_BASE_CAMP, DATA_BRANN_EASY_MODE, DATA_BRANN_MEMOTESAY, DATA_CALL_TRAM, DATA_DESPAWN_ALGALON, DATA_DWARFAGEDDON, DATA_LEVIATHAN_VEHICLES_USABLE, DATA_MAGE_BARRIER, DATA_MIMIRON_ACTIVATE_TRAM, DATA_MIMIRON_CALL_TRAM_CENTER, DATA_MIMIRON_CALL_TRAM_MIMIRON, DATA_MIMIRON_TRAM, DATA_MIMIRON_TRAM_ROCKET_BOOSTER, DATA_MIMIRON_TRAM_TURNAROUND_1, DATA_MIMIRON_TRAM_TURNAROUND_2, DATA_SARA, DATA_VEHICLE_SPAWN, InstanceScript::DoStartTimedAchievement(), InstanceScript::DoUpdateAchievementCriteria(), InstanceScript::DoUpdateWorldState(), EVENT_KEEPER_TELEPORTED, EVENT_TOWER_OF_FLAMES_DESTROYED, EVENT_TOWER_OF_FROST_DESTROYED, EVENT_TOWER_OF_LIFE_DESTROYED, EVENT_TOWER_OF_STORM_DESTROYED, EVENT_UPDATE_ALGALON_TIMER, InstanceScript::GetCreature(), Map::GetGameObject(), InstanceScript::GetGameObject(), GameTime::GetGameTime(), GetHodirChest(), GO_FLAG_NOT_SELECTABLE, GO_STATE_ACTIVE, GO_STATE_READY, InstanceScript::instance, MINUTE, PERSISTENT_DATA_ALGALON_DEADLINE, PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_MAGE_BARRIER, ProcessEvent(), EventMap::RescheduleEvent(), respawnHodirHardmodeChest(), TaskScheduler::Schedule(), InstanceScript::scheduler, SpawnLeviathanEncounterVehicles(), SPELL_DWARFAGEDDON, InstanceScript::StorePersistentData(), TIMER_ALGALON_DEFEATED, TIMER_ALGALON_MINUTES, TIMER_ALGALON_SUMMONED, GameObject::ToStaticTransport(), TYPE_HODIR_HM_FAIL, TYPE_HODIR_HM_RESET, UnlockLeviathanVehicles(), WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, and WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED.

Referenced by ExpireAlgalonCountdown(), and ProcessEvent().

◆ SpawnLeviathanEncounterVehicles()

void instance_ulduar::instance_ulduar_InstanceMapScript::SpawnLeviathanEncounterVehicles ( uint8  mode)
1387{
1388 // Retire the old set first: despawning it must not queue replacements for a set that is going away
1389 std::vector<LeviathanVehicle> retired;
1390 retired.swap(_leviathanVehicles);
1391 _leviathanVehicleMode = mode;
1392
1393 for (LeviathanVehicle const& summoned : retired)
1394 {
1395 if (Creature* cr = instance->GetCreature(summoned.guid))
1396 {
1397 cr->DespawnOrUnsummon();
1398 }
1399 }
1400
1401 if (mode >= VEHICLE_POS_NONE)
1402 return;
1403
1404 // The raid may look the vehicles over on arrival, but cannot board them until the Kirin Tor say so.
1405 // MAGE_BARRIER_LOWERED covers lockouts saved before the unlock got its own flag.
1409
1410 for (uint32 i = 0; i < (instance->Is25ManRaid() ? 5u : 2u); ++i)
1411 {
1413 SummonLeviathanVehicle(NPC_VEHICLE_CHOPPER, 15 * mode + i + 5);
1415 }
1416}
bool Is25ManRaid() const
Definition Map.h:304
Definition instance_ulduar.cpp:205
@ NPC_SALVAGED_SIEGE_ENGINE
Definition ulduar.h:224
@ NPC_VEHICLE_CHOPPER
Definition ulduar.h:226
@ NPC_SALVAGED_DEMOLISHER
Definition ulduar.h:227

References _leviathanVehicleMode, _leviathanVehicles, _leviathanVehiclesUsable, Map::GetCreature(), InstanceScript::GetPersistentData(), InstanceScript::instance, Map::Is25ManRaid(), MAGE_BARRIER_LOWERED, NPC_SALVAGED_DEMOLISHER, NPC_SALVAGED_SIEGE_ENGINE, NPC_VEHICLE_CHOPPER, PERSISTENT_DATA_LEVIATHAN_VEHICLES_USABLE, PERSISTENT_DATA_MAGE_BARRIER, SummonLeviathanVehicle(), VEHICLE_POS_NONE, and VEHICLE_POS_START.

Referenced by OnPlayerEnter(), and SetData().

◆ SpawnLeviathanOutro()

void instance_ulduar::instance_ulduar_InstanceMapScript::SpawnLeviathanOutro ( bool  justKilled)
inline
356 {
358 return;
359
361
362 std::list<TempSummon*> summons;
364 if (!summons.empty())
365 _formationRhydianGUID = summons.front()->GetGUID();
366
367 summons.clear();
369 if (justKilled)
370 for (TempSummon* mage : summons)
371 mage->CastSpell(mage, SPELL_SIMPLE_TELEPORT_VISUAL, true);
372
373 summons.clear();
375 for (TempSummon* battleMage : summons)
376 {
377 if (justKilled)
378 battleMage->CastSpell(battleMage, SPELL_SIMPLE_TELEPORT_VISUAL, true);
379 // The two by the portal sustain it; the one at the Formation Grounds teleporter does not
380 if (battleMage->GetPositionX() > 200.0f)
381 battleMage->CastSpell(battleMage, SPELL_ARCANE_CHANNELING, false);
382 }
383
385
386 // The crew stands by the Leviathan gate until the sequence sends it into formation
387 summons.clear();
389 for (TempSummon* crew : summons)
390 _leviathanCrewGUIDs.push_back(crew->GetGUID());
391
392 if (justKilled)
393 {
395 return;
396 }
397
398 // On later visits the landing, march and dialogue replay once someone approaches the Formation Grounds
399 scheduler.Schedule(2s, [this](TaskContext context)
400 {
402 return;
403
404 bool triggered = false;
405 instance->DoForAllPlayers([&](Player* player)
406 {
407 if (player->IsAlive() && player->GetExactDist2d(234.0f, -100.0f) < 150.0f)
408 triggered = true;
409 });
410
411 if (triggered)
413 else
414 context.Repeat(2s);
415 });
416 }
float summons[3][4]
Definition boss_urom.cpp:71
void SummonGameObjectGroup(uint8 group, std::list< GameObject * > *list=nullptr)
Definition Object.cpp:2383
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2371
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
Definition TaskScheduler.h:494
Definition TemporarySummon.h:50
bool IsAlive() const
Definition Unit.h:1812
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170
void StartLeviathanOutroSequence()
Definition instance_ulduar.cpp:418
@ SUMMON_GROUP_LEVIATHAN_OUTRO_MAGES
Definition ulduar.h:383
@ SUMMON_GROUP_LEVIATHAN_OUTRO_MARCH
Definition ulduar.h:379
@ SPELL_SIMPLE_TELEPORT_VISUAL
Definition ulduar.h:396
@ SUMMON_GROUP_LEVIATHAN_OUTRO_RHYDIAN
Definition ulduar.h:380
@ GO_SUMMON_GROUP_LEVIATHAN_PORTAL
Definition ulduar.h:387
@ SPELL_ARCANE_CHANNELING
Definition ulduar.h:399
@ SUMMON_GROUP_LEVIATHAN_OUTRO_BATTLE_MAGES
Definition ulduar.h:384

References _formationRhydianGUID, _leviathanCrewGUIDs, _leviathanOutroSpawned, _leviathanSequenceStarted, Map::DoForAllPlayers(), Position::GetExactDist2d(), GO_SUMMON_GROUP_LEVIATHAN_PORTAL, InstanceScript::instance, Unit::IsAlive(), TaskContext::Repeat(), TaskScheduler::Schedule(), InstanceScript::scheduler, SPELL_ARCANE_CHANNELING, SPELL_SIMPLE_TELEPORT_VISUAL, StartLeviathanOutroSequence(), SUMMON_GROUP_LEVIATHAN_OUTRO_BATTLE_MAGES, SUMMON_GROUP_LEVIATHAN_OUTRO_MAGES, SUMMON_GROUP_LEVIATHAN_OUTRO_MARCH, SUMMON_GROUP_LEVIATHAN_OUTRO_RHYDIAN, Map::SummonCreatureGroup(), Map::SummonGameObjectGroup(), and summons.

Referenced by OnPlayerEnter(), and SetBossState().

◆ SpawnObservationRingKeepers()

void instance_ulduar::instance_ulduar_InstanceMapScript::SpawnObservationRingKeepers ( )
inline

◆ StartLeviathanOutroSequence()

void instance_ulduar::instance_ulduar_InstanceMapScript::StartLeviathanOutroSequence ( )
inline
419 {
421 return;
422
424
425 // The crew runs its sniffed column routes into the formation slots, paired by group row order
426 static uint32 const marchPaths[] =
427 {
428 3414401, 3414402, 3414403, 3414404, 3414405, 3414406,
429 3414501, 3414502, 3414503, 3414504, 3414505, 3414506
430 };
431 if (std::vector<TempSummonData> const* formation = sObjectMgr->GetSummonGroup(MAP_ULDUAR, SUMMONER_TYPE_MAP, SUMMON_GROUP_LEVIATHAN_OUTRO))
432 {
433 auto slot = formation->begin();
434 uint8 pathIndex = 0;
435 for (ObjectGuid const& guid : _leviathanCrewGUIDs)
436 {
437 Creature* crew = instance->GetCreature(guid);
438 if (!crew)
439 continue;
440 while (slot != formation->end() && slot->entry != crew->GetEntry())
441 ++slot;
442 if (slot == formation->end() || pathIndex >= sizeof(marchPaths) / sizeof(marchPaths[0]))
443 break;
444 crew->SetHomePosition(slot->pos);
445 crew->GetMotionMaster()->MovePath(marchPaths[pathIndex], FORCED_MOVEMENT_RUN);
446 ++slot;
447 ++pathIndex;
448 }
449 }
450 _leviathanCrewGUIDs.clear();
451
452 // The machine flies its sniffed arc over the grounds and reaches the descent point at ~36s
453 std::list<TempSummon*> machine;
455 if (!machine.empty())
456 {
457 _leviathanMachineGUID = machine.front()->GetGUID();
458 machine.front()->SetCanFly(true);
459 machine.front()->GetMotionMaster()->MovePath(PATH_FLYING_MACHINE_APPROACH);
460 }
461
462 scheduler.Schedule(13s, [this](TaskContext /*context*/)
463 {
465 {
466 rhydian->SetHomePosition({ 239.31581f, -123.64426f, 409.80365f, 3.104f });
467 rhydian->GetMotionMaster()->MovePath(PATH_RHYDIAN_TO_BRANN, FORCED_MOVEMENT_WALK);
468 }
469 }).Schedule(36s, [this](TaskContext /*context*/)
470 {
471 if (Creature* flyingMachine = instance->GetCreature(_leviathanMachineGUID))
472 flyingMachine->GetMotionMaster()->MoveLand(0, { 246.4216f, -80.03793f, 409.80365f });
473 }).Schedule(39s, [this](TaskContext /*context*/)
474 {
475 std::list<TempSummon*> brann;
477 if (brann.empty())
478 return;
479
480 if (std::vector<TempSummonData> const* formation = sObjectMgr->GetSummonGroup(MAP_ULDUAR, SUMMONER_TYPE_MAP, SUMMON_GROUP_LEVIATHAN_OUTRO))
481 for (TempSummonData const& slot : *formation)
482 if (slot.entry == NPC_BRANN_FORMATION_GROUNDS)
483 {
484 brann.front()->SetHomePosition(slot.pos);
485 break;
486 }
487
488 brann.front()->GetMotionMaster()->MovePath(PATH_BRANN_FORMATION_GROUNDS, FORCED_MOVEMENT_WALK);
489 }).Schedule(59500ms, [this](TaskContext /*context*/)
490 {
492 });
493 }
@ MAP_ULDUAR
Definition AreaDefines.h:258
@ FORCED_MOVEMENT_WALK
Definition MotionMaster.h:87
@ FORCED_MOVEMENT_RUN
Definition MotionMaster.h:88
#define sObjectMgr
Definition ObjectMgr.h:1731
@ SUMMONER_TYPE_MAP
Definition TemporarySummon.h:28
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:347
void MovePath(uint32 path_id, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, PathSource pathSource=PathSource::WAYPOINT_MGR)
Definition MotionMaster.cpp:520
MotionMaster * GetMotionMaster()
Definition Unit.h:1774
bool rhydian
Definition instance_ulduar.cpp:87
Stores data for temp summons.
Definition TemporarySummon.h:33
@ SUMMON_GROUP_LEVIATHAN_OUTRO
Definition ulduar.h:378
@ SUMMON_GROUP_LEVIATHAN_OUTRO_BRANN
Definition ulduar.h:382
@ PATH_BRANN_FORMATION_GROUNDS
Definition ulduar.h:391
@ SUMMON_GROUP_LEVIATHAN_OUTRO_MACHINE
Definition ulduar.h:381
@ PATH_FLYING_MACHINE_APPROACH
Definition ulduar.h:393
@ PATH_RHYDIAN_TO_BRANN
Definition ulduar.h:392
@ NPC_BRANN_FORMATION_GROUNDS
Definition ulduar.h:237

References _formationRhydianGUID, _leviathanCrewGUIDs, _leviathanMachineGUID, _leviathanSequenceStarted, FORCED_MOVEMENT_RUN, FORCED_MOVEMENT_WALK, Map::GetCreature(), Object::GetEntry(), Unit::GetMotionMaster(), InstanceScript::instance, MAP_ULDUAR, MotionMaster::MovePath(), NPC_BRANN_FORMATION_GROUNDS, PATH_BRANN_FORMATION_GROUNDS, PATH_FLYING_MACHINE_APPROACH, PATH_RHYDIAN_TO_BRANN, PlayBrannRhydianLine(), rhydian, TaskScheduler::Schedule(), InstanceScript::scheduler, Creature::SetHomePosition(), sObjectMgr, SUMMON_GROUP_LEVIATHAN_OUTRO, SUMMON_GROUP_LEVIATHAN_OUTRO_BRANN, SUMMON_GROUP_LEVIATHAN_OUTRO_MACHINE, Map::SummonCreatureGroup(), and SUMMONER_TYPE_MAP.

Referenced by SpawnLeviathanOutro().

◆ SummonLeviathanVehicle()

void instance_ulduar::instance_ulduar_InstanceMapScript::SummonLeviathanVehicle ( uint32  entry,
uint32  index 
)
1419{
1420 if (TempSummon* veh = instance->SummonCreature(entry, vehiclePositions[index]))
1421 {
1422 // The vehicle kit hands out the spell click on install, take it back while the barrier is still up
1424 veh->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
1425
1426 _leviathanVehicles.push_back({ veh->GetGUID(), entry, index });
1427 }
1428}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:346
const Position vehiclePositions[30]
Definition instance_ulduar.cpp:1344

References WorldObject::SummonCreature(), UNIT_NPC_FLAG_SPELLCLICK, and vehiclePositions.

Referenced by SpawnLeviathanEncounterVehicles().

◆ UnlockLeviathanVehicles()

void instance_ulduar::instance_ulduar_InstanceMapScript::UnlockLeviathanVehicles ( )
inline

◆ Update()

void instance_ulduar::instance_ulduar_InstanceMapScript::Update ( uint32  diff)
inlineoverridevirtual

Reimplemented from InstanceScript.

1220 {
1222
1223 if (_events.Empty())
1224 return;
1225
1226 _events.Update(diff);
1227 switch (_events.ExecuteEvent())
1228 {
1230 {
1232 return;
1233
1234 uint32 minutesLeft = AlgalonMinutesLeft();
1235 if (!minutesLeft)
1236 {
1238 break;
1239 }
1240
1243 _events.Repeat(1min);
1244 break;
1245 }
1247 {
1249 if (GetCreature(BOSS_ALGALON) || !algalonTimer
1250 || (algalonTimer > TIMER_ALGALON_MINUTES && algalonTimer != TIMER_ALGALON_TO_SUMMON))
1251 break;
1252
1254 if (!algalon)
1255 break;
1256
1257 if (algalonTimer <= TIMER_ALGALON_MINUTES)
1258 {
1260 algalon->AI()->DoAction(ACTION_INIT_ALGALON);
1261 }
1262 else // TIMER_ALGALON_TO_SUMMON
1263 {
1265 algalon->SetImmuneToPC(false);
1266 }
1267 break;
1268 }
1269 }
1270 }
void Update(uint32 time)
Definition EventMap.h:67
bool Empty() const
Definition EventMap.h:95
void Repeat(Milliseconds time)
Definition EventMap.cpp:76
EventId ExecuteEvent()
Definition EventMap.cpp:86
virtual void Update(uint32)
Definition InstanceScript.cpp:263
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:10423
Position const AlgalonLandPos
Definition ulduar.h:449
@ ACTION_INIT_ALGALON
Definition ulduar.h:418

References _events, ACTION_INIT_ALGALON, Creature::AI(), AlgalonLandPos, AlgalonMinutesLeft(), BOSS_ALGALON, UnitAI::DoAction(), InstanceScript::DoUpdateWorldState(), EventMap::Empty(), EVENT_RESUMMON_ALGALON, EVENT_UPDATE_ALGALON_TIMER, EventMap::ExecuteEvent(), ExpireAlgalonCountdown(), InstanceScript::GetCreature(), InstanceScript::GetPersistentData(), InstanceScript::instance, NPC_ALGALON, PERSISTENT_DATA_ALGALON_TIMER, EventMap::Repeat(), EventMap::RescheduleEvent(), Unit::SetImmuneToPC(), InstanceScript::StorePersistentData(), Map::SummonCreature(), TIMER_ALGALON_DEFEATED, TIMER_ALGALON_MINUTES, TIMER_ALGALON_SUMMONED, TIMER_ALGALON_TO_SUMMON, EventMap::Update(), InstanceScript::Update(), and WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER.

Member Data Documentation

◆ _algalonArrivalPending

bool instance_ulduar::instance_ulduar_InstanceMapScript::_algalonArrivalPending

◆ _events

EventMap instance_ulduar::instance_ulduar_InstanceMapScript::_events

◆ _formationRhydianGUID

ObjectGuid instance_ulduar::instance_ulduar_InstanceMapScript::_formationRhydianGUID

◆ _hmHodir

bool instance_ulduar::instance_ulduar_InstanceMapScript::_hmHodir

◆ _leviathanBeaconGUIDs

GuidUnorderedSet instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanBeaconGUIDs

◆ _leviathanCrewGUIDs

GuidList instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanCrewGUIDs

◆ _leviathanGauntletGUIDs

GuidUnorderedSet instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanGauntletGUIDs

◆ _leviathanMachineGUID

ObjectGuid instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanMachineGUID

◆ _leviathanOutroSpawned

bool instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanOutroSpawned

Referenced by Initialize(), and SpawnLeviathanOutro().

◆ _leviathanSequenceStarted

bool instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanSequenceStarted

◆ _leviathanTowers

bool instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanTowers[4]

Referenced by GetData(), Initialize(), and SetData().

◆ _leviathanVehicleMode

uint8 instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanVehicleMode

◆ _leviathanVehicles

std::vector<LeviathanVehicle> instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanVehicles

◆ _leviathanVehiclesUsable

bool instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanVehiclesUsable

◆ _leviathanVisualTowers

ObjectGuid instance_ulduar::instance_ulduar_InstanceMapScript::_leviathanVisualTowers[4][2]

Referenced by OnGameObjectCreate(), and SetData().

◆ _mimironTramUsed

bool instance_ulduar::instance_ulduar_InstanceMapScript::_mimironTramUsed

◆ _repairSGUID

ObjectGuid instance_ulduar::instance_ulduar_InstanceMapScript::_repairSGUID[2]

Referenced by GetGuidData(), and OnGameObjectCreate().

◆ triggerAncientGatePosition

Position const instance_ulduar::instance_ulduar_InstanceMapScript::triggerAncientGatePosition = { 1883.65f, 269.272f, 418.406f }
254{ 1883.65f, 269.272f, 418.406f };

Referenced by SetBossState().


The documentation for this struct was generated from the following file: