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)。