Skip to content
iPlugin

物品匹配提供商

解析内容匹配物品

抽象类

/**
 * 物品匹配提供商
 */
abstract class ItemMatchProvider {

    /**
     * 物品匹配提供商的唯一标识符
     */
    abstract val namespace: String

    /**
     * 匹配物品
     *
     * @param item 接收物品
     * @param demand 物品格式
     *
     * @return 匹配数量
     */
    abstract fun match(item: ItemStack, demand: Demand): Int

    /**
     * 获取匹配到的物品
     *
     * @param items 物品列表
     * @param demand 物品格式
     *
     * @return 匹配到的物品,匹配不到则返回 null
     */
    abstract fun getItem(items: List<ItemStack>, demand: Demand): ItemStack?
}

注册提供商

// 创建一个物品匹配提供商实例
val provider = MyProvider()

// 注册物品匹配提供商
ItemMatchRegistry.registerProvider(provider)

示例

/**
 * Minecraft -material stone -amount 2 -cmd 1 -lore_key "hello world" -name ton
 */
class BukkitItemMatch() : ItemMatchProvider() {

    companion object {

        @Awake(LifeCycle.ENABLE)
        fun init() {
            // 确保 BukkitTest 插件已加载
            if (!PluginReader.hasPlugin("BukkitTest")) return
            // 注册 BukkitItemMatch 提供商
            ItemMatchRegistry.registerProvider(BukkitItemMatch())
        }

    }

    override val namespace: String
        get() = "minecraft"

    override fun match(item: ItemStack, demand: Demand): Int {

        // 匹配物品的材质
        demand.get("material")?.let {
            if (Material.valueOf(it.uppercase()) != item.type) return 0
        }

        // 匹配物品的名称
        demand.get("name")?.let {
            if (item.itemMeta?.displayName != it) return 0
        }

        // 匹配物品的命令模型数据
        demand.get("cmd")?.toInt()?.let {
            if (item.itemMeta?.customModelData != it) return 0
        }

        // 匹配物品的描述信息(Lore)
        demand.get("lore_key")?.let {
            if (item.itemMeta?.lore?.contains(it) == true) return 0
        }

        return item.amount
    }
}