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 不一致(见 源码缺陷)。

相关条目