diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 179b4d50d..63d575c36 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -1579,7 +1579,7 @@ namespace Game.Maps } } - foreach (Transport transport in _transports) + foreach (Transport transport in _transports.ToList()) RemoveFromMap(transport, true); _transports.Clear(); diff --git a/Source/Game/Maps/MapManager.cs b/Source/Game/Maps/MapManager.cs index 7db375e80..4edcb3b32 100644 --- a/Source/Game/Maps/MapManager.cs +++ b/Source/Game/Maps/MapManager.cs @@ -254,7 +254,7 @@ namespace Game.Entities foreach (var pair in i_maps.ToList()) { pair.Value.UnloadAll(); - i_maps.Remove(pair.Value.GetId()); + i_maps.Remove(pair.Key); } } diff --git a/Source/Game/Scripting/ScriptManager.cs b/Source/Game/Scripting/ScriptManager.cs index 1b8084387..ed5dd7345 100644 --- a/Source/Game/Scripting/ScriptManager.cs +++ b/Source/Game/Scripting/ScriptManager.cs @@ -401,8 +401,13 @@ namespace Game.Scripting //Unloading public void Unload() { - foreach (ScriptRegistry scr in ScriptStorage) - scr.Unload(); + foreach (DictionaryEntry entry in ScriptStorage) + { + IScriptRegistry scriptRegistry = (IScriptRegistry)entry.Value; + scriptRegistry.Unload(); + } + + ScriptStorage.Clear(); } //SpellScriptLoader @@ -1339,7 +1344,6 @@ namespace Game.Scripting RunScript(script => script.OnQuestStatusChange(player, quest, oldStatus, newStatus), quest.ScriptId); } - public void OnQuestObjectiveChange(Player player, Quest quest, QuestObjective objective, int oldAmount, int newAmount) { Contract.Assert(player); @@ -1416,7 +1420,12 @@ namespace Game.Scripting MultiMap, SplineChainLink> m_mSplineChainsMap = new MultiMap, SplineChainLink>(); // spline chains } - public class ScriptRegistry where TValue : ScriptObject + public interface IScriptRegistry + { + void Unload(); + } + + public class ScriptRegistry : IScriptRegistry where TValue : ScriptObject { public void AddScript(TValue script) { @@ -1486,8 +1495,7 @@ namespace Game.Scripting public void Unload() { - foreach (var key in ScriptMap.Keys) - ScriptMap.Remove(key); + ScriptMap.Clear(); } // Counter used for code-only scripts. diff --git a/Source/WorldServer/Server.cs b/Source/WorldServer/Server.cs index cd1c048bf..38a620ccf 100644 --- a/Source/WorldServer/Server.cs +++ b/Source/WorldServer/Server.cs @@ -111,6 +111,7 @@ namespace WorldServer catch (Exception ex) { Log.outException(ex); + ExitNow(); } }