换上 Folia 核心后,老假人插件罢工了
生电和挂机农场离不开假人。以前在 Paper 单线程核心上,大家用惯了经典的 tanyaofei/minecraft-fakeplayer。但当我们把服务器换到多线程区域化调度的 Folia / Lophine 核心、并升级到新版本后,上游仓库因为完全建立在传统 Bukkit 单主线程假设上,而且版本停留在老分支,直接跑不起来了。
2026 年 8 月 13 日到 14 日(Commit f5c1509、c85e0aa),我动手把整套假人插件移植到了 Folia 的区域调度体系(EntityScheduler 与 RegionScheduler)上,一口气补齐了 MC 1.21.11 和 26.1.2 的 NMS 适配模块;后来在 10 月 12 日发布的 v0.3.19-folia.5 里,又跟进加上了 MC 26.2 模块与 Adventure 5.2 兼容 shim。
跨区域看背包:不同线程只读、同线程可改
在 Folia 里改插件,最容易炸服的就是“跨区域读写实体数据”。假如假人挂在主世界的刷怪塔,而玩家站在几千格外的基地里敲指令打开假人背包拿东西,这时候两个人根本不在同一个线程区域里,直接改背包分分钟触发跨线程并发报错甚至刷物品。
为了解决这个问题,我设计了跨区域 invsee 只读镜像机制:当你和假人不在同一个线程区域时,打开假人背包看到的是一个安全的只读快照,你可以随时查看它包里攒了多少材料,但不能直接拿取;只有当你走过去、和假人处在同一个调度区域内时,才会开放可编辑的真实背包。这样既保留了远程巡检的方便,又从根源上掐断了跨线程改背包的风险。
不怕崩服的 Lifecycle Journal 恢复日志
生成假人时往往需要临时执行一串前置命令(pre-spawn-commands),比如临时加白名单或者改权限,生成完再执行清理。如果刚好在假人生成到一半的时候服务器意外崩了,以前留下的临时权限就会一直残留在服里。
为此我专门加了一套崩溃恢复日志(Lifecycle Journal)。每次执行前置指令前先把逆操作写进本地日志,哪怕假人刚生成一半服务器突然断电,下次重启时插件也会自动读取未完成的日志,按逆序把临时白名单等指令干干净净地回滚掉。