diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs index cfe0d0418..381e6a081 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs @@ -367,13 +367,11 @@ namespace Barotrauma public void AddCommand(string name, string help, LuaCsAction onExecute, LuaCsFunc getValidArgs = null, bool isCheat = false) { - var cmd = new DebugConsole.Command(name, help, (string[] arg1) => { onExecute(new object[] { arg1 }); }, + var cmd = new DebugConsole.Command(name, help, (string[] arg1) => onExecute(new object[] { arg1 }), () => { - if (getValidArgs == null) { return null; } - var obj = getValidArgs(); - if (obj is LuaResult lr) { return lr.DynValue().ToObject(); } - return (string[][])obj; + if (getValidArgs == null) return null; + return getValidArgs().ToObject(); }, isCheat); luaAddedCommand.Add(cmd); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaResult.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaResult.cs deleted file mode 100644 index c71cb9e50..000000000 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaResult.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using MoonSharp.Interpreter; -using Microsoft.Xna.Framework; -using Barotrauma.Networking; -using Barotrauma.Items.Components; -using System.IO; -using System.Net; -using System.Linq; -using System.Xml.Linq; -using FarseerPhysics.Dynamics; -using System.Reflection; -using HarmonyLib; -using MoonSharp.Interpreter.Interop; -using System.Diagnostics; - -namespace Barotrauma -{ - public class LuaResult - { - object result; - public LuaResult(object arg) - { - result = arg; - } - - public bool IsNull() - { - if (result == null) - return true; - - if (result is DynValue dynValue) - return dynValue.IsNil(); - - return false; - } - - public bool Bool() - { - if (result is DynValue dynValue) - { - return dynValue.CastToBool(); - } - - return false; - } - - public float Float() - { - if (result is DynValue dynValue) - { - var num = dynValue.CastToNumber(); - if (num == null) { return 0f; } - return (float)num.Value; - } - - return 0f; - } - - public double Double() - { - if (result is DynValue dynValue) - { - var num = dynValue.CastToNumber(); - if (num == null) { return 0f; } - return num.Value; - } - - return 0f; - } - - public string String() - { - if (result is DynValue dynValue) - { - var str = dynValue.CastToString(); - if (str == null) { return ""; } - return str; - } - - return ""; - } - - public object Object() - { - if (result is DynValue dynValue) - { - return dynValue.ToObject(); - } - - return null; - } - - public DynValue DynValue() - { - if (result is DynValue dynValue) - { - return dynValue; - } - - return null; - } - } -} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs index ecae3a6cb..581becdc0 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs @@ -21,42 +21,50 @@ namespace Barotrauma RegisterFunc(); RegisterFunc(); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsAction), v => (LuaCsAction)( args => GameMain.LuaCs.CallLuaFunction(v.Function, args) )); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsFunc), v => (LuaCsFunc)( args => new LuaResult(GameMain.LuaCs.CallLuaFunction(v.Function, args)) )); - Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsPatch), v => (LuaCsPatch)( (self, args) => new LuaResult(GameMain.LuaCs.CallLuaFunction(v.Function, self, args)) )); - Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion(typeof(LuaResult), (Script s, object v) => (v as LuaResult).DynValue()); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( + DataType.Function, + typeof(LuaCsAction), + v => (LuaCsAction)(args => GameMain.LuaCs.CallLuaFunction(v.Function, args))); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( + DataType.Function, + typeof(LuaCsFunc), + v => (LuaCsFunc)(args => GameMain.LuaCs.CallLuaFunction(v.Function, args))); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( + DataType.Function, + typeof(LuaCsPatch), + v => (LuaCsPatch)((self, args) => GameMain.LuaCs.CallLuaFunction(v.Function, self, args))); #if CLIENT RegisterAction(); RegisterAction(); { - object Call(object function, params object[] arguments) => GameMain.LuaCs.CallLuaFunction(function, arguments); + DynValue Call(object function, params object[] arguments) => GameMain.LuaCs.CallLuaFunction(function, arguments); void RegisterHandler(Func converter) => Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(T), v => converter(v.Function)); RegisterHandler(f => (GUIComponent.SecondaryButtonDownHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIButton.OnClickedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIButton.OnButtonDownHandler)( - () => new LuaResult(Call(f)).Bool())); + () => Call(f).CastToBool())); RegisterHandler(f => (GUIButton.OnPressedHandler)( - () => new LuaResult(Call(f)).Bool())); + () => Call(f).CastToBool())); RegisterHandler(f => (GUIColorPicker.OnColorSelectedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIDropDown.OnSelectedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIListBox.OnSelectedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIListBox.OnRearrangedHandler)( (a1, a2) => Call(f, a1, a2))); RegisterHandler(f => (GUIListBox.CheckSelectedHandler)( - () => new LuaResult(Call(f)).Object())); + () => Call(f).ToObject())); RegisterHandler(f => (GUINumberInput.OnValueEnteredHandler)( (a1) => Call(f, a1))); @@ -64,28 +72,28 @@ namespace Barotrauma (a1) => Call(f, a1))); RegisterHandler(f => (GUIProgressBar.ProgressGetterHandler)( - () => new LuaResult(Call(f)).Float())); + () => (float)(Call(f).CastToNumber() ?? 0))); RegisterHandler(f => (GUIRadioButtonGroup.RadioButtonGroupDelegate)( (a1, a2) => Call(f, a1, a2))); RegisterHandler(f => (GUIScrollBar.OnMovedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUIScrollBar.ScrollConversion)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Float())); + (a1, a2) => (float)(Call(f, a1, a2).CastToNumber() ?? 0))); RegisterHandler(f => (GUITextBlock.TextGetterHandler)( - () => new LuaResult(Call(f, new object[] { })).String())); + () => Call(f, new object[0]).CastToString())); RegisterHandler(f => (GUITextBox.OnEnterHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (GUITextBox.OnTextChangedHandler)( - (a1, a2) => new LuaResult(Call(f, a1, a2)).Bool())); + (a1, a2) => Call(f, a1, a2).CastToBool())); RegisterHandler(f => (TextBoxEvent)( (a1, a2) => Call(f, a1, a2))); RegisterHandler(f => (GUITickBox.OnSelectedHandler)( - (a1) => new LuaResult(Call(f, a1)).Bool())); + (a1) => Call(f, a1).CastToBool())); } #endif diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs index 738425070..4558c8afa 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs @@ -13,7 +13,7 @@ using System.Diagnostics; namespace Barotrauma { public delegate void LuaCsAction(params object[] args); - public delegate object LuaCsFunc(params object[] args); + public delegate DynValue LuaCsFunc(params object[] args); public delegate object LuaCsPatch(object self, Dictionary args); public partial class LuaCsHook @@ -157,18 +157,18 @@ namespace Barotrauma [MoonSharpHidden] public T Call(string name, params object[] args) { - if (GameMain.LuaCs == null) { return default(T); } - if (name == null) { throw new ScriptRuntimeException("Hook.Call: name must not be null."); } - if (args == null) { args = new object[] { }; } + if (GameMain.LuaCs == null) return default; // FIXME: should this throw an exception? + if (name == null) throw new ArgumentNullException(name); + if (args == null) args = new object[0]; name = name.ToLower(); if (!hookFunctions.ContainsKey(name)) { - return default(T); + return default; } - T lastResult = default(T); + T lastResult = default; if (!hookFunctions.ContainsKey(name)) { @@ -192,30 +192,9 @@ namespace Barotrauma } var result = tuple.Item1.func(args); - if (result != null) + if (result != null && !result.IsNil()) { - if (typeof(object) != typeof(T)) - { - if (result is LuaResult lRes) - { - if (!lRes.IsNull()) { lastResult = lRes.DynValue().ToObject(); } - } - else if (result is T cRes && cRes != null) - { - lastResult = cRes; - } - } - else - { - if (result is LuaResult lRes) - { - if (!lRes.IsNull()) { lastResult = (T)(object)lRes.DynValue(); } - } - else - { - lastResult = (T)result; - } - } + lastResult = result.ToObject(); } if (GameMain.LuaCs.PerformanceCounter.EnablePerformanceCounter) @@ -239,10 +218,14 @@ namespace Barotrauma return lastResult; } - public object Call(string name, params object[] args) => Call(name, args); + public object Call(string name, params object[] args) + { + if (name == null) throw new ScriptRuntimeException("Hook.Call: name must not be null."); + return Call(name, args); + } - private static bool PatchPrefix(MethodBase __originalMethod, object[] __args, object __instance) + private static bool PatchPrefix(MethodBase __originalMethod, object[] __args, object __instance) { ExecutePatch(__originalMethod, __args, __instance, out object result, HookMethodType.Before); return result == null; @@ -415,31 +398,22 @@ namespace Barotrauma continue; } - object[] args = new object[] { __instance }.Concat(__args).ToArray(); - object _result = tuple.Item2(args); + var args = Enumerable.Empty() + .Concat(__args) + .Prepend(__instance) + .ToArray(); + var _result = tuple.Item2(args); - if (_result == null) + if (_result != null && !_result.IsNil()) { - continue; - } - - if (_result is LuaResult res) - { - if (!res.IsNull()) + if (__originalMethod is MethodInfo mi && mi.ReturnType != typeof(void)) { - if (__originalMethod is MethodInfo mi && mi.ReturnType != typeof(void)) - { - result = res.DynValue().ToObject(mi.ReturnType); - } - else - { - result = res.DynValue().ToObject(); - } + result = _result.ToObject(mi.ReturnType); + } + else + { + result = _result.ToObject(); } - } - else - { - result = _result; } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHookCompat.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHookCompat.cs index 3aa07f90a..c009a8d24 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHookCompat.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHookCompat.cs @@ -58,17 +58,17 @@ namespace Barotrauma var _result = tuple.Item2(__instance, args); if (_result != null) { - if (_result is LuaResult res) + if (_result is DynValue res) { - if (!res.IsNull()) + if (!res.IsNil()) { if (__originalMethod is MethodInfo mi && mi.ReturnType != typeof(void)) { - result = res.DynValue().ToObject(mi.ReturnType); + result = res.ToObject(mi.ReturnType); } else { - result = res.DynValue().ToObject(); + result = res.ToObject(); } } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 42b9865e3..9df6d4931 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -284,7 +284,7 @@ namespace Barotrauma return lua.LoadFile(file, globalContext, codeStringFriendly); } - public object CallLuaFunction(object function, params object[] arguments) + public DynValue CallLuaFunction(object function, params object[] arguments) { lock (lua) {