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)。

相关条目