diff --git a/lua-test/lua/base/BootStarp.lua b/lua-test/lua/base/BootStarp.lua new file mode 100644 index 0000000..f8cccf6 --- /dev/null +++ b/lua-test/lua/base/BootStarp.lua @@ -0,0 +1,32 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by 無心道(15388152619). +--- DateTime: 2024/12/26 16:47 +--- +Bootstrap = {} + +require("LuaScan") +require("EventLister") + +local this = {} +local LoginEventListerTable = EventListerTable:new("测试扫描", 9999) + +function onStart() + +end + +function Bootstrap.onLogin(player) + print("onLogin", player) +end + +function Bootstrap.onInit() + LoginEventListerTable:eventLister("0", "onLogin", Bootstrap.onLogin) +end + +function onInit() + local funs = LuaScan.findTableFunc("onInit") + for i, f in pairs(funs) do + f.fun() + --local s, e = xpcall(load(f.fun), debug.traceback) + end +end \ No newline at end of file diff --git a/lua-test/lua/base/EventLister.lua b/lua-test/lua/base/EventLister.lua index 9c03355..04d8690 100644 --- a/lua-test/lua/base/EventLister.lua +++ b/lua-test/lua/base/EventLister.lua @@ -3,7 +3,7 @@ --- Created by 無心道(15388152619). --- DateTime: 2024/10/31 16:54 -require("gameDebug") +require("GameDebug") require("table-extend") ---事件注册 @@ -75,7 +75,7 @@ function EventListerTable:eventLister(eventType, eventName, eventFun, index) table.sort(em.MappingList, function(a, b) return a.weight < b.weight end) - --gameDebug.printType(_VERSION, "注册事件:", self, em, eventType, eventName) + EventListerTable.print(self.name, "注册事件:", eventType, eventName, funInfo) end --- 触发事件 @@ -85,7 +85,7 @@ function EventListerTable:triggerEvent(eventType, ...) local em = self:eventMap(eventType) if em then for _, v in pairs(em.MappingList) do - print(self.name, "触发监听", v.name, v.funInfo) + EventListerTable.print(self.name, "触发监听", v.name, v.funInfo) local s, e = xpcall(v.fun, debug.traceback, ...) gameDebug.assertPrint(s, "触发事件", v.name, v.funInfo, "调用异常", ..., e) end @@ -100,7 +100,7 @@ function EventListerTable:triggerResult(eventType, ...) if table.notEmpty(em) then gameDebug.assertTrue(table.count(em.MappingList) == 1, self.name, "存在多个事件监听", eventType) local v = em.MappingList[1] - print(self.name, "触发监听", v.name, v.funInfo) + EventListerTable.print(self.name, "触发监听", v.name, v.funInfo) local s, e = xpcall(v.fun, debug.traceback, ...) gameDebug.assertPrint(s, "触发事件", v.name, v.funInfo, "调用异常", ..., e) if s then @@ -110,6 +110,15 @@ function EventListerTable:triggerResult(eventType, ...) return nil end +local offPrint = false +function EventListerTable.print(...) + if offPrint then + return + end + print("out", gameDebug.toStrings(" ", ...)) + print("EventListerTable.print") +end + EventListerTable.registerType("默认", "0", "player_db_key", "global_db_key") --- 商业化模块充值事件触发监听 diff --git a/lua-test/lua/base/GameDebug.lua b/lua-test/lua/base/GameDebug.lua index f75c23b..03ad096 100644 --- a/lua-test/lua/base/GameDebug.lua +++ b/lua-test/lua/base/GameDebug.lua @@ -29,7 +29,7 @@ end ---获取函数所在的文件名 function gameDebug.get_function_file(func) local info = debug.getinfo(func, "S") - return info.source or "匿名文件" + return info.short_src or "匿名文件" end ---获取函数的名字 @@ -43,7 +43,14 @@ end function gameDebug.getFunctionInfo(func) local debugInfo = debug.getinfo(func) --获取不到函数名字,只能又文件名和行数表达了 - return (debugInfo.source or "匿名文件") .. ":" .. tostring(debugInfo.linedefined) + return (debugInfo.short_src or "匿名文件") .. ":" .. tostring(debugInfo.linedefined) +end + +---获取函数所在文件行号 +function gameDebug.getFunctionLineNumber(func) + local debugInfo = debug.getinfo(func) + --获取不到函数名字,只能又文件名和行数表达了 + return debugInfo.linedefined or -1 end --- 把 table 数据转化成json字符串 diff --git a/lua-test/lua/base/LuaScan.lua b/lua-test/lua/base/LuaScan.lua new file mode 100644 index 0000000..040e897 --- /dev/null +++ b/lua-test/lua/base/LuaScan.lua @@ -0,0 +1,106 @@ +--- lua 扫描器 +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by 無心道(15388152619). +--- DateTime: 2024/12/26 14:31 +LuaScan = {} + +local this = {} + +function forTable0() + + local tables = this.GetTable() + for fileName, v in pairs(tables) do + print(fileName) + end + print("---------------一级事件-----------------") + local onLoginTable = LuaScan.findFunc("onLogin") + for i, v in pairs(onLoginTable) do + print(i, this.toString(v)) + end + print("---------------二级事件-----------------") + local onLoginTable = LuaScan.findTableFunc("onLogin") + for i, v in pairs(onLoginTable) do + print(i, this.toString(v)) + end +end + +--- 查找 全局table 中的指定函 二级函数,是 全局table 虚拟类 下面注册的函数 +--- @param name string 需要查找的函数名 +function LuaScan.findTableFunc(name) + local result = {} + local tables = this.GetTable() + for fileName, fileTable in pairs(tables) do + for methodName, v in pairs(fileTable) do + if type(v) == "function" and methodName == name then + local infoMapping = { + ["fileName"] = this.get_function_file(v), + ["methodName"] = fileName .. "." .. methodName, + ["line"] = this.getFunctionLineNumber(v), + ["fun"] = v, + } + infoMapping["info"] = this.toString(infoMapping) + table.insert(result, infoMapping); + end + end + end + return result +end + +--- 查找一级函数 就是全局函数 +function LuaScan.findFunc(name) + local result = {} + for methodName, v in pairs(_G) do + if type(v) == "function" and methodName == name then + table.insert( + result, + { + ["fileName"] = this.get_function_file(v), + ["methodName"] = "_G." .. methodName, + ["line"] = this.getFunctionLineNumber(v), + ["fun"] = v, + } + ); + end + end + return result +end + +function this.toString(funMapping) + return funMapping.methodName .. "() 文件:" .. funMapping.fileName .. " line:" .. funMapping.line; +end + +--- 获取当前虚拟机中所有的表 +function this.GetTable() + local result = {} + for k, v in pairs(_G) do + if type(v) == "table" then + if k ~= "__index" + and k ~= "_G" + and k ~= "string" + and k ~= "java" + and k ~= "utf8" + and k ~= "package" + and k ~= "io" + and k ~= "math" + and k ~= "debug" + and k ~= "coroutine" + and k ~= "os" then + result[k] = v + end + end + end + return result; +end + +---获取函数所在的文件名 +function this.get_function_file(func) + local info = debug.getinfo(func) + return info.short_src or "匿名文件" +end + +---获取函数所在文件行号 +function this.getFunctionLineNumber(func) + local debugInfo = debug.getinfo(func) + --获取不到函数名字,只能又文件名和行数表达了 + return debugInfo.linedefined or -1 +end \ No newline at end of file diff --git a/lua-test/lua/module/1/test1.lua b/lua-test/lua/module/1/test1.lua index 88c9bd1..65ca917 100644 --- a/lua-test/lua/module/1/test1.lua +++ b/lua-test/lua/module/1/test1.lua @@ -21,6 +21,8 @@ function t1(str) return str end + + --local success, error = pcall(t1, "d") --if not success then -- errFunc(error) diff --git a/lua-test/lua/module/2/test2.lua b/lua-test/lua/module/2/test2.lua index 6a9ecff..aac9df4 100644 --- a/lua-test/lua/module/2/test2.lua +++ b/lua-test/lua/module/2/test2.lua @@ -5,7 +5,7 @@ --- function t3(str) - local a =3 & 0xFF + local a = 3 & 0xFF print(a) local num = 9199999999999999989 print("lua long - " .. tostring(num)) @@ -25,6 +25,10 @@ function argsTest(...) Assert.assertTrue(1 == 2, "参数异常", ...) end +function onLogin() + print("onLogin") +end + function ret(obj) local success, ret = pcall(function() return "dd - " .. obj diff --git a/lua-test/lua/module/ClassTest.lua b/lua-test/lua/module/ClassTest.lua index dd94fe5..8306997 100644 --- a/lua-test/lua/module/ClassTest.lua +++ b/lua-test/lua/module/ClassTest.lua @@ -27,6 +27,10 @@ function TestClass:Level(newLv) return self["level"] end +function TestClass.onLogin() + print("onLogin") +end + function TestClass:printName2() print("printName2", self) end diff --git a/lua-test/lua/module/TableInsert.lua b/lua-test/lua/module/TableInsert.lua index e6a562a..46aaa98 100644 --- a/lua-test/lua/module/TableInsert.lua +++ b/lua-test/lua/module/TableInsert.lua @@ -46,6 +46,14 @@ function this.t1() print("this method test") end +function this.onLogin() + print("onLogin") +end + +function tableInsert.onLogin() + print("onLogin") +end + LoginEventListerTable:eventLister("0", "test", function() print("test") end, 999999) diff --git a/lua-test/lua/module/TestData.lua b/lua-test/lua/module/TestData.lua index 07542a0..bbb706a 100644 --- a/lua-test/lua/module/TestData.lua +++ b/lua-test/lua/module/TestData.lua @@ -54,4 +54,8 @@ local k1 = "dddd" gameDebug.print({ k1 = "1" }) gameDebug.print({ [k1] = "1" }) +ldebug("debug", 3) +linfo("info", 3) +lerror("error", 3) + return TestData \ No newline at end of file diff --git a/lua-test/luac/src/main/java/luajava/luac/LuaFunction.java b/lua-test/luac/src/main/java/luajava/luac/LuaFunction.java index d496b01..b5cfe20 100644 --- a/lua-test/luac/src/main/java/luajava/luac/LuaFunction.java +++ b/lua-test/luac/src/main/java/luajava/luac/LuaFunction.java @@ -1,5 +1,6 @@ package luajava.luac; +import com.alibaba.fastjson.JSON; import party.iroiro.luajava.JFunction; import party.iroiro.luajava.Lua; import party.iroiro.luajava.value.LuaValue; @@ -13,9 +14,10 @@ import party.iroiro.luajava.value.LuaValue; public interface LuaFunction extends JFunction { @Override default int __call(Lua L) { + Object[] _args = null; try { int oldTop = L.getTop(); - Object[] _args = new Object[oldTop]; + _args = new Object[oldTop]; for (int i = 0; i < _args.length; i++) { LuaValue luaValue1 = L.get(); Object javaObject = LuaUtils.luaValue2Object(luaValue1); @@ -28,7 +30,11 @@ public interface LuaFunction extends JFunction { } return results == null ? 0 : 1; } catch (Throwable e) { - throw new RuntimeException(e); + String jsonString = ""; + try { + jsonString = JSON.toJSONString(_args); + } catch (Exception ignore) {} + throw new RuntimeException("call lua function error " + jsonString, e); } } diff --git a/lua-test/luac/src/main/java/luajava/luac/LuacContext.java b/lua-test/luac/src/main/java/luajava/luac/LuacContext.java index 513fb37..eea0b8e 100644 --- a/lua-test/luac/src/main/java/luajava/luac/LuacContext.java +++ b/lua-test/luac/src/main/java/luajava/luac/LuacContext.java @@ -4,6 +4,9 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import luajava.LuaRuntime; import luajava.LuaType; +import luajava.luac.func.JLogDebug; +import luajava.luac.func.JLogError; +import luajava.luac.func.JLogInfo; import luajava.luac.impl.Lua54Impl; import luajava.luac.impl.LuaJitImpl; import party.iroiro.luajava.Consts; @@ -56,6 +59,10 @@ public class LuacContext implements luajava.ILuaContext { // 加载内置资源 load(luacRuntime.getLuaFileCache().getExtendList(), 5); + L.set("ldebug", new JLogDebug()); + L.set("linfo", new JLogInfo()); + L.set("lerror", new JLogError()); + for (Map.Entry entry : luacRuntime.getGlobals().entrySet()) { L.set(entry.getKey(), entry.getValue()); } diff --git a/lua-test/luac/src/main/java/luajava/luac/func/JLogDebug.java b/lua-test/luac/src/main/java/luajava/luac/func/JLogDebug.java new file mode 100644 index 0000000..137a85b --- /dev/null +++ b/lua-test/luac/src/main/java/luajava/luac/func/JLogDebug.java @@ -0,0 +1,25 @@ +package luajava.luac.func; + +import lombok.extern.slf4j.Slf4j; +import luajava.luac.LuaFunction; +import party.iroiro.luajava.Lua; + +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * java log info + * + * @author: wxd-gaming(無心道, 15388152619) + * @version: 2024-12-26 16:00 + **/ +@Slf4j +public class JLogDebug implements LuaFunction { + + @Override public Object doAction(Lua L, Object[] args) { + if (log.isDebugEnabled()) + log.debug("{}", Arrays.stream(args).map(String::valueOf).collect(Collectors.joining(" "))); + return null; + } + +} diff --git a/lua-test/luac/src/main/java/luajava/luac/func/JLogError.java b/lua-test/luac/src/main/java/luajava/luac/func/JLogError.java new file mode 100644 index 0000000..09ead7c --- /dev/null +++ b/lua-test/luac/src/main/java/luajava/luac/func/JLogError.java @@ -0,0 +1,24 @@ +package luajava.luac.func; + +import lombok.extern.slf4j.Slf4j; +import luajava.luac.LuaFunction; +import party.iroiro.luajava.Lua; + +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * java log info + * + * @author: wxd-gaming(無心道, 15388152619) + * @version: 2024-12-26 16:00 + **/ +@Slf4j +public class JLogError implements LuaFunction { + + @Override public Object doAction(Lua L, Object[] args) { + log.error("{}", Arrays.stream(args).map(String::valueOf).collect(Collectors.joining(" "))); + return null; + } + +} diff --git a/lua-test/luac/src/main/java/luajava/luac/func/JLogInfo.java b/lua-test/luac/src/main/java/luajava/luac/func/JLogInfo.java new file mode 100644 index 0000000..5286b47 --- /dev/null +++ b/lua-test/luac/src/main/java/luajava/luac/func/JLogInfo.java @@ -0,0 +1,24 @@ +package luajava.luac.func; + +import lombok.extern.slf4j.Slf4j; +import luajava.luac.LuaFunction; +import party.iroiro.luajava.Lua; + +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * java log info + * + * @author: wxd-gaming(無心道, 15388152619) + * @version: 2024-12-26 16:00 + **/ +@Slf4j +public class JLogInfo implements LuaFunction { + + @Override public Object doAction(Lua L, Object[] args) { + log.info("{}", Arrays.stream(args).map(String::valueOf).collect(Collectors.joining(" "))); + return null; + } + +} diff --git a/lua-test/luac/src/test/java/code/LuaTest.java b/lua-test/luac/src/test/java/code/LuaTest.java index 0a11b35..e8bc046 100644 --- a/lua-test/luac/src/test/java/code/LuaTest.java +++ b/lua-test/luac/src/test/java/code/LuaTest.java @@ -69,6 +69,9 @@ public class LuaTest { ILuaContext context = luaService.getRuntime().context(); context.call(true, "testActor", new LuaActor(7788L, "7788L")); + context.call(true,"forTable0"); + context.call(true,"onInit"); + // luaService.getRuntime().call("printData"); // luaService.getRuntime().call("showmemory", Thread.currentThread().getName()); // luaService.getRuntime().call("t3", Long.MAX_VALUE); diff --git a/lua-test/pom.xml b/lua-test/pom.xml index a1140a3..293cf56 100644 --- a/lua-test/pom.xml +++ b/lua-test/pom.xml @@ -95,7 +95,7 @@ org.slf4j slf4j-api - 2.0.13 + 1.7.7 com.alibaba