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 更新检查,后者面向游戏内按钮。
相关条目
- 发送 IMC(sendIMC) - 派发方
- 按钮(Button) - 常见挂载位置