Skip to content

BetterAutoSave v0.20.1 — Forge 1.20.1 / NeoForge 1.21.1 异步存档优化

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Aug 03:35
3e92575

v0.20.1 — 修复与 Lithium 系优化 mod 同装时启动崩服

0.20.0 与 Harium、Radium、Radium Re-Reforged、Canary 一类 Lithium 移植同装时会导致服务器启动崩溃。装了这些 mod 的用户请直接升级到 0.20.1,或临时回退到 0.19.0。只有 0.20.0 受影响

一、症状

启动时 mixin 应用失败,整个配置被拒绝:

Mixin apply failed shinoyuki_betterautosave.mixins.json:ServerChunkCacheSyncLoadMixin
  -> net.minecraft.server.level.ServerChunkCache
InvalidInjectionException: @At("INVOKE") on ...betterautosave$measureSyncChunkLoad with priority 1000
  cannot inject into ServerChunkCache::m_7587_ merged by
  me.jellysquid.mods.lithium.mixin.world.chunk_access.ServerChunkManagerMixin with priority 1000

失败的是 0.20.0 新增的同步加载检测器,但代价是整份 shinoyuki_betterautosave.mixins.json 一起被拒绝——异步存盘、异步加载全部随之失效,服务器起不来

二、原因

0.20.0 的同步加载检测器用 @WrapOperation 包住 ServerChunkCache.getChunk 里那次等待区块就绪的调用,并声明了 require = 0,本意是「注入点不存在时静默跳过,不让一个纯观测功能把服务器搞崩」

这个声明不足以覆盖真实的失败模式。Lithium 系用 @Overwrite 整体接管了 getChunk,而 Mixin 在 Injector.findTargetNodes 里有一条更早的判定:注入器的优先级不高于已经 merge 该方法的 mixin 时,直接抛 InvalidInjectionException。两边优先级都是默认的 1000,不满足条件;这条判定发生在 require 的命中数检查之前,所以 require = 0 根本没有被问到

0.20.0 发行说明里「这种情况下同步加载检测静默不生效,而不是让服务器启动失败」这句话,方向是对的,实现没有兑现。这一版补上

三、修复

同步加载检测器的注入改为在类加载期先过一道门控,命中任一条就完全不注入这个 mixin:

  1. 磁盘上 common.tomldiagnostics.syncLoadDetectionfalse(缺文件、缺段或缺键按默认值 true 处理)
  2. 在场 mod 中含已知会 @Overwrite getChunk 的:hariumradiumcanarylithium

门控关闭时打一行 WARN 指明是哪个 mod 触发的:

[BetterAutoSave] sync chunk load detector disabled: mod 'harium' overwrites
ServerChunkCache.getChunk, which Mixin will not let us wrap. Async saving and loading are unaffected

这一行是必要的:否则「装了 0.20 却看不到任何同步加载报告」将无从解释。存盘、异步加载以及其余全部功能不受该门控影响

没有采用提高该 mixin 优先级的做法。那样 BAS 会先应用,对方的 @Overwrite 随后把整个方法体连同本注入一起覆盖掉,结果是崩溃风险转移给对方而本功能照样失效

四、名单之外的同类 mod

第 2 条是白名单,只覆盖已知的四个。若今后出现同样 @Overwrite getChunk 而不在名单上的 mod,把 diagnostics.syncLoadDetection 设为 false 并重启即可(走第 1 条判定),不必等待版本更新

判定逻辑对两个加载器完全一致;NeoForge 侧此前没有 mixin 配置插件,这一版补齐

五、验证

  • 529 项单元测试,其中门控判定规则 11 项,覆盖白名单匹配、大小写、误报反向断言、TOML 段落识别与默认值语义
  • 测试服 1.20.1 双向实测:BAS 0.20.0 + Harium 2.0 可稳定复现启动崩溃;换 0.20.1 后服务器正常启动,日志中 WARN 指明 harium;移除 Harium 后服务器正常启动且不打该 WARN,检测器照常注入
  • 上述崩溃异常原文已随修复一并记入源码注释,避免今后再次用 require = 0 去应对同类问题

六、升级

替换 jar 即可,存档格式与配置键不变。0.19.0 及更早版本不含该 mixin,不受此问题影响