NEI 接口实现总表

基本信息

属性 值
类型 NEI 客户端扩展点清单(总表)
源码规模 50 个源文件(49 .java + 1 .scala),全在 src/main/scala/net/bdew/neiaddons/
modid NEIAddons(gradle.properties 的 modId,大小写混用,不是 neiaddons)
NEI 依赖 com.github.GTNewHorizons:NotEnoughItems:2.8.145-GTNH:dev(dependencies.gradle,api 作用域)
网络通道 bdew.neiaddons,netVersion = 1

本 mod 只实现 7 个 NEI 扩展点。grep -rh "import codechicken.nei" src/ 的完整结果只有 20 个不同的 import 符号,说明它的 NEI 接触面非常窄。

已实现的 NEI 接口

NEI 接口 实现类 作用 门控
IConfigureNEI NEIAddonsConfig(net.bdew.neiaddons) NEI 唯一的全局配置回调。loadConfig() 遍历已激活的 addon 并逐个调用 addon.loadClient(),把 init() 阶段收集的开关值转成实际的 NEI 注册 无(随主 mod 常驻)
IRecipeHandler 6 个 handler 全部经 TemplateRecipeHandler 继承得到(见下表) 合成 / 使用配方页 每个由 setting/config 里的开关分别控制
IOverlayHandler utils/CustomOverlayHandler 把配方一键灌进容器 ⚠️ 源码中无任何实例化点,见下方「死代码」
ItemFilter utils/ModItemFilter 按 modid + 物品/方块属性过滤 NEI 搜索 ⚠️ 源码中无任何实例化点
INEIGuiAdapter appeng/AppEngGuiHandler 接管 AE2 界面的拖拽放物品 Applied Energistics 2 addon 激活 + 客户端
IContainerTooltipHandler developer/DeveloperGuiHandler 悬停槽位时吐出槽位调试信息 Developer Tools addon 激活(默认关闭)
IStackPositioner 由 utils/CustomOverlayHandler 实例化而非实现:new OffsetPositioner(xOffs, yOffs),喂给 DefaultOverlayRenderer 叠加层物品坐标偏移 随 CustomOverlayHandler 死代码

6 个 IRecipeHandler 子类

BaseBreedingRecipeHandler(forestry/)与 BaseProduceRecipeHandler(forestry/)都是 TemplateRecipeHandler 的抽象子类,因此下面 6 个类间接实现 IRecipeHandler。全部用 API.registerRecipeHandler + API.registerUsageHandler 成对注册。

Handler 类 基类 getRecipeIdent() 显示名(i18n 键) GUI 贴图
forestry/bees/BeeBreedingHandler BaseBreedingRecipeHandler beebreeding bdew.neiaddons.breeding.beebreeding = “Bee Breeding” neiaddons:textures/gui/breeding.png
forestry/bees/BeeProduceHandler BaseProduceRecipeHandler beeproduce bdew.neiaddons.produce.beeproduce = “Bee Produce” neiaddons:textures/gui/products_dynamic.png
forestry/trees/TreeBreedingHandler BaseBreedingRecipeHandler treebreeding bdew.neiaddons.breeding.treebreeding = “Tree Breeding” 同 breeding.png
forestry/trees/TreeProduceHandler BaseProduceRecipeHandler treeproduce bdew.neiaddons.produce.treeproduce = “Tree Produce” 同 products_dynamic.png
forestry/butterflies/ButterflyBreedingHandler BaseBreedingRecipeHandler butterflybreeding bdew.neiaddons.breeding.butterflybreeding = “Butterfly Breeding” 同 breeding.png
botany/flowers/FlowerBreedingHandler BaseBreedingRecipeHandler flowerbreeding bdew.neiaddons.breeding.flowerbreeding = “Flower Breeding” 同 breeding.png

getRecipeName() 在两个基类里都是 final,统一拼成 bdew.neiaddons.breeding. + ident(育种类)或 bdew.neiaddons.produce. + ident(产物类)。

非 NEI 的第三方接口

接口 实现类 归属
IWailaDataProvider exnihilo/waila/CrucibleHandler、BarrelHandler、BeeTrapHandler WAILA(不是 NEI),见 Ex Nihilo 集成

本 mod 没有实现的 NEI 接口(附 grep 证据)

在 src/main 下逐个搜索,结果为 0 命中文件:

简报假设的接口 grep -rl 命中文件数
ICraftingRecipeProvider 0
IItemListOverlay 0
IWorldAwareIItemListProvider 0
IContainerInputHandler 0
IStackStringifyHandler 0
IGuiRecipeButton 0
IIngredientList 0
RegisterRecipeHandler 0

对照之下确实存在的 6 项命中文件数均为 1:IConfigureNEI、IRecipeHandler、IOverlayHandler、ItemFilter、INEIGuiAdapter、IContainerTooltipHandler、IStackPositioner。

注意:IOverlayHandler 与 ItemFilter 虽然被 implements,但在全仓只有各自类声明那一处出现,没有任何 new 或工厂注册。它们是历史遗留的死代码,不要当成生效功能。

死代码清单(三项)

类 接口 证据
utils/CustomOverlayHandler IOverlayHandler grep -rn "CustomOverlayHandler" src 只命中自身第 33 行类声明与第 40 行构造函数
utils/SetRecipeCommandHandler SubPacketHandler grep -rn "SetRecipeCommandHandler" src 只命中自身第 19 行与第 24 行构造函数
utils/ModItemFilter ItemFilter grep -rn "ModItemFilter" src 只命中自身第 15 行与第 20 行构造函数

另有 utils/ItemStackWithTip 与 utils/PositionedStackWithTip 同样只被彼此引用(ItemStackWithTip 出现在 PositionedStackWithTip 的构造函数参数里),互为死代码对。

API 调用点全清单

grep -rho "API\.[a-zA-Z]*" src | sort -u 的结果:

API 方法 调用位置 次数
API.addItemListEntry Utils.safeAddNBTItem() → forestry/bees/BeeHelper、forestry/trees/TreeHelper、forestry/butterflies/ButterflyHelper、botany/flowers/FlowerHelper 4
API.addOption MutationDumper 注册点(3 处,见 Mutation 转储工具) 3
API.registerRecipeHandler 6 个 handler 的注册处 6
API.registerUsageHandler 与上同点成对 6
API.registerNEIGuiHandler appeng/AppEngHelper.init() 1
API.registerGuiOverlay crafting/AddonCraftingTablesClient.load() 1(在循环内)
API.registerGuiOverlayHandler 同上,循环内 1(在循环内)

相关条目