IMC API

基本信息

属性 值
入口类 HeeIMC(api/HeeIMC.java)
传输机制 FML Inter-Mod Comms(FMLInterModComms.IMCMessage)
注册的消息 key 14 个(跨 6 个 handler 类,全部唯一)
运行时机枚举 RunEvent:POSTINIT / LOADCOMPLETE(2 个常量)
元素值类型 12 个类(api/message/element/)
文档地址 配置项注释与 mcmod.info 指向 http://hee-api.chylex.com

功能

其他 mod 通过 FML IMC 通道向 HEE 发送字符串消息来修改 HEE 的运行时数据。消息被缓存到 HeeIMC.cachedMessages,等对应的加载阶段再统一执行。

消息接受(api/HeeIMC.java:77-…)

public static void acceptString(String sender, String fullNotation)

以第一个空格切分为 key 与 data;key 必须匹配 Pattern.compile("[^A-Za-z:]")(:21)—— 即 key 中只允许字母与冒号。data 中的 JSON 键会被 Pattern.compile("(?:\"(\\w+)?\":)")(:22)修正后再 JsonToNBT 解析。

配置项 IMC(system/ConfigHandler.java:189-197)也是走这条通道:配置文件里写的每一条消息都以 sender "HEE Configuration File" 发送;默认值 {"Write your message here"} 被显式跳过(:195)。

三种运行方式

方法 前置状态 RunEvent 位置
runPostInit() LoaderState.POSTINITIALIZATION POSTINIT HeeIMC.java:29-35
runLoadComplete() LoaderState.AVAILABLE LOADCOMPLETE HeeIMC.java:40-46
runUnsafe() hasReachedState(AVAILABLE) null(全部) HeeIMC.java:51-59

runMessagesForEvent 遍历缓存,MessageRegistry.canRunInEvent(msg.key, event) 判定 events.get(key) == event || event == null(api/message/MessageRegistry.java:38-40),命中的消息从缓存移除并执行。HEE 自身只在 onPostInit 调 HeeIMC.runPostInit()(HardcoreEnderExpansion.java:182)。

⚠️ runLoadComplete() 与 runUnsafe() 在 api/ 包内没有调用者 —— 它们是留给外部 mod 在自己的 LoadComplete 阶段调用的公开 API。已核对 grep -rn 'runLoadComplete\|runUnsafe' src/main/java:命中均在 api/HeeIMC.java 自身的定义处。这不是死代码,是设计上的对外 API。

数值

14 个消息 key

key 运行时机 处理器类 行
HEE:DragonEssence:AddRecipe POSTINIT ImcEssenceHandlers api/message/handlers/ImcEssenceHandlers.java:69
HEE:DragonEssence:RemoveRecipe POSTINIT ImcEssenceHandlers ImcEssenceHandlers.java:73
HEE:Mobs:SetGooImmune LOADCOMPLETE ImcMobHandlers ImcMobHandlers.java:41
HEE:Mobs:SetEnergy LOADCOMPLETE ImcMobHandlers ImcMobHandlers.java:44
HEE:Orb:ItemBlacklist LOADCOMPLETE ImcOrbHandlers ImcOrbHandlers.java:77
HEE:Orb:MobAdd LOADCOMPLETE ImcOrbHandlers ImcOrbHandlers.java:80
HEE:Orb:MobRemove LOADCOMPLETE ImcOrbHandlers ImcOrbHandlers.java:82
HEE:DecompositionTable:Blacklist LOADCOMPLETE ImcTableHandlers ImcTableHandlers.java:51
HEE:ExtractionTable:SetEnergy LOADCOMPLETE ImcTableHandlers ImcTableHandlers.java:54
HEE:ExperienceTable:AddItem LOADCOMPLETE ImcTableHandlers ImcTableHandlers.java:57
HEE:World:LootAdd LOADCOMPLETE ImcWorldHandlers ImcWorldHandlers.java:151
HEE:World:LootRemove LOADCOMPLETE ImcWorldHandlers ImcWorldHandlers.java:154
HEE:World:BiomeMobAdd LOADCOMPLETE ImcWorldHandlers ImcWorldHandlers.java:157
HEE:System:DisableIntegration POSTINIT ImcSystemHandlers ImcSystemHandlers.java:24

计数核对(两种表述互相验证):HEE:DragonEssence:* 2 + Mobs 2 + Orb 3 + Table 3 + World 3 + System 1 = 14;grep -oE 'register\("HEE:[A-Za-z]+:[A-Za-z]+"' src/main/java/chylex/hee/api/message/handlers/Imc*.java 取 14 条、去重后仍 14 条。

带属性声明的 4 条:

key 属性 类型
HEE:Mobs:SetEnergy id SpawnEntryValue.livingMobString
HEE:Orb:MobAdd / :MobRemove id SpawnEntryValue.livingMobString
HEE:World:LootAdd / :LootRemove list lootName
HEE:World:BiomeMobAdd biome biomeName
HEE:System:DisableIntegration modid StringValue.any()

12 个元素值类型

api/message/element/ 下:BoolValue、DecimalValue、IntArrayValue、IntValue、ItemDamagePairValue、ItemPatternValue、ItemStackValue、ListValue、NbtValue、SpawnEntryValue、StringValue、WeightedLootValue(12 个),外加 element/base/ 下的 Optional、Precondition、PreconditionComposite 三个前置条件类。

交互

注册机制

MessageRegistry.register(String key, MessageHandler handler, RunEvent event) 在重复 key 时抛 IllegalArgumentException("Cannot register duplicate IMC message key: " + key)(api/message/MessageRegistry.java:19-25)。

静态块(:42-48)依次完成:建 HashMap → ImcHandler.loadHandlers() → 冻结为 ImmutableMap。因此注册表在类初始化后不可变。loadHandlers() 显式实例化 6 个 handler(api/message/handlers/ImcHandler.java:11-12):

ImcHandler[] handlers = new ImcHandler[] { new ImcEssenceHandlers(), new ImcMobHandlers(), new ImcOrbHandlers(),
        new ImcTableHandlers(), new ImcWorldHandlers(), new ImcSystemHandlers() };

runMessage 找不到 key 时记 logError("Message key not found: $0", key) 并返回 false(MessageRegistry.java:27-36)。

HEE:System:DisableIntegration 的行为

if (ModIntegrationManager.blacklistedMods.add(runner.getString("modid")))
    MessageLogger.logOk("Added 1 mod ID to the list.");
else MessageLogger.logFail("The mod ID was already in the list.");

(ImcSystemHandlers.java:12-20)向 ModIntegrationManager.blacklistedMods(public static final Set<String>,system/integration/ModIntegrationManager.java:19)添加 modid,之后该 mod 的兼容处理器会被跳过 —— 集成循环的判定是 Loader.isModLoaded(modId) && !blacklistedMods.contains(modId)(ModIntegrationManager.java:32、:51)。

相关条目