Mutation 转储工具
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 调试用数据导出(NEI 选项面板入口) |
| 源码类 | forestry/MutationDumper.scala(全仓唯一的 .scala 源文件,其余 49 个都是 .java,但都放在 src/main/scala/ 目录下) |
| 基类 | codechicken.nei.config.ArrayDumper[IMutation] |
| 注册方式 | API.addOption(new MutationDumper(root, "<suffix>")) |
三处注册点
MutationDumper 构造函数签名是 (root: ISpeciesRoot, suffix: String),i18n 前缀固定为 "tools.dump.neiaddons." + suffix。三个调用点:
| 调用方 | root 取自 |
suffix | NEI 选项面板名 |
|---|---|---|---|
forestry/bees/BeeHelper.setup() |
AlleleManager.alleleRegistry.getSpeciesRoot("rootBees") |
bee_mutation |
nei.options.tools.dump.neiaddons.bee_mutations = “Bee Mutations” |
forestry/trees/TreeHelper.setup() |
getSpeciesRoot("rootTrees") |
tree_mutation |
nei.options.tools.dump.neiaddons.tree_mutations = “Tree Mutations” |
botany/flowers/FlowerHelper.setup() |
getSpeciesRoot("rootFlowers") |
flower_mutation |
nei.options.tools.dump.neiaddons.flower_mutations = “Flower Mutations” |
⚠️ 三个 suffix 与三个 i18n 键并不一一对应:注册用的是单数 bee_mutation / tree_mutation / flower_mutation,而 en_US.lang 里定义的键是复数 ..._mutations。ArrayDumper 用 "tools.dump.neiaddons." + suffix 拼键,所以实际查找的是 nei.options.tools.dump.neiaddons.bee_mutation(单数),lang 文件里的单数键不存在——这些选项在英文环境下会显示未翻译的键名。
面板根标题 nei.options.tools.dump.neiaddons = “NEI Addons” 存在,dumped = "%s dumped to %s" 也存在,唯独三个子项名对不上。
三个 root 为空时静默跳过
每个 setup() 在取 root 之后都判一次 null 并打警告后 return,此时 API.addOption 不会执行:
| Helper | 警告原文 |
|---|---|
BeeHelper |
"Bee Species Root not found, some functionality will be unavailable" |
TreeHelper |
"Tree Species Root not found, some functionality will be unavailable" |
ButterflyHelper |
"Butterfly Species Root not found, some functionality will be unavailable" |
FlowerHelper |
"Failed to load Flower root, Botany support disabled" |
即装了 Forestry 也不会注册蝴蝶转储(ButterflyHelper 根本没调 API.addOption,源码里没有对应行),但缺蝶类时其它两个照常。
导出的 CSV 列
MutationDumper 覆写三个 ArrayDumper 成员:
| 成员 | 行为 |
|---|---|
header() |
返回 7 列:UID、Name、Allele0、Allele1、isSecret、baseChance、conditions |
array() |
root.getMutations(false).toArray(Array.empty) — false 表示不排除隐性突变,所以转储表里一定包含 secret 条目,与 Show Secret Mutations 开关无关 |
dump(mutation, id) |
逐列填值 |
dump() 的列取自 root.getKaryotypeKey.ordinal() 索引到的模板染色槽:
| 列 | 取值 |
|---|---|
UID |
mutation.getTemplate()(speciesKey).getUID |
Name |
mutation.getTemplate()(speciesKey).getName |
Allele0 |
mutation.getAllele0.getUID |
Allele1 |
mutation.getAllele1.getUID |
isSecret |
mutation.isSecret.toString |
baseChance |
"%.1f".format(mutation.getBaseChance) — 保留 1 位小数 |
conditions |
getSpecialConditions 用 | 连接;抛异常时打日志并填 "[Error]";null 时填 "" |
getSpecialConditions 的异常处理与 BaseBreedingRecipeHandler 里的写法平行(都打 logSevereExc 并带 mutation 的三个 UID),两处独立实现,互不调用。
Scala / Java 混编细节
MutationDumper.scala 里 import scala.collection.JavaConversions._,array() 用 .toArray(Array.empty) 把 java.util.Collection 转成数组。getTemplate() 在 Scala 侧写成双括号 getTemplate()(0)——即 Java 的 getTemplate()[0],因为 Scala 把无参重载视作 ()。getAllele0 同样省略括号。
相关条目
- 配置文件 -
Show Secret Mutations与本工具的差异 - Forestry 集成 - 突变数据同时驱动育种页与转储表
- Botany 集成 - 第三个注册点
- Addon 架构与加载顺序 -
loadClient()在何时触发这些 setup