Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaSafeUserData.cs
2026-02-02 21:30:06 -03:00

199 lines
6.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using MoonSharp.Interpreter;
using MoonSharp.Interpreter.Interop;
namespace Barotrauma
{
partial class LuaSafeUserData
{
public IUserDataDescriptor this[string index]
{
get => LuaUserData.Descriptors.GetValueOrDefault(index);
}
private static bool CanBeRegistered(string typeName)
{
if (typeName.StartsWith("Barotrauma.Lua", StringComparison.Ordinal) ||
typeName.StartsWith("Barotrauma.Cs", StringComparison.Ordinal) ||
typeName.StartsWith("Barotrauma.LuaCs", StringComparison.Ordinal))
{
return false;
}
if (typeName == "System.Single") { return true; }
if (typeName.StartsWith("System.Collections", StringComparison.Ordinal))
return true;
if (typeName.StartsWith("Microsoft.Xna", StringComparison.Ordinal))
return true;
if (typeName.StartsWith("Barotrauma.IO", StringComparison.Ordinal))
return false;
if (typeName.StartsWith("Barotrauma.ToolBox", StringComparison.Ordinal))
return false;
if (typeName.StartsWith("Barotrauma.SaveUtil", StringComparison.Ordinal))
return false;
if (typeName.StartsWith("Barotrauma.", StringComparison.Ordinal))
return true;
return false;
}
private static bool CanBeReRegistered(string typeName)
{
if (typeName.StartsWith("Barotrauma.Lua", StringComparison.Ordinal) ||
typeName.StartsWith("Barotrauma.Cs", StringComparison.Ordinal) ||
typeName.StartsWith("Barotrauma.LuaCs", StringComparison.Ordinal))
{
return false;
}
return true;
}
private static bool IsAllowed(string typeName)
{
if (!CanBeReRegistered(typeName) && LuaUserData.IsRegistered(typeName))
{
return false;
}
if (!CanBeRegistered(typeName) && !LuaUserData.IsRegistered(typeName))
{
return false;
}
return true;
}
private static void CheckAllowed(string typeName)
{
if (!IsAllowed(typeName))
{
throw new ScriptRuntimeException($"Type {typeName} can't be registered");
}
}
public static Type GetType(string typeName)
{
CheckAllowed(typeName);
return LuaUserData.GetType(typeName);
}
public static IUserDataDescriptor RegisterType(string typeName)
{
CheckAllowed(typeName);
return LuaUserData.RegisterType(typeName);
}
public static IUserDataDescriptor RegisterTypeBarotrauma(string typeName)
{
return RegisterType($"Barotrauma.{typeName}");
}
public static void RegisterExtensionType(string typeName)
{
CheckAllowed(typeName);
LuaUserData.RegisterExtensionType(typeName);
}
public static bool IsRegistered(string typeName)
{
return LuaUserData.IsRegistered(typeName);
}
public static void UnregisterType(string typeName, bool deleteHistory = false)
{
LuaUserData.UnregisterType(typeName, deleteHistory);
}
public static IUserDataDescriptor RegisterGenericType(string typeName, params string[] typeNameArguements)
{
CheckAllowed(typeName);
return LuaUserData.RegisterGenericType(typeName, typeNameArguements);
}
public static void UnregisterGenericType(string typeName, params string[] typeNameArguements)
{
LuaUserData.UnregisterGenericType(typeName, typeNameArguements);
}
public static bool IsTargetType(object obj, string typeName)
{
return LuaUserData.IsTargetType(obj, typeName);
}
public static string TypeOf(object obj)
{
return LuaUserData.TypeOf(obj);
}
public static object CreateStatic(string typeName)
{
CheckAllowed(typeName);
return LuaUserData.CreateStatic(typeName);
}
public static object CreateEnumTable(string typeName)
{
return LuaUserData.CreateEnumTable(typeName);
}
public static void MakeFieldAccessible(IUserDataDescriptor IUUD, string fieldName)
{
LuaUserData.MakeFieldAccessible(IUUD, fieldName);
}
public static void MakeMethodAccessible(IUserDataDescriptor IUUD, string methodName, string[] parameters = null)
{
LuaUserData.MakeMethodAccessible(IUUD, methodName, parameters);
}
public static void MakePropertyAccessible(IUserDataDescriptor IUUD, string propertyName)
{
LuaUserData.MakePropertyAccessible(IUUD, propertyName);
}
public static void AddMethod(IUserDataDescriptor IUUD, string methodName, object function)
{
LuaUserData.AddMethod(IUUD, methodName, function);
}
public static void AddField(IUserDataDescriptor IUUD, string fieldName, DynValue value)
{
LuaUserData.AddField(IUUD, fieldName, value);
}
public static void RemoveMember(IUserDataDescriptor IUUD, string memberName)
{
LuaUserData.RemoveMember(IUUD, memberName);
}
public static bool HasMember(object obj, string memberName)
{
return LuaUserData.HasMember(obj, memberName);
}
public static void AddCallMetaTable(object userdata) { }
public static DynValue CreateUserDataFromDescriptor(DynValue scriptObject, IUserDataDescriptor desiredTypeDescriptor)
{
return LuaUserData.CreateUserDataFromDescriptor(scriptObject, desiredTypeDescriptor);
}
public static DynValue CreateUserDataFromType(DynValue scriptObject, Type desiredType)
{
return LuaUserData.CreateUserDataFromType(scriptObject, desiredType);
}
}
}