diff --git a/gradle.properties b/gradle.properties index 40f18d0..e288257 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group=com.github.xbaimiao.shoppro -version=1.1.7 +version=1.1.8 diff --git a/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ItemLoader.kt b/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ItemLoader.kt index 199a8a6..92620d2 100644 --- a/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ItemLoader.kt +++ b/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ItemLoader.kt @@ -23,6 +23,14 @@ abstract class ItemLoader { this.getString("currency")?.let { currency = CurrencyType.formString(it).func.invoke(it) } + val limitMap = HashMap() + + this.getConfigurationSection("limitMap")?.let { limitSection -> + limitSection.getKeys(false).forEach { key -> + limitMap[key] = limitSection.getLong(key) + } + } + return ShopItem.ItemSetting( key = char, material = parseToMaterial(this), @@ -39,6 +47,7 @@ abstract class ItemLoader { conditionIcon = this.getString("condition-icon")?.parseToMaterial(), conditionLore = this.getStringList("condition-lore"), conditionName = this.getString("condition-name"), + limitPermissionMap = limitMap ) } diff --git a/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ShopItem.kt b/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ShopItem.kt index bc3308d..428e8a9 100644 --- a/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ShopItem.kt +++ b/src/main/kotlin/com/github/xbaimiao/shoppro/core/item/ShopItem.kt @@ -25,7 +25,8 @@ abstract class ShopItem( override val conditionName: String?, val price: Double, val limitServer: Long, - val limitPlayer: Long, + private val limitPlayer: Long, + private val limitPermissionMap: Map, val currency: Currency ) : Item, KetherCondition { @@ -44,6 +45,7 @@ abstract class ShopItem( itemSetting.price, itemSetting.limitServer, itemSetting.limitPlayer, + itemSetting.limitPermissionMap, itemSetting.currency ) @@ -62,6 +64,7 @@ abstract class ShopItem( val price: Double, val limitServer: Long, val limitPlayer: Long, + val limitPermissionMap: Map, var currency: Currency ) @@ -80,6 +83,10 @@ abstract class ShopItem( return limitPlayer != 0L && limitServer != 0L } + fun getLimitPlayer(player: Player): Long { + return limitPermissionMap.filter { player.hasPermission(it.key) }.maxOfOrNull { it.value } ?: limitPlayer + } + override fun update(player: Player): ItemStack { val playerLimit = if (shop.getType() == Shop.ShopType.BUY) { ShopPro.database.getPlayerAlreadyData(player, this).buy diff --git a/src/main/kotlin/com/github/xbaimiao/shoppro/core/shop/ShopImpl.kt b/src/main/kotlin/com/github/xbaimiao/shoppro/core/shop/ShopImpl.kt index 6a21981..f601ca1 100644 --- a/src/main/kotlin/com/github/xbaimiao/shoppro/core/shop/ShopImpl.kt +++ b/src/main/kotlin/com/github/xbaimiao/shoppro/core/shop/ShopImpl.kt @@ -149,16 +149,16 @@ class ShopImpl(private val configuration: Configuration) : Shop() { private fun checkBuyLimit(amount: Int, item: ShopItem, player: Player) { if (item.isLimit()) { - if (ShopPro.database.getPlayerAlreadyData(player, item).buy >= item.limitPlayer) { - player.sendLang("buy-limit-player", item.limitPlayer) + if (ShopPro.database.getPlayerAlreadyData(player, item).buy >= item.getLimitPlayer(player)) { + player.sendLang("buy-limit-player", item.getLimitPlayer(player)) return } if (ShopPro.database.getServerAlreadyData(item).buy >= item.limitServer) { player.sendLang("buy-limit-server", item.limitServer) return } - if (ShopPro.database.getPlayerAlreadyData(player, item).buy + amount > item.limitPlayer) { - buy((item.limitPlayer - ShopPro.database.getPlayerAlreadyData(player, item).buy).toInt(), item, player) + if (ShopPro.database.getPlayerAlreadyData(player, item).buy + amount > item.getLimitPlayer(player)) { + buy((item.getLimitPlayer(player) - ShopPro.database.getPlayerAlreadyData(player, item).buy).toInt(), item, player) return } if (ShopPro.database.getServerAlreadyData(item).buy + amount > item.limitServer) { @@ -187,17 +187,17 @@ class ShopImpl(private val configuration: Configuration) : Shop() { private fun checkSellLimit(amount: Int, item: ShopItem, player: Player) { if (item.isLimit()) { - if (ShopPro.database.getPlayerAlreadyData(player, item).sell >= item.limitPlayer) { - player.sendLang("sell-limit-player", item.limitPlayer) + if (ShopPro.database.getPlayerAlreadyData(player, item).sell >= item.getLimitPlayer(player)) { + player.sendLang("sell-limit-player", item.getLimitPlayer(player)) return } if (ShopPro.database.getServerAlreadyData(item).sell >= item.limitServer) { player.sendLang("sell-limit-server", item.limitServer) return } - if (ShopPro.database.getPlayerAlreadyData(player, item).sell + amount > item.limitPlayer) { + if (ShopPro.database.getPlayerAlreadyData(player, item).sell + amount > item.getLimitPlayer(player)) { sell( - (item.limitPlayer - ShopPro.database.getPlayerAlreadyData(player, item).sell).toInt(), + (item.getLimitPlayer(player) - ShopPro.database.getPlayerAlreadyData(player, item).sell).toInt(), item, player ) diff --git a/src/main/resources/shops/limit-buy.yml b/src/main/resources/shops/limit-buy.yml index 7ae2ef9..a94a8e0 100644 --- a/src/main/resources/shops/limit-buy.yml +++ b/src/main/resources/shops/limit-buy.yml @@ -29,6 +29,9 @@ items: limit: 5000 # 每个玩家限购买 limit-player: 500 + # 根据权限限制玩家购买数量 所有权限都不满足则使用limit-player + limitMap: + vip: 1000 # 物品金额 price: 2 lore: