From 9dc87c34f3ae5a94f06fa45bedcf5473cfc2893d Mon Sep 17 00:00:00 2001 From: EvilFactory Date: Thu, 23 Mar 2023 12:30:20 -0300 Subject: [PATCH] Fixed error "Attempt to perform operations with resources owned by different script" that would sometimes happen when reloading lua --- .../SharedSource/LuaCs/Lua/LuaConverters.cs | 50 +++++++++++++------ .../SharedSource/LuaCs/LuaCsSetup.cs | 2 +- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaConverters.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaConverters.cs index 1785b15ff..a2ae5682f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaConverters.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaConverters.cs @@ -21,22 +21,40 @@ namespace Barotrauma RegisterFunc(); RegisterFunc(); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( - DataType.Function, - typeof(LuaCsAction), - v => (LuaCsAction)(args => CallLuaFunction(v.Function, args))); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( - DataType.Function, - typeof(LuaCsFunc), - v => (LuaCsFunc)(args => CallLuaFunction(v.Function, args))); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( - DataType.Function, - typeof(LuaCsCompatPatchFunc), - v => (LuaCsCompatPatchFunc)((self, args) => CallLuaFunction(v.Function, self, args))); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( - DataType.Function, - typeof(LuaCsPatchFunc), - v => (LuaCsPatchFunc)((self, args) => CallLuaFunction(v.Function, self, args))); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsAction), v => (LuaCsAction)(args => + { + if (v.Function.OwnerScript == Lua) + { + CallLuaFunction(v.Function, args); + } + })); + + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsFunc), v => (LuaCsFunc)(args => + { + if (v.Function.OwnerScript == Lua) + { + return CallLuaFunction(v.Function, args); + } + return default; + })); + + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsCompatPatchFunc), v => (LuaCsCompatPatchFunc)((self, args) => + { + if (v.Function.OwnerScript == Lua) + { + return CallLuaFunction(v.Function, self, args); + } + return default; + })); + + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsPatchFunc), v => (LuaCsPatchFunc)((self, args) => + { + if (v.Function.OwnerScript == Lua) + { + return CallLuaFunction(v.Function, self, args); + } + return default; + })); #if CLIENT RegisterAction(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 69d95c71c..54f02979c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -178,7 +178,7 @@ namespace Barotrauma { // XXX: `lua` might be null if `LuaCsSetup.Stop()` is called while // a patched function is still running. - if (Lua == null) return null; + if (Lua == null) { return null; } lock (Lua) {