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 空间不冲突方向一致(覆盖而非并存)。
相关条目
- Arcane Workbench 覆盖 - 同一
NEIConfig里注册的其他 NEI 扩展 - 兼容性 - 与 TCNEIPlugin 共存时的重复配方问题
- Aspect 研究点 - 本模组唯一的运行时数据包
- Stack Stringify Handler - NEI 侧的第三类集成