
标签救援
将模组以"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 许可。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。