public void PushLuaCLRFunction(LuaCLRFunction f) { PushLuaReference(_MicroLuaMakeCallWrapperRef); _PushCLRReference(SelfRef); PushCLR(f); PushLuaCClosure(_LuaCLRFunctionInvoke, 2); ProtCall(1, results: 1); }
private void _RunModScript(ModInfo info, ModInfo parent = null) { LuaState.EnterArea(); info.ScriptPath = Path.Combine(info.RealPath, info.ModMetadata.Script); Logger.Info($"Running Lua script at '{info.ScriptPath}'"); if (parent != null) { info.Parent = parent; } info.Hooks = new HookManager(); var env_ref = _CreateNewEnvironment(info); LuaState.LoadFile(info.ScriptPath); var mod_func_ref = LuaState.MakeLuaReference(); LuaState.PushNewTable(); info.RealPackageTableRef = LuaState.MakeLuaReference(); LuaState.Pop(); LuaState.PushLuaReference(mod_func_ref); LuaState.PushLuaReference(env_ref); LuaState.SetEnvironment(); LuaState.Pop(); // Setup the metatable LuaCLRFunction fake_package_index = (lua) => { lua.PushLuaReference(info.RealPackageTableRef); lua.PushValue(2); lua.GetField(); return(1); }; LuaState.PushNewTable(); // fake package LuaState.PushNewTable(); // mt LuaState.PushLuaCLRFunction(fake_package_index); LuaState.SetField("__index"); LuaState.PushLuaCLRFunction(_FakePackageNewIndex); LuaState.SetField("__newindex"); LuaState.PushLuaCLRFunction(_FakePackageMetatable); LuaState.SetField("__metatable"); LuaState.SetMetatable(); // setmetatable(fake_package, mt) LuaState.Pop(); // pop fake_package LuaState.PushLuaReference(info.RealPackageTableRef); LuaState.PushNewTable(); LuaState.SetField("loaded"); LuaState.PushString(Path.Combine(Paths.ResourcesFolder, "lua/libs/?.lua") + ";" + Path.Combine(Paths.ResourcesFolder, "lua/libs/?/init.lua") + ";" + Path.Combine(Paths.ResourcesFolder, "lua/libs/?/?.lua") + ";" + info.RealPath + "/?.lua"); LuaState.SetField("path"); LuaState.PushString("Really makes you think"); LuaState.SetField("cpath"); LuaState.SetGlobal("package"); info.LuaEnvironmentRef = env_ref; info.RunLua(mod_func_ref, "the main script"); info.Triggers = new TriggerContainer(info.LuaEnvironmentRef, info); info.Triggers.SetupExternalHooks(); LuaState.LeaveAreaCleanup(); // I am lazy }