public void PushLuaCLRFunction(LuaCLRFunction f)
        {
            PushLuaReference(_MicroLuaMakeCallWrapperRef);

            _PushCLRReference(SelfRef);
            PushCLR(f);
            PushLuaCClosure(_LuaCLRFunctionInvoke, 2);

            ProtCall(1, results: 1);
        }
Exemple #2
0
        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
        }