using System; using System.Collections.Generic; using System.IO; using System.Reflection; using MoonSharp.Interpreter; using MoonSharp.Interpreter.Loaders; using PhoenixLib.Logging; using WingsAPI.Scripting.Attribute; using WingsAPI.Scripting.LUA.Converter; using WingsAPI.Scripting.LUA.Converter.Object.Common.Map; using WingsAPI.Scripting.LUA.Extension; namespace WingsAPI.Scripting.LUA { public class LuaScriptFactory : IScriptFactory { /// /// Specific converter /// private static readonly IConverter[] SpecialConverters = { new SEventConverter(), new GuidConverter(), new SMapObjectConverter() }; private readonly ScriptFactoryConfiguration _configuration; public LuaScriptFactory(ScriptFactoryConfiguration configuration) { _configuration = configuration; RegisterAllScriptingObjectsInAssembly(typeof(IScriptFactory).Assembly); foreach (IConverter converter in SpecialConverters) { RegisterConverter(converter); } } public void RegisterAllScriptingObjectsInAssembly(Assembly assembly) { IEnumerable scriptObjects = assembly.GetTypesWithAttribute(); foreach (Type scriptObject in scriptObjects) { RegisterType(scriptObject); } } public void RegisterType() { RegisterType(typeof(T)); } public T LoadScript(string name) { if (!File.Exists(name)) { throw new IOException($"Couldn't find file {name}"); } var script = new Script { Options = { DebugPrint = Log.Debug, ScriptLoader = new FileSystemScriptLoader { ModulePaths = new[] { $"{_configuration.LibDirectory}/?.lua", $"{_configuration.LibDirectory}/enum/?.lua" } } } }; DynValue scriptReturn = script.DoFile(name); return scriptReturn.ToObject(); } public void RegisterConverter(IConverter converter) { Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(converter.DataType, converter.ObjectType, converter.ToCSharpObject); Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion(converter.ObjectType, converter.ToLuaObject); } private void RegisterType(Type scriptObject) { Log.Debug($"[LUA_SCRIPT_FACTORY] {scriptObject.Name} registered"); UserData.RegisterType(scriptObject); Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.Table, scriptObject, value => ObjectFactory.ToCSharpObject(scriptObject, value)); Script.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion(scriptObject, ObjectFactory.ToLuaObject); } } }