Pipeline 管道
Pipeline 是事件分发器的执行管道,每个事件触发后都会经过一条完整的管道流程。同一事件可以注册多条 Pipeline,按优先级从高到低依次执行。
生命周期阶段
Pipeline 包含 5 个顺序执行的阶段:
| 阶段 | 说明 |
|---|---|
initPrincipal | 初始化事件主体,确定事件的关联对象(玩家、实体或方块) |
initVariables | 初始化上下文变量,将预注入变量和事件数据写入上下文 |
filter | 过滤阶段,判断是否满足执行条件,不满足则跳过后续阶段 |
afterFilter | 过滤通过后的后处理,可用于修改上下文或执行前置逻辑 |
postprocess | 最终后处理,主路由执行完成后的收尾工作 |
执行流程:
initPrincipal → initVariables → filter → afterFilter → postprocess
如果 filter 阶段未通过,后续的 afterFilter 和 postprocess 将被跳过。
PipelineContext
每条 Pipeline 执行时都会创建一个 PipelineContext,包含以下信息:
| 属性 | 说明 |
|---|---|
event | 触发的 Bukkit 事件实例 |
principal | 事件主体(玩家、实体或方块) |
variables | 上下文变量集合 |
| 取消状态 | 是否已被取消 |
| 过滤状态 | 是否通过了 filter 阶段 |
Principal ID 格式
事件主体通过统一的 ID 格式标识:
| 主体类型 | ID 格式 | 示例 |
|---|---|---|
| 玩家 | PLAYER@<uuid> | PLAYER@a1b2c3d4-... |
| 实体 | ENTITY@<uuid> | ENTITY@e5f6a7b8-... |
| 方块 | BLOCK@<world>,<x>,<y>,<z> | BLOCK@world,100,64,-200 |
StateProbe 状态探针
Bukkit 并不会为所有状态变化触发事件。例如,玩家更换盔甲栏位的装备时没有原生事件。StateProbe 通过定期轮询来检测这类状态变化,并生成虚拟事件。
工作原理
- StateProbe 在每个 tick 或指定间隔轮询目标状态
- 当检测到状态发生变化时,
StateProbe.poll()返回对应的虚拟事件 - 虚拟事件被注入到事件分发系统中,和普通 Bukkit 事件一样被分发器处理
内建虚拟事件
| 虚拟事件 | 说明 |
|---|---|
PlayerArmorChangeEvent | 玩家盔甲栏位装备发生变化 |
你可以像监听普通事件一样,在分发器定义中使用 listen-event 监听这些虚拟事件:
resource-version: 1
id: player.armor.change
listen-event: PlayerArmorChangeEvent
execute: dispatcher.armor-change