事件系统
Baikiruto 使用自定义的 ItemEventBus 事件总线,而非 Bukkit 原生事件系统。同时提供少量 Bukkit 代理事件。
ItemEventBus
| 方法 | 返回值 | 说明 |
|---|---|---|
post(event: Any) | Unit | 发布事件 |
subscribe(type: Class<T>, handler: (T) -> Unit) | Unit | 订阅事件 |
val api = Baikiruto.api()
val bus = api.getItemEventBus()
// 订阅物品构建事件
bus.subscribe(ItemBuildPostEvent::class.java) { event ->
println("物品构建完成: ${event.itemId}")
}
// 发布自定义事件
bus.post(MyCustomEvent())
生命周期事件
物品从构建到销毁的完整生命周期:
| 事件 | 说明 |
|---|---|
ItemBuildPreEvent | 物品构建前触发,可修改构建参数 |
ItemBuildPostEvent | 物品构建完成后触发 |
ItemReleaseEvent | 物品释放(从配置加载)时触发 |
ItemReleaseFinalEvent | 物品最终释放完成后触发 |
ItemGiveEvent | 物品给予玩家时触发 |
ItemUpdateEvent | 物品数据更新时触发 |
ItemCheckUpdateEvent | 检查物品是否需要更新时触发 |
ItemSelectDisplayEvent | 选择物品显示方案时触发 |
val bus = api.getItemEventBus()
// 在物品构建前修改参数
bus.subscribe(ItemBuildPreEvent::class.java) { event ->
// 可以修改构建上下文
println("即将构建物品: ${event.itemId}")
}
// 物品构建完成后处理
bus.subscribe(ItemBuildPostEvent::class.java) { event ->
val itemStack = event.itemStack
println("物品已构建: ${event.itemId}")
}
// 物品给予玩家时
bus.subscribe(ItemGiveEvent::class.java) { event ->
println("${event.player.name} 获得了物品 ${event.itemId}")
}
// 物品更新
bus.subscribe(ItemUpdateEvent::class.java) { event ->
println("物品 ${event.itemId} 已更新")
}
动作触发事件
玩家与 Baikiruto 物品交互时触发的事件:
| 事件 | 说明 |
|---|---|
ItemInteractActionEvent | 物品交互(通用) |
ItemLeftClickActionEvent | 左键点击 |
ItemRightClickActionEvent | 右键点击 |
ItemUseActionEvent | 使用物品 |
ItemAttackActionEvent | 攻击实体 |
ItemDamageActionEvent | 物品受损 |
ItemBlockBreakActionEvent | 使用物品破坏方块 |
ItemConsumeActionEvent | 消耗物品(食物/药水) |
ItemPickupActionEvent | 拾取物品 |
ItemDropActionEvent | 丢弃物品 |
ItemSwapToMainhandActionEvent | 切换到主手 |
ItemSwapToOffhandActionEvent | 切换到副手 |
ItemInventoryClickTriggerEvent | 在背包中点击物品 |
ItemSelectActionEvent | 选中物品(切换快捷栏) |
val bus = api.getItemEventBus()
// 监听右键点击
bus.subscribe(ItemRightClickActionEvent::class.java) { event ->
val player = event.player
val itemId = event.itemId
player.sendMessage("你右键点击了 $itemId")
}
// 监听攻击
bus.subscribe(ItemAttackActionEvent::class.java) { event ->
println("${event.player.name} 使用 ${event.itemId} 攻击了实体")
}
// 监听物品拾取
bus.subscribe(ItemPickupActionEvent::class.java) { event ->
println("${event.player.name} 拾取了 ${event.itemId}")
}
Bukkit 代理事件
以下事件通过 Bukkit 原生事件系统分发,使用 @EventHandler 监听:
| 事件 | 说明 |
|---|---|
PluginReloadEvent.Item | 物品配置重载完成 |
PluginReloadEvent.Display | 显示配置重载完成 |
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
class BaikirutoListener : Listener {
@EventHandler
fun onItemReload(event: PluginReloadEvent.Item) {
println("Baikiruto 物品配置已重载")
// 刷新依赖 Baikiruto 物品的缓存
}
@EventHandler
fun onDisplayReload(event: PluginReloadEvent.Display) {
println("Baikiruto 显示配置已重载")
}
}
备注
生命周期事件和动作触发事件通过 ItemEventBus 订阅,Bukkit 代理事件通过标准的 @EventHandler 监听。两者不要混淆。