跳到主要内容

事件系统

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 监听。两者不要混淆。