架构与客户端限定

本 mod 是纯客户端的

NEIIntegration 只有一个生命周期方法 preInit,且第一件事就是服务端直接返回:

@EventHandler
public void preInit(FMLPreInitializationEvent evt) {
    if (evt.getSide() != Side.CLIENT) {
        return;
    }
    log = evt.getModLog();
    log.info("Starting NEI Integration");
    integrations = Integrations.getIntegrations();
    Config.preInit(evt);
}

即:装在服务器上等于完全不生效。没有 init / postInit / serverStarting 事件处理器,没有任何服务端内容。

@Mod 注解上还有 acceptableRemoteVersions = "*"(自由兼容)与 guiFactory = "tonius.neiintegration.config.ConfigGuiFactory"。

加载流程

NEIIntegration.preInit(仅客户端)
  └─ Integrations.getIntegrations()        → 构造 6 个 IntegrationBase
  └─ Config.preInit(evt)                   → 读 config/neiintegration.cfg
       └─ ConfigurationManager             → 挂到 FML 总线监听配置变更
       └─ processConfig()                  → 逐个 integration.loadConfig()
            └─ registerHandler(handler)    → API.registerRecipeHandler + registerUsageHandler
            └─ MCForgeDumpers.loadConfig() → API.addOption × 10

每个 IntegrationBase 的 isValid() 为真时才会 loadConfig()。MCForgeIntegration 的 isValid() 恒 true,其余 5 个用 Utils.isModLoaded(modid)。

Handler 注册的成对性

protected void registerHandler(IRecipeHandler handler) {
    handler.prepare();
    API.registerRecipeHandler(handler);   // 配方页(合成 → 产出)
    API.registerUsageHandler(handler);    // 使用页(物品 → 机器)
}

NEI 的「合成」与「使用」是两个独立列表,必须成对注册才能在两个页面都看到。

类型体系

IRecipeHandler                        (本 mod 自定义接口)
  extends ICraftingHandler, IUsageHandler   (NEI 接口)
  + void prepare()                          (本 mod 扩展点)

RecipeHandlerBase                      (抽象实现)
  extends TemplateRecipeHandler             (NEI 模板化配方页基类)
  implements IRecipeHandler
  + 内部类 CachedBaseRecipe extends CachedRecipe

prepare() 在 RecipeHandlerBase 中是空实现(public void prepare() {}),仅作为子类覆写钩子存在——多数子类并不覆写它。

TemplateRecipeHandler 提供基于 IRecipeTemplate 的模板化配方页:子类只需给出「机器 → 槽位布局」模板,NEI 自动渲染进度条与流体槽。贴图 textures/basicProcessing.png 就是这份通用模板。

三个辅助抽象

类 用途
PositionedStackAdv NEI PositionedStack 的扩展(携带更多配方的物品变体)
PositionedFluidTank 在 NEI 配方页上绘制流体槽(基于 Rectangle/Point)
Utils isModLoaded、getClass、areStacksSameTypeCraftingSafe 等工具

Utils.getClass(String) 是本 mod 探测目标 mod 内部类是否存在的反射工具(HarvestCraftIntegration 用它做条件注册),返回 Class<?> 或 null,避免了硬链接。

Access Transformer

src/main/resources/META-INF/neiintegration_at.cfg 随 jar 分发,声明了本 mod 需要的 AT 访问变换。

相关条目