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
 
void DespawnLeviathanGauntlet ()
 
void UnlockLeviathanVehicles ()
 
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 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
 
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 OnCreatureEvade (Creature *)
 
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 _algalonResummonPending
 
- 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:308
void LoadSummonData(ObjectData const *data)
Definition InstanceScript.cpp:222
void SetPersistentDataCount(uint32 number)
Definition InstanceScript.h:309
void LoadDoorData(DoorData const *data)
Definition InstanceScript.cpp:186
void LoadBossBoundaries(BossBoundaryData const &data)
Definition InstanceScript.cpp:156
void SetHeaders(std::string const &dataHeaders)
Definition InstanceScript.cpp:163
void LoadObjectData(ObjectData const *creatureData, ObjectData const *gameObjectData)
Definition InstanceScript.cpp:198
constexpr auto MAX_ENCOUNTER
Definition instance_blackrock_depths.cpp:24
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

◆ CheckAchievementCriteriaMeet()

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

Reimplemented from InstanceScript.

1225 {
1227 switch (criteria_id)
1228 {
1229 case 10042:
1230 case 10352:
1231 return (mask & (1 << BOSS_LEVIATHAN)) == 0;
1232 case 10342:
1233 case 10355:
1234 return (mask & (1 << BOSS_IGNIS)) == 0;
1235 case 10340:
1236 case 10353:
1237 return (mask & (1 << BOSS_RAZORSCALE)) == 0;
1238 case 10341:
1239 case 10354:
1240 return (mask & (1 << BOSS_XT002)) == 0;
1241 case 10598:
1242 case 10599:
1243 return (mask & (1 << BOSS_ASSEMBLY)) == 0;
1244 case 10348:
1245 case 10357:
1246 return (mask & (1 << BOSS_KOLOGARN)) == 0;
1247 case 10351:
1248 case 10363:
1249 return (mask & (1 << BOSS_AURIAYA)) == 0;
1250 case 10439:
1251 case 10719:
1252 return (mask & (1 << BOSS_HODIR)) == 0;
1253 case 10403:
1254 case 10404:
1255 return (mask & (1 << BOSS_THORIM)) == 0;
1256 case 10582:
1257 case 10583:
1258 return (mask & (1 << BOSS_FREYA)) == 0;
1259 case 10347:
1260 case 10361:
1261 return (mask & (1 << BOSS_MIMIRON)) == 0;
1262 case 10349:
1263 case 10362:
1264 return (mask & (1 << BOSS_VEZAX)) == 0;
1265 case 10350:
1266 case 10364:
1267 return (mask & (1 << BOSS_YOGGSARON)) == 0;
1268 }
1269 return false;
1270 }
std::uint32_t uint32
Definition Define.h:107
uint32 GetPersistentData(uint32 index) const
Definition InstanceScript.h:257
@ PERSISTENT_DATA_C_OF_ULDUAR_MASK
Definition ulduar.h:359
@ 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:39
@ BOSS_KOLOGARN
Definition ulduar.h:36
@ BOSS_THORIM
Definition ulduar.h:41
@ BOSS_FREYA
Definition ulduar.h:38
@ BOSS_AURIAYA
Definition ulduar.h:37
@ BOSS_XT002
Definition ulduar.h:34
@ BOSS_MIMIRON
Definition ulduar.h:40
@ 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.

1273 {
1274 if (_SkipCheckRequiredBosses(player))
1275 return true;
1276
1277 switch (bossId)
1278 {
1279 case BOSS_YOGGSARON:
1281 return false;
1282 break;
1283 default:
1284 break;
1285 }
1286
1287 return true;
1288 }
@ DONE
Definition InstanceScript.h:61
EncounterState GetBossState(uint32 id) const
Definition InstanceScript.h:252
bool _SkipCheckRequiredBosses(Player const *player=nullptr) const
Definition InstanceScript.cpp:395

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

◆ DespawnLeviathanGauntlet()

void instance_ulduar::instance_ulduar_InstanceMapScript::DespawnLeviathanGauntlet ( )
inline
301 {
302 for (ObjectGuid const& guid : _leviathanGauntletGUIDs)
303 if (Creature* creature = instance->GetCreature(guid))
304 creature->DespawnOrUnsummon(0ms, 7_days);
306
307 for (ObjectGuid const& guid : _leviathanBeaconGUIDs)
308 if (GameObject* beacon = instance->GetGameObject(guid))
309 beacon->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true);
310 _leviathanBeaconGUIDs.clear();
311 }
@ GO_DESTRUCTIBLE_DESTROYED
Definition SharedDefines.h:1633
Definition Creature.h:47
Definition GameObject.h:120
Creature * GetCreature(uint32 type)
Definition InstanceScript.cpp:120
Map * instance
Definition InstanceScript.h:149
GameObject * GetGameObject(uint32 type)
Definition InstanceScript.cpp:125
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().

◆ 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 <= 60) ? 1 : 0);
295 packet.Worldstates.emplace_back(
297 std::min<uint32>(algalonTimer, 60));
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:358

References InstanceScript::GetPersistentData(), PERSISTENT_DATA_ALGALON_TIMER, 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.

1079 {
1080 switch (type)
1081 {
1087
1088 case DATA_MAGE_BARRIER:
1089 return GetPersistentData(
1091
1092 case DATA_CALL_TRAM:
1093 return _mimironTramUsed;
1094 }
1095
1096 return 0;
1097 }
bool _mimironTramUsed
Definition instance_ulduar.cpp:258
bool _leviathanTowers[4]
Definition instance_ulduar.cpp:238
@ PERSISTENT_DATA_MAGE_BARRIER
Definition ulduar.h:360
@ 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:147
@ DATA_CALL_TRAM
Definition ulduar.h:122

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.

1064 {
1065 switch (data)
1066 {
1067 // Flame Leviathan
1069 return _repairSGUID[0];
1071 return _repairSGUID[1];
1072
1073 }
1074
1075 return GetObjectGuid(data);
1076 }
ObjectGuid GetObjectGuid(uint32 type) const
Definition InstanceScript.cpp:103
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
724 {
725 if (hardmode)
726 {
728 return go;
730 }
731
733 return go;
735 }
@ DATA_HODIR_CHEST_NORMAL
Definition ulduar.h:141
@ DATA_HODIR_CHEST_NORMAL_HERO
Definition ulduar.h:143
@ DATA_HODIR_CHEST_HARD
Definition ulduar.h:142
@ DATA_HODIR_CHEST_HARD_HERO
Definition ulduar.h:144

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 _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 _algalonResummonPending
Definition instance_ulduar.cpp:259
bool _leviathanOutroSpawned
Definition instance_ulduar.cpp:245
std::vector< LeviathanVehicle > _leviathanVehicles
Definition instance_ulduar.cpp:239
@ VEHICLE_POS_NONE
Definition ulduar.h:372

References _algalonResummonPending, _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.

544 {
545 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
546 {
547 if (GetBossState(i) == IN_PROGRESS)
548 return true;
549 }
550
551 // Leviathan does not use IN_PROGRESS type, instead SPECIAL is set and never reset,
552 // Check if he is in combat.
554 if (l->IsInCombat())
555 return true;
556
557 return false;
558 }
@ 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.

1149 {
1151
1152 if (!data)
1154
1155 uint32 algalonTimer =
1157 if (algalonTimer == TIMER_ALGALON_SUMMONED)
1158 {
1162 }
1163
1164 algalonTimer =
1166 if (algalonTimer && algalonTimer <= 60
1168 {
1173 algalonTimer);
1174 }
1175 }
virtual void Load(char const *data)
Definition InstanceScript.cpp:469
void StorePersistentData(uint32 index, uint32 data)
Definition InstanceScript.cpp:440
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
Definition InstanceScript.cpp:639
@ PERSISTENT_DATA_UNBROKEN
Definition ulduar.h:357
@ TIMER_ALGALON_SUMMONED
Definition ulduar.h:424
@ TIMER_ALGALON_TO_SUMMON
Definition ulduar.h:423
@ BOSS_ALGALON
Definition ulduar.h:44

References BOSS_ALGALON, DONE, InstanceScript::DoUpdateWorldState(), InstanceScript::GetBossState(), InstanceScript::GetPersistentData(), InstanceScript::Load(), PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_UNBROKEN, InstanceScript::StorePersistentData(), 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.

657 {
659
660 switch (creature->GetEntry())
661 {
662 case NPC_KOLOGARN:
664 {
665 creature->SetDisableGravity(true);
666 creature->SetPosition(creature->GetHomePosition());
668 creature->SetHealth(0);
670 creature->ReplaceAllDynamicFlags(0);
671 creature->SetCorpseDelay(7 * DAY);
672 creature->SetCorpseRemoveTime(7 * DAY);
674 creature->StopMovingOnCurrentPos();
675 }
676 break;
677 case NPC_ALGALON:
679 creature->DespawnOrUnsummon();
680 break;
681 // Gone for good once Flame Leviathan is defeated
687 creature->DespawnOrUnsummon(0ms, 7_days);
688 else
689 _leviathanGauntletGUIDs.insert(creature->GetGUID());
690 break;
693 {
694 // Waypoint patrols survive the kill (sniffed); only the static spawns are cleared
695 CreatureData const* data = creature->GetCreatureData();
696 if (data && data->movementType == WAYPOINT_MOTION_TYPE)
697 break;
699 creature->DespawnOrUnsummon(0ms, 7_days);
700 else
701 _leviathanGauntletGUIDs.insert(creature->GetGUID());
702 break;
703 }
711 if (Creature* algalon = GetCreature(BOSS_ALGALON))
712 algalon->AI()->JustSummoned(creature);
713 break;
714 }
715 }
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
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition Creature.cpp:1973
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:3343
CreatureData const * GetCreatureData() const
Definition Creature.h:208
void SetCorpseRemoveTime(uint32 delay)
Definition Creature.cpp:3900
void SetCorpseDelay(uint32 delay)
Definition Creature.h:74
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2216
void OnCreatureCreate(Creature *creature) override
Definition InstanceScript.cpp:75
bool IsBossDone(uint32 bossId) const
Definition InstanceScript.h:297
uint32 GetEntry() const
Definition Object.h:123
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:120
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:770
void SetHealth(uint32 val)
Definition Unit.cpp:11950
void StopMovingOnCurrentPos()
Definition Unit.cpp:12678
void SetDisableGravity(bool disable)
Definition Unit.cpp:16119
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:749
void SetStandState(uint8 state)
Definition Unit.cpp:12731
Definition CreatureData.h:370
uint8 movementType
Definition CreatureData.h:382
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_01
Definition ulduar.h:252
@ NPC_UNLEASHED_DARK_MATTER
Definition ulduar.h:254
@ NPC_ALGALON
Definition ulduar.h:187
@ NPC_ULDUAR_COLOSSUS
Definition ulduar.h:232
@ NPC_DEFENDER_GENERATED
Definition ulduar.h:235
@ NPC_ALGALON_STALKER_ASTEROID_TARGET_02
Definition ulduar.h:253
@ NPC_ULDUAR_GAUNTLET_GENERATOR
Definition ulduar.h:234
@ NPC_KOLOGARN
Definition ulduar.h:175
@ NPC_IRONWORK_CANNON
Definition ulduar.h:233
@ NPC_ALGALON_VOID_ZONE_VISUAL_STALKER
Definition ulduar.h:251
@ NPC_RUNEFORGED_SENTRY
Definition ulduar.h:237
@ NPC_STEELFORGED_DEFENDER
Definition ulduar.h:231

References _leviathanGauntletGUIDs, BOSS_ALGALON, BOSS_KOLOGARN, BOSS_LEVIATHAN, Corpse, DAY, Creature::DespawnOrUnsummon(), 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(), Creature::SetCorpseDelay(), Creature::SetCorpseRemoveTime(), Creature::setDeathState(), Unit::SetDisableGravity(), Unit::SetHealth(), Creature::SetPosition(), Unit::SetStandState(), Unit::SetUnitFlag(), Unit::StopMovingOnCurrentPos(), UNIT_FLAG_NOT_SELECTABLE, UNIT_STAND_STATE_STAND, and WAYPOINT_MOTION_TYPE.

◆ OnGameObjectCreate()

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

Reimplemented from ZoneScript.

738 {
740
741 if ((gameObject->GetEntry() >= GO_STORM_BEACON_FIRST && gameObject->GetEntry() <= GO_STORM_BEACON_LAST)
743 {
745 {
746 // Deferred: this hook runs before the object is in world, where SetDestructibleState
747 // cannot swap the collision model and AddToWorld would re-enable collision
748 scheduler.Schedule(1ms, [this, guid = gameObject->GetGUID()](TaskContext /*context*/)
749 {
750 if (GameObject* beacon = instance->GetGameObject(guid))
751 beacon->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true);
752 });
753 }
754 else
755 _leviathanBeaconGUIDs.insert(gameObject->GetGUID());
756 return;
757 }
758
759 switch (gameObject->GetEntry())
760 {
761 // Flame Leviathan
763 {
764 if (_repairSGUID[0])
765 _repairSGUID[1] = gameObject->GetGUID();
766 else
767 _repairSGUID[0] = gameObject->GetGUID();
768 break;
769 }
772 _leviathanVisualTowers[3][0] = gameObject->GetGUID();
773 break;
776 _leviathanVisualTowers[0][0] = gameObject->GetGUID();
777 break;
780 _leviathanVisualTowers[2][0] = gameObject->GetGUID();
781 break;
784 _leviathanVisualTowers[1][0] = gameObject->GetGUID();
785 break;
788 _leviathanVisualTowers[3][1] = gameObject->GetGUID();
789 break;
792 _leviathanVisualTowers[0][1] = gameObject->GetGUID();
793 break;
796 _leviathanVisualTowers[2][1] = gameObject->GetGUID();
797 break;
800 _leviathanVisualTowers[1][1] = gameObject->GetGUID();
801 break;
805 break;
810 gameObject->DespawnOrUnsummon(0ms, 7_days);
811 break;
814 break;
815 case GO_KEEPERS_GATE:
818 break;
819 // Mimiron, Hodir, Vezax
821 gameObject->EnableCollision(false);
822 break;
823 case GO_SNOW_MOUND:
824 gameObject->EnableCollision(false);
825 break;
826 // Hodir loot chests: spawned locked via gameobject_template_addon,
827 // unlocked by setChestsLootable() when the encounter is defeated
833 {
835 gameObject->SetLootRecipient(instance);
836 }
837 break;
838 // Mimiron Tram
839 case GO_MIMIRON_TRAM:
841 _mimironTramUsed = true;
842 break;
843 // Algalon the Observer
848 break;
854 gameObject->EnableCollision(false);
855 break;
858 gameObject->SetGoState(GO_STATE_ACTIVE);
859 break;
862 gameObject->SetGoState(GO_STATE_ACTIVE);
863 break;
864 // Herbs
865 case 191019: // Adder's Tongue
866 case 190176: // Frost Lotus
867 case 190171: // Lichbloom
868 case 190170: // Talandra's Rose
869 case 189973: // Goldclover
871 gameObject->SetRespawnTime(7 * DAY);
872 break;
873 // Freya Loot
874 case 194324:
875 case 194325:
876 case 194326:
877 case 194327:
878 case 194328:
879 case 194329:
880 case 194330:
881 case 194331:
882 gameObject->SetLootRecipient(instance);
883 break;
884 }
885 }
@ 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:2519
void SetGameObjectFlag(GameObjectFlags flags)
Definition GameObject.h:219
void EnableCollision(bool enable)
Definition GameObject.cpp:2646
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1288
void SetLootRecipient(Creature *creature)
Definition GameObject.cpp:2688
void RemoveGameObjectFlag(GameObjectFlags flags)
Definition GameObject.h:220
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forcedRespawnTime=0s)
Definition GameObject.cpp:928
void OnGameObjectCreate(GameObject *go) override
Definition InstanceScript.cpp:90
TaskScheduler scheduler
Definition InstanceScript.h:305
bool AllBossesDone() const
Definition InstanceScript.cpp:826
Definition TaskScheduler.h:422
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
Definition TaskScheduler.h:233
void OpenIfDone(uint32 encounter, GameObject *go, GOState state)
Definition instance_ulduar.cpp:717
ObjectGuid _leviathanVisualTowers[4][2]
Definition instance_ulduar.cpp:236
@ PERSISTENT_DATA_LEVIATHAN_VEHICLES_USABLE
Definition ulduar.h:363
@ MAGE_BARRIER_LOWERED
Definition ulduar.h:375
@ GO_DOODAD_UL_SIGILDOOR_03
Definition ulduar.h:344
@ GO_DOODAD_UL_UNIVERSEGLOBE01
Definition ulduar.h:347
@ GO_MIMIRON_ELEVATOR
Definition ulduar.h:310
@ GO_DOODAD_UL_SIGILDOOR_01
Definition ulduar.h:342
@ GO_KOLOGARN_BRIDGE
Definition ulduar.h:296
@ GO_LEVIATHAN_DOORS
Definition ulduar.h:277
@ GO_THORIMS_TARGETTING_CRYSTAL
Definition ulduar.h:284
@ GO_HODIR_CHEST_NORMAL
Definition ulduar.h:264
@ GO_DOODAD_UL_SIGILDOOR_02
Definition ulduar.h:343
@ GO_MIMIRONS_TARGETTING_CRYSTAL
Definition ulduar.h:281
@ GO_FREYAS_GENERATOR
Definition ulduar.h:286
@ GO_STORM_BEACON_FIRST
Definition ulduar.h:289
@ GO_HODIR_CHEST_NORMAL_HERO
Definition ulduar.h:265
@ GO_HODIRS_GENERATOR
Definition ulduar.h:287
@ GO_CELESTIAL_PLANETARIUM_ACCESS_25
Definition ulduar.h:341
@ GO_DOODAD_UL_ULDUAR_TRAPDOOR_03
Definition ulduar.h:348
@ GO_HODIR_CHEST_HARD_HERO
Definition ulduar.h:267
@ GO_DOODAD_UL_UNIVERSEFLOOR_01
Definition ulduar.h:345
@ GO_KEEPERS_GATE
Definition ulduar.h:297
@ GO_ULDUAR_PROTECTIVE_BUBBLE
Definition ulduar.h:280
@ GO_THORIMS_GENERATOR
Definition ulduar.h:288
@ GO_REPAIR_STATION_TRAP
Definition ulduar.h:276
@ GO_HODIRS_TARGETTING_CRYSTAL
Definition ulduar.h:283
@ GO_SNOW_MOUND
Definition ulduar.h:319
@ GO_STORM_BEACON_LAST
Definition ulduar.h:290
@ GO_MIMIRONS_GENERATOR
Definition ulduar.h:285
@ GO_HODIR_CHEST_HARD
Definition ulduar.h:266
@ GO_STORM_BEACON_FORMATION_GROUNDS
Definition ulduar.h:291
@ GO_CELESTIAL_PLANETARIUM_ACCESS_10
Definition ulduar.h:340
@ GO_DOODAD_UL_UNIVERSEFLOOR_02
Definition ulduar.h:346
@ GO_MIMIRON_TRAM
Definition ulduar.h:301
@ GO_FREYAS_TARGETTING_CRYSTAL
Definition ulduar.h:282

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.

483 {
485 SpawnLeviathanOutro(false);
486 // The salvaged vehicles wait for the raid at the Expedition Base Camp, they are not tied to Brann's intro.
487 // Keyed on the mode rather than on the pool being empty: a pool whose wrecks are all pending replacement
488 // is empty too, and respawning over it would leave the camp with a double set once the timers fire.
491
492 // mimiron tram:
493 if (GameObject* MimironTram = GetGameObject(DATA_MIMIRON_TRAM))
494 {
495 player->UpdateVisibilityOf(MimironTram);
496 if (StaticTransport* t = MimironTram->ToStaticTransport())
497 {
499 if (!go->GetTransport())
500 t->AddPassenger(go, true);
502 if (!go->GetTransport())
503 t->AddPassenger(go, true);
504 }
505 }
506
507 // Spawn Observation Ring keepers for defeated bosses
508 uint32 watchersMask =
510 for (uint8 i = KEEPER_FREYA; i <= KEEPER_THORIM; ++i)
512 && !(watchersMask & (1 << i))
517
518 uint32 algalonTimer =
520 if (!GetObjectGuid(BOSS_ALGALON) && !_algalonResummonPending && algalonTimer
521 && (algalonTimer <= 60
522 || algalonTimer == TIMER_ALGALON_TO_SUMMON))
523 {
525 if (!algalon)
526 return;
527
528 if (algalonTimer <= 60)
529 {
531 algalon->AI()->DoAction(ACTION_INIT_ALGALON);
532 }
533 else // if (algalonTimer == TIMER_ALGALON_TO_SUMMON)
534 {
538 algalon->SetImmuneToPC(false);
539 }
540 }
541 }
@ SPECIAL
Definition InstanceScript.h:62
CreatureAI * AI() const
Definition Creature.h:144
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:70
StaticTransport * ToStaticTransport()
Definition GameObject.h:326
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:2246
void UpdateVisibilityOf(WorldObject *target)
Definition PlayerUpdates.cpp:1744
Definition Transport.h:120
Definition TemporarySummon.h:50
virtual void DoAction(int32)
Definition UnitAI.h:217
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:10379
static Position const ObservationRingKeepersPos[4]
Definition instance_ulduar.cpp:61
static uint32 const ObservationRingKeeperData[4]
Definition instance_ulduar.cpp:75
static uint32 const ObservationRingKeeperBoss[4]
Definition instance_ulduar.cpp:81
static uint32 const ObservationRingKeeperEntry[4]
Definition instance_ulduar.cpp:69
void SpawnLeviathanOutro(bool justKilled)
Definition instance_ulduar.cpp:325
void SpawnLeviathanEncounterVehicles(uint8 mode)
Definition instance_ulduar.cpp:1334
Position const AlgalonLandPos
Definition ulduar.h:448
@ PERSISTENT_DATA_WATCHERS_MASK
Definition ulduar.h:355
@ KEEPER_THORIM
Definition ulduar.h:441
@ ACTION_INIT_ALGALON
Definition ulduar.h:418
@ EVENT_UPDATE_ALGALON_TIMER
Definition ulduar.h:415
@ VEHICLE_POS_START
Definition ulduar.h:370
@ KEEPER_FREYA
Definition ulduar.h:438
@ 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 _algalonResummonPending, _events, _leviathanVehicleMode, ACTION_INIT_ALGALON, Creature::AI(), AlgalonLandPos, BOSS_ALGALON, BOSS_LEVIATHAN, DATA_MIMIRON_ACTIVATE_TRAM, DATA_MIMIRON_TRAM, DATA_MIMIRON_TRAM_ROCKET_BOOSTER, UnitAI::DoAction(), EVENT_UPDATE_ALGALON_TIMER, InstanceScript::GetBossState(), InstanceScript::GetGameObject(), InstanceScript::GetObjectGuid(), InstanceScript::GetPersistentData(), InstanceScript::instance, InstanceScript::IsBossDone(), KEEPER_FREYA, KEEPER_THORIM, NPC_ALGALON, ObservationRingKeeperBoss, ObservationRingKeeperData, ObservationRingKeeperEntry, ObservationRingKeepersPos, PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_WATCHERS_MASK, EventMap::RescheduleEvent(), Unit::SetImmuneToPC(), SpawnLeviathanEncounterVehicles(), SpawnLeviathanOutro(), SPECIAL, InstanceScript::StorePersistentData(), Map::SummonCreature(), TIMER_ALGALON_SUMMONED, 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.

1100 {
1101 if (Creature* creature = unit->ToCreature())
1103
1104 // Feeds on Tears achievement
1105 if (unit->IsPlayer())
1106 {
1108 if (Creature* algalon = GetCreature(BOSS_ALGALON))
1109 algalon->AI()->DoAction(ACTION_FEEDS_ON_TEARS_FAILED);
1110 }
1111 else if (unit->IsCreature() && unit->GetAreaId() == AREA_THE_CONSERVATORY_OF_LIFE)
1112 {
1113 uint32 conspeedatory =
1115 if (GameTime::GetGameTime().count() > (conspeedatory + DAY))
1116 {
1119 21597 /*CON-SPEED-ATORY_TIMED_CRITERIA*/);
1121 GameTime::GetGameTime().count());
1122 }
1123 }
1124
1125 // achievement Champion/Conqueror of Ulduar
1126 if (unit->IsPlayer())
1127 for (uint8 i = 0; i <= 12; ++i)
1128 {
1129 bool inCombat = false;
1130 if (i == BOSS_LEVIATHAN)
1131 {
1133 if (c->IsInCombat())
1134 inCombat = true;
1135 }
1136 else
1137 inCombat = (GetBossState(i) == IN_PROGRESS);
1138
1139 uint32 mask =
1141 if (inCombat && (mask & (1 << i)) == 0)
1144 mask | (1 << i));
1145 }
1146 }
@ 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:683
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:3179
Seconds GetGameTime()
Definition GameTime.cpp:38
void ScheduleLeviathanVehicleRespawn(Creature *vehicle)
Definition instance_ulduar.cpp:1378
@ PERSISTENT_DATA_CONSPEEDATORY
Definition ulduar.h:356
@ 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
718 {
719 if (GetBossState(encounter) == DONE)
720 go->SetGoState(state);
721 }

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

Referenced by OnGameObjectCreate().

◆ PlayBrannRhydianLine()

void instance_ulduar::instance_ulduar_InstanceMapScript::PlayBrannRhydianLine ( uint8  index)
inline
466 {
467 auto const& line = BrannRhydianDialogue[index];
468 Creature* speaker = line.rhydian
471 if (speaker)
472 speaker->AI()->Talk(line.textGroup);
473
474 uint8 const next = static_cast<uint8>(index + 1);
475 if (next < static_cast<uint8>(sizeof(BrannRhydianDialogue) / sizeof(BrannRhydianDialogue[0])))
476 scheduler.Schedule(line.nextDelay, [this, next](TaskContext /*context*/)
477 {
479 });
480 }
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 @310 BrannRhydianDialogue[]
void PlayBrannRhydianLine(uint8 index)
Definition instance_ulduar.cpp:465
@ DATA_BRANN_FORMATION_GROUNDS
Definition ulduar.h:159

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.

561 {
562 // destory towers
564 SetData(eventId, 0);
565 else if (eventId == EVENT_HODIR_SHATTER_CHEST)
566 {
567 if (GameObject* go = GetHodirChest(true))
568 {
569 go->SetGoState(GO_STATE_ACTIVE);
570 scheduler.Schedule(3s, [this](TaskContext /*context*/)
571 {
574 });
575 }
576 }
577 }
void SetData(uint32 type, uint32 data) override
Definition instance_ulduar.cpp:925
GameObject * GetHodirChest(bool hardmode)
Definition instance_ulduar.cpp:723
@ 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
890 {
892 return;
893
894 _hmHodir = true;
895
896 if (GameObject* go = GetHodirChest(true))
897 go->Respawn();
898 }

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

Referenced by SetData().

◆ ScheduleLeviathanVehicleRespawn()

void instance_ulduar::instance_ulduar_InstanceMapScript::ScheduleLeviathanVehicleRespawn ( Creature *  vehicle)
1379{
1380 // The Expedition Base Camp keeps its motor pool stocked. The trigger that ends it is the pool itself being
1381 // relocated to the Formation Grounds on the first Reset() after the boss has been engaged, not the raid
1382 // driving up there: for the whole first attempt wrecks are still replaced back at the camp. From the
1383 // relocation on, a wreck stays where it fell and only the next reset lays out a fresh set
1385 return;
1386
1387 for (auto itr = _leviathanVehicles.begin(); itr != _leviathanVehicles.end(); ++itr)
1388 {
1389 if (itr->guid != vehicle->GetGUID())
1390 continue;
1391
1392 uint32 entry = itr->entry;
1393 uint32 index = itr->index;
1394 _leviathanVehicles.erase(itr);
1395
1396 // A replacement rolls out of the camp 40 seconds after the wreck has decayed
1398 scheduler.Schedule(respawnDelay, [this, entry, index](TaskContext /*context*/)
1399 {
1401 SummonLeviathanVehicle(entry, index);
1402 });
1403
1404 return;
1405 }
1406}
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
uint32 GetCorpseDelay() const
Definition Creature.h:76
constexpr Seconds LEVIATHAN_VEHICLE_RESPAWN_DELAY
Definition instance_ulduar.cpp:201
void SummonLeviathanVehicle(uint32 entry, uint32 index)
Definition instance_ulduar.cpp:1366

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.

580 {
581 if (!InstanceScript::SetBossState(type, state))
582 return false;
583
584 switch (type)
585 {
586 case BOSS_LEVIATHAN:
587 if (state == DONE)
588 {
589 instance->DoForAllPlayers([&](Player* player)
590 {
591 if (Creature* vehicleCreature = player->GetVehicleCreatureBase())
592 vehicleCreature->DespawnOrUnsummon();
593 });
594
596 go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
597
600 }
601 break;
602 case BOSS_MIMIRON:
603 if (state == IN_PROGRESS)
604 _mimironTramUsed = true;
605 [[fallthrough]];
606 case BOSS_HODIR:
607 case BOSS_THORIM:
608 case BOSS_FREYA:
610 {
611 scheduler.Schedule(45s, [this](TaskContext /*context*/)
612 {
614 trigger->AI()->Talk(EMOTE_ANCIENT_GATE_UNLOCKED);
615 });
616 }
617 if (type == BOSS_HODIR && state == DONE)
619 if (state == DONE)
620 {
621 uint8 keeperIdx = type - BOSS_FREYA;
624 ObservationRingKeepersPos[keeperIdx]);
625 }
626 break;
627 default:
628 break;
629 }
630
631 // take care of herbs
632 if (type == BOSS_FREYA && state == DONE)
633 {
634 std::list<GameObject*> goList;
635 if (Creature* freya = GetCreature(BOSS_FREYA))
636 {
637 freya->GetGameObjectListWithEntryInGrid(goList, { 191019, 190176, 190171, 190170, 189973 }, 333.0f);
638
639 for (GameObject* herb : goList)
640 herb->SetRespawnTime(7 * DAY);
641 }
642 }
643
644 if (type > BOSS_LEVIATHAN && type < MAX_ENCOUNTER && state == IN_PROGRESS)
645 {
646 instance->DoForAllPlayers([&](Player* player)
647 {
648 if (Creature* vehicleCreature = player->GetVehicleCreatureBase())
649 vehicleCreature->DespawnOrUnsummon();
650 });
651 }
652
653 return true;
654 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
virtual bool SetBossState(uint32 id, EncounterState state)
Definition InstanceScript.cpp:400
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:3343
Definition Player.h:1086
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:14631
void GetGameObjectListWithEntryInGrid(std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
Definition Object.cpp:2605
Position const triggerAncientGatePosition
Definition instance_ulduar.cpp:254
void setChestsLootable(uint32 boss)
Definition instance_ulduar.cpp:900
void DespawnLeviathanGauntlet()
Definition instance_ulduar.cpp:300
@ NPC_ANCIENT_GATE_WORLD_TRIGGER
Definition ulduar.h:433
@ EMOTE_ANCIENT_GATE_UNLOCKED
Definition ulduar.h:434
@ DATA_LEVIATHAN_DOORS
Definition ulduar.h:68

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

◆ setChestsLootable()

void instance_ulduar::instance_ulduar_InstanceMapScript::setChestsLootable ( uint32  boss)
inline
901 {
902 if (boss)
903 {
904 switch (boss)
905 {
906 case BOSS_HODIR:
907 if (_hmHodir)
908 {
909 if (GameObject* go = GetHodirChest(true))
910 {
911 go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
912 go->SetLootRecipient(instance);
913 }
914 }
915 if (GameObject* go = GetHodirChest(false))
916 {
917 go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
918 go->SetLootRecipient(instance);
919 }
920 break;
921 }
922 }
923 }

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.

926 {
927 switch (type)
928 {
931 break;
933 if (GameObject* go = GetHodirChest(true))
934 {
935 _hmHodir = false;
936 go->DespawnOrUnsummon(0ms, 7_days);
937 }
938 break;
942 break;
944 if (Creature* sara = GetCreature(DATA_SARA))
945 sara->AI()->DoAction(ACTION_SARA_UPDATE_SUMMON_KEEPERS);
946 break;
951 {
953 for (uint8 i = 0; i < 2; ++i)
954 {
956 {
957 gameObject->SetGoState(GO_STATE_ACTIVE);
958 }
959 }
960 return;
961 }
962
965 return;
967 // Archmage Pentarus has just answered Brann, the crews get a moment to reach the vehicles
968 scheduler.Schedule(3s, [this](TaskContext /*context*/)
969 {
971 });
972 return;
978 return;
982 return;
991 return;
992 // Achievement
996 return;
997 case DATA_CALL_TRAM:
998 if (GameObject* MimironTram = GetGameObject(DATA_MIMIRON_TRAM))
999 if (StaticTransport* t = MimironTram->ToStaticTransport())
1000 {
1001 if (data == 0 && t->GetGoState() == GO_STATE_ACTIVE && t->GetPathProgress() == t->GetPauseTime())
1002 {
1003 MimironTram->SetGoState(GO_STATE_READY);
1005 rocketBooster->SetGoState(GO_STATE_ACTIVE);
1006 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1007 activateTramButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1008 if (GameObject* callTramCenterButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_CENTER))
1009 callTramCenterButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1010 scheduler.Schedule(30s, [this](TaskContext /*context*/)
1011 {
1013 turnaround1->UseDoorOrButton();
1015 rocketBooster->SetGoState(GO_STATE_READY);
1016 }).Schedule(60s, [this](TaskContext /*context*/)
1017 {
1018 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1019 activateTramButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1020 if (GameObject* callTramMimironButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_MIMIRON))
1021 callTramMimironButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1022 });
1023 }
1024 if (data == 1 && t->GetGoState() == GO_STATE_READY && t->GetPathProgress() == 0)
1025 {
1026 MimironTram->SetGoState(GO_STATE_ACTIVE);
1028 rocketBooster->SetGoState(GO_STATE_ACTIVE);
1029 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1030 activateTramButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1031 if (GameObject* callTramMimironButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_MIMIRON))
1032 callTramMimironButton->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1033 scheduler.Schedule(33s, [this](TaskContext /*context*/)
1034 {
1036 turnaround2->UseDoorOrButton();
1038 rocketBooster->SetGoState(GO_STATE_READY);
1039 }).Schedule(63s, [this](TaskContext /*context*/)
1040 {
1041 if (GameObject* activateTramButton = GetGameObject(DATA_MIMIRON_ACTIVATE_TRAM))
1042 activateTramButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1043 if (GameObject* callTramCenterButton = GetGameObject(DATA_MIMIRON_CALL_TRAM_CENTER))
1044 callTramCenterButton->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
1045 });
1046 }
1047 }
1048 break;
1051 cr->TextEmote("Go to your vehicles!", nullptr, true);
1052 break;
1058 break;
1059 }
1060
1061 }
@ 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:674
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:2447
void respawnHodirHardmodeChest()
Definition instance_ulduar.cpp:889
void ProcessEvent(WorldObject *, uint32 eventId) override
Definition instance_ulduar.cpp:560
void UnlockLeviathanVehicles()
Definition instance_ulduar.cpp:315
@ EVENT_KEEPER_TELEPORTED
Definition ulduar.h:430
@ SPELL_DWARFAGEDDON
Definition ulduar.h:444
@ ACTION_SARA_UPDATE_SUMMON_KEEPERS
Definition ulduar.h:437
@ EVENT_RESUMMON_ALGALON
Definition ulduar.h:416
@ TIMER_ALGALON_DEFEATED
Definition ulduar.h:422
@ DATA_SARA
Definition ulduar.h:130
@ DATA_BRANN_MEMOTESAY
Definition ulduar.h:148
@ DATA_BRANN_BASE_CAMP
Definition ulduar.h:150
@ 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:149
@ DATA_ALGALON_DEFEATED
Definition ulduar.h:105
@ 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:117
@ DATA_ALGALON_SUMMON_STATE
Definition ulduar.h:103
@ DATA_RESUMMON_ALGALON
Definition ulduar.h:114

References _algalonResummonPending, _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_RESUMMON_ALGALON, DATA_SARA, DATA_VEHICLE_SPAWN, InstanceScript::DoStartTimedAchievement(), InstanceScript::DoUpdateAchievementCriteria(), InstanceScript::DoUpdateWorldState(), EVENT_KEEPER_TELEPORTED, EVENT_RESUMMON_ALGALON, 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(), GetHodirChest(), GO_FLAG_NOT_SELECTABLE, GO_STATE_ACTIVE, GO_STATE_READY, InstanceScript::instance, 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_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 ProcessEvent(), and Update().

◆ SpawnLeviathanEncounterVehicles()

void instance_ulduar::instance_ulduar_InstanceMapScript::SpawnLeviathanEncounterVehicles ( uint8  mode)
1335{
1336 // Retire the old set first: despawning it must not queue replacements for a set that is going away
1337 std::vector<LeviathanVehicle> retired;
1338 retired.swap(_leviathanVehicles);
1339 _leviathanVehicleMode = mode;
1340
1341 for (LeviathanVehicle const& summoned : retired)
1342 {
1343 if (Creature* cr = instance->GetCreature(summoned.guid))
1344 {
1345 cr->DespawnOrUnsummon();
1346 }
1347 }
1348
1349 if (mode >= VEHICLE_POS_NONE)
1350 return;
1351
1352 // The raid may look the vehicles over on arrival, but cannot board them until the Kirin Tor say so.
1353 // MAGE_BARRIER_LOWERED covers lockouts saved before the unlock got its own flag.
1357
1358 for (uint32 i = 0; i < (instance->Is25ManRaid() ? 5u : 2u); ++i)
1359 {
1361 SummonLeviathanVehicle(NPC_VEHICLE_CHOPPER, 15 * mode + i + 5);
1363 }
1364}
bool Is25ManRaid() const
Definition Map.h:304
Definition instance_ulduar.cpp:205
@ NPC_SALVAGED_SIEGE_ENGINE
Definition ulduar.h:225
@ NPC_VEHICLE_CHOPPER
Definition ulduar.h:227
@ NPC_SALVAGED_DEMOLISHER
Definition ulduar.h:228

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
326 {
328 return;
329
331
332 std::list<TempSummon*> summons;
334 if (!summons.empty())
335 _formationRhydianGUID = summons.front()->GetGUID();
336
337 summons.clear();
339 if (justKilled)
340 for (TempSummon* mage : summons)
341 mage->CastSpell(mage, SPELL_SIMPLE_TELEPORT_VISUAL, true);
342
343 summons.clear();
345 for (TempSummon* battleMage : summons)
346 {
347 if (justKilled)
348 battleMage->CastSpell(battleMage, SPELL_SIMPLE_TELEPORT_VISUAL, true);
349 // The two by the portal sustain it; the one at the Formation Grounds teleporter does not
350 if (battleMage->GetPositionX() > 200.0f)
351 battleMage->CastSpell(battleMage, SPELL_ARCANE_CHANNELING, false);
352 }
353
355
356 // The crew stands by the Leviathan gate until the sequence sends it into formation
357 summons.clear();
359 for (TempSummon* crew : summons)
360 _leviathanCrewGUIDs.push_back(crew->GetGUID());
361
362 if (justKilled)
363 {
365 return;
366 }
367
368 // On later visits the landing, march and dialogue replay once someone approaches the Formation Grounds
369 scheduler.Schedule(2s, [this](TaskContext context)
370 {
372 return;
373
374 bool triggered = false;
375 instance->DoForAllPlayers([&](Player* player)
376 {
377 if (player->IsAlive() && player->GetExactDist2d(234.0f, -100.0f) < 150.0f)
378 triggered = true;
379 });
380
381 if (triggered)
383 else
384 context.Repeat(2s);
385 });
386 }
float summons[3][4]
Definition boss_urom.cpp:71
void SummonGameObjectGroup(uint8 group, std::list< GameObject * > *list=nullptr)
Definition Object.cpp:2376
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2364
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
Definition TaskScheduler.h:494
bool IsAlive() const
Definition Unit.h:1796
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170
void StartLeviathanOutroSequence()
Definition instance_ulduar.cpp:388
@ 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().

◆ StartLeviathanOutroSequence()

void instance_ulduar::instance_ulduar_InstanceMapScript::StartLeviathanOutroSequence ( )
inline
389 {
391 return;
392
394
395 // The crew runs its sniffed column routes into the formation slots, paired by group row order
396 static uint32 const marchPaths[] =
397 {
398 3414401, 3414402, 3414403, 3414404, 3414405, 3414406,
399 3414501, 3414502, 3414503, 3414504, 3414505, 3414506
400 };
401 if (std::vector<TempSummonData> const* formation = sObjectMgr->GetSummonGroup(MAP_ULDUAR, SUMMONER_TYPE_MAP, SUMMON_GROUP_LEVIATHAN_OUTRO))
402 {
403 auto slot = formation->begin();
404 uint8 pathIndex = 0;
405 for (ObjectGuid const& guid : _leviathanCrewGUIDs)
406 {
407 Creature* crew = instance->GetCreature(guid);
408 if (!crew)
409 continue;
410 while (slot != formation->end() && slot->entry != crew->GetEntry())
411 ++slot;
412 if (slot == formation->end() || pathIndex >= sizeof(marchPaths) / sizeof(marchPaths[0]))
413 break;
414 crew->SetHomePosition(slot->pos);
415 crew->GetMotionMaster()->MovePath(marchPaths[pathIndex], FORCED_MOVEMENT_RUN);
416 ++slot;
417 ++pathIndex;
418 }
419 }
420 _leviathanCrewGUIDs.clear();
421
422 // The machine flies its sniffed arc over the grounds and reaches the descent point at ~36s
423 std::list<TempSummon*> machine;
425 if (!machine.empty())
426 {
427 _leviathanMachineGUID = machine.front()->GetGUID();
428 machine.front()->SetCanFly(true);
429 machine.front()->GetMotionMaster()->MovePath(PATH_FLYING_MACHINE_APPROACH);
430 }
431
432 scheduler.Schedule(13s, [this](TaskContext /*context*/)
433 {
435 {
436 rhydian->SetHomePosition({ 239.31581f, -123.64426f, 409.80365f, 3.104f });
437 rhydian->GetMotionMaster()->MovePath(PATH_RHYDIAN_TO_BRANN, FORCED_MOVEMENT_WALK);
438 }
439 }).Schedule(36s, [this](TaskContext /*context*/)
440 {
441 if (Creature* flyingMachine = instance->GetCreature(_leviathanMachineGUID))
442 flyingMachine->GetMotionMaster()->MoveLand(0, { 246.4216f, -80.03793f, 409.80365f });
443 }).Schedule(39s, [this](TaskContext /*context*/)
444 {
445 std::list<TempSummon*> brann;
447 if (brann.empty())
448 return;
449
450 if (std::vector<TempSummonData> const* formation = sObjectMgr->GetSummonGroup(MAP_ULDUAR, SUMMONER_TYPE_MAP, SUMMON_GROUP_LEVIATHAN_OUTRO))
451 for (TempSummonData const& slot : *formation)
452 if (slot.entry == NPC_BRANN_FORMATION_GROUNDS)
453 {
454 brann.front()->SetHomePosition(slot.pos);
455 break;
456 }
457
458 brann.front()->GetMotionMaster()->MovePath(PATH_BRANN_FORMATION_GROUNDS, FORCED_MOVEMENT_WALK);
459 }).Schedule(59500ms, [this](TaskContext /*context*/)
460 {
462 });
463 }
@ 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:1761
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:238

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 
)
1367{
1368 if (TempSummon* veh = instance->SummonCreature(entry, vehiclePositions[index]))
1369 {
1370 // The vehicle kit hands out the spell click on install, take it back while the barrier is still up
1372 veh->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
1373
1374 _leviathanVehicles.push_back({ veh->GetGUID(), entry, index });
1375 }
1376}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:346
const Position vehiclePositions[30]
Definition instance_ulduar.cpp:1292

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.

1178 {
1180
1181 if (_events.Empty())
1182 return;
1183
1184 _events.Update(diff);
1185 switch (_events.ExecuteEvent())
1186 {
1188 {
1189 uint32 algalonTimer =
1191 if (algalonTimer == TIMER_ALGALON_DEFEATED)
1192 return;
1193
1196 --algalonTimer);
1199 algalonTimer);
1200 if (algalonTimer)
1201 {
1202 _events.Repeat(1min);
1203 return;
1204 }
1205
1207 if (Creature* algalon = GetCreature(BOSS_ALGALON))
1208 algalon->AI()->DoAction(ACTION_DESPAWN_ALGALON);
1209 break;
1210 }
1215 algalon->AI()->DoAction(ACTION_START_INTRO);
1216 break;
1217 }
1218 }
@ ACTION_START_INTRO
Definition boss_nightbane.cpp:57
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:257
@ ACTION_DESPAWN_ALGALON
Definition ulduar.h:419
Position const AlgalonSummonPos
Definition ulduar.h:447

References _algalonResummonPending, _events, ACTION_DESPAWN_ALGALON, ACTION_START_INTRO, AlgalonSummonPos, BOSS_ALGALON, DATA_ALGALON_DEFEATED, InstanceScript::DoUpdateWorldState(), EventMap::Empty(), EVENT_RESUMMON_ALGALON, EVENT_UPDATE_ALGALON_TIMER, EventMap::ExecuteEvent(), InstanceScript::GetCreature(), InstanceScript::GetPersistentData(), InstanceScript::instance, NPC_ALGALON, PERSISTENT_DATA_ALGALON_TIMER, EventMap::Repeat(), SetData(), InstanceScript::StorePersistentData(), Map::SummonCreature(), TIMER_ALGALON_DEFEATED, EventMap::Update(), InstanceScript::Update(), and WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER.

Member Data Documentation

◆ _algalonResummonPending

bool instance_ulduar::instance_ulduar_InstanceMapScript::_algalonResummonPending

◆ _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: