跳到主要内容

Pipeline 管道

Pipeline 是事件分发器的执行管道,每个事件触发后都会经过一条完整的管道流程。同一事件可以注册多条 Pipeline,按优先级从高到低依次执行。

生命周期阶段

Pipeline 包含 5 个顺序执行的阶段:

阶段说明
initPrincipal初始化事件主体,确定事件的关联对象(玩家、实体或方块)
initVariables初始化上下文变量,将预注入变量和事件数据写入上下文
filter过滤阶段,判断是否满足执行条件,不满足则跳过后续阶段
afterFilter过滤通过后的后处理,可用于修改上下文或执行前置逻辑
postprocess最终后处理,主路由执行完成后的收尾工作

执行流程:

initPrincipal → initVariables → filter → afterFilter → postprocess

如果 filter 阶段未通过,后续的 afterFilterpostprocess 将被跳过。

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 通过定期轮询来检测这类状态变化,并生成虚拟事件。

工作原理

  1. StateProbe 在每个 tick 或指定间隔轮询目标状态
  2. 当检测到状态发生变化时,StateProbe.poll() 返回对应的虚拟事件
  3. 虚拟事件被注入到事件分发系统中,和普通 Bukkit 事件一样被分发器处理

内建虚拟事件

虚拟事件说明
PlayerArmorChangeEvent玩家盔甲栏位装备发生变化

你可以像监听普通事件一样,在分发器定义中使用 listen-event 监听这些虚拟事件:

resource-version: 1
id: player.armor.change
listen-event: PlayerArmorChangeEvent
execute: dispatcher.armor-change