# 拦截器 - interceptor

## 概念

在 AzureFlow 中，触发器（Trigger） 通常是绑定在特定物品上的，只有当玩家手持或使用该物品时，触发器才会生效。这种机制虽然高效，但在某些场景下不够灵活。

拦截器（Interceptor） 则是一种全局监听机制，不依赖特定物品。它是 AzureFlow 中最接近底层（Bukkit API）的一层，能够拦截和响应各种原始事件，无论玩家手中是否是 AF 的物品，甚至可以脱离 AzureFlow 的物品体系。&#x20;

拦截器适用于以下场景：

* 全局性操作：对所有物品生效的操作逻辑，例如全服右键某类物品触发某个事件。
* 非 AF 物品处理：即使不是 AzureFlow 生成的物品，也能监听并响应事件。
* 特殊事件监听：如基于 ItemMeta、lore 等细节字段做判断。
* 逻辑隔离：当你希望某些逻辑独立于物品逻辑进行处理时（例如 PvP 限制、区域交互检测等）。

## 触发器 vs 拦截器

| 特性     | 触发器（Trigger）      | 拦截器（Interceptor） |
| ------ | ----------------- | ---------------- |
| 绑定方式   | 绑定在 AzureFlow 物品上 | 全局生效，无需绑定物品      |
| 作用范围   | 仅限 AF 物品          | 所有物品，甚至非 AF 物品   |
| 使用场景   | 物品技能、行为绑定等        | 全局监听、扩展事件控制      |
| 接近底层程度 | 相对较高              | 非常接近 Bukkit API  |

## 如何使用

在插件目录下新建 `interceptors` 文件夹（如果尚未存在），然后在其中**创建任意名称的 `.yml` 文件**，例如：

```bash
plugins/
└── AzureFlow/
    └── interceptors/
        ├── globalClick.yml
        └── pvpLimit.yml
```

拦截器文件的命名**没有限制**，只要是 `.yml` 格式，插件启动时会自动加载其中的拦截器逻辑。

拦截器的语法结构与触发器类似。只需要写出事件名称、条件和动作即可。例如：

示例 1：检测所有物品右键带有特定 lore 的操作

```yaml
onRightClick:
  - require: 'checkLore("&6[神器] 传承之剑")'
  - message: "&a检测到神器，正在激活技能..."
  - cast: skill_godslash
```

示例 2：玩家攻击攻击时触发血量检测（无视手中物品）

<pre class="language-yaml"><code class="lang-yaml"><strong>onDamage:
</strong><strong>  - require: 'utils.isPlayer(victim)'
</strong><strong>  - check: ${ victim_health.health &#x3C; 10 }: {
</strong><strong>      tell: &#x26;c你对低血量玩家造成了攻击！;
</strong><strong>      cast: punish_warning
</strong><strong>    }s
</strong></code></pre>

示例 3：禁止玩家在特定区域丢弃任何物品

```yaml
onDrop:
  - require: inZone("spawn_zone")
  - cancel
  - tell: "&e该区域禁止丢弃物品！"
```

## 备注

* 拦截器执行顺序早于触发器，可用于拦截默认行为。
* 如果你需要对事件做更加细致的控制，拦截器是首选。
* 不要在拦截器中过度执行重逻辑任务，建议异步或延迟处理。
