最近写了个 Minecraft 的小工具,叫 LiteTrack,用来整理投影材料和分工备货。
主要是多人一起做工程的时候,除了材料数量,还得知道谁在收集、哪些已经准备好了。Litematica 的投影文件里有材料数据,就想着直接读出来,做成一个可以一起认领的清单。后面又加了 3D 预览,打开网页就能看投影。
目前大概是下面这个样子,项目也放到了 GitHub。

LiteTrack 桌面端项目列表
材料认领
创建项目后上传 .litematic 文件,就会生成材料清单。同一个项目可以放多份投影,建筑分了几个部分的话,不用分别建项目。

LiteTrack 项目概况:投影预览、认领覆盖和备货完成度
成员可以认领自己准备收集的材料,之后在“我的认领”里查看。收集完了再标记完成,项目里的进度会一起更新。

LiteTrack 桌面端我的认领:按项目查看待收集材料
认领和完成是分开统计的。项目概况里已经认领了一部分,但完成度还是 0%,因为还没有确认收集。现在也没有连接游戏里的仓库,材料有没有备齐,需要自己手动标记。
同一份投影里的同一种材料,目前只能由一个人认领,服务端会检查是否重复。容器里的物品单独处理,不会和同名建筑材料抢同一个认领位置。
材料列表
列表里保留了原始数量,旁边加了一列推荐备货,换算成组和潜影盒。看着这个拿材料,比对着几千几万个方块数算要方便一些。

LiteTrack 材料列表:原始数量、推荐备货和认领状态
比如这里的 2014 个云杉木板,会推荐准备 2 个潜影盒。推荐数量向上取整,具体需要多少还是看左边的原始数量。
不过换算目前写得比较简单,统一按一组 64 个、一个潜影盒 27 格算。只能堆叠 16 个或不能堆叠的物品,还不能准确换算,备货时需要自己核对一下。
有些材料不需要收集,可以由管理员点“无需收集”,从任务和进度里排除。原来的数量和认领记录会保留,点错了可以撤销。
另外也加了按名称、方块 ID 搜索,以及分类和认领状态筛选。材料多的时候,用搜索直接找会快一些。
项目统计
统计页可以看还有多少没认领、多少正在备货,以及各个成员的收集情况。建筑材料和容器物品分开统计,也能查看每份投影的进度。

LiteTrack 桌面端项目统计:需求分布、收集进度和成员贡献
投影解析
解析用的是自己写的 NBT 和方块状态读取逻辑。解压 .litematic 后,读取各区域的方块调色板和索引,再累计数量。
除了建筑方块,现在也会读取容器里的物品。比如投影里有箱子,箱子本身会出现在材料列表,里面的物品放到另一张清单,也可以认领和标记完成。前提是投影保存了这些数据,没有保存容器库存的文件就读不到。
空气会直接过滤掉,其他不需要统计的方块可以加到黑名单。黑名单只影响之后上传的投影,已经有的材料和认领不会跟着删。已有项目想临时排除某个材料,还是用前面的“无需收集”。
3D 预览
模型页用 Three.js 和 React Three Fiber,显示的是上传文件里的实际结构。可以拖动旋转、缩放和平移,项目有多份投影时也能切换。

LiteTrack 3D 模型页:在浏览器中查看实际投影结构
打开预览时,浏览器会下载投影源文件,用 Web Worker 解析,再交给 Three.js 渲染。方块绘制用了实例化,减少单独绘制大量方块的开销。
项目概况里也放了一份缩小的模型,配上网格背景,看起来像一张图纸。这个效果我还挺喜欢的。
预览目前限制在 50 万个非空气方块以内,材质和特殊方块的形状做了简化,主要用来看建筑结构。大投影还是会吃内存和 GPU,解析放到 Worker 里也只能减少对主线程的占用。
以前如果只保存了材料清单,没有保留投影源文件,需要重新上传才能看到模型。
界面和部署
界面用了浅色背景、网格和方块图标,整体偏图纸的样子。手机上也适配了一下,可以看项目和自己的认领任务。
技术栈是 Next.js、React、TypeScript,数据库用 SQLite。部署直接用 Docker Compose,仓库里有配置和说明,备份时记得保留数据目录。
现在只支持 .litematic,单文件最大 100 MB,其他投影格式和世界存档还不能上传。
项目里还有传送站、问卷、白名单这些功能,不过这篇主要写投影协作,其他的有空再说。
本来想玩游戏,结果又在写代码。先这样,后面有改动再补。