联动
EventPacket 跨模块联动与 Capability
依赖关系
| 类型 | 依赖 | 作用 | 缺少时表现 |
|---|---|---|---|
| 必需 | ArcartXSuite 本体 | 核心 API、存储管理、Capability 注册、PacketBridge、脚本条件引擎 | 模块无法运行 |
| 可选 | PlaceholderAPI | PAPI 触发器(papi-increase/decrease/threshold)和 PAPI 条件 | 这部分触发器和条件不生效,启动时输出警告 |
| 可选 | Chemdah | Chemdah 任务事件触发器(quest-/objective-/chemdah-level-change) | 这部分触发器不生效,启动时输出警告 |
SignalDispatchable Capability
EventPacket 模块注册了 SignalDispatchable Capability,供其他模块跨模块调用发送命令信号。信号发送后,所有 trigger: command-signal 且 signal 匹配的规则将被触发。
接口方法
调用示例
信号发送后,规则中可通过 {boss_id}、{damage} 等上下文变量引用传入的变量。
消费的 Capability
EventPacket 模块在动作执行时通过 Capability Supplier 延迟获取其他模块的能力。缺失能力时对应动作直接跳过,不报错。
| Capability | 消费动作 | 提供模块 | 缺失时表现 |
|---|---|---|---|
QuestGpsNavigable | questgps.offer、questgps.accept、questgps.open、questgps.track | QuestGPS | 任务相关动作跳过 |
SubtitlePlayable | subtitle.play、announcer.play | Subtitle / Announcer | 字幕播放动作跳过 |
ChatCardSendable | chat.card | Chat | 聊天卡片动作跳过 |
TitleGrantable | title.give | Title | 称号发放动作跳过 |
MailDispatchable | mail.send | 邮件发送动作跳过 | |
QQBotBroadcastable | qq-broadcast | QQBot | QQ 广播动作跳过 |
PacketBridgeAPI | ui-packet、combateffect.play | 本体 PacketBridge | UI 包和战斗特效动作跳过 |
所有跨模块调用通过 Capability Supplier 完成,模块间无编译期依赖,缺失能力时优雅降级。
Chemdah 事件桥接
EventPacket 通过 ChemdahEventBridge 反射注册 Chemdah 事件监听器,将 Chemdah 任务事件桥接到事件包分发系统。桥接器在模块启动时检测 Chemdah 插件是否存在,存在且有 Chemdah 触发器规则时自动注册。
桥接的事件
| Chemdah 事件 | 触发器 | 注入变量 |
|---|---|---|
QuestEvents$Accept$Post | quest-accept | {quest_id} |
QuestEvents$Complete$Post | quest-complete | {quest_id} |
QuestEvents$Fail$Post | quest-fail | {quest_id} |
ObjectiveEvents$Complete$Post | objective-complete | {quest_id}、{task_id}、{objective_type}、{objective_name} |
ObjectiveEvents$Continue$Post | objective-continue | {quest_id}、{task_id}、{objective_type}、{objective_name} |
ObjectiveEvents$Restart$Post | objective-restart | {quest_id}、{task_id}、{objective_type}、{objective_name} |
PlayerEvents$LevelChange | chemdah-level-change | {level_option}、{old_level}、{new_level}、{old_experience}、{new_experience}、{level_delta} |
signal 过滤说明
| 触发器 | signal 过滤规则 |
|---|---|
quest-accept / quest-complete / quest-fail | signal 留空匹配所有任务;填任务 ID 仅匹配该任务 |
objective-complete / objective-continue / objective-restart | signal 可填 quest_id 或 objective_name 过滤 |
chemdah-level-change | signal 填等级选项 ID 过滤(如 adventure) |
Chemdah 事件类继承 TabooLib
BukkitProxyEvent,共享同一个HandlerList。桥接器通过运行时类型严格过滤(e.getClass() != eventClass),避免其他BukkitProxyEvent子类事件误触发。
脚本触发器
EventPacket 支持 JavaScript 和 Aria 两种脚本触发器,通过 PapiWatcherService 在轮询周期内评估脚本表达式。脚本返回 true 时触发规则(仅在从 false 变为 true 的上升沿触发)。
script-js
JavaScript 表达式中 player 变量直接注入 Bukkit Player 对象。
script-aria
Aria 表达式中 player 门面注入到 global. 命名空间,需用 global.player 访问。
脚本触发器使用 条件系统 的
ScriptConditionKind.JS和ScriptConditionKind.ARIA引擎评估。
数据库表
EventPacket 模块使用两张数据表存储击杀进度和规则触发状态。表名前缀由存储模式决定(共享模式无前缀,自建模式使用 axs_eventpacket_)。
eventpacket_kill_progress
记录玩家在击杀计数规则下的累计击杀数。
| 列名 | SQLite 类型 | MySQL 类型 | 说明 |
|---|---|---|---|
player_uuid | TEXT | VARCHAR(36) | 玩家 UUID |
rule_id | TEXT | VARCHAR(128) | 规则 ID |
kill_count | INTEGER | INT | 累计击杀数 |
updated_at | INTEGER | BIGINT | 更新时间戳(毫秒) |
主键:(player_uuid, rule_id)
eventpacket_fired_rules
记录玩家是否已触发过某条规则(用于非 repeatable 规则的一次性触发控制)。
| 列名 | SQLite 类型 | MySQL 类型 | 说明 |
|---|---|---|---|
player_uuid | TEXT | VARCHAR(36) | 玩家 UUID |
rule_id | TEXT | VARCHAR(128) | 规则 ID |
fired_at | INTEGER | BIGINT | 触发时间戳(毫秒) |
主键:(player_uuid, rule_id)
数据库迁移
EventPacket 模块注册了 DatabaseMigratable Capability,支持通过 /axs migrate 命令跨源数据库迁移。
迁移时将 eventpacket_kill_progress 和 eventpacket_fired_rules 两张表的数据从当前数据源迁移到目标数据源。
数据清理
EventPacket 模块注册了 PlayerDataPurgeable Capability,支持通过 /axs purge 命令统一清理玩家数据。
purgePlayerData— 清理指定玩家在eventpacket_kill_progress和eventpacket_fired_rules表中的所有记录purgeAllPlayerData— 清理所有玩家的数据