事件系统
Malkuth 提供 14 个 Bukkit 事件,覆盖商城操作的完整生命周期。标记 ✅ 的事件可取消(isCancelled)。
事件一览
| 事件 | 可取消 | 说明 |
|---|---|---|
PlayerOpenShopEvent | ✅ | 玩家打开商店前触发 |
PlayerCloseShopEvent | ❌ | 玩家关闭商店后触发 |
PlayerPurchaseEvent | ✅ | 玩家购买商品前触发 |
PlayerPurchasePostEvent | ❌ | 玩家购买商品后触发 |
PlayerRecycleEvent | ✅ | 玩家回收物品前触发 |
PlayerRecyclePostEvent | ❌ | 玩家回收物品后触发 |
PlayerSellEvent | ✅ | 玩家出售物品前触发 |
PlayerBuyFromPlayerEvent | ✅ | 玩家从其他玩家购买前触发 |
PlayerBuyFromPlayerPostEvent | ❌ | 玩家从其他玩家购买后触发 |
PlayerGiftEvent | ✅ | 玩家赠送物品前触发 |
PlayerGiftPostEvent | ❌ | 玩家赠送物品后触发 |
PlayerCartCheckoutEvent | ✅ | 玩家购物车结算前触发 |
PlayerAuctionBidEvent | ✅ | 玩家拍卖出价前触发 |
MalkuthReloadEvent | ❌ | Malkuth 重载完成后触发 |
事件详情
PlayerOpenShopEvent
玩家打开商店前触发,取消后商店不会打开。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 触发玩家 |
shopId | String | 商店 ID |
@EventHandler
fun onOpenShop(event: PlayerOpenShopEvent) {
if (event.shopId == "vip_shop" && !event.player.hasPermission("shop.vip")) {
event.isCancelled = true
event.player.sendMessage("你没有权限打开 VIP 商店")
}
}
PlayerCloseShopEvent
玩家关闭商店后触发,不可取消。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 触发玩家 |
shopId | String | 商店 ID |
PlayerPurchaseEvent
玩家购买商品前触发,取消后购买不会执行。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 购买玩家 |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
amount | Int | 购买数量 |
price | Double | 总价格 |
@EventHandler
fun onPurchase(event: PlayerPurchaseEvent) {
// 限制单次购买数量
if (event.amount > 64) {
event.isCancelled = true
event.player.sendMessage("单次购买不能超过 64 个")
}
}
PlayerPurchasePostEvent
购买完成后触发,用于记录日志或发放额外奖励。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 购买玩家 |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
amount | Int | 购买数量 |
price | Double | 总价格 |
@EventHandler
fun onPurchasePost(event: PlayerPurchasePostEvent) {
// 购买后发放积分
PointsPlugin.addPoints(event.player, (event.price * 0.1).toInt())
}
PlayerRecycleEvent
玩家回收物品前触发,取消后回收不会执行。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 回收玩家 |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
amount | Int | 回收数量 |
price | Double | 回收价格 |
PlayerRecyclePostEvent
回收完成后触发。属性同 PlayerRecycleEvent。
PlayerSellEvent
玩家出售物品前触发(玩家交易模式)。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 出售玩家 |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
price | Double | 出售价格 |
PlayerBuyFromPlayerEvent
玩家从其他玩家购买物品前触发。
| 属性 | 类型 | 说明 |
|---|---|---|
buyer | Player | 买家 |
seller | UUID | 卖家 UUID |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
price | Double | 价格 |
PlayerBuyFromPlayerPostEvent
玩家间交易完成后触发。属性同 PlayerBuyFromPlayerEvent。
PlayerGiftEvent
玩家赠送物品前触发。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 赠送者 |
target | UUID | 接收者 UUID |
shopId | String | 商店 ID |
goodsId | String | 商品 ID |
amount | Int | 赠送数量 |
PlayerGiftPostEvent
赠送完成后触发。属性同 PlayerGiftEvent。
PlayerCartCheckoutEvent
购物车结算前触发,取消后结算不会执行。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 结算玩家 |
shopId | String | 商店 ID |
items | List<CartItem> | 购物车内容 |
totalPrice | Double | 总价格 |
PlayerAuctionBidEvent
玩家在拍卖行出价前触发。
| 属性 | 类型 | 说明 |
|---|---|---|
player | Player | 出价玩家 |
auctionId | String | 拍卖 ID |
bidPrice | Double | 出价金额 |
MalkuthReloadEvent
Malkuth 重载完成后触发,用于在重载后刷新缓存。
@EventHandler
fun onReload(event: MalkuthReloadEvent) {
// 重载后刷新自定义缓存
myCache.invalidateAll()
}
监听示例
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
class MalkuthListener : Listener {
@EventHandler
fun onPurchase(event: PlayerPurchaseEvent) {
val player = event.player
val goods = event.goodsId
val price = event.price
// 自定义逻辑
}
@EventHandler
fun onPurchasePost(event: PlayerPurchasePostEvent) {
// 购买完成后的处理
}
}
备注
所有事件位于 kim.hhhhhy.malkuth.common.api.event 包下。可取消事件继承自 Cancellable,设置 isCancelled = true 即可阻止对应操作。