简体中文
事件 API
EmakiAccessory 在 emaki.jiuwu.craft.accessory.api.event 包发布一个 Bukkit 事件, 完整契约如下
AccessorySetBonusChangeEvent
java
public final class AccessorySetBonusChangeEvent extends Event不可取消. 事件触发时套装加成已经折算进属性与技能贡献, 监听器仅接收通知, 取消操作不改变结果
| 成员 | 类型 | 说明 |
|---|---|---|
getPlayer() | Player | 套装状态发生变化的玩家 |
getSetId() | String | 饰品套装 id |
getOldPieceCount() | int | 变化前的已装备件数 |
getNewPieceCount() | int | 变化后的已装备件数 |
getTotalPieces() | int | 该套装声明的成员总数; 该套装定义已不存在 (例如刚被从配置里删除) 时为 0 |
getActiveThresholds() | List<Integer> | 当前生效的各档所需件数; 套装定义已不存在时为空列表 |
getActiveThresholds() 返回不可变列表. 由于阈值是累加的, 戴够 3 件时该列表同时包含 2 和 3
边沿触发
饰品贡献快照在每次 GUI 变更, 数据加载和 reload 后都会重算, 但本事件只在某个套装的已装备件数发生变化时派发; 件数不变的重算不产生事件
件数比较的基线在 reload 时会被清空 (reconfigure 重置内部计数表), 因此 reload 后的第一次上报对件数大于 0 的套装报的是 0 → n 的上升
线程
在该玩家的实体 owner 线程触发
孤儿槽的影响
孤儿饰品永不计入件数, 所以从 parts.yml 里移除一个部位会让这里报告的件数变低
注意修改 parts.yml 必须走 /eacc reload, 而 reload 会清空件数比较的基线: 随后第一次上报看到的是从 0 开始的件数, 因此事件表现为 0 → n 的上升, 而不是当初那次下降. 想在不 reload 的前提下看到件数下跌, 只有切换生效页或编辑生效页饰品这类会话内变化
多页的影响
件数只统计生效页. 切换生效页会让两边的件数同时变化, 每个件数变化的套装各派发一次事件; 玩家失去生效页权限时该页贡献按 0 计算, 同样触发件数下降
事件本身不带页信息. 需要知道是哪一页时, 用 EmakiAccessoryApi.catalog().enabledPage(playerId) 查询
与 EmakiItem 装备套装的关系
饰品套装只统计饰品槽内的物品, 永不与 EmakiItem 的装备套装混算. 同一件物品同时属于两边套装时, 两边各自独立计数, 各自触发自己的事件
示例
java
@EventHandler
public void onSetChange(AccessorySetBonusChangeEvent event) {
if (event.getNewPieceCount() == event.getTotalPieces()) {
event.getPlayer().sendMessage("饰品套装已集齐:" + event.getSetId());
}
}