aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Instances/InstanceLockMgr.cpp6
-rw-r--r--src/server/game/Instances/InstanceLockMgr.h8
-rw-r--r--src/server/game/Instances/InstanceScript.cpp13
-rw-r--r--src/server/game/Instances/InstanceScript.h3
-rw-r--r--src/server/game/Maps/Map.cpp20
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);