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() 流程

  1. root = AlleleManager.alleleRegistry.getSpeciesRoot("rootFlowers");为 null → 打 "Failed to load Flower root, Botany support disabled" 并 return。
  2. flowerSpeciesClass = Utils.getAndCheckClass("binnie.botany.api.IAlleleFlowerSpecies", IAlleleSpecies.class);抛异常 → 打 "Failed to load Flower species interface, Botany support disabled" 并 return。
  3. 打一行 "Root=%s Species=%s"。
  4. Show Flower Mutations 为真 → new FlowerBreedingHandler(),成对 API.registerRecipeHandler + API.registerUsageHandler,再发 NEIPlugins IMC。
  5. 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 引用它——是个未使用的键。

相关条目