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/Cs/CsScriptRunner.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs index 112280d50..60bdf559f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Cs/CsScriptRunner.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis; using System.Runtime.Loader; using System.Reflection.PortableExecutable; using System.Reflection.Metadata; +using MoonSharp.Interpreter; namespace Barotrauma { @@ -97,7 +98,11 @@ namespace Barotrauma if (runner != null) { var method = runner.GetType().GetMethod("Run", BindingFlags.Public | BindingFlags.Instance); - if (method != null) scriptResilt = method.Invoke(runner, null); + if (method != null) + { + scriptResilt = method.Invoke(runner, null); + foreach (var type in assembly.GetTypes()) { UserData.UnregisterType(type, true); } + } else LuaCsSetup.PrintCsError("Script Error - no run method detected"); } else LuaCsSetup.PrintCsError("Script Error - no runner class detected"); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs index 48393ab6b..122428209 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs @@ -13,7 +13,7 @@ namespace Barotrauma { var type = Type.GetType(typeName); if (type != null) return type; - foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) + foreach (var a in AppDomain.CurrentDomain.GetAssemblies().Reverse()) { type = a.GetType(typeName); if (type != null) 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()