WDMla 插件开发 API
基本信息
| 属性 | 值 |
|---|---|
| API 包 | com.gtnewhorizons.wdmla.api(gradle.properties 的 apiPackage = api + modGroup) |
| API 文件数 | 54(git ls-files 'src/main/java/com/gtnewhorizons/wdmla/api/*') |
| 入口接口 | com.gtnewhorizons.wdmla.api.IWDMlaPlugin |
| 标记注解 | com.gtnewhorizons.wdmla.api.WDMlaPlugin |
| 依赖方需加 | WDMla(编译期 compileOnly) |
| javadoc | 随 javadocJar 发布,含 com.gtnewhorizons.wdmla.** 与 mcp/mobius/waila/**(addon.gradle) |
功能
WDMla 的插件系统完全基于注解发现,不要求外部 mod 写进任何硬编码列表。这与旧版 Waila 的 IMC 字符串注册不同。
一个插件类需要:加 @WDMlaPlugin 注解、实现 IWDMlaPlugin、在 register / registerClient 中调用注册方法。FML 的 ASMDataTable 会在 preInit 扫出所有带该注解的类并实例化(PluginScanner.java:28-63),因此注解类必须有无参构造函数,且源码建议配 @SuppressWarnings("unused")——编译器看不到反射调用(IWDMlaPlugin.java:6-7)。
最小示例直接写在 IWDMlaPlugin 的 javadoc 里(IWDMlaPlugin.java:10-30)。
注册方法
IWDMlaCommonRegistration(服务端,5 个方法):
| 方法 | 用途 |
|---|---|
registerBlockDataProvider |
方块 → NBT 数据 |
registerEntityDataProvider |
实体 → NBT 数据 |
registerItemStorage |
任意类 → 物品存储视图 |
registerFluidStorage |
任意类 → 流体存储视图 |
registerProgress |
任意类 → 进度条 |
IWDMlaClientRegistration(客户端,7 个注册方法 + 3 个查询方法):
| 方法 | 用途 |
|---|---|
registerBlockComponent |
方块 → 提示行 |
registerEntityComponent |
实体 → 提示行 |
hideBlock / hideEntity |
完全隐藏某类方块/实体的信息 |
registerItemStorageClient |
物品存储视图的客户端渲染 |
registerFluidStorageClient |
流体存储视图的客户端渲染 |
registerProgressClient |
进度条客户端渲染 |
registerAccessorHandler |
接管 BlockAccessor / EntityAccessor 的客户端构造 |
IWDMlaClientRegistration 另有三个查询方法供 provider 在绘制时使用:isServerConnected()、isShowDetailsPressed()、getServerData()(IWDMlaClientRegistration.java:63,70,78),以及两个构造器工厂 blockAccessor() / entityAccessor()(IWDMlaClientRegistration.java:84,90)。
注解属性
@WDMlaPlugin 有三个属性(WDMlaPlugin.java):
| 属性 | 默认 | 作用 |
|---|---|---|
uid |
"" |
插件标识。与 provider 的 uid 无对应关系,注释明确写了这一点(WDMlaPlugin.java:17-21) |
dependencies |
{} |
modid 数组;任一未加载则整个插件被跳过(PluginScanner.java:36-40、65-75) |
overridingRegistrationMethodName |
"" |
声明要屏蔽的旧版 Waila IMC 注册方法全限定名(WDMlaPlugin.java:28-32) |
dependencies 传的是 Loader.isModLoaded 的参数,因此必须是modid 而非仓库名(详见 版本门控与软依赖)。
数值
provider 侧(IWDMlaProvider)控制排序与配置的默认行为:
| 方法 | 默认值 | 语义 |
|---|---|---|
getUid() |
必实现 | provider 唯一 id,ResourceLocation;必须全小写,注释警告大写会让注册表混乱(IWDMlaProvider.java:14-22) |
getDefaultPriority() |
TooltipPosition.BODY |
提示框内纵向位置 |
isPriorityFixed() |
false |
为真则优先级不可配置,也不会写入配置文件(IWDMlaProvider.java:38-43) |
canPrioritizeInGui() |
true |
为假则配置界面隐藏该项(IWDMlaProvider.java:45-50) |
getConfigCategory() |
plugins_autogen.<域>.<路径> |
配置分类名(IWDMlaProvider.java:52-57) |
getLangKey() |
provider.wdmla.<域>.<路径> |
界面显示名(IWDMlaProvider.java:59-68) |
优先级的两个基准值写在 getDefaultPriority 的 javadoc 里(IWDMlaProvider.java:31-32):默认组件(物品名)注册于 -10000,采集信息注册于 -8000,插件可把自己的组件插在两者之间;取值建议落在 0–5000 区间以排在正文下方(IWDMlaProvider.java:27-30)。
交互
PluginScanner 遇到未满足依赖的插件时打 skipped plugin %s loading: missing dependency(PluginScanner.java:38);遇到实现类但不是 IWDMlaPlugin 的注解类时打 skipped plugin %s loading: class is not IWDMlaPlugin(PluginScanner.java:57)。反射构造失败与 ClassNotFoundException 都交给 WailaExceptionHandler.handleErr(PluginScanner.java:52-55、59-61)。
注册完成后 CommonProxy.postInit 会 startSession → 注册服务端插件 → (客户端)startSession → 注册客户端插件 → endSession → 重载配置 → endSession(CommonProxy.java:57-73)。优先级排序在 loadComplete() 中仅客户端执行(CommonProxy.java:75-83)。