跳到主要内容

货币系统 API

Malkuth 支持自定义货币系统,允许第三方插件注册自己的货币类型并与商城集成。

方法一览

方法返回值说明
registerCurrency(id: String, currency: ShopSerializer.CustomCurrency)Unit注册自定义货币
getCurrencyBalance(player: Player, shopId: String)Double获取玩家在指定商店使用的货币余额
hasCurrency(player: Player, shopId: String, price: Double)Boolean检查玩家是否有足够的货币

CustomCurrency 结构

ShopSerializer.CustomCurrency 是自定义货币的核心接口,定义了货币的基本行为:

import kim.hhhhhy.malkuth.common.api.currency.ShopSerializer

interface CustomCurrency {

/** 货币显示名称 */
val name: String

/** 货币图标(用于 GUI 显示) */
val icon: String

/**
* 获取玩家余额
* @param player 目标玩家
* @return 当前余额
*/
fun getBalance(player: Player): Double

/**
* 检查玩家是否有足够余额
* @param player 目标玩家
* @param amount 需要的金额
* @return 是否足够
*/
fun has(player: Player, amount: Double): Boolean

/**
* 扣除玩家余额
* @param player 目标玩家
* @param amount 扣除金额
* @return 是否成功
*/
fun take(player: Player, amount: Double): Boolean

/**
* 给予玩家余额
* @param player 目标玩家
* @param amount 给予金额
* @return 是否成功
*/
fun give(player: Player, amount: Double): Boolean
}

注册自定义货币

import kim.hhhhhy.malkuth.common.api.currency.ShopSerializer.CustomCurrency

class PointsCurrency : CustomCurrency {

override val name = "积分"
override val icon = "EMERALD"

override fun getBalance(player: Player): Double {
return PointsPlugin.getPoints(player).toDouble()
}

override fun has(player: Player, amount: Double): Boolean {
return getBalance(player) >= amount
}

override fun take(player: Player, amount: Double): Boolean {
if (!has(player, amount)) return false
PointsPlugin.removePoints(player, amount.toInt())
return true
}

override fun give(player: Player, amount: Double): Boolean {
PointsPlugin.addPoints(player, amount.toInt())
return true
}
}

// 注册
Malkuth.api.registerCurrency("points", PointsCurrency())

查询余额

val api = Malkuth.api

// 获取玩家在商店使用的货币余额
val balance = api.getCurrencyBalance(player, "main_shop")
player.sendMessage("你的余额: $balance")

// 检查是否足够购买
if (api.hasCurrency(player, "main_shop", 100.0)) {
player.sendMessage("余额充足")
} else {
player.sendMessage("余额不足")
}

在商店配置中使用自定义货币

注册完成后,可以在商店配置文件中通过货币 ID 引用:

shop:
id: "points_shop"
name: "积分商店"
currency: "points" # 使用注册的货币 ID
goods:
- id: "diamond"
price: 500 # 500 积分
提示

自定义货币注册应在插件启用阶段(onEnable)完成,确保在 Malkuth 加载商店配置之前注册。建议在 plugin.yml 中将 Malkuth 设为前置依赖。