IMC 事件接口(ActionIMCEvent)

基本信息

属性 值
事件类 lumien.custommainmenu.events.ActionIMCEvent
总线 net.minecraftforge.common.MinecraftForge.EVENT_BUS
触发方 发送 IMC(sendIMC) 动作
可取消 ❌ 否
加载阶段 仅客户端(整个 mod 是 @SideOnly GUI 逻辑)

本 mod 唯一的编程接口

ActionIMCEvent 是 Custom Main Menu 对外暴露的唯一扩展点——它没有配置文件 API、没有注册表、没有 API 包,全 mod 唯一的跨 mod 契约就是这个事件。

事件定义

public class ActionIMCEvent extends Event {
    public final String modId;
    public final String message;

    public ActionIMCEvent(String modId, String message) {
        this.modId = modId;
        this.message = message;
    }
}
字段 类型 语义
modId String 配置里 action.modid 的原值
message String 配置里 action.message 的原值,本 mod 完全不解释

两个字段都是 public final,无 getter、无校验、无规范化。

派发时机

ActionSendIMC.perform(ActionSendIMC.java:19-21):

MinecraftForge.EVENT_BUS.post(new ActionIMCEvent(targetModId, message));

派发点只有两处触发路径:

触发路径 来源
按钮点击 按钮(Button) → GuiCustom.actionPerformed → action.perform
文本点击 文本(Text) → GuiCustomLabel.mouseClicked → action.perform

没有其它派发点:加载配置时不发、切换 GUI 时不发、关屏时不发。

订阅方写法

@Mod.EventHandler
public void onCMM(ActionIMCEvent event) {
    if (!"MyMod".equals(event.modId)) return;   // 订阅方自己过滤
    switch (event.message) {
        case "reloadConfig" -> myMod.reload();
        case "openMenu"    -> myMod.showMenu();
    }
}
注意事项 说明
必须自己过滤 modId 事件不带 mod 路由,所有订阅者都会收到
用 EVENT_BUS 不是 FML bus() 与 FMLInterModComms / FMLInterModComms.sendRuntimeMessage 无关
同步派发 在渲染/点击调用栈上同步执行,订阅方异常会冒回 GUI
不能取消 非 Cancelable,无返回值语义
modId 大小写敏感 配 MyMod 与 mymod 视为不同目标(equals 由订阅方决定)

命名沿革

类名沿用 Forge 的 “IMC”(Inter-Mod Comms)术语,但实现与 FMLInterModComms 无关。仓库里唯一真正用 FMLInterModComms 的地方是 CustomMainMenu.postInit(CustomMainMenu.java:62-66)——给 CurseForge 的 VersionChecker 发 addCurseCheck 消息(curseProjectName: 226406-custom-main-menu,文件名模式 CustomMainMenu-MC1.8-[].jar)。这是两套完全独立的机制,前者面向 CurseForge 更新检查,后者面向游戏内按钮。

相关条目