Capability API
registerCapability/getCapability 机制及所有内置 Capability 接口(TitleGrantable、MailDispatchable、ChatCardSendable、EventBusCapability 等)的方法签名参考。
Capability API
Capability 是 Suite 推荐的跨模块通信机制。模块通过 ModuleContext 注册自己提供的能力接口,其他模块通过类型查找来调用,实现松耦合的模块间协作。
工作原理
- 提供方在
startService()中注册 Capability - 使用方通过
Supplier延迟查找,避免加载顺序问题 - 模块
onDisable时宿主自动注销其注册的所有 Capability
registerCapability / getCapability
公开 Capability:外部插件入口
context.getCapability() 仅供 AXS 模块内部使用。面向外部 Bukkit 插件,Suite 提供统一静态门面 AxsCapabilities,并配合 @PublicCapability 注解做可见性过滤:
- 只有标注
@PublicCapability的接口才能被AxsCapabilities.get()返回;未标记的类型对外一律返回null(模块内部getCapability不受限) - 宿主启动时把门面直连
ModuleRegistry的 capability 注册表;模块热卸载后对应 capability 自动摘除,get()返回null - 公开 capability 的约定:入参用富对象(spec/record),阻塞操作返回
CompletableFuture
当前公开的 Capability
| 接口 | 提供方 | 用途 |
|---|---|---|
EventBusCapability | 宿主 | EventBus 主题 pub/sub |
SecondaryPasswordAccess | 宿主 | 二级密码访问 |
AxsMailService | 邮件发送/查询/领取/删除(全异步 API) | |
AxsMarketService | market | 市场 UI 打开/挂单/搜索/计数 |
MapNavigable | map | 地图第三方插件注册路径点推送、导航回调注册、导航互斥 |
QuestGpsNavigable | questgps | 任务推送/接取/追踪/门禁检查 |
BattlePassAccess | battlepass | 战令经验/等级/档位/任务进度 |
FishingAccess | fishing | 钓鱼小游戏/图鉴/经验/疲劳/领奖 |
RegionQueryable | regions | 保护区域查询(RegionInfo 只读视图) |
BossTrackerQueryable | entitytracker | 活跃 Boss 会话查询 |
LotteryAccess | lottery | 抽奖积分/兑换/开箱 |
LoginViewQueryable | loginview | 认证状态查询/打开登录界面 |
PropAccessible | prop | 道具列表/应用到主手 |
AnnouncerBroadcastable | announcer | 即时/排队公告广播 |
SubtitlePlayable | announcer | 播放字幕组 |
RgbRenderable | rgb | 渐变文本渲染 |
TitleGrantable / TitleConfigQueryable | title | 发放称号 / 查询称号元数据 |
ChatCardSendable / ChatMutable | chat | 发送聊天卡片 / 禁言管理 |
TabRefreshable | tab | 刷新 Tab 列表 |
CombatEffectTriggerable | combateffect | 触发战斗特效 |
SignalDispatchable | eventpacket | 触发规则引擎信号 |
MenuOpenable | menu | 打开配置菜单 |
AfkRewardDispatchable | afkreward | 挂机状态/原地挂机 |
WarehouseAutoDepositable | warehouse | 仓库自动存入 |
ExtraBackpackAccess | extrabackpack | 扩展背包访问 |
PickupNotifiable / PickupInterceptor | pickup | 拾取通知推送 / 拾取拦截查询(分模式注册) |
QQBotNotifiable / QQBotBroadcastable / QqBindCapable | qqbot | 群消息监听 / 群推送 / QQ 绑定 |
EssentialsQueryable | essentials | AFK/隐身/禁言/昵称查询 |
OnlineRewardsQueryable | onlinerewards | 签到/在线时长查询与操作 |
InteractionState | conversation | 对话交互状态查询 |
MailDispatchable、PlayerDataPurgeable、DatabaseMigratable、PolygonSelectionCapability、ModuleAdminCapability等接口为内部专用(未标注@PublicCapability),外部插件调用AxsCapabilities.get()会返回null。完整对照见文末 内置 Capability 能力图。
外部插件接入
插件 plugin.yml 声明 depend: [ArcartXSuite](或 softdepend),构建时 compileOnly 依赖 axs-api:
AxsCapabilities.get(Class)— 返回实现实例;类型未公开、未注册或本体未就绪时返回nullAxsCapabilities.has(Class)— 判断指定公开 capability 当前是否可用
外部插件无需再为每个模块编写 AxsXxxApi 静态门面,AxsCapabilities 是唯一入口。
内置 Capability 接口
TitleGrantable
称号授予能力(公开 capability)。由 Title 模块实现。
| 参数 | 说明 |
|---|---|
playerId | 玩家 UUID |
titleId | 称号 id |
duration | 持续时间(如 "permanent"、"7d") |
source | 来源标识(如 "EventPacket") |
TitleConfigQueryable
称号配置查询能力(公开 capability)。由 Title 模块实现。
MailDispatchable
邮件发送能力(内部专用,未标记 @PublicCapability,外部插件请使用 AxsMailService)。由 Mail 模块实现。两个方法均可在任意线程调用(同步执行,内部落库阻塞至完成后返回)。
sendMail— 发送带混合附件(物品+货币)的系统邮件,收件人无需在线dispatchPreset— 按预设模板发送邮件,收件人用玩家名(支持离线玩家)
Mail 模块未启用时返回 failure,调用方应自行降级处理。
AxsMailService
邮件公开服务接口(公开 capability,@PublicCapability + @Stable)。由 Mail 模块实现,面向外部 Bukkit 插件。所有方法返回 CompletableFuture,异步执行——不要在 Bukkit 主线程 join()/get(),应用 thenAccept/whenComplete 回调。
| 方法 | 返回 | 说明 |
|---|---|---|
send(AxsMailRequest) | CompletableFuture<AxsDeliveryReceipt> | 发送系统邮件(含物品/货币/命令附件),idempotencyKey 去重 |
sendDurable(AxsMailRequest) | CompletableFuture<AxsDeliveryReceipt> | 恢复持久化的发送意图(当前与 send 行为一致) |
getMail(UUID, long) | CompletableFuture<AxsMailView> | 查询玩家单封邮件 |
getInbox(UUID, AxsMailQuery) | CompletableFuture<List<AxsMailView>> | 查询收件箱 |
getUnreadCount(UUID) | CompletableFuture<Integer> | 查询未读数 |
markRead(UUID, long) | CompletableFuture<AxsMailView> | 标记已读并返回详情 |
claim(UUID, long) | CompletableFuture<AxsClaimResult> | 领取全部可领附件(物品附件需玩家在线) |
delete(UUID, long) | CompletableFuture<AxsDeleteResult> | 删除邮件(有未领取受保护附件时拒绝) |
ChatCardSendable
聊天卡片发送能力(公开 capability)。由 Chat 模块或宿主桥接实现。
ChatMutable
聊天禁言能力(公开 capability)。由 Chat 模块实现。
expiresAt 为 null 表示永久禁言。
SubtitlePlayable
字幕播放能力(公开 capability)。由 Announcer 模块实现。
SignalDispatchable
信号派发能力(公开 capability)。由 EventPacket 模块实现,供其他模块触发规则引擎信号。
CombatEffectTriggerable
战斗特效触发能力(公开 capability)。由 CombatEffect 模块实现。
MapNavigable
地图导航能力(公开 capability,@PublicCapability + @Stable)。由 Map 模块实现。地图是展示层与事件源:来源推送第三方插件注册路径点、接收导航点击回调;导航的实际执行由来源负责,或经 useMapNavigation/navigateExternalTarget 交给地图内置导航栈代执行。按场景选型的完整对接方案见 Map - 第三方插件对接方案。
| 方法 | 说明 |
|---|---|
upsertExternalTarget | 新增/更新单个第三方插件注册路径点(紫色标记,不占玩家路径点上限),select=true 时切到目标世界并选中 |
upsertExternalTargets | 批量推送第三方插件注册路径点,一次视图同步 |
reconcileExternalTargets | 用给定集合原子替换某来源的全部目标:单次同步、仍存在的目标选中态不闪断;空列表 = 清空该来源 |
clearExternalTargets | 清除指定来源的所有第三方插件注册路径点(source 为空串 = 全部来源) |
setExternalNavigated | 来源回推导航状态,驱动面板"导航 ↔ 取消"按钮切换(useMapNavigation 目标由地图自维护) |
navigateExternalTarget | 由地图内置导航栈开始导航指定第三方插件注册路径点("地图代导航"命令式入口,不过全局委托);已在导航返回 true |
registerNavigationSource | 按 source 注册导航回调;玩家点击该来源目标的"导航/取消"时回调;owner 插件禁用时自动注销 |
unregisterNavigationSource | 注销指定来源的导航回调 |
setNavigationDelegate | 注册全局导航委托(全量接管导航点击);同一时间全服只有一个委托,重复注册由后者覆盖;owner 插件禁用时自动注销 |
clearNavigationDelegate | 注销导航委托(仅当当前委托属于该插件时生效) |
hasNavigationDelegate | 当前是否已注册全局导航委托 |
clearTrack | 清除玩家当前的地图导航(锚点/路径点追踪)——来源开始自身导航时调用,实现导航互斥 |
openMenuFor | 打开地图并选中目标;targetId 依次匹配第三方插件注册路径点 → 路径点 → 标记点,未命中时按世界 ID 兜底打开 |
MapExternalTargetSpec 为 record:targetId / source / worldId / title / description / x / y / z / iconId / navigated / sortOrder / useMapNavigation(保留省略 useMapNavigation 的兼容构造,另有省略 iconId/navigated/sortOrder/useMapNavigation 的便捷构造)。useMapNavigation=true 时"导航"点击由地图内置导航栈执行,不回调来源 handler。
MapNavigationHandler 回调接口:
MapNavigationDelegate 全局委托接口(@Stable):
MapNavigationRequest 为 record:targetType("anchor"/"waypoint"/"external")/ targetId / worldId / title / x / y / z / source(地图自有目标固定 "map",第三方插件注册路径点为其注册 source)。标记点(pin)无 Y 坐标、不可导航,不经此接口。
委托契约:导航执行(信标/路径/追踪)完全由委托方负责,地图不建客户端路标;委托接管后地图记录一条委托导航态,面板"导航"按钮切换为"取消";委托接管第三方插件注册路径点时应另调
setExternalNavigated驱动该目标行按钮切换。
监测事件(EventBus 主题,可经 EventBusCapability 订阅):
| 主题 | 触发时机 |
|---|---|
axs.map.nav_started | 玩家开始地图导航(payload 含 type/id/world)——来源应停止自身导航实现互斥 |
axs.map.nav_cleared | 玩家停止地图导航 |
axs.map.external_navigate | 面板点击第三方插件注册路径点"导航"(转发回调的同时发布,供监测/兜底) |
axs.map.external_nav_cancel | 面板点击第三方插件注册路径点"取消" |
QuestGpsNavigable
任务导航能力(公开 capability)。由 QuestGPS 模块实现,外部插件经 AxsCapabilities.get(QuestGpsNavigable.class) 获取。
TabRefreshable
Tab 列表刷新能力(公开 capability)。由 Tab 模块实现。
MenuOpenable
通用菜单打开能力(公开 capability)。由 Menu 模块实现。
AfkRewardDispatchable
挂机状态查询与控制能力(公开 capability)。由 AfkReward 模块实现。
WarehouseAutoDepositable
仓库自动入库能力(公开 capability)。由 Warehouse 模块实现。
PickupNotifiable
拾取通知能力(公开 capability)。由 Pickup 模块(通知模式)实现;scanner 模式下不注册,get() 返回 null。
notifyPickup 用于"物品已被其他模块接管、但玩家确实拾取了"的补发场景(如 Warehouse 自动入库取消 EntityPickupItemEvent)。前置校验通过后会同步发布 EventBus 主题 axs.pickup.item_pickup(payload 含 material/amount),与原版监听器路径语义一致——每次补发即一次拾取。请在 Bukkit 主线程调用。
PickupInterceptor
拾取拦截能力(公开 capability)。由 Pickup 模块(扫描模式)实现;notification 模式下不注册,get() 返回 null。
扫描模式接管掉落物拾取流程后,其他自动拾取类模块/插件(如 Warehouse 自动入库、磁铁插件)应在处理 EntityPickupItemEvent 前调用本接口判断是否让步。
ExtraBackpackAccess
扩展背包操作能力(公开 capability)。由 ExtraBackpack 模块实现。
AxsMarketService
市场公开服务接口(公开 capability)。由 Market 模块实现,覆盖拍卖行 / 系统商店 / 回收 / 玩家商店的 UI 打开与常用操作。所有方法请在 Bukkit 主线程调用。
写操作返回 CompletableFuture<Boolean>:操作在调用线程同步完成(涉及背包与落库,须主线程调用),返回的 Future 已完成,false 表示校验失败(价格/货币/黑名单/数量上限等,失败原因已通过消息发给玩家)。createAuctionListing 有防复制约束:item 必须与玩家主手物品匹配,上架从主手扣除,不支持上架玩家未持有的物品。
市场事件订阅 EventBus 主题 axs.market.*(listing_created / auction_purchased / shop_dynamic_triggered),详见 EventBus 已注册主题。
BattlePassAccess
战令公开能力(公开 capability)。由 BattlePass 模块实现。所有方法请在 Bukkit 主线程调用。
FishingAccess
钓鱼公开能力(公开 capability)。由 Fishing 模块实现。所有方法请在 Bukkit 主线程调用。
钓鱼事件订阅 axs.fishing.*(success / perfect / collection_unlock / treasure / level_up)。
RegionQueryable
区域查询能力(公开 capability)。由 Regions 模块实现。返回 API 侧只读 RegionInfo record(owners/members 为不可变集合拷贝),不暴露模块内部 Region 类型。请在 Bukkit 主线程调用——Region 内部成员集合非并发容器,快照拷贝遇异步并发修改可能抛出 ConcurrentModificationException。
区域变更订阅 axs.regions.region_change。
BossTrackerQueryable
Boss 追踪查询能力(公开 capability)。由 EntityTracker 模块实现。
Boss 击杀订阅 axs.entitytracker.boss_kill。
LotteryAccess
抽奖公开能力(公开 capability)。由 Lottery 模块实现。所有方法请在 Bukkit 主线程调用。
CaseDrawResult 屏蔽内部 PoolItem 类型:itemKey/itemName 无奖品时为 null,poolIndex 为 1 基索引(无奖品 -1)。
LoginViewQueryable
登录界面查询能力(公开 capability)。由 LoginView 模块实现。isAuthenticated/isRegistered 可从任意线程调用——注意冷路径(内存未命中/自建认证模式)会同步执行一次数据库查询,高频路径请缓存结果或异步调用;openFor 涉及 UI 打开,须在 Bukkit 主线程调用。
登录成功订阅 axs.loginview.login_success。
PropAccessible
快捷道具公开能力(公开 capability)。由 Prop 模块实现。所有方法请在 Bukkit 主线程调用。
道具使用事件订阅 axs.prop.prop_used。
AnnouncerBroadcastable
公告广播能力(公开 capability)。由 Announcer 模块实现,文本支持 PlaceholderAPI 变量。
forward=true 时经跨服通道转发到其他子服(需 cross-server.enabled)。
RgbRenderable
渐变文本渲染能力(公开 capability)。由 RGB 模块实现。
player 参数用于解析条目 text 中的 PlaceholderAPI 占位符。
OnlineRewardsQueryable
在线奖励查询与操作能力(公开 capability,接口位于 xuanmo.arcartxsuite.api.capability)。由 OnlineRewards 模块实现。
全服目标达成订阅 axs.onlinerewards.server_goal_reached。
EventBusCapability
模块间解耦事件总线(pub/sub 模式)。由宿主注册唯一实例,任何模块可发布/订阅主题。
其他 Capability 接口
| 接口 | 提供模块 | 公开 | 用途 |
|---|---|---|---|
EssentialsQueryable | essentials | ✅ | AFK/隐身/禁言/昵称查询 |
QQBotBroadcastable | qqbot | ✅ | 推送消息到 QQ 群 |
QQBotNotifiable | qqbot | ✅ | 监听群消息/进退群 |
QqBindCapable | qqbot | ✅ | QQ 绑定查询 |
InteractionState | conversation | ✅ | 对话中让出共享按键 |
TooltipDataCapable | tooltip | ✅ | 物品提示数据 |
PlayerDataPurgeable | 多模块 | — | 清除玩家数据(/axs purge) |
DatabaseMigratable | 多模块 | — | 跨库迁移(/axs migrate) |
PolygonSelectionCapability | 宿主/regions | — | 多边形选区管理 |
ModuleAdminCapability | 宿主 | — | 模块管理能力(@Internal) |
内置 Capability 能力图
| Capability 接口 | 提供模块 | 公开 | 典型使用方 | 用途 |
|---|---|---|---|---|
TitleGrantable | title | ✅ | eventpacket, battlepass, 外部插件 | 发放称号 |
TitleConfigQueryable | title | ✅ | tab, chat, 外部插件 | 查询称号元数据 |
AxsMailService | ✅ | 外部插件 | 邮件发送/查询/领取/删除 | |
MailDispatchable | — | eventpacket, onlinerewards | 发送邮件(内部) | |
SubtitlePlayable | announcer | ✅ | eventpacket, 外部插件 | 播放字幕组 |
AnnouncerBroadcastable | announcer | ✅ | 外部插件 | 即时/排队公告广播 |
ChatCardSendable | chat | ✅ | eventpacket, 外部插件 | 发送聊天卡片 |
ChatMutable | chat | ✅ | essentials, 外部插件 | 禁言/解禁 |
QuestGpsNavigable | questgps | ✅ | eventpacket, 外部插件 | 任务导航 |
MapNavigable | map | ✅ | questgps, 外部插件 | 地图外部导航点 |
TabRefreshable | tab | ✅ | title, chat, 外部插件 | 刷新 Tab 列表 |
CombatEffectTriggerable | combateffect | ✅ | eventpacket, prop, 外部插件 | 触发战斗特效 |
SignalDispatchable | eventpacket | ✅ | onlinerewards, afkreward, 外部插件 | 触发规则引擎信号 |
EventBusCapability | 宿主 | ✅ | market, qqbot, 第三方/外部插件 | 主题 pub/sub |
AxsMarketService | market | ✅ | 外部插件 | 市场 UI/挂单/搜索 |
BattlePassAccess | battlepass | ✅ | 外部插件 | 战令经验/等级/档位/任务进度 |
FishingAccess | fishing | ✅ | 外部插件 | 钓鱼状态/小游戏/经验/疲劳 |
RegionQueryable | regions | ✅ | 外部插件 | 区域信息查询 |
BossTrackerQueryable | entitytracker | ✅ | 外部插件 | 活跃 Boss 会话查询 |
LotteryAccess | lottery | ✅ | 外部插件 | 抽奖积分/兑换/开箱 |
LoginViewQueryable | loginview | ✅ | 外部插件 | 认证状态查询/打开登录界面 |
PropAccessible | prop | ✅ | 外部插件 | 道具列表/应用到主手 |
RgbRenderable | rgb | ✅ | 外部插件 | 渐变文本渲染 |
OnlineRewardsQueryable | onlinerewards | ✅ | 外部插件 | 签到/在线时长查询 |
WarehouseAutoDepositable | warehouse | ✅ | pickup, 外部插件 | 仓库自动存入 |
ExtraBackpackAccess | extrabackpack | ✅ | 外部插件 | 扩展背包访问 |
PickupNotifiable / PickupInterceptor | pickup | ✅ | warehouse, 外部插件 | 拾取通知/拦截(分模式注册) |
QQBotNotifiable / QQBotBroadcastable / QqBindCapable | qqbot | ✅ | 外部插件 | QQ 推送/群事件/绑定查询 |
EssentialsQueryable | essentials | ✅ | 外部插件 | 基础工具查询 |
AfkRewardDispatchable | afkreward | ✅ | 外部插件 | 挂机状态/原地挂机 |
InteractionState | conversation | ✅ | 外部插件 | 交互状态 |
MenuOpenable | menu | ✅ | 外部插件 | 打开菜单 |
SecondaryPasswordAccess | 宿主 | ✅ | 外部插件 | 二级密码访问 |
PlayerDataPurgeable | 多模块 | — | 宿主 /axs purge | 清除玩家数据 |
DatabaseMigratable | 多模块 | — | 宿主 /axs migrate | 跨库迁移 |
PolygonSelectionCapability | 宿主/regions | — | fishing 等 | 多边形选区管理 |
ModuleAdminCapability | 宿主 | — | 调试工具 | 模块管理(@Internal) |
"公开" = 标注
@PublicCapability,外部 Bukkit 插件可通过AxsCapabilities.get()获取;其余仅限 AXS 模块内部getCapability使用。