Misc Lua fixes
This commit is contained in:
committed by
Maplewheels
parent
ba10d9d031
commit
422e8a6185
+7
-3
@@ -28,6 +28,8 @@ namespace Barotrauma.LuaCs;
|
|||||||
|
|
||||||
class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService
|
class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService
|
||||||
{
|
{
|
||||||
|
public Script? InternalScript => _script;
|
||||||
|
|
||||||
private Script? _script;
|
private Script? _script;
|
||||||
private bool _isRunning;
|
private bool _isRunning;
|
||||||
[MemberNotNullWhen(true, nameof(_script))]
|
[MemberNotNullWhen(true, nameof(_script))]
|
||||||
@@ -184,8 +186,10 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService
|
|||||||
|
|
||||||
Script.GlobalOptions.ShouldPCallCatchException = (Exception ex) => { return true; };
|
Script.GlobalOptions.ShouldPCallCatchException = (Exception ex) => { return true; };
|
||||||
|
|
||||||
|
UserData.RegisterType<ILuaCsHook.HookMethodType>();
|
||||||
UserData.RegisterType(typeof(LuaGame));
|
UserData.RegisterType(typeof(LuaGame));
|
||||||
UserData.RegisterType(typeof(EventService));
|
StandardUserDataDescriptor descriptor = (StandardUserDataDescriptor)UserData.RegisterType(typeof(EventService));
|
||||||
|
descriptor.AddDynValue("HookMethodType", UserData.CreateStatic<ILuaCsHook.HookMethodType>());
|
||||||
UserData.RegisterType(typeof(ILuaCsNetworking));
|
UserData.RegisterType(typeof(ILuaCsNetworking));
|
||||||
UserData.RegisterType(typeof(ILuaCsUtility));
|
UserData.RegisterType(typeof(ILuaCsUtility));
|
||||||
UserData.RegisterType(typeof(ILuaCsTimer));
|
UserData.RegisterType(typeof(ILuaCsTimer));
|
||||||
@@ -195,7 +199,7 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService
|
|||||||
UserData.RegisterType(typeof(IUserDataDescriptor));
|
UserData.RegisterType(typeof(IUserDataDescriptor));
|
||||||
UserData.RegisterType(typeof(INetworkingService));
|
UserData.RegisterType(typeof(INetworkingService));
|
||||||
|
|
||||||
new LuaConverters(_script).RegisterLuaConverters();
|
new LuaConverters(this).RegisterLuaConverters();
|
||||||
|
|
||||||
var luaRequire = new LuaRequire(_script);
|
var luaRequire = new LuaRequire(_script);
|
||||||
|
|
||||||
@@ -287,7 +291,7 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DynValue? CallFunction(DynValue luaFunction, params object[] args)
|
public DynValue? CallFunctionSafe(object luaFunction, params object[] args)
|
||||||
{
|
{
|
||||||
if (!IsRunning) { return null; }
|
if (!IsRunning) { return null; }
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -14,10 +14,11 @@ namespace Barotrauma.LuaCs;
|
|||||||
|
|
||||||
public interface ILuaScriptManagementService : IReusableService
|
public interface ILuaScriptManagementService : IReusableService
|
||||||
{
|
{
|
||||||
#region Script_Ops
|
Script? InternalScript { get; }
|
||||||
|
|
||||||
object? GetGlobalTableValue(string tableName);
|
object? GetGlobalTableValue(string tableName);
|
||||||
FluentResults.Result<DynValue> DoString(string code);
|
FluentResults.Result<DynValue> DoString(string code);
|
||||||
|
DynValue? CallFunctionSafe(object luaFunction, params object[] args);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parses and loads script sources (code) into a memory cache without executing it.
|
/// Parses and loads script sources (code) into a memory cache without executing it.
|
||||||
@@ -55,7 +56,4 @@ public interface ILuaScriptManagementService : IReusableService
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <remarks>May be functionally equivalent to <see cref="IReusableService.Reset"/></remarks>
|
/// <remarks>May be functionally equivalent to <see cref="IReusableService.Reset"/></remarks>
|
||||||
FluentResults.Result DisposeAllPackageResources();
|
FluentResults.Result DisposeAllPackageResources();
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -39,12 +39,13 @@ public class DefaultLuaRegistrar : IDefaultLuaRegistrar
|
|||||||
_userDataService.RegisterType("Barotrauma.Success`2");
|
_userDataService.RegisterType("Barotrauma.Success`2");
|
||||||
_userDataService.RegisterType("Barotrauma.Failure`2");
|
_userDataService.RegisterType("Barotrauma.Failure`2");
|
||||||
_userDataService.RegisterType("Barotrauma.Range`1");
|
_userDataService.RegisterType("Barotrauma.Range`1");
|
||||||
|
_userDataService.RegisterType("Barotrauma.ItemPrefab");
|
||||||
|
|
||||||
List<Assembly> assembliesToScan = [typeof(DefaultLuaRegistrar).Assembly, typeof(Identifier).Assembly, typeof(Microsoft.Xna.Framework.Vector2).Assembly];
|
List<Assembly> assembliesToScan = [typeof(DefaultLuaRegistrar).Assembly, typeof(Identifier).Assembly, typeof(Microsoft.Xna.Framework.Vector2).Assembly];
|
||||||
|
|
||||||
foreach (var type in assembliesToScan.SelectMany(a => a.GetTypes()))
|
foreach (var type in assembliesToScan.SelectMany(a => a.GetTypes()))
|
||||||
{
|
{
|
||||||
if (type.IsEnum || type.IsDefined(typeof(CompilerGeneratedAttribute)) || !_safeUserDataService.IsAllowed(type.FullName))
|
if (type.IsEnum || type.Name.StartsWith("<") || type.IsDefined(typeof(CompilerGeneratedAttribute)) || !_safeUserDataService.IsAllowed(type.FullName))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-10
@@ -11,14 +11,14 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
public class LuaConverters
|
public class LuaConverters
|
||||||
{
|
{
|
||||||
private readonly Script _script;
|
private readonly ILuaScriptManagementService _luaScriptManagementService;
|
||||||
|
|
||||||
public LuaConverters(Script script)
|
public LuaConverters(ILuaScriptManagementService luaScriptManagementService)
|
||||||
{
|
{
|
||||||
_script = script;
|
_luaScriptManagementService = luaScriptManagementService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private DynValue Call(object function, params object[] arguments) => _script.Call(function, arguments);
|
private DynValue Call(object function, params object[] arguments) => _luaScriptManagementService.CallFunctionSafe(function, arguments);
|
||||||
|
|
||||||
public void RegisterLuaConverters()
|
public void RegisterLuaConverters()
|
||||||
{
|
{
|
||||||
@@ -34,7 +34,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsAction), v => (LuaCsAction)(args =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsAction), v => (LuaCsAction)(args =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService)
|
||||||
{
|
{
|
||||||
Call(v.Function, args);
|
Call(v.Function, args);
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsFunc), v => (LuaCsFunc)(args =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsFunc), v => (LuaCsFunc)(args =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService.InternalScript)
|
||||||
{
|
{
|
||||||
return Call(v.Function, args);
|
return Call(v.Function, args);
|
||||||
}
|
}
|
||||||
@@ -51,7 +51,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsCompatPatchFunc), v => (LuaCsCompatPatchFunc)((self, args) =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsCompatPatchFunc), v => (LuaCsCompatPatchFunc)((self, args) =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService.InternalScript)
|
||||||
{
|
{
|
||||||
return Call(v.Function, self, args);
|
return Call(v.Function, self, args);
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsPatchFunc), v => (LuaCsPatchFunc)((self, args) =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(LuaCsPatchFunc), v => (LuaCsPatchFunc)((self, args) =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService.InternalScript)
|
||||||
{
|
{
|
||||||
return Call(v.Function, self, args);
|
return Call(v.Function, self, args);
|
||||||
}
|
}
|
||||||
@@ -137,7 +137,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(NetMessageReceived), v => (NetMessageReceived)((arg1) =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(NetMessageReceived), v => (NetMessageReceived)((arg1) =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService.InternalScript)
|
||||||
{
|
{
|
||||||
Call(v.Function, arg1);
|
Call(v.Function, arg1);
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ namespace Barotrauma
|
|||||||
#elif SERVER
|
#elif SERVER
|
||||||
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(NetMessageReceived), v => (NetMessageReceived)((arg1, arg2) =>
|
Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Function, typeof(NetMessageReceived), v => (NetMessageReceived)((arg1, arg2) =>
|
||||||
{
|
{
|
||||||
if (v.Function.OwnerScript == _script)
|
if (v.Function.OwnerScript == _luaScriptManagementService.InternalScript)
|
||||||
{
|
{
|
||||||
Call(v.Function, arg1, arg2);
|
Call(v.Function, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -794,7 +794,6 @@ namespace Barotrauma.LuaCs
|
|||||||
}
|
}
|
||||||
|
|
||||||
registeredPatches.Clear();
|
registeredPatches.Clear();
|
||||||
patchModuleBuilder = null;
|
|
||||||
|
|
||||||
compatHookPrefixMethods.Clear();
|
compatHookPrefixMethods.Clear();
|
||||||
compatHookPostfixMethods.Clear();
|
compatHookPostfixMethods.Clear();
|
||||||
|
|||||||
+1
-32
@@ -87,7 +87,7 @@ public class LuaUserDataService : ILuaUserDataService
|
|||||||
throw new ScriptRuntimeException($"tried to register a type that doesn't exist: {typeName}.");
|
throw new ScriptRuntimeException($"tried to register a type that doesn't exist: {typeName}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return UserData.RegisterType(type, new CallableUserDataDescriptor(type));
|
return UserData.RegisterType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegisterExtensionType(string typeName)
|
public void RegisterExtensionType(string typeName)
|
||||||
@@ -407,34 +407,3 @@ public class LuaUserDataService : ILuaUserDataService
|
|||||||
return FluentResults.Result.Ok();
|
return FluentResults.Result.Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class CallableUserDataDescriptor : StandardUserDataDescriptor
|
|
||||||
{
|
|
||||||
public CallableUserDataDescriptor(Type type)
|
|
||||||
: base(type, InteropAccessMode.Default)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override DynValue MetaIndex(Script script, object obj, string metaname)
|
|
||||||
{
|
|
||||||
if (metaname == "__call")
|
|
||||||
{
|
|
||||||
return DynValue.NewCallback((ctx, args) =>
|
|
||||||
{
|
|
||||||
var self = args[0];
|
|
||||||
|
|
||||||
var ctor = base.Index(script, obj, DynValue.NewString("__new"), true);
|
|
||||||
|
|
||||||
if (ctor == null || ctor.IsNil())
|
|
||||||
{
|
|
||||||
throw new ScriptRuntimeException("Attempted to call userdata without __new.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var callArgs = args.GetArray().Skip(1).ToArray();
|
|
||||||
return script.Call(ctor, callArgs);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.MetaIndex(script, obj, metaname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user