From 2b09e4227b5f072848b93080e5feaebc99eb09a1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 4 Oct 2022 14:53:22 -0400 Subject: [PATCH] Core/Instances: Save instance entrance based on completed encounters Port From (https://github.com/TrinityCore/TrinityCore/commit/4cbaaa343543e0fde5d90b87f762804997f1dbac) --- .../Game/Maps/Instances/InstanceLockManager.cs | 10 +++++++++- Source/Game/Maps/Instances/InstanceScript.cs | 13 +++++++++++++ Source/Game/Maps/Map.cs | 17 ++++++++++++----- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Source/Game/Maps/Instances/InstanceLockManager.cs b/Source/Game/Maps/Instances/InstanceLockManager.cs index 5e13ce427..05d6a1a9a 100644 --- a/Source/Game/Maps/Instances/InstanceLockManager.cs +++ b/Source/Game/Maps/Instances/InstanceLockManager.cs @@ -267,6 +267,9 @@ namespace Game.Maps if (!entries.MapDifficulty.IsUsingEncounterLocks()) instanceLock.GetData().CompletedEncountersMask |= updateEvent.InstanceCompletedEncountersMask; + if (updateEvent.EntranceWorldSafeLocId.HasValue) + instanceLock.GetData().EntranceWorldSafeLocId = updateEvent.EntranceWorldSafeLocId.Value; + if (instanceLock.IsExpired()) { Cypher.Assert(instanceLock.IsExtended(), "Instance lock must have been extended to create instance map from it"); @@ -299,6 +302,9 @@ namespace Game.Maps Log.outDebug(LogFilter.Instance, $"Instance {updateEvent.InstanceId} gains completed encounter [{updateEvent.CompletedEncounter.Id}-{updateEvent.CompletedEncounter.Name[Global.WorldMgr.GetDefaultDbcLocale()]}]"); } + if (updateEvent.EntranceWorldSafeLocId.HasValue) + sharedData.EntranceWorldSafeLocId = updateEvent.EntranceWorldSafeLocId.Value; + trans.Append($"DELETE FROM instance2 WHERE instanceId={sharedData.InstanceId}"); string escapedData = sharedData.Data; CharacterDatabase.EscapeString(ref escapedData); @@ -505,13 +511,15 @@ namespace Game.Maps public string NewData; public uint InstanceCompletedEncountersMask; public DungeonEncounterRecord CompletedEncounter; + public uint? EntranceWorldSafeLocId; - public InstanceLockUpdateEvent(uint instanceId, string newData, uint instanceCompletedEncountersMask, DungeonEncounterRecord completedEncounter) + public InstanceLockUpdateEvent(uint instanceId, string newData, uint instanceCompletedEncountersMask, DungeonEncounterRecord completedEncounter, uint? entranceWorldSafeLocId) { InstanceId = instanceId; NewData = newData; InstanceCompletedEncountersMask = instanceCompletedEncountersMask; CompletedEncounter = completedEncounter; + EntranceWorldSafeLocId = entranceWorldSafeLocId; } } } diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index bf2fb112e..af44bc705 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -506,6 +506,19 @@ namespace Game.Maps return writer.GetString(); } + public uint? GetEntranceLocationForCompletedEncounters(uint completedEncountersMask) + { + if (!instance.GetMapDifficulty().IsUsingEncounterLocks()) + return _entranceId; + + return ComputeEntranceLocationForCompletedEncounters(completedEncountersMask); + } + + public virtual uint? ComputeEntranceLocationForCompletedEncounters(uint completedEncountersMask) + { + return null; + } + public void HandleGameObject(ObjectGuid guid, bool open, GameObject go = null) { if (!go) diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index a720db78a..03eedd7a1 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -4992,7 +4992,8 @@ namespace Game.Maps SQLTransaction trans = new(); if (entries.IsInstanceIdBound()) - Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter)); + Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), + instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data.GetEntranceLocationForCompletedEncounters(instanceCompletedEncounters))); foreach (var player in GetPlayers()) { @@ -5002,12 +5003,17 @@ namespace Game.Maps InstanceLock playerLock = Global.InstanceLockMgr.FindActiveInstanceLock(player.GetGUID(), entries); string oldData = ""; + uint playerCompletedEncounters = 0; if (playerLock != null) + { oldData = playerLock.GetData().Data; + playerCompletedEncounters = playerLock.GetData().CompletedEncountersMask | (1u << updateSaveDataEvent.DungeonEncounter.Bit); + } bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired(); - InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateBossStateSaveData(oldData, updateSaveDataEvent), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter)); + InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateBossStateSaveData(oldData, updateSaveDataEvent), + instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data.GetEntranceLocationForCompletedEncounters(playerCompletedEncounters))); if (isNewLock) { @@ -5034,7 +5040,7 @@ namespace Game.Maps SQLTransaction trans = new(); if (entries.IsInstanceIdBound()) - Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, null)); + Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, null, null)); foreach (var player in GetPlayers()) { @@ -5049,7 +5055,8 @@ namespace Game.Maps bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired(); - InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateAdditionalSaveData(oldData, updateSaveDataEvent), instanceCompletedEncounters, null)); + InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateAdditionalSaveData(oldData, updateSaveDataEvent), + instanceCompletedEncounters, null, null)); if (isNewLock) { @@ -5074,7 +5081,7 @@ namespace Game.Maps SQLTransaction trans = new(); - InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), i_instanceLock.GetData().CompletedEncountersMask, null)); + InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), i_instanceLock.GetData().CompletedEncountersMask, null, null)); DB.Characters.CommitTransaction(trans);