Skip to content

开发接口

提示

开发接口可在售后群下载,如果你是开发者,欢迎联系作者 15568820 进行交流或咨询

API

kotlin
package me.yeezhi.soulringx.api

import me.yeezhi.soulringx.core.entity.StoreItem
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.math.BigDecimal
import java.util.function.Function

/**
 * 物品存储管理接口
 */
interface IStoreItemAPI {
    /**
     * 获取物品(指定仓库)
     * @param name 玩家名
     * @param pageName 仓库页
     * @param itemStack 物品
     */
    fun get(name: String, pageName: String, itemStack: ItemStack): StoreItem?

    /**
     * 扣除物品(指定仓库)
     * @param name 玩家名
     * @param pageName 仓库页
     * @param itemStack 物品
     * @param amount 数量
     * @return 未成功扣除数量
     */
    fun take(name: String, pageName: String, itemStack: ItemStack, amount: Int): Int

    /**
     * 扣除物品(自动匹配仓库)
     * @param name 玩家名
     * @param itemStack 物品
     * @param amount 数量
     * @return 未成功扣除数量
     */
    fun take(name: String, itemStack: ItemStack, amount: Int): Int

    /**
     * 扣除物品(自动匹配仓库)
     * @param name 玩家名
     * @param amount 数量
     * @param matcher 匹配回调
     * @return 未成功扣除数量
     */
    fun take(name: String, amount: Int, matcher: Function<ItemStack, Boolean>): Int

    /**
     * 添加物品(指定仓库)
     * @param name 玩家名
     * @param pageName 仓库页
     * @param itemStack 物品
     * @param amount 数量
     * @return 当前数量
     */
    fun add(name: String, pageName: String, itemStack: ItemStack, amount: Int): Int

    /**
     * 添加物品(自动匹配仓库)
     * @param name 玩家名
     * @param itemStack 物品
     * @param amount 数量
     * @return 当前数量
     */
    fun add(name: String, itemStack: ItemStack, amount: Int): Int

    /**
     * 匹配物品
     * @param name 玩家名
     * @param pageName 仓库页
     * @param matcher 匹配回调
     */
    fun match(name: String, pageName: String, matcher: Function<ItemStack, Boolean>): StoreItem?


    /**
     * 统计物品数量
     * @param name 玩家名
     * @param matcher 匹配回调
     */
    fun count(name: String, matcher: Function<ItemStack, Boolean>): BigDecimal

    /**
     * 匹配物品列表
     * @param name 玩家名
     * @param pageName 仓库页
     * @param matcher 匹配回调
     */
    fun matchs(name: String, pageName: String, matcher: Function<ItemStack, Boolean>): List<StoreItem>

    /**
     * 匹配物品列表
     * @param name 玩家名
     * @param matcher 匹配回调
     */
    fun matchs(name: String, matcher: Function<ItemStack, Boolean>): List<StoreItem>


    /**
     * 批量存入物品
     * @param player 玩家
     * @param onlyExisting 是否仅存入仓库中已有的物品
     */
    fun storeItemsBulk(player: Player, onlyExisting: Boolean = true)
}
kotlin
package me.yeezhi.soulringx.api

import me.yeezhi.soulringx.core.entity.StoreItem
import me.yeezhi.soulringx.core.entity.UnlockRule
import me.yeezhi.soulringx.core.entity.filter.FilterData
import me.yeezhi.soulringx.core.enums.SoulPageType
import me.yeezhi.soulringx.core.util.ItemFinder
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.*
import java.util.function.Function

/**
 * 仓库页接口
 */

interface ISoulPageAPI {

    /**
     * 获取默认仓库名
     */
    fun getDefaultPageName(): String


    /**
     * 获取仓库解锁规则
     * @param player 玩家
     * @param pageName 仓库页
     */
    fun getUnlockRules(player: Player, pageName: String): UnlockRule

    /**
     * 获取仓库可以容量
     * @param name 玩家名
     * @param pageName 仓库页
     */
    fun getSoulPageSize(name: String, pageName: String): Int

    /**
     * 打开仓库页面
     * @param player 玩家
     * @param ownerName 仓库主人
     * @param pageName 仓库页
     * @param pageType 页面类型
     * @param itemFinders 额外筛选规则
     * @param async 异步构建
     */
    fun openSoulPage(
        player: Player,
        ownerName: String = player.name,
        pageName: String = getDefaultPageName(),
        pageType: SoulPageType = SoulPageType.NORMAL,
        itemFinders: List<ItemFinder> = ArrayList(),
        async: Boolean = true
    )

    /**
     * 打开分类页面
     * @param player 玩家
     * @param pageName 仓库页
     * @param closeBack 关闭页面返回仓库页面
     * @param itemFinders 额外筛选规则
     * @param async 异步构建
     */
    fun filterSoulPage(
        player: Player,
        pageName: String,
        closeBack: Boolean = false,
        itemFinders: List<ItemFinder> = ArrayList(),
        async: Boolean = true
    )

    /**
     * 打开仓库搜索页面
     * @param player 玩家
     * @param pageName 仓库页
     */
    fun searchSoulPage(player: Player, pageName: String)

    /**
     * 获取存储物品列表快照
     * 将按照玩家配置数据进行筛选,排序
     * @param name 玩家
     * @param pageName 仓库页
     * @param filter 是否筛选
     * @param itemFinders 筛选规则
     */
    fun getStoreItems(
        name: String, pageName: String, filter: Boolean = false, itemFinders: List<ItemFinder> = ArrayList()
    ): List<StoreItem>

    /**
     * 获取筛选数据
     * @param name 玩家名
     * @param pageName 仓库页
     */
    fun getFilters(name: String, pageName: String): LinkedList<FilterData>

    /**
     * 添加仓库已解锁槽位
     * @param name 玩家名
     * @param pageName 仓库
     * @param amount 槽位数量
     * @return 当前解锁数量
     */
    fun addUnlockedSlots(name: String, pageName: String, amount: Int): Int

    /**
     * 获取空闲槽位数量
     * @param name 玩家名
     * @param pageName 仓库页
     */
    fun getFreeSlot(name: String, pageName: String): Int

    /**
     * 仓库是否满
     * @param name 玩家名
     * @param pageName 仓库页
     */
    fun isFull(name: String, pageName: String): Boolean


    /**
     * 所有仓库是否满
     * @param name 玩家名
     */
    fun isFull(name: String): Boolean

    /**
     * 判断物品是否在仓库黑名单中,禁止存入
     * @param pageName 仓库页
     * @param itemStack 物品
     */
    fun isBlacklisted(pageName: String, itemStack: ItemStack): Boolean

    /**
     * 判断物品是否允许存入仓库(综合黑名单 + 容量等规则)
     * @param player 玩家
     * @param itemStack 物品
     */
    fun canStoreItem(player: Player, itemStack: ItemStack): Boolean


    /**
     * 合并仓库物品
     * @param player 玩家
     * @param pageName 合并至的仓库名
     * @param matcher 需合并物品匹配回调
     */
    fun mergeSoulPage(player: Player, pageName: String, matcher: Function<ItemStack, Boolean>)


}
kotlin
package me.yeezhi.soulringx.api

import me.yeezhi.soulringx.core.entity.PlayerData
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack


interface ISoulRingXAPI {

    /**
     * 获取玩家数据
     * @param player 玩家
     */
    fun getPlayerData(player: Player): PlayerData


    /**
     * 设置玩家数据
     * @param player 玩家
     * @param playerData 数据
     */
    fun setPlayerData(player: Player, playerData: PlayerData)


    /**
     * 是否为空间戒指
     * @param itemStack 物品
     */
    fun hasSoulRing(itemStack: ItemStack?): Boolean


    /**
     * 玩家背包查找空间戒指
     * @param player 玩家
     */
    fun findSoulRing(player: Player): ItemStack?

    /**
     * 获取空间戒指
     * @param player 玩家
     * @param pickup 拾取模式
     */
    fun getSoulRing(player: Player, pickup: Boolean): ItemStack
}
kotlin
package me.yeezhi.soulringx.api

import org.bukkit.entity.Player

/**
 * 拾取控制接口
 */
interface IPickupAPI {
    /**
     * 拾取模式总开关
     * @param player 玩家
     */
    fun hasPickup(player: Player): Boolean

    /**
     * 是否自动拾取地上掉落物
     * @param player 玩家
     */
    fun hasPickupDrop(player: Player): Boolean

    /**
     * 是否启用击杀掉落拾取
     * @param player 玩家
     */
    fun hasPickupKill(player: Player): Boolean


    /**
     * 是否启用击杀掉落拾取
     * @param player 玩家
     */
    fun hasPickupBreak(player: Player): Boolean

}
kotlin
package me.yeezhi.soulringx.api

import me.yeezhi.soulringx.core.entity.StoreItem
import org.bukkit.inventory.ItemStack

/**
 * 回收站
 */
interface IRecycleBinAPI {


    /**
     * 添加物品
     * @param name 玩家名
     * @param itemStack 物品
     * @param amount 数量
     * @return 当前数量
     */
    fun add(name: String, itemStack: ItemStack, amount: Int): Int


    /**
     * 扣除物品
     * @param name 玩家名
     * @param itemStack 物品
     * @param amount 数量
     * @return 当前数量
     */
    fun take(name: String, itemStack: ItemStack, amount: Int): Int


    /**
     * 获取物品
     * @param name 玩家名
     * @param itemStack 物品
     * @return 存储物品
     */
    fun get(name: String, itemStack: ItemStack): StoreItem?

    /**
     * 删除物品
     * @param name 玩家名
     * @param itemStack 物品
     */
    fun remove(name: String, itemStack: ItemStack)

    /**
     * 清空回收站
     * @param name 玩家名
     */
    fun clear(name: String)
}

Event

提示

由于 YeePlugins 在 onEnable 阶段执行云端加载,若需注册监听,请在插件加载完成后通过循环检测再进行注册

kotlin
package me.yeezhi.soulringx.api.event

import org.bukkit.event.Event
import org.bukkit.event.HandlerList
import org.bukkit.inventory.ItemStack
import java.math.BigDecimal

/**
 * 仓库物品操作事件 (抽象父类,不直接触发)
 */
abstract class StoreItemEvent : Event() {
    // 所有者
    abstract val owner: String

    // 仓库名
    abstract val pageName: String

    // 物品
    abstract val itemStack: ItemStack

    // 操作数量
    abstract val amount: BigDecimal

    // 操作前
    abstract val before: BigDecimal

    // 操作后
    abstract val after: BigDecimal
}

/**
 * 仓库增加物品事件
 */
class StoreItemAddEvent(
    // 所有者
    override val owner: String,
    // 仓库名
    override val pageName: String,
    // 物品
    override val itemStack: ItemStack,
    // 操作数量
    override val amount: BigDecimal,
    // 操作前
    override val before: BigDecimal,
    // 操作后
    override val after: BigDecimal
) : StoreItemEvent() {

    override fun getHandlers(): HandlerList = handlerList

    companion object {
        @JvmStatic
        val handlerList = HandlerList()
    }
}

/**
 * 仓库扣除物品事件
 */
class StoreItemTakeEvent(
    // 所有者
    override val owner: String,
    // 仓库名
    override val pageName: String,
    // 物品
    override val itemStack: ItemStack,
    // 操作数量
    override val amount: BigDecimal,
    // 操作前
    override val before: BigDecimal,
    // 操作后
    override val after: BigDecimal
) : StoreItemEvent() {

    override fun getHandlers(): HandlerList = handlerList

    companion object {
        @JvmStatic
        val handlerList = HandlerList()
    }
}
kotlin
package me.yeezhi.soulringx.core.listener

import me.yeezhi.soulringx.api.event.StoreItemAddEvent
import me.yeezhi.soulringx.api.event.StoreItemTakeEvent
import me.yeezhi.soulringx.core.util.debug
import me.yeezhi.yeecore.internal.util.StringUtil.replace
import taboolib.common.platform.event.SubscribeEvent
import taboolib.common.platform.function.info
import taboolib.module.nms.getName
import java.text.SimpleDateFormat

/**
 * 基于TabooLib的监听示例
 */

object StoreItemListener {

    val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")

    @SubscribeEvent
    fun onStoreItemAddEvent(event: StoreItemAddEvent) {
        if (!debug) {
            return
        }
        val map = mutableMapOf<String, String>(
            "{time}" to sdf.format(System.currentTimeMillis()),
            "{owner}" to event.owner,
            "{page}" to event.pageName,
            "{item}" to event.itemStack.getName(),
            "{amount}" to event.amount.toString(),
            "{before}" to event.before.toString(),
            "{after}" to event.after.toString(),
        )
        info(
            """
                
                [{time}] 物品新增
                玩家: {owner}({page})
                物品: {item}
                数量: {before} + {amount} → {after}
            """.trimIndent().replace(map)
        )
    }

    @SubscribeEvent
    fun onStoreItemTakeEvent(event: StoreItemTakeEvent) {
        if (!debug) {
            return
        }
        val map = mutableMapOf<String, String>(
            "{time}" to sdf.format(System.currentTimeMillis()),
            "{owner}" to event.owner,
            "{page}" to event.pageName,
            "{item}" to event.itemStack.getName(),
            "{amount}" to event.amount.toString(),
            "{before}" to event.before.toString(),
            "{after}" to event.after.toString(),
        )
        info(
            """
                
                [{time}] 物品扣除
                玩家: {owner}({page})
                物品: {item}
                数量: {before} + {amount} → {after}
            """.trimIndent().replace(map)
        )
    }

}