diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs index 7adf82a7a..389f19aa1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptLoader.cs @@ -144,5 +144,14 @@ namespace Barotrauma return files.ToArray(); } + public void Clear() + { + Assembly = null; + } + + ~CsScriptLoader() + { + + } } } \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index c25c4fa46..ec0890c7f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -278,6 +278,10 @@ namespace Barotrauma public void Stop() { + foreach (var type in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name == "NetScriptAssembly").SelectMany(assembly => assembly.GetTypes())) + { + UserData.UnregisterType(type, true); + } foreach (var mod in ACsMod.LoadedMods.ToArray()) mod.Dispose(); ACsMod.LoadedMods.Clear(); Hook?.Call("stop"); @@ -289,8 +293,18 @@ namespace Barotrauma Game = new LuaGame(); Networking = new LuaCsNetworking(); LuaScriptLoader = null; + lua = null; Lua = null; CsScript = null; + + if (CsScriptLoader != null) + { + CsScriptLoader.Clear(); + CsScriptLoader.Unload(); + CsScriptLoader = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + } } public void Initialize()