发送 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 换皮肤、重读配置、切换服务端状态等。
相关条目
- 重载配置(refresh) - 本 mod 自身状态变更的对应物
- 按钮(Button) - 常见挂载位置
- IMC 事件接口 - 事件类的完整说明