diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Instances/InstanceLockMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceLockMgr.h | 8 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.h | 3 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 20 |
5 files changed, 41 insertions, 9 deletions
diff --git a/src/server/game/Instances/InstanceLockMgr.cpp b/src/server/game/Instances/InstanceLockMgr.cpp index 94cfd09706c..b1c645f46e9 100644 --- a/src/server/game/Instances/InstanceLockMgr.cpp +++ b/src/server/game/Instances/InstanceLockMgr.cpp @@ -346,6 +346,9 @@ InstanceLock* InstanceLockMgr::UpdateInstanceLockForPlayer(CharacterDatabaseTran if (!entries.MapDifficulty->IsUsingEncounterLocks()) instanceLock->GetData()->CompletedEncountersMask |= updateEvent.InstanceCompletedEncountersMask; + if (updateEvent.EntranceWorldSafeLocId) + instanceLock->GetData()->EntranceWorldSafeLocId = *updateEvent.EntranceWorldSafeLocId; + if (instanceLock->IsExpired()) { ASSERT(instanceLock->IsExtended(), "Instance lock must have been extended to create instance map from it"); @@ -393,6 +396,9 @@ void InstanceLockMgr::UpdateSharedInstanceLock(CharacterDatabaseTransaction tran updateEvent.InstanceId, updateEvent.CompletedEncounter->ID, updateEvent.CompletedEncounter->Name[sWorld->GetDefaultDbcLocale()]); } + if (updateEvent.EntranceWorldSafeLocId) + sharedData->EntranceWorldSafeLocId = *updateEvent.EntranceWorldSafeLocId; + trans->PAppend("DELETE FROM instance2 WHERE instanceId=%u", sharedData->InstanceId); std::string escapedData = sharedData->Data; diff --git a/src/server/game/Instances/InstanceLockMgr.h b/src/server/game/Instances/InstanceLockMgr.h index 45394451878..f905d7e6fe7 100644 --- a/src/server/game/Instances/InstanceLockMgr.h +++ b/src/server/game/Instances/InstanceLockMgr.h @@ -23,6 +23,7 @@ #include "Duration.h" #include "Hash.h" #include "ObjectGuid.h" +#include "Optional.h" #include <unordered_map> /* @@ -173,8 +174,10 @@ struct TC_GAME_API MapDb2Entries struct InstanceLockUpdateEvent { - InstanceLockUpdateEvent(uint32 instanceId, std::string newData, uint32 instanceCompletedEncountersMask, DungeonEncounterEntry const* completedEncounter) - : InstanceId(instanceId), NewData(std::move(newData)), InstanceCompletedEncountersMask(instanceCompletedEncountersMask), CompletedEncounter(completedEncounter) { } + InstanceLockUpdateEvent(uint32 instanceId, std::string newData, uint32 instanceCompletedEncountersMask, DungeonEncounterEntry const* completedEncounter, + Optional<uint32> entranceWorldSafeLocId) : + InstanceId(instanceId), NewData(std::move(newData)), InstanceCompletedEncountersMask(instanceCompletedEncountersMask), CompletedEncounter(completedEncounter), + EntranceWorldSafeLocId(entranceWorldSafeLocId) { } InstanceLockUpdateEvent(InstanceLockUpdateEvent const& other) = delete; InstanceLockUpdateEvent(InstanceLockUpdateEvent&& other) noexcept; @@ -186,6 +189,7 @@ struct InstanceLockUpdateEvent std::string NewData; uint32 InstanceCompletedEncountersMask; DungeonEncounterEntry const* CompletedEncounter; + Optional<uint32> EntranceWorldSafeLocId; }; // TOTALLY NOT THREADSAFE YET diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 3d3a8cf3384..79cfe925f5b 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -521,6 +521,19 @@ std::string InstanceScript::UpdateAdditionalSaveData(std::string const& oldData, return writer.GetString(); } +Optional<uint32> InstanceScript::GetEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const +{ + if (!instance->GetMapDifficulty()->IsUsingEncounterLocks()) + return _entranceId; + + return ComputeEntranceLocationForCompletedEncounters(completedEncountersMask); +} + +Optional<uint32> InstanceScript::ComputeEntranceLocationForCompletedEncounters(uint32 /*completedEncountersMask*/) const +{ + return { }; +} + void InstanceScript::HandleGameObject(ObjectGuid guid, bool open, GameObject* go /*= nullptr*/) { if (!go) diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 121e243033c..43cb58622fc 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -21,6 +21,7 @@ #include "ZoneScript.h" #include "Common.h" #include "Duration.h" +#include "Optional.h" #include <array> #include <map> #include <set> @@ -197,6 +198,8 @@ class TC_GAME_API InstanceScript : public ZoneScript std::string UpdateBossStateSaveData(std::string const& oldData, UpdateBossStateSaveDataEvent const& event); std::string UpdateAdditionalSaveData(std::string const& oldData, UpdateAdditionalSaveDataEvent const& event); + Optional<uint32> GetEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const; + virtual Optional<uint32> ComputeEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const; virtual void Update(uint32 /*diff*/) { } void UpdateCombatResurrection(uint32 diff); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index d2295ac58c9..fbf89f37050 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3017,8 +3017,8 @@ void InstanceMap::UpdateInstanceLock(UpdateBossStateSaveDataEvent const& updateS CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); if (entries.IsInstanceIdBound()) - sInstanceLockMgr.UpdateSharedInstanceLock(trans, - { GetInstanceId(), i_data->GetSaveData(), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter }); + sInstanceLockMgr.UpdateSharedInstanceLock(trans, InstanceLockUpdateEvent(GetInstanceId(), i_data->GetSaveData(), + instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data->GetEntranceLocationForCompletedEncounters(instanceCompletedEncounters))); for (MapReference& mapReference : m_mapRefManager) { @@ -3029,13 +3029,18 @@ void InstanceMap::UpdateInstanceLock(UpdateBossStateSaveDataEvent const& updateS InstanceLock const* playerLock = sInstanceLockMgr.FindActiveInstanceLock(player->GetGUID(), entries); std::string const* oldData = nullptr; + uint32 playerCompletedEncounters = 0; if (playerLock) + { oldData = &playerLock->GetData()->Data; + playerCompletedEncounters = playerLock->GetData()->CompletedEncountersMask | (1u << updateSaveDataEvent.DungeonEncounter->Bit); + } bool isNewLock = !playerLock || !playerLock->GetData()->CompletedEncountersMask || playerLock->IsExpired(); InstanceLock const* newLock = sInstanceLockMgr.UpdateInstanceLockForPlayer(trans, player->GetGUID(), entries, - { GetInstanceId(), i_data->UpdateBossStateSaveData(oldData ? *oldData : "", updateSaveDataEvent), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter }); + InstanceLockUpdateEvent(GetInstanceId(), i_data->UpdateBossStateSaveData(oldData ? *oldData : "", updateSaveDataEvent), + instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data->GetEntranceLocationForCompletedEncounters(playerCompletedEncounters))); if (isNewLock) { @@ -3062,8 +3067,8 @@ void InstanceMap::UpdateInstanceLock(UpdateAdditionalSaveDataEvent const& update CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); if (entries.IsInstanceIdBound()) - sInstanceLockMgr.UpdateSharedInstanceLock(trans, - { GetInstanceId(), i_data->GetSaveData(), instanceCompletedEncounters, nullptr }); + sInstanceLockMgr.UpdateSharedInstanceLock(trans, InstanceLockUpdateEvent(GetInstanceId(), i_data->GetSaveData(), + instanceCompletedEncounters, nullptr, {})); for (MapReference& mapReference : m_mapRefManager) { @@ -3080,7 +3085,8 @@ void InstanceMap::UpdateInstanceLock(UpdateAdditionalSaveDataEvent const& update bool isNewLock = !playerLock || !playerLock->GetData()->CompletedEncountersMask || playerLock->IsExpired(); InstanceLock const* newLock = sInstanceLockMgr.UpdateInstanceLockForPlayer(trans, player->GetGUID(), entries, - { GetInstanceId(), i_data->UpdateAdditionalSaveData(oldData ? *oldData : "", updateSaveDataEvent), instanceCompletedEncounters, nullptr }); + InstanceLockUpdateEvent(GetInstanceId(), i_data->UpdateAdditionalSaveData(oldData ? *oldData : "", updateSaveDataEvent), + instanceCompletedEncounters, nullptr, {})); if (isNewLock) { @@ -3106,7 +3112,7 @@ void InstanceMap::CreateInstanceLockForPlayer(Player* player) CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); InstanceLock const* newLock = sInstanceLockMgr.UpdateInstanceLockForPlayer(trans, player->GetGUID(), entries, - { GetInstanceId(), i_data->GetSaveData(), i_instanceLock->GetData()->CompletedEncountersMask, nullptr }); + InstanceLockUpdateEvent(GetInstanceId(), i_data->GetSaveData(), i_instanceLock->GetData()->CompletedEncountersMask, nullptr, {})); CharacterDatabase.CommitTransaction(trans); |