Files
chess_game/Scripts/Mods/LuaModManager.cs

41 lines
1.2 KiB
C#

using System;
using System.IO;
using System.Linq;
using Godot;
using NLua;
class LuaMod : IDisposable {
private readonly Lua lua = new();
public LuaMod(string path, string? package_path = null) {
lua.LoadCLRPackage();
lua.State.Encoding = System.Text.Encoding.UTF8;
lua["package.path"] = package_path ?? Path.GetDirectoryName(path) + "/?.lua;";
lua.RegisterFunction("print", new Action<object[]>(GD.Print).Method);
// Action bar = () => { GD.Print("bar"); };
// lua.RegisterFunction("bar", bar.Target, bar.Method);
lua.DoFile(path);
}
public void BindFunc(ModManager mod) {
foreach (var api in mod.GetAPIs()) {
lua.RegisterFunction(api.Key, api.Value.Target, api.Value.Method);
}
foreach (var hook in mod.GetHooks()) {
if (lua[hook.Key] is LuaFunction func) {
mod.AddHook(hook.Key, (args) => {
var rets = func.Call(args).FirstOrDefault();
if (rets is bool b) return b;
return false;
});
}
}
}
public void Dispose() {
lua?.Dispose();
GC.SuppressFinalize(this);
}
}