事件系统

Zephyrion 自定义事件列表、属性说明与监听示例

事件系统

Zephyrion 提供了一系列自定义事件,允许其他插件监听和响应保险库操作。所有事件都继承自 TabooLib 的 BukkitProxyEvent

导入

import com.faithl.zephyrion.api.events.*
import taboolib.common.platform.event.SubscribeEvent

事件列表

事件类说明可取消
VaultOpenEvent保险库打开时触发
VaultCloseEvent保险库关闭时触发
VaultAddItemEvent物品添加到保险库时触发
VaultRemoveItemEvent物品从保险库移除时触发
VaultSearchOpenEvent搜索模式打开时触发
VaultSearchCloseEvent搜索模式关闭时触发

VaultOpenEvent

当玩家打开保险库时触发。

属性

属性类型说明
vaultVault被打开的保险库
pageInt当前页码
inventoryInventory保险库的 Inventory 对象
openerPlayer打开保险库的玩家

示例

@SubscribeEvent
fun onVaultOpen(event: VaultOpenEvent) {
    val player = event.opener
    val vault = event.vault
    val workspace = vault.workspace
    
    player.sendMessage("你打开了 ${workspace.name} 的 ${vault.name}")
    player.sendMessage("当前页码: ${event.page}")
}

VaultCloseEvent

当玩家关闭保险库时触发。

属性

属性类型说明
vaultVault被关闭的保险库
pageInt关闭时的页码
inventoryInventory保险库的 Inventory 对象
closerPlayer关闭保险库的玩家

示例

@SubscribeEvent
fun onVaultClose(event: VaultCloseEvent) {
    val player = event.closer
    player.sendMessage("你关闭了保险库 ${event.vault.name}")
}

VaultAddItemEvent

当物品被添加到保险库时触发。

属性

属性类型说明
vaultVault目标保险库
indexInt物品在保险库中的索引位置
pageInt计算属性:物品所在的页码 (1-based)
slotInt计算属性:物品在页面中的槽位 (0-based)
itemStackItemStack被添加的物品
operatorPlayer?操作者(可能为空)

示例

@SubscribeEvent
fun onItemAdd(event: VaultAddItemEvent) {
    val item = event.itemStack
    val vault = event.vault
    
    // 记录物品存储日志
    println("[Zephyrion] ${event.operator?.name ?: "系统"} 将 ${item.type} x${item.amount} 存入 ${vault.name}")
    
    // 统计存储的物品
    if (item.type == Material.DIAMOND) {
        // 处理钻石存储
    }
}

用途示例

物品存储统计:

@SubscribeEvent
fun onItemAdd(event: VaultAddItemEvent) {
    val player = event.operator ?: return
    val item = event.itemStack
    
    // 记录到数据库或日志
    logStorage(player.uniqueId, event.vault.id, item.type, item.amount)
}

VaultRemoveItemEvent

当物品从保险库被移除时触发。

属性

属性类型说明
vaultVault目标保险库
indexInt物品在保险库中的索引位置
pageInt计算属性:物品所在的页码 (1-based)
slotInt计算属性:物品在页面中的槽位 (0-based)
operatorPlayer?操作者(可能为空)

示例

@SubscribeEvent
fun onItemRemove(event: VaultRemoveItemEvent) {
    val player = event.operator
    println("[Zephyrion] ${player?.name ?: "系统"} 从 ${event.vault.name} 取出了物品")
}

VaultSearchOpenEvent

当玩家打开保险库搜索模式时触发。

属性

属性类型说明
vaultVault搜索的保险库
paramsMap<String, String>搜索参数
inventoryInventory搜索结果 Inventory
openerPlayer执行搜索的玩家

示例

@SubscribeEvent
fun onSearchOpen(event: VaultSearchOpenEvent) {
    val player = event.opener
    val params = event.params
    
    player.sendMessage("搜索条件:")
    params.forEach { (key, value) ->
        player.sendMessage("  $key: $value")
    }
}

VaultSearchCloseEvent

当玩家关闭搜索模式时触发。

属性

属性类型说明
vaultVault搜索的保险库
paramsMap<String, String>搜索参数
inventoryInventory搜索结果 Inventory
closerPlayer关闭搜索的玩家

示例

@SubscribeEvent
fun onSearchClose(event: VaultSearchCloseEvent) {
    val player = event.closer
    player.sendMessage("搜索模式已关闭")
}

完整监听示例

import com.faithl.zephyrion.api.events.*
import org.bukkit.Material
import taboolib.common.platform.event.SubscribeEvent

object ZephyrionListener {

    @SubscribeEvent
    fun onVaultOpen(event: VaultOpenEvent) {
        // 记录打开日志
        val log = "[OPEN] ${event.opener.name} -> ${event.vault.workspace.name}/${event.vault.name}"
        println(log)
    }
    
    @SubscribeEvent
    fun onVaultClose(event: VaultCloseEvent) {
        // 记录关闭日志
        val log = "[CLOSE] ${event.closer.name} -> ${event.vault.name}"
        println(log)
    }
    
    @SubscribeEvent
    fun onItemAdd(event: VaultAddItemEvent) {
        val item = event.itemStack
        val operator = event.operator?.name ?: "SYSTEM"
        
        // 检测贵重物品存储
        if (item.type == Material.DIAMOND_BLOCK || item.type == Material.NETHERITE_INGOT) {
            println("[VALUABLE] $operator 存储了 ${item.type} x${item.amount}")
        }
    }
    
    @SubscribeEvent
    fun onItemRemove(event: VaultRemoveItemEvent) {
        val operator = event.operator?.name ?: "SYSTEM"
        println("[REMOVE] $operator 从 ${event.vault.name} 取出物品 (${event.page}:${event.slot})")
    }
    
    @SubscribeEvent
    fun onSearchOpen(event: VaultSearchOpenEvent) {
        val params = event.params.entries.joinToString(", ") { "${it.key}=${it.value}" }
        println("[SEARCH] ${event.opener.name} 搜索 ${event.vault.name}: $params")
    }
}

使用场景

1. 物品交易日志

@SubscribeEvent
fun onItemAdd(event: VaultAddItemEvent) {
    val player = event.operator ?: return
    saveTransactionLog(
        player = player.uniqueId,
        vault = event.vault.id,
        action = "DEPOSIT",
        item = event.itemStack.type.name,
        amount = event.itemStack.amount
    )
}

@SubscribeEvent
fun onItemRemove(event: VaultRemoveItemEvent) {
    val player = event.operator ?: return
    saveTransactionLog(
        player = player.uniqueId,
        vault = event.vault.id,
        action = "WITHDRAW",
        slot = event.slot
    )
}

2. 物品存储限制

// 注意:当前事件不可取消,此示例仅作参考
// 实际限制需要通过其他方式实现

@SubscribeEvent
fun onItemAdd(event: VaultAddItemEvent) {
    val item = event.itemStack
    
    // 检测禁止存储的物品
    if (isBannedItem(item)) {
        event.operator?.sendMessage("此物品不允许存储到保险库!")
        // 由于事件不可取消,需要在下一 tick 移除物品
        submitAsync {
            ZephyrionAPI.removeItem(event.vault, event.page, event.slot, event.operator)
        }
    }
}

3. 数据统计

@SubscribeEvent
fun onVaultOpen(event: VaultOpenEvent) {
    // 统计保险库访问次数
    incrementVaultAccess(event.vault.id)
    
    // 记录玩家活跃度
    updatePlayerActivity(event.opener.uniqueId)
}

注意事项

  1. 事件不可取消:所有 Zephyrion 事件的 allowCancelled 都是 false,无法取消事件
  2. 异步安全:事件可能在异步线程触发,访问 Bukkit API 时注意线程安全
  3. operator 可能为空:系统操作(如自动拾取)时 operator 可能为 null
  4. 性能考虑:避免在事件处理中进行耗时操作

On this page