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)的解析逻辑:

  1. 按最后一个 . 切分,得到 methodName 与 className(ProxyServer.java:118-120)
  2. Class.forName(className) 加载类(ProxyServer.java:123)
  3. getDeclaredMethod(methodName, IWailaRegistrar.class) 取方法(ProxyServer.java:124)
  4. 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)。

相关条目