From d94ad385b13b7d73b6740bd1e2cd76ca0d43786c Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 26 May 2018 13:12:28 -0400 Subject: [PATCH] Core/Maps: Fixes nulls which unloading instance maps. --- Source/Game/Maps/Instances/MapInstance.cs | 9 ++--- Source/Game/Maps/Map.cs | 41 ++++++++++++----------- Source/Game/Maps/MapManager.cs | 3 +- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Source/Game/Maps/Instances/MapInstance.cs b/Source/Game/Maps/Instances/MapInstance.cs index 107c3038b..041027200 100644 --- a/Source/Game/Maps/Instances/MapInstance.cs +++ b/Source/Game/Maps/Instances/MapInstance.cs @@ -45,17 +45,17 @@ namespace Game.Maps { base.Update(diff); - foreach (var i in m_InstancedMaps.ToList()) + foreach (var pair in m_InstancedMaps.ToList()) { - if (i.Value.CanUnload(diff)) + if (pair.Value.CanUnload(diff)) { - if (!DestroyInstance(i)) + if (!DestroyInstance(pair)) { //m_unloadTimer } } else - i.Value.Update(diff); + pair.Value.Update(diff); } } @@ -265,6 +265,7 @@ namespace Game.Maps Global.MapMgr.FreeInstanceId(pair.Value.GetInstanceId()); // erase map + pair.Value.Dispose(); m_InstancedMaps.Remove(pair.Key); return true; diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index f83cd345a..958d5597b 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -36,7 +36,7 @@ using System.Linq; namespace Game.Maps { - public class Map + public class Map : IDisposable { public Map(uint id, long expiry, uint instanceId, Difficulty spawnmode, Map parent = null) { @@ -86,6 +86,27 @@ namespace Game.Maps Global.ScriptMgr.OnCreateMap(this); } + public void Dispose() + { + Global.ScriptMgr.OnDestroyMap(this); + + for (var i = 0; i < i_worldObjects.Count; ++i) + { + WorldObject obj = i_worldObjects[i]; + Contract.Assert(obj.IsWorldObject()); + obj.RemoveFromWorld(); + obj.ResetMap(); + } + + if (!m_scriptSchedule.Empty()) + Global.MapMgr.DecreaseScheduledScriptCount((uint)m_scriptSchedule.Count); + + if (m_parentMap == this) + m_childTerrainMaps = null; + + Global.MMapMgr.unloadMapInstance(GetId(), i_InstanceId); + } + public static bool ExistMap(uint mapid, uint gx, uint gy) { string fileName = $"{Global.WorldMgr.GetDataPath()}/maps/{mapid:D4}_{gx:D2}_{gy:D2}.map"; @@ -1647,24 +1668,6 @@ namespace Game.Maps _corpsesByCell.Clear(); _corpsesByPlayer.Clear(); _corpseBones.Clear(); - - Global.ScriptMgr.OnDestroyMap(this); - - for (var i = 0; i < i_worldObjects.Count; ++i) - { - WorldObject obj = i_worldObjects[i]; - Contract.Assert(obj.IsWorldObject()); - obj.RemoveFromWorld(); - obj.ResetMap(); - } - - if (!m_scriptSchedule.Empty()) - Global.MapMgr.DecreaseScheduledScriptCount((uint)m_scriptSchedule.Count); - - if (m_parentMap == this) - m_childTerrainMaps = null; - - Global.MMapMgr.unloadMapInstance(GetId(), i_InstanceId); } private GridMap GetGridMap(float x, float y) diff --git a/Source/Game/Maps/MapManager.cs b/Source/Game/Maps/MapManager.cs index 6d9ffc1b3..b3fa6df82 100644 --- a/Source/Game/Maps/MapManager.cs +++ b/Source/Game/Maps/MapManager.cs @@ -269,9 +269,10 @@ namespace Game.Entities foreach (var pair in i_maps) pair.Value.UnlinkAllChildTerrainMaps(); - foreach (var pair in i_maps) + foreach (var pair in i_maps.ToList()) { pair.Value.UnloadAll(); + pair.Value.Dispose(); i_maps.Remove(pair.Key); }