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:
- 磁盘上
common.toml里diagnostics.syncLoadDetection为false(缺文件、缺段或缺键按默认值true处理) - 在场 mod 中含已知会
@Overwrite getChunk的:harium、radium、canary、lithium
门控关闭时打一行 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,不受此问题影响