Example #1
0
    public static void DoCall(this ILuaState self, int nResult, params object[] Args)
    {
        var b = self.GetTop();

        self.PushCSharpFunction(LuaStatic.traceback);
        self.Insert(b);

        int nArg = 0;

        if (Args != null)
        {
            nArg = Args.Length;
            for (int i = 0; i < Args.Length; ++i)
            {
                self.PushAnyObject(Args[i]);
            }
        }

        if (self.PCall(nArg, nResult, b) == LuaThreadStatus.LUA_OK)
        {
            self.Remove(b);
        }
        else
        {
            ThrowExceptionFromError(self, b - 1);
        }
    }
Example #2
0
    private static IEnumerator LuaCoroutine(ILuaState lua, LuaFunction luaRef, object yieldRet)
    {
        lua.GetGlobal("coroutine", "status");
        var coro_status = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX);

        lua.GetGlobal("coroutine", "resume");
        var corou_resume = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX);

        for (bool coroRet = true; ;)
        {
            yield return(yieldRet);

            var oldTop = lua.GetTop();

            // 检查协程状态
            lua.GetRef(coro_status);
            luaRef.push(lua);
            lua.Call(1, 1);
            var coStat = lua.ToString(-1);
            lua.Pop(1);
            if (coStat == "dead")
            {
                break;
            }

            // 再启动协程
            lua.GetRef(corou_resume);
            luaRef.push(lua);
            var status = lua.PCall(1, 2, 0);
            if (status != LuaThreadStatus.LUA_OK)
            {
                LogMgr.E(lua.ToString(-1));
                lua.SetTop(oldTop);
                break;
            }
            coroRet  = lua.ToBoolean(-2);
            yieldRet = lua.ToAnyObject(-1);
            // 弹出返回值
            lua.Pop(2);
            if (!coroRet)
            {
                LogMgr.E("{0}", yieldRet);
                break;
            }
        }

        lua.L_Unref(LuaIndexes.LUA_REGISTRYINDEX, coro_status);
        lua.L_Unref(LuaIndexes.LUA_REGISTRYINDEX, corou_resume);
        luaRef.Dispose();
    }
Example #3
0
    public static int DoBuffer(this ILuaState self, byte[] nbytes, string name)
    {
        int oldTop = self.GetTop();

        self.PushCSharpFunction(LuaEnv.Get(self).ls.tracebackFunction);
        var b = oldTop + 1;

        if (self.L_LoadBuffer(nbytes, name) == LuaThreadStatus.LUA_OK &&
            self.PCall(0, -1, b) == LuaThreadStatus.LUA_OK)
        {
            self.Remove(b);
            return(self.GetTop() - oldTop);
        }

        ThrowExceptionFromError(self, oldTop);
        return(0);
    }
Example #4
0
    private static int StartCoroutine(ILuaState lua)
    {
        var oldTop = lua.GetTop();
        // 参数列表 (mono, func, [args, ...])
        var mono = lua.ToComponent(1, typeof(LuaComponent)) as MonoBehaviour;

        if (mono == null)
        {
            mono = ZFrame.UIManager.Instance;
        }
        if (mono.isActiveAndEnabled)
        {
            // 创建lua协程
            lua.GetGlobal("coroutine", "create");
            lua.PushValue(2);
            var status = lua.PCall(1, 1, 0);
            if (status == LuaThreadStatus.LUA_OK)
            {
                // 保存协程引用(这个其实不是函数,应该是LUA_TTHREAD类型)
                var r      = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX);
                var luaRef = new LuaFunction(r, lua);

                var top = lua.GetTop();
                // 协程启动方法入栈
                lua.GetGlobal("coroutine", "resume");
                // 协程入栈
                luaRef.push(lua);
                // 启动参数入栈
                for (int i = 3; i < top + 1; ++i)
                {
                    lua.PushValue(i);
                }

                // 总参数数量=协程+启动参数数量,即:1 + (top - 2)
                status = lua.PCall(top - 1, 2, 0);
                if (status == LuaThreadStatus.LUA_OK)
                {
                    var coroRet  = lua.ToBoolean(-2);
                    var yieldRet = lua.ToAnyObject(-1);
                    // 弹出返回值
                    lua.Pop(2);
                    if (coroRet)
                    {
                        var coro = mono.StartCoroutine(LuaCoroutine(lua, luaRef, yieldRet));
                        lua.PushLightUserData(coro);
                        return(1);
                    }
                    else
                    {
                        LogMgr.E("{0}", yieldRet);
                    }
                }
                else
                {
                    LogMgr.E("coroutine.resume FAIL!");
                }
            }
            else
            {
                LogMgr.E("coroutine.create FAIL!");
            }
            lua.SetTop(oldTop);
        }
        else
        {
            LogMgr.W("MonoBehaviour<{0}> not exist OR not isActiveAndEnabled", mono);
        }
        return(0);
    }
Example #5
0
        public static int Open(IntPtr L)
        {
            L.glua_settop(0); // Remove weird constants
            L.PushGFunction(GLua.EmptyGFunc);
            L.PushGFunction(GLua.EmptyGFunc);
            L.PushGFunction(GLua.EmptyGFunc);
            L.PushGFunction(GLua.EmptyGFunc);
            L.PushGFunction(GLua.EmptyGFunc);

            Kernel32.AllocConsole();
            Console.Title = "Garry's Mod";

            GLuaDynamic _GD = new GLuaDynamic(L);
            dynamic _G = _GD;

            _GD.Dbg();
            L.CreateType(typeof(Cart));

            _GD.Dbg();
            GLua.Utils.DoString(L, "TESTVAR = 256; function TESTFUNC(...) Cart.Console(...) print(...) end");

            _GD.Dbg();
            _G.TESTFUNC("Hello from DLR! ", 42);
            _G.TESTFUNC(_G.TESTVAR);

            L.SetGlobalTableGFunc("_G", "SpewMsg", GLua.EmptyGFunc);

            bool InHook = false;
            GLua.Utils.HookOutput(new GSpewOutputFunc((int T, string Str, int R, int G, int B, int A) => {
                if (InHook)
                    return;
                InHook = true;

                L.Locked(() => {
                    L.PushSpecial(SPECIAL.GLOB);
                    L.glua_getfield(-1, "SpewMsg");
                    L.glua_pushinteger(R);
                    L.glua_pushinteger(G);
                    L.glua_pushinteger(B);
                    L.glua_pushinteger(A);
                    L.glua_pushstring(Str);
                    if (L.PCall(5, 0, 0) != 0)
                        GLua.Utils.print(L, L.CheckString(-1));
                });
                InHook = false;
            }));

            L.Locked(() => {
                if (L.gluaL_loadstring("function TEST_DUMP() print(\"Hello universe!\") end") != 0)
                    Console.WriteLine(L.CheckString(-1));
                if (L.glua_pcall(0, 0, 0) != 0)
                    Console.WriteLine(L.CheckString(-1));
            });

            /*L.GetTableVal("_G", "TEST_DUMP");
            L.glua_dump((LPtr, Dump, Size, UData) => { // TODO: Fix, what is this shit.
                string Str = Marshal.PtrToStringAnsi(Dump, (int)Size);
                Console.WriteLine("{0} >> \"{1}\"", Size, Str);
                return 0;
            });*/

            GLua.Utils.print(L, string.Format("Test with ManagedWrapper v{0} loaded", ManagedWrapper.VERSION), false);
            return 0;
        }