搜索

0.27.23 Folia 专项排查

线程边界修复、366 项测试、隔离服证据与残余并发风险。

日期:2026-09-06。交付版本:0.27.23-SNAPSHOT。

本轮完成调度器、跨区域战斗、捕捉异步回调、GUI 点击事务、跟随与主人恢复的定向排查和修复。结论是这些已覆盖路径通过测试,不代表所有 Folia 分支、第三方插件和并发场景都已验证。

已修复的线程边界

路径 原有问题 本版处理
延迟、重复实体任务 retired 直接执行业务回调,Future 依赖链或骑乘清理可能在实体移除临界区运行 延迟任务复用单次回调保护;重复任务单独保留每次 tick,退休业务异步派发且只执行一次
战斗目标持续追踪 下达攻击指令时检查过区域,但目标之后传送,攻击循环仍读取其有效性和位置 每轮攻击在任何目标状态读取前检查区域;已跨区则清除目标并停止导航
远程弹射物命中 受击者区域可能读取发射宠物的攻击属性并直接回血 远程发射者用档案计算伤害;回血回到宠物区域;暴击特效在受击者区域生成
MythicMobs 技能入口 直接将远程主人或攻击目标传给同步技能接口 先检查施法宠物和最终目标归属;跨区时跳过此次技能且不占用冷却,不擅自更换技能目标
捕捉仪式和保存完成 仪式在目标线程修改玩家物品,保存回调在玩家线程移除目标;目标退休后可能遗留捕捉锁 仪式跨区即取消;退款调度到玩家;保存成功后的实体清理回到目标区域;拒绝/退休释放捕捉锁并退款
GUI 动作 点击事件内部直接打开/关闭背包,可能与库存事务冲突 当场取消点击,下个玩家 tick 执行动作;旧菜单已被替换时丢弃旧点击
跟随和回传 跨线程往返后可能继续使用旧活动会话;落点搜索未限制区域和世界高度 拒绝过期会话;方块探测检查区域和高度;飞行宠物越过世界高度时走回传流程

调度依据:Folia EntityScheduler 官方 API。其 retired 回调属于实体移除临界路径,不能在其中移除实体、加载区块或改变区块票据。异步派发仅隔离业务完成链;后续实体和区块操作仍必须重新调度。

远程弹射物的伤害回退使用 LiPet 档案及技能加成,不读取远程实体上由其他插件临时添加的 AttributeModifier。第三方技能本身是否支持 Folia,仍取决于该插件及技能内容。

捕捉行为变化

  • 捕捉开始前目标已不属于当前区域时拒绝尝试,不扣球。
  • 仪式期间主人与目标进入不同区域,取消本次捕捉并退款;不能通过跨区继续访问玩家背包。
  • 玩家在线时退到玩家背包;背包满按原有逻辑掉落。玩家离线/实体调度器退休时,在捕捉位置所属区块退回掉落物,需回原地拾取,仍受掉落物清理规则影响。
  • 捕捉保存成功后,即便主人已经离开区域,也会独立清理原生生物;通知回到玩家线程,宠物币奖励按 UUID 处理。
  • 无新增配置,不覆盖管理员的宠物属性、食物、GUI、价格、捕捉概率或消息。

自动化和隔离服证据

  • 默认兼容 API(Paper 1.21.11,Java 21 字节码):366 项测试通过,失败/错误/跳过为 0。
  • Paper 26.2 API:366 项测试通过,失败/错误/跳过为 0。
  • 新增定向测试覆盖:延迟 Future 退休完成链、重复任务多 tick 与单次退休、已退休任务拒绝、MM 跨区不消耗冷却、读取远程施法者状态之前拒绝。
  • 实机:Folia 26.2 Build 7、Java 25、隔离测试服。最终探针日志时间为 2026-09-06 15:28:00—15:28:02。
  • 狼召唤、清空驯服主人后恢复、收回均通过。测试将宠物移动到 X/Z 各偏移 16384 格,并明确断言 isOwnedByCurrentRegion(owner)==false;单凭相距 1024 格不足以证明不同区域。
  • 真实远程实体作为过期战斗目标被安全清除。伤害测试将真实宠物引用注入弹射物代理,再调用实际伤害监听器,得到 3.0 伤害且没有跨区属性访问;这是最坏输入测试,不是真人射箭验收。
  • 实际移除实体后,延迟 Future 与重复任务退休回调完成,业务链不在移除线程执行。
  • 捕捉仪式中移除真实牛,捕捉球仅退回一枚且捕捉锁释放。另一次强制成功概率的保存路径测试在主人与目标不同区域时完成档案保存及原实体移除。
  • 实际打开背包并构造点击事件,验证当场取消、下一 tick 关闭,以及旧点击不会关闭后来打开的新菜单。未进行真人客户端鼠标/数字键操作。

探针初始化曾因区块卸载、区域未分离和探针自身跨区设置 shooter 而失败;修正测试夹具后最终全部通过。最终日志中仍有 Windows OSHI 性能计数器警告,与 LiPet 实体线程无关;未出现 LiPet 实体线程异常。探针不打入交付 Jar。

仍需处理的风险

优先级 代码证据与边界 当前建议
P1:同一宠物背包并发编辑 PetInventoryService.openResolved/save 为不同编辑者建立独立库存副本,关闭后直接覆盖存储,未见按 petId 独占会话或 revision 校验;主人与管理员同时编辑可能覆盖或重复物品,尚未做双客户端复现 暂勿让多人同时打开同一宠物背包;后续补独占编辑与失败保存恢复,群组服还需要跨服租约
P2:重载并发可见性 YamlConfigFile.load 在补全、校验前发布可变 configuration,配置子类缓存也分步更新,区域线程读者未统一使用不可变配置快照;本轮未做并发重载压力复现 高并发战斗/捕捉期间避免连续 reload;后续改成完整校验后原子发布快照,不能仅加 volatile 就宣称全局原子重载
P2:捕捉掉线/崩溃一致性 捕捉档案保存与原实体移除不是同一持久事务;保存后原实体卸载、进程崩溃,仍需持久化清理凭据。仪式冻结 AI 后卸载也缺少重新加载恢复凭据 本版修复区域访问和在线退休退款,不承诺崩溃后的恰好一次捕捉/退款;需单独补恢复台账和重启测试
P2:退出异常可观测性 PlayerConnectionListener.onPlayerQuit 丢弃 storePet 异常结果;管理器部分内部路径有日志,但退出入口不统一报告失败 保留数据库与退出时完整日志,后续补统一失败记录和重试策略

这些风险不全部由 Folia 独有,但并行区域调度会扩大竞争窗口,不能用本轮定向通过替代它们的专项验证。

未覆盖的组合

跟随的旧会话与方块探测边界本轮经过代码检查和全量测试回归,未单独执行跨高度边界的实机验收。

未运行用户的 Shiroha 26.2 构建,未进行实际网络掉线重进、多真人刷级、ModelEngine 座位、真实 MythicMobs 技能、Residence 联动、MySQL 跨服并发和持续负载测试。历史已修复功能未在本轮全部重新进行客户端验收。

升级与产物

在维护窗口备份 plugins/LiPet/,停止 Minecraft 服务器后替换旧 Jar,只保留 LiPet-0.27.23-SNAPSHOT.jar,再完整启动。/lipet reload 不能替换已加载的 Java 代码。本次只启停隔离测试服,没有操作正式服或关闭电脑。

产物大小:919640 字节;421 个 class 均在 cn/lipet/ 下;class 主版本号 65(Java 21);未打包公共依赖。

SHA-256:A9DD79B5EC22D481DDC4E8D0EDCDFF7F7CF04EF365BB3E4ED908F02192DDF318。