标签救援

标签救援

将模组以"replace": true删除的标签条目放回原位。静默地,Minecraft放它们离去。

Tag Rescue

一个模组在标签上设置了 "replace": true,其他模组放入该标签的所有条目就消失了。

没有报错。没有警告。日志里一行都没有。

方块不再能被挖掘。矿石不再生成。结构不再出现。你在第三周才注意到,然后花一个晚上对 300 个模组的列表进行二分排查。

实际发生了什么

当标签文件声明了 replace 时,Minecraft 会在替换模组写入自己的内容之前清空条目列表——连同包中其他模组贡献的所有内容一起清空:

if (tagfile.replace()) {
    list.clear();        // 其他模组添加的所有内容:消失
}

替换模组的意图是*“我现在定义这个标签。”* 它不知道已有另一个模组往里加了内容。没人会被告知。

什么算作损害。 一个模组重新定义原版标签通常正是 replace 的用途所在,默认策略也允许它这样做。真正的问题是当替换者删除了其他模组的条目——该模组并不在替换者的文件中,没人告知它失去了内容,它添加的功能就这样停止了工作。

Tag Rescue 做了什么

列表中的每个条目都知道它来自哪个包。所以清除不必是“全有或全无”。Tag Rescue 会保留那些本不应被删除的内容。

策略 存活的条目
KEEP_MOD_ENTRIES(默认) 其他模组添加的条目。替换者仍可丢弃原版条目。
KEEP_EVERYTHING 所有条目。replace 不再有意义;标签会被合并。
VANILLA 无——原始行为,如果你想恢复的话。

默认策略遵循了 replace 几乎总是意味着的意图——“我正在重新定义这个原版标签”——同时拒绝让它把第三方的工作当作附带损害删除。

replace 并不自动等于 bug。一个模组故意清空原版标签是在正确使用该功能。当其他模组已经向该标签添加了内容时,这才变成 bug。可以在配置中排除特定标签。

查看效果

救援操作会被记录,并且 /tagrescue 可以在游戏中列出它们:

Tag Rescue
  policy: KEEP_MOD_ENTRIES
  Put back 1 entr(ies) across 1 tag(s):
  minecraft:dirt
    'file/wipe-test' wanted them gone
    kept: farmersdelight:rich_soil

不同于 Load My F***ing Tags

那个模组(拥有 820 万下载量,并且值得拥有)修复的是另一个 bug:标签中的一个无效条目会让 Minecraft 丢弃整个标签。它对 replace 无能为力。两者并不重叠——建议同时运行。

注意事项

  • 客户端和服务端。单独任一端使用都安全。
  • 无依赖。
  • 可在 config/tagrescue-common.toml 中按标签配置。
  • MIT 许可。