按时间线记录"现象 → 根因 → 修法"。这些几乎都是实测撞出来的:不是猜的,每条都有对应的无头测试或截图。
setBlock → markDirty → onUpdate → updateChunk → updateBlocks 里,
updateBlocks 只调了一个空实现 Block.onBlockUpdate() —— 方块新增一个包都不发。
引擎只同步"整块区块第一次下发"和"挖掉方块"。BlockManager#addBlock。任何 mod 甚至引擎自己的泥土都会渲染。KernelBlockSyncTest(地形阶段 0 个包、右键恰好 1 个包)+ 真客户端截图。cutRect,把 collisionRect 传成 null。
而客户端 Block.isSolid() 是 solid && !isBackground && collisionRect != null —— 缺了就恒为 false。chunkIndex * chunkSize);
我传了世界坐标 —— chunk(0,0) 恰好相等所以测试全绿,其它区块整个偏一个区块宽。localCollisionRect;自检升级成"读回矩形并与期望的局部矩形逐值比对"。PlaceRequest 在
ModLoader.tickAll()(onTick() 之后)落地,越过了引擎同 tick 的放/挖到达顺序。KernelDigRaceTest —— 修前 30 轮里 27 轮出现恢复,修后 restoredAfterDig=0。Chunk.setBackgroundBlock(),它只往数组里塞、
从不设置 block.isBackground = true,所以地形背景方块全报 false;照它判断,挖不掉的背景格每点一次就白给一个方块。generateChunk
末尾种矿脉(只替换石头、只长在埋着的位置,位置完全确定性)。hotbar.settings。glDisable(GL_BLEND),
而 ShapeRenderer 只在构造时开一次混合,于是 60% 黑的遮罩被画成实心。
修法:每次画 shapes 前自己 glEnable(GL_BLEND)。client.World 用 E / Q 做相机缩放。一键启动.bat:查文件 → 起服务端(新窗口)→ 等端口就绪 → 起客户端;端口已占则只开客户端。
(踩坑:bat 必须 GBK + CRLF;等待用 ping 而不是在某些环境会失败的 timeout)assets/site.css 与 site.js,贴图直接引用资源包。KernelBlockSyncTest / KernelOreGenTest / KernelProductionTest / KernelDigRaceTest / KernelClickTest改动过程与设计取舍都在开发文档里:内核 README、 MOD 开发指南、hotbar mod README。