QuickShop 自定义事件(开发者指南)
QuickShop-Hikari 提供了一个全面的自定义事件系统,让开发者能够将商店生命周期的几乎每个阶段绑定到交易和管理。
在 6.2.0.11 后,事件系统已经:
- 全面重构
- 分阶段(PRE/MAIN/POST)
- 更加一致
- 更可扩展
- 更好地与 ShopType 和税收系统集成
此页面记录了开发者可用的支持的自定义事件。
此页最后更新版本为 6.2.0.11。
事件结构概述
所有 QuickShop 事件都会继承:AbstractQSEvent
所有事件都有阶段,且其生命周期可预测:
- PRE(可取消)
- MAIN(核心逻辑执行)
- POST(执行后)
可取消的事件允许你安全阻止操作。
商店生命周期事件
这些事件涉及商店的创建、删除和状态更改。
ShopCreateEvent
创建商店时触发。
- 可取消
- 在商店完全注册前触发
- 可修改初始商店属性
常见用法:
- 限制创建条件
- 修改默认值
- 强制执行区域规则
ShopDeleteEvent
删除商店时触发。
- 移除前触发
- 可以用于日志记录或清理
常见用法:
- 外部数据库同步
- 自定义日志
- 奖励退还
ShopDatabaseEvent
商店保存、更新或持久化时触发。
常见用法:
- 同步外部存储
- 监视数据库更新
- 统计数据
商店修改事件
商店属性被更改时触发。
ShopPriceEvent
商店价格改变时触发。
- 可取消(PRE 阶段)
- 提供新旧价格
常见用法:
- 强制执行价格上限
- 应用动态定价规则
- 联动经济平衡插件
ShopNameEvent
商店名称改变时触发。
常见用法:
- 屏蔽违规名称
- 使用格式规则
ShopOwnerEvent
商店转让时触发。
常见用法:
- 限制转让
- 同步权限
- 审核日志
ShopUnlimitedEvent
商店切换无限模式时触发。
常见用法:
- 限制管理员不受限制
- 强制自定义库存规则
商店类型事件
旧版的 ShopType 常量已经被更灵活的系统替代。
ShopTypeEnhancedEvent
商店类型改变时触发。
支持:
- SELLING
- BUYING
- FROZEN
- 自定义商店类型(通过 IShopType 设置)
常见用法:
- 限制特定的商店类型
- 冻结/解冻相关操作
- 更新外部地图或界面
交易事件
交易时触发。
ShopPreTransactionEvent
处理交易前触发。
- 可取消
- 可验证
常见用法:
- 阻止满足条件的交易
- 应用自定义检查
ShopTransactionEvent
交易进行时触发。
提供:
- 买家
- 卖家
- 价格
- 物品
- 数量
常见用法:
- 记录
- 统计
- 外部经济同步
ShopEnhancedTaxEvent
计算税收时触发。
替换旧版税收事件。
提供:
- 获取 TaxRates
- 允许修改卖家税收
- 允许修改买家税收
- 交易构造器参考
常见用法:
- VIP 减税
- 动态税
- 基于区域的税率倍率
限制事件
UserLimitCalculationEvent
计算玩家拥有商店上限时触发。
允许:
- 修改商店限制
- 增加额外限度
- 应用等级比例
常见用法:
- 基于等级的奖励
- 基于权限的商店限制
- 基于活动的商店上限增加
交互事件
与玩家交互行为相关的事件。
InteractionPreEvent
交互行为执行前触发。
- 可取消
- 提供 InteractionType
- 提供 InteractionBehavior
常见用法:
- 限制特定的点击类型
- 重写交互逻辑
InteractionPostEvent
交互执行后触发。
常见用法:
- 统计
- 记录
- 刷新自定义界面
显示和视觉事件
ShopDisplayUpdateEvent
展示物品更新时触发。
常见用法:
- 替换显示逻辑
- 同步外部地图标记
- 自定义显示渲染
排版和格式事件
ShopLayoutResolveEvent
解析告示牌排版时触发。
常见用法:
- 注入自定义变量
- 修改告示牌文本行
- 分玩家显示格式
基于阶段的事件
许多事件继承了阶段事件的基础类。
例如:
- PRE
- MAIN
- POST
监听事件时:
- 若需取消或修改,请使用 PRE
- 若需要记录或执行其他代码,请使用 POST
示例:
@EventHandler
public void onPriceChange(ShopPriceEvent event) {
if (event.getNewPrice() < 0) {
event.setCancelled(true);
}
}
事件注册示例
@EventHandler
public void onTransaction(ShopTransactionEvent event) {
Player buyer = event.getBuyer();
double price = event.getPrice();
buyer.sendMessage("你支付了 " + price);
}
确保你的类注册为 Bukkit 监听器。
已弃用事件(6.2.0.11)
如下旧版事件已被替换:
- ShopTypeEvent → 替换为 ShopTypeEnhancedEvent
- ShopTaxEvent → 替换为 ShopEnhancedTaxEvent
- ShopUpdateEvent → 替换为 ShopDatabaseEvent
不要在新版本开发中使用这些已弃用事件。
最佳做法
- 尽可能检查事件阶段。
- 避免 PRE 阶段大量操作。
- 不要用读写阻塞主线程。
- 尊重取消状态。
- 优先使用增强事件而非旧版事件。
总结
QuickShop-Hikari 对如下情况提供了事件:
- 商店生命周期
- 价格更新
- 商店转让
- 商店类型更改
- 交易
- 税收计算
- 用户限制
- 交互处理
- 排版解析
- 显示更新
6.2.0.11 事件系统的设计是为了:
- 扩展性
- 稳定性
- 性能
- 现代 API 结构
进阶集成建议使用 6.2.x 引入的增强事件变体。