事件 API
EmakiAttribute 对外公开 Bukkit 事件,外部插件可以监听这些事件来拦截或改写关键流程。事件类由公开 API 模块 EmakiAttributeApi 提供,位于 emaki.jiuwu.craft.attribute.api 包,使用标准 HandlerList 样板。
| 事件 | 触发时机 | 可取消 | 可改写 |
|---|---|---|---|
EmakiAttributeDamageEvent | 属性伤害计算完成、应用到目标之前 | 是 | setFinalDamage |
PlayerResourceConsumeEvent | 自定义资源被消费之前 | 是 | setAmount |
EmakiAttributeDamageEvent 的完整说明见 伤害事件 API。本页说明资源消费事件。
PlayerResourceConsumeEvent
在自定义资源(如法力、怒气等由 EmakiAttribute 管理的资源)被实际扣除之前触发。可用于拦截消费、改写消费量,或基于资源状态做联动。
事件特性
- 可取消(
Cancellable):取消后消费调用返回false,资源不被扣除。 - 可改写消费量(
setAmount):事件结束后会按当前余额重新校验,若改写后的量超过余额则中止消费。 - 在主线程触发;异步路径会跳过事件。
方法列表
| 方法 | 返回值 | 说明 |
|---|---|---|
getPlayer() | Player | 被消费资源的玩家。 |
getResourceId() | String | 资源 id。 |
getCurrentValue() | double | 消费前的当前值。 |
getCurrentMax() | double | 当前上限。 |
getAmount() | double | 将被消费的量(除非改写或取消)。 |
setAmount(double) | void | 改写消费量;事件后按余额重新校验。 |
isCancelled() | boolean | 是否已取消。 |
setCancelled(boolean) | void | 取消或恢复事件。 |
监听示例
java
@EventHandler
public void onResourceConsume(PlayerResourceConsumeEvent event) {
// 法力消费减半
if (event.getResourceId().equals("mana")) {
event.setAmount(event.getAmount() * 0.5);
}
// 余额不足时直接拦截
if (event.getCurrentValue() < event.getAmount()) {
event.setCancelled(true);
}
}注意事项
- 改写后的消费量超过当前余额时,EmakiAttribute 会中止本次消费。
- 取消事件后,发起消费的调用返回
false,调用方应据此处理失败分支。 - 不要在监听器里做耗时操作;事件运行在主线程上。