IMC 注册消息(发给 NotEnoughItems)

基本信息

属性 值
类型 跨模组通信(FML IMC)
源码类 com.gtnewhorizons.aspectrecipeindex.nei.IMCForNEI
入口 static IMCSender(),由 ClientProxy.init(FMLInitializationEvent) 调用
目标模组 "NotEnoughItems"
消息种类 2 种:registerHandlerInfo(7 条)、registerCatalystInfo(8 条)
通道 FML FMLInterModComms,不是网络包

重要:这是 FML 的加载期跨模组通信,不产生任何运行时网络数据包。本模组唯一的运行时数据包是复用 Thaumcraft 的 PacketAspectPool,见 Aspect 研究点。

registerHandlerInfo(7 条)

NBT 载荷字段(由 registerHandlerInfo(String name, String stack, int height) 构造):

字段 类型 固定值
handler String handler 类的全限定名
modName String "Thaumcraft"
modId String "Thaumcraft"
modRequired boolean true
itemName String 各条不同
handlerHeight int 各条不同
maxRecipesPerPage int 2

注意 modName / modId 都被写成了 "Thaumcraft"——因为这些 handler 展示的都是 Thaumcraft 的配方,NEI 里要挂在 Thaumcraft 名下,而不是 ARI 名下。

Handler 类 itemName handlerHeight
ShapedArcaneRecipeHandler Thaumcraft:blockTable:15(奥法工作台) 144
WandRecipeHandler Thaumcraft:WandCasting 144
ShapelessArcaneRecipeHandler Thaumcraft:blockTable:15 144
AlchemyRecipeHandler Thaumcraft:blockMetalDevice(坩埚) 136
InfusionRecipeHandler Thaumcraft:blockStoneDevice:2(符文矩阵) 152
ItemsContainingAspectHandler Thaumcraft:ItemResearchNotes(研究札记) 147
AspectCombinationHandler Thaumcraft:blockTable:2(研究桌) 43

handlerHeight 与各 handler 实际绘制的页面高度对应——InfusionRecipeHandler.getRecipeHeight 返回 152 + (行数 - 1) * 20,基础值正是 152。

registerCatalystInfo(8 条)

NBT 载荷字段(由 registerCatalystInfo(String handlerName, String stack) 构造):

字段 类型 固定值
handlerID String handler 的 overlay 标识(不是类名)
itemName String 各条不同
priority int 0

registerCatalystInfo 的实参通过 new XxxHandler().getOverlayIdentifier() 现场取——这会额外实例化一遍 handler 对象(无副作用,构造器为空)。

overlay 标识 itemName 用途
thaumcraft.arcane.shaped Thaumcraft:blockTable:15 奥法工作台
thaumcraft.wands Thaumcraft:blockTable:15 奥法工作台
thaumcraft.arcane.shapeless Thaumcraft:blockTable:15 奥法工作台
thaumcraft.alchemy Thaumcraft:blockMetalDevice 坩埚
thaumcraft.infusion Thaumcraft:blockStoneDevice:2 符文矩阵
thaumcraft.items_containing_aspect Thaumcraft:ItemThaumometer 元素分析仪
thaumcraft.items_containing_aspect Thaumcraft:blockStoneDevice 炼金熔炉(同一 overlay 重复注册)
thaumcraft.aspects Thaumcraft:blockTable:2 研究桌

重复注册说明

thaumcraft.items_containing_aspect 出现两次,分别指向元素分析仪与炼金熔炉。后一条会覆盖前一条的催化剂映射(相同 handlerID),因此实际只有炼金熔炉这一条生效。

源码里紧挨着还有一条被注释掉的 Thaumcraft:blockStoneDevice:10(高级炼金熔炉),注释为 // TODO Advanced Alchemical Furnace render item。

神秘机器的催化剂也整条注释掉:registerCatalystInfo(alchemy overlay, "Thaumcraft:blockMetalDevice:10"),注释为 // TODO Fix item render for Thaumatorium。

注册时序

FMLInitializationEvent (客户端)
  └─ ClientProxy.init
       ├─ IMCForNEI.IMCSender()          ← 本页:加载期 IMC
       ├─ MinecraftForgeClient.registerItemRenderer(itemAspect, new ItemAspectRenderer())
       └─ ConfigurationManager.registerConfig(ARIConfig.class)

IMC 与配置文件注册在同一个方法里,IMC 先执行。

与 IConfigureNEI 的关系

IMCForNEI 提供的是"这些 handler 挂在哪些物品下、页面多高";而实际把 handler 对象注册进 NEI 的是 NEIConfig implements IConfigureNEI 的 loadConfig()。

ARI 自身从不实例化 NEIConfig——全仓 grep NEIConfig 只在它自己的文件里出现,没有 new NEIConfig()。注册依赖 NEI 客户端启动时对 IConfigureNEI 实现的发现机制。

Overlay 标识总表

Overlay 标识 Handler
thaumcraft.items_containing_aspect Items Containing Aspect
thaumcraft.aspects Aspect Combination
thaumcraft.alchemy Alchemy
thaumcraft.infusion Arcane Infusion
thaumcraft.arcane.shaped Shaped Arcane
thaumcraft.arcane.shapeless Shapeless Arcane
thaumcraft.wands Wand Crafting

7 个 overlay ID 全部沿用 thaumcraft. 前缀而非 aspectrecipeindex.,保证与 TCNEIPlugin 的 ID 空间不冲突方向一致(覆盖而非并存)。

相关条目