internal static object TryRun(LuaRuntime runtime, long token, object target, object[] args, out bool returned) { _Logger.Debug($"Trying to run method hook (token {token})"); returned = false; object return_value = null; LuaFunction fun; if (_Hooks.TryGetValue(token, out fun)) { _Logger.Debug($"Hook found"); // target == null --> static var objs_offs = 1; if (target == null) { objs_offs = 0; } var objs = new LuaValue[args.Length + objs_offs]; if (target != null) { objs[0] = runtime.AsLuaValue(target); } for (int i = 0; i < args.Length; i++) { objs[i + objs_offs] = runtime.AsLuaValue(args[i]); } var result = fun.Call(args: objs); Type return_type; if (_HookReturns.TryGetValue(token, out return_type)) { if (result.Count > 1) { for (int i = 1; i < result.Count; i++) { result[i].Dispose(); } } if (result.Count > 0) { returned = true; return_value = runtime.ToClrObject(result[0], return_type); if (return_value != result[0]) { result[0].Dispose(); } } } else { result.Dispose(); } for (int i = 0; i < objs.Length; i++) { objs[i]?.Dispose(); } } else { _Logger.Debug($"Hook not found"); } return(return_value); }