开发第三方模块
从零编写 Suite 第三方模块——Gradle 工程、module.yml、AbstractAXSModule、UI 绑定、配置、命令与客户端包。
开发第三方模块
本文是完整动手教程:读完即可创建一个可加载的 AXS 模块 Jar。更底层的 API 说明见 API 参考。
前置条件
| 项目 | 要求 |
|---|---|
| JDK | 17+ |
| 构建 | Gradle(推荐)或 Maven |
| 服务端 | 已安装 ArcartX 插件 + ArcartXSuite 宿主 |
| 客户端 | 玩家需安装 ArcartX 模组(UI/HUD/自定义包依赖客户端) |
| SDK | axs-api.jar |
不要引用宿主实现
模块代码中只能 import xuanmo.arcartxsuite.api.*。不要 import xuanmo.arcartxsuite.bridge.* 或宿主 module 包——这些内部类不对外开放,引用会导致模块加载失败或版本不兼容。
第一步:工程结构
build.gradle.kts
执行 ./gradlew jar,产物在 build/libs/MyAXSModule.jar。
第二步:module.yml
放在 src/main/resources/module.yml,打包后位于 Jar 根目录:
| 字段 | 说明 |
|---|---|
id | 全局唯一,与 config.yml 中 modules.mymodule 对应 |
main | 实现 AXSModule 的类全限定名 |
depends | 硬依赖的其他 AXS 模块 id;缺失则本模块拒绝启动 |
softdepends | 软依赖;缺失时跳过,不报错(跨模块 Capability 常用) |
external-depends | 硬依赖的外部 Bukkit 插件名(如 PlaceholderAPI) |
加载顺序
depends 保证提供方先于使用方启用。若模块 A depends: [title],则 Title 一定先于 A 启用——这对 Capability 使用方很重要。
第三步:实现模块入口
推荐:继承 AbstractAXSModule
基类自动处理:配置导出、UI 资源复制、监听器/命令/PAPI 注册与卸载、reload 时保留 UI。
极简:直接实现 AXSModule
无配置、无 UI 时可用,需自行管理 onEnable / onDisable / onReload。
第四步:使用 ModuleContext
AbstractAXSModule 子类可直接使用 protected 字段(基类自动注入):
完整列表见 ModuleContext。
第五步:UI 注册
声明式 UI(推荐)
- 资源放在 Jar 内
arcartx/ui/xxx.yml uiSpec()声明导出路径startService()中调用registerModuleUi()
reload 时 registerModuleUi 会自动重新读取磁盘文件并热重载,手动修改的 YAML 即时生效。
打开 UI
第六步:客户端自定义包
实现 ClientPacketHandler,通过 createPacketHandlerSpec() 注册:
客户端通过 ArcartX 模组发送 action 字段匹配的数据包,服务端在 handle(Player, Map) 中处理。
第七步:注册 /axs 子命令
实现 ModuleCommandHandler:
独立玩家命令
通过 commandBindings() 注册独立命令(命令名需在 plugin.yml 中声明):
第八步:与其他模块联动(Capability)
AXS 不推荐在模块 A 里 import 模块 B 的实现类。标准做法是:
- 在
axs-api或你的公共包中定义接口(Capability) - 提供方:
registerCapability(接口.class, 实现) - 使用方:
getCapability(接口.class),务必判空
完整教程见 Capability 详解。
第九步:打包与部署
config.yml:
热加载(无需重启):
服主侧安装说明见 使用第三方模块。
常见问题
ClassNotFoundException
- 检查
module.yml的main是否与类名一致 - 确认 Jar 内含编译后的
.class
模块加载了但 UI 不显示
- 玩家是否安装 ArcartX 客户端模组
registerModuleUi的路径是否与uiSpec()一致
PlaceholderAPI 扩展未注册
- 服务器需安装 PAPI
createPlaceholderExpansion()返回非 null 对象
依赖模块未加载
depends写错 id → 本模块拒绝启动- 需要可选联动时用
softdepends+ Capability 判空