架构与客户端限定
本 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 访问变换。