发送 IMC(sendIMC)

基本信息

属性 值
type 值 sendIMC(大小写不敏感)
实现类 lumien.custommainmenu.lib.actions.ActionSendIMC
参数 modid(目标 mod id)、message(字符串键)
事件类 lumien.custommainmenu.events.ActionIMCEvent
分发点 GuiConfig.getWantedAction(GuiConfig.java:414-418)

核心差异

本 mod 唯一对外暴露的编程接口,也是唯一被别的 mod 订阅的扩展点。其余 7 个动作都只影响 Minecraft 自身的状态。

事件契约

ActionSendIMC.perform 只做一件事(ActionSendIMC.java:19-21):

MinecraftForge.EVENT_BUS.post(new ActionIMCEvent(targetModId, message));
字段 类型 说明
modId String 配置里写的目标 mod id,原样传递,不做大小写规范化
message String 自由字符串,本 mod 不解释语义

事件继承 cpw.mods.fml.common.eventhandler.Event,发在 MinecraftForge.EVENT_BUS(不是 FML 的 bus())。源码 Javadoc 明确写了这只会在按钮被点击时触发——而同一个动作也能挂在 文本(Text) 上,那里是 mouseClicked 直接调 perform(GuiCustomLabel.java:129)。

订阅方示例

@Mod.EventHandler
public void onAction(ActionIMCEvent event) {
    if (event.modId.equals("MyMod")) {
        // event.message 自行解释,如 "reloadConfig"
    }
}

⚠️ 事件不带 mod 过滤:所有订阅者都会收到事件,每个订阅方必须自己比对 event.modId。本 mod 自身也订阅了 CMMEventHandler,但它不监听这个事件。 ⚠️ 事件不是 Cancelable / 不是 TickEvent,没有返回值语义——同步派发,订阅方的异常会沿 post() 冒回 GUI 渲染/点击栈。

命名说明

类名沿用了 Forge 的 “IMC”(Inter-Mod Comms)叫法,但实现上与 FMLInterModComms 无关——CustomMainMenu.postInit 里那次真正的 FMLInterModComms.sendRuntimeMessage(CustomMainMenu.java:66)是给 CurseForge 的 VersionChecker 用的,与本动作无关联。

使用场景

自定义主菜单按钮触发其他 mod 的行为:让某个 mod 换皮肤、重读配置、切换服务端状态等。

相关条目