Botany 集成
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 1 个 NEI 育种配方页 + 搜索索引注入(Botany addon) |
@Mod 类 |
net.bdew.neiaddons.botany.AddonBotany,modid NEIAddons|Botany |
| 目标 mod | Botany(裸 modid,只查存在性不查版本) |
| 侧 | 仅客户端(checkSide(side) { return side.isClient(); }) |
| 配方数 | 1 个(FlowerBreedingHandler),无产物页 |
| 开关 | 2 个 |
与 Forestry addon 的差异
这是全 mod 最小的 addon,源码 3 个类(AddonBotany / FlowerHelper / FlowerBreedingHandler):
| 对比项 | Forestry addon | Botany addon |
|---|---|---|
| handler 数 | 5 | 1 |
| 产物页 | 有(BaseProduceRecipeHandler) |
无(Show Butterfly Products 那样的开关在源码里连注释都没有) |
| 索引注入 | 5 类 | 0 类 |
MinecraftForge.EVENT_BUS.register |
有 | 无——所以没有 registerHandlerInfo,FlowerBreedingHandler 不走 HandlerInfo 路径 |
NEIPlugins IMC |
有 | 有(同名方法) |
| 黑名单开关 | Load blacklisted |
Load blacklisted(独立一份,不是共享同一个键) |
FlowerHelper.setup() 流程
root = AlleleManager.alleleRegistry.getSpeciesRoot("rootFlowers");为 null → 打"Failed to load Flower root, Botany support disabled"并 return。flowerSpeciesClass = Utils.getAndCheckClass("binnie.botany.api.IAlleleFlowerSpecies", IAlleleSpecies.class);抛异常 → 打"Failed to load Flower species interface, Botany support disabled"并 return。- 打一行
"Root=%s Species=%s"。 Show Flower Mutations为真 →new FlowerBreedingHandler(),成对API.registerRecipeHandler+API.registerUsageHandler,再发 NEIPlugins IMC。API.addOption(new MutationDumper(root, "flower_mutation"))。
第 2 步是全 mod 唯一对「目标 mod 的具体接口类」做反射断言的地方——别处都是断言 Minecraft 基类。Botany 的花种接口是可选的(别的 mod 也可能注册 rootFlowers),所以失败时整个 addon 退出而不是抛异常。
FlowerHelper 不做任何搜索索引注入:没有 Utils.safeAddNBTItem 调用。所以 Botany 的花种物品能不能在 NEI 里搜到,取决于上游 mod 自己的注册,本 mod 不插手。
FlowerBreedingHandler
只有一个方法:
public String getRecipeIdent() {
return "flowerbreeding";
}
其余全部继承自 forestry/BaseBreedingRecipeHandler——Botany addon 直接复用 Forestry addon 的抽象基类,这也是为什么 Botany 没有自己的 BaseBreeding 类。getRecipeName() 因此返回 I18n.format("bdew.neiaddons.breeding.flowerbreeding") = “Flower Breeding”。
GUI 贴图同样是 neiaddons:textures/gui/breeding.png,与蜂/树/蝶共用一张。
特殊条件与概率
BaseBreedingRecipeHandler.CachedBreedingRecipe 对花突变同样会调 mutation.getSpecialConditions():
- 抛异常 → 打日志、填
["§cError! See log for details"]、置derp = true,配方页 (108, 15) 处显示红色DERP。 - 返回 null → 打
"Mutation %s + %s -> %s is returning null from getSpecialConditions"警告并填空列表。 - 正常 → 正常渲染。
Show Secret Mutations 在 Botany 侧没有对应开关:基类读的是 AddonForestry.showSecret 这个静态字段。若 Forestry addon 未激活(例如 Addons 里 Forestry=false),showSecret 保持字段初始值 false;但更关键的是——AddonBotany.init 并不会因为 Forestry 缺席而失败,BaseBreedingRecipeHandler 里也没有 AddonForestry.instance 的非空判断,只在出错分支里用它打日志,那条路径才有 NPE 风险。
同理 showReqs 也是 AddonForestry 的静态字段。所以 Botany 的花突变概率高亮与条件提示,实际由 Forestry addon 的配置决定。
NEIPlugins IMC
AddonBotany.registerWithNEIPlugins 与 Forestry 版逐字相同,只是调用者是 Botany:
FMLInterModComms.sendRuntimeMessage(
this, "NEIPlugins", "register-crafting-handler",
String.format("%s@%s@%s", I18n.format("bdew.neiaddons.genetics"), name, id));
⚠️ 这里用的是 bdew.neiaddons.genetics(en_US = “Forestry Genetics”)而不是 bdew.neiaddons.exnihilo 那种专属前缀,所以花突变在 NEIPlugins 里的分组标签是「Forestry Genetics」。lang 文件里另有一个 bdew.neiaddons.exnihilo=Ex Nihilo 键,但源码中无任何 I18n.format 引用它——是个未使用的键。
相关条目
- 配置文件 -
Botany分类的 2 个开关 - NEI 接口实现总表 - 1 个 handler 的接口归属
- Forestry 集成 - 被复用的
BaseBreedingRecipeHandler与共享静态开关 - Mutation 转储工具 - 第三个
API.addOption注册点 - Addon 架构与加载顺序 - 仅客户端 addon 的入列判定