IMC 注册入口
基本信息
| 属性 | 值 |
|---|---|
| 通道 modid | Waila(Waila.java:39) |
| IMC 消息键 | register(Waila.java:111)、addconfig(Waila.java:93) |
| 接收方 | Waila.processIMC(Waila.java:88-120) |
| 执行时机 | FMLLoadCompleteEvent(Waila.java:82-86) |
| 执行器 | ProxyServer.registerIMCs(ProxyServer.java:111-116) |
Waila 的 @Mod 声明了 acceptableRemoteVersions = "*"(Waila.java:43),并通过 @NetworkCheckHandler 阻止版本低于 1.7.3 的客户端加入(Waila.java:55、Waila.java:130-137)。
功能
FML 的 Inter-Mod Comms(IMC)是 Waila 唯一对外的注册通道。第三方 addon 只需在 preInit 阶段发一条字符串消息,Waila 会在 FMLLoadCompleteEvent 之后用反射调用 addon 提供的静态方法,并把 IWailaRegistrar 实例作为唯一参数传入。
1. register —— 注册回调
发送方:
FMLInterModComms.sendMessage("Waila", "register",
"fully.qualified.path.to.registration.method");
接收侧(Waila.java:111-118)把 (方法全名 → 发送方 modid) 存入 ModuleRegistrar.IMCRequests(ModuleRegistrar.java:57、ModuleRegistrar.java:71-73)。
2. 回调方法签名约束
ProxyServer.callbackRegistration(ProxyServer.java:117-134)的解析逻辑:
- 按最后一个
.切分,得到methodName与className(ProxyServer.java:118-120) Class.forName(className)加载类(ProxyServer.java:123)getDeclaredMethod(methodName, IWailaRegistrar.class)取方法(ProxyServer.java:124)reflectMethod.invoke(null, ModuleRegistrar.instance())以静态方法调用(ProxyServer.java:125)
因此 addon 的回调方法必须满足:全名含至少一个 .(否则 method.substring(0, -1) 越界)、static、可见性允许 getDeclaredMethod + invoke、唯一参数为 IWailaRegistrar。签名约定见 IWailaRegistrar.java:4-12。
三类失败各自降级为 log.warn 而不抛出:ClassNotFoundException(ProxyServer.java:127-129)、NoSuchMethodException(ProxyServer.java:129-131)、其他 Exception(ProxyServer.java:131-133)。
3. addconfig —— 免反射配置注入
Waila.java:93-109:addconfig 消息的值按 $$ 分割,必须恰好 3 段,分别对应 modname、keyname、configtext;段数不为 3 时 log.warn 后 continue(Waila.java:95-102)。这条通道让 addon 无需写 Java 回调即可注入配置项。
交互
| 环节 | 负责方 | 源码位置 |
|---|---|---|
| 发送 IMC | 第三方 addon | FMLInterModComms.sendMessage |
| 收集请求 | Waila | Waila.java:88-120 → ModuleRegistrar.java:71-73 |
| 反射执行 | Waila | ProxyServer.java:111-116 → ProxyServer.java:117-134 |
| 实际登记 | addon 的静态回调 | 回调收到 IWailaRegistrar 后调用其方法 |
IMCRequests 的 key 集合在 registerIMCs 中被直接遍历(ProxyServer.java:112-114),且 IMC 消息非字符串时会被跳过(Waila.java:91)。
相关条目
- IWailaRegistrar - 回调拿到的接口,共 24 个方法
- 配置 API -
addconfig注入的配置如何被读取 - /dumphandlers 指令 - 运行时列出所有已注册 provider 的排障手段