Minecraft / Forge 集成
MCForgeIntegration(mods/mcforge/MCForgeIntegration.java)是 6 个集成中唯一 isValid() 恒返回 true 的——它针对的是原版与 Forge 本身,不依赖任何其它 mod。
它注册三类东西:1 个 tooltip handler、2 个 recipe handler、10 个 NEI 选项(dumper)。
public MCForgeIntegration() {
MinecraftForge.EVENT_BUS.register(new MCForgeTooltipHandler());
}
public void loadConfig() {
this.registerHandler(new RecipeHandlerFluidRegistry());
this.registerHandler(new RecipeHandlerOreDictionary());
MCForgeDumpers.loadConfig();
}
注意 tooltip handler 在构造器里就注册到了 MinecraftForge.EVENT_BUS,而两个 recipe handler 在 loadConfig() 里注册。
物品 Tooltip 增强
MCForgeTooltipHandler(92 行)监听 ItemTooltipEvent,为物品 tooltip 追加 6 类信息:
| 配置项 | 追加内容 |
|---|---|
tooltipUnlocalizedName |
未本地化名 |
tooltipInternalName |
内部名(modid:blockName) |
tooltipMaxStack |
最大堆叠数 |
tooltipBurnTime |
燃料燃烧时间 |
tooltipOreDictNames |
矿物词典名 |
tooltipFluidRegInfo |
流体注册信息 |
每类都有 3 个独立开关(普通 / Shift / Advanced),判定式为:
if (Config.tooltipUnlocalizedName
&& (!Config.tooltipUnlocalizedNameShift || Utils.isShiftKeyDown())
&& (!Config.tooltipUnlocalizedNameAdvanced || evt.showAdvancedItemTooltips)) { ... }
即:主开关必须开;Shift 变体开了就要求按住 Shift 才显示;Advanced 变体开了就要求开启高级 tooltip(F3+H)才显示。三者可自由组合。
全部 20 个配置项默认均为 false,即开箱状态下 tooltip 什么都不显示。
两个通用 Recipe Handler
| Handler | 说明 | 默认 |
|---|---|---|
RecipeHandlerFluidRegistry |
把 Forge 流体注册表接进 NEI | handlerFluidRegistry = false |
RecipeHandlerOreDictionary |
把矿物词典接进 NEI | handlerOreDictionary = false |
两者在 loadConfig() 中无条件调用 registerHandler(handler 对象一定会被注册到 NEI),但配方内容被配置开关整体包住:
// RecipeHandlerFluidRegistry.java:205
@Override
public void loadAllRecipes() {
if (Config.handlerFluidRegistry) { // ← 整个方法体被开关包住
for (Fluid fluid : this.getFluids()) {
this.arecipes.add(new CachedFluidRegistryRecipe(fluid));
}
}
}
RecipeHandlerOreDictionary.loadAllRecipes()(:99)结构完全相同,开关名为 handlerOreDictionary。
该开关在 RecipeHandlerFluidRegistry 中出现 5 处(:206, 218, 236, 248, 266),在 RecipeHandlerOreDictionary 中出现 2 处(:100, 111),覆盖 loadAllRecipes / loadCraftingRecipes / loadUsageRecipes 等入口。
因此默认状态下这两个 handler 会注册但产出 0 条配方——NEI 里能看到它们却点不出内容。
10 个 Dumper
mods/mcforge/dumpers/MCForgeDumpers.loadConfig() 通过 NEI 的 API.addOption() 注册 10 个调试转储选项:
API.addOption(new LoadedModDumper());
API.addOption(new ChestLootDumper());
API.addOption(new DimensionDumper());
API.addOption(new EntityDumper());
API.addOption(new TileEntityDumper());
API.addOption(new OreDictionaryDumper());
API.addOption(new FluidDumper());
API.addOption(new FluidContainerDumper());
API.addOption(new RecipeHandlerDumper());
API.addOption(new InventoryDumper());
| Dumper | 用途 |
|---|---|
LoadedModDumper |
列出已加载的 mod |
ChestLootDumper |
转储战利品箱表 |
DimensionDumper |
转储维度信息 |
EntityDumper |
转储实体注册表 |
TileEntityDumper |
转储方块实体注册表 |
OreDictionaryDumper |
转储矿物词典 |
FluidDumper |
转储流体 |
FluidContainerDumper |
转储流体容器 |
RecipeHandlerDumper |
转储已注册的全部 NEI recipe handler |
InventoryDumper |
转储物品栏内容 |
API.addOption是 NEI 的选项菜单 API(不是registerRecipeHandler),因此这 10 个不出现在 NEI 物品列表里,而是作为 NEI 界面的调试选项。
RecipeHandlerDumper.java 放在 mods/mcforge/ 而非 dumpers/ 下,命名上与其它 dumper 不一致(见 源码缺陷)。