luanti 开发问题排查
开发问题排查
Lua API 常见坑
先把 Lua 5.1 官方手册吃透,少犯低级错误!
Q:我写了新类,但调用方法报“userdata value”错误
A:你忘了注册类!
C++ 暴露给 Lua 的对象默认是裸 userdata,必须配 __index 和 __metatable 才能当对象用。
照着 LuaPerlinNoise 的 Register() 写法抄,并且在 scriptapi_export() 里调用。
Lua 里那些气死人的小细节
- 循环次数坑:
for i=0,20 do会跑 21 次,不是 20 次! - 数组下标坑:Lua 数组默认从 1 开始,不是 0!所有标准库和 Luanti API 都遵守这个规则。
Q:数组传进/传出 API 就变 nil,坏了!
A:你用了浮点数当下标!
因为浮点精度误差,z-z1 可能是 0.0000000002 而不是 0,Lua 一查表直接返回 nil。
解决:
1 | array[math.floor(z-z1)] |
强行转整数下标!
节点定义(Nodedef)问题
Q:初始化时创建 MapNode,结果全是 CONTENT_IGNORE
A:执行时机太早!
必须等 Lua 脚本加载完成 再创建节点,否则定义还没注册。
Q:用别名注册节点,default:* 能用,自定义别名却返回 CONTENT_IGNORE
A:别名映射表没更新!
需要手动调用 CNodeDefManager::updateAliases() 刷新。
临时方案:先存名字,后面再取 ID。
柏林噪声(Perlin Noise)问题
Q:噪声完全错乱,全是斜线/乱码
A:99% 是下标越界或坐标顺序错了!
- 检查
noise->result取值是否正常 - 必须用相对坐标访问数组
- 检查
stride(行偏移)是否正确 - 加数据断点,看是不是被意外改写了
Q:噪声正常,但区块之间接缝对不上
A:两种典型错误:
- 矩阵转置了:x/y 循环写反
- 坐标传错:必须传绝对坐标给
getPerlinMap2D/3D,不要自己算偏移
地图生成光照问题
Q:用 VoxelManipulator 生成区块后,世界全黑!只有开飞行才看到蓝天
A:你在顶部生成了 CONTENT_IGNORE!CONTENT_IGNORE 不透光,会挡住太阳光。VoxelManipulator 缓冲区别乱填非忽略方块!
Luanti 崩溃排查
Q:一开启公共服务器列表就崩溃,怎么查原因?
A:Linux 用 gdb 抓崩溃栈!
- 编译时加:
-DCMAKE_BUILD_TYPE=Debug - 安装 gdb
- 运行:
1 | bin/luanti --debugger --verbose |
- 复现崩溃,自动打印调用栈
- 也可以用
dmesg看系统级错误