kether判断

This commit is contained in:
小白
2023-05-10 10:24:45 +08:00
parent 1e8495da56
commit f56bdade63
15 changed files with 291 additions and 100 deletions
+3 -1
View File
@@ -21,6 +21,7 @@ taboolib {
install("module-ui") install("module-ui")
install("module-nms-util") install("module-nms-util")
install("module-nms") install("module-nms")
install("module-kether")
install("platform-bukkit") install("platform-bukkit")
install("expansion-command-helper") install("expansion-command-helper")
classifier = null classifier = null
@@ -31,7 +32,7 @@ taboolib {
repositories { repositories {
mavenCentral() mavenCentral()
maven("https://repo.xbaimiao.com/nexus/content/repositories/releases/") maven("https://maven.xbaimiao.com/repository/maven-public/")
} }
dependencies { dependencies {
@@ -41,6 +42,7 @@ dependencies {
compileOnly("public:points:1.0.0") compileOnly("public:points:1.0.0")
compileOnly("ink.ptms.core:v11902:11902-minimize:mapped") compileOnly("ink.ptms.core:v11902:11902-minimize:mapped")
compileOnly("ink.ptms.core:v11902:11902-minimize:universal") compileOnly("ink.ptms.core:v11902:11902-minimize:universal")
compileOnly("public:Zaphkiel:1.0.0")
taboo(kotlin("stdlib")) taboo(kotlin("stdlib"))
compileOnly(fileTree("libs")) compileOnly(fileTree("libs"))
} }
@@ -10,11 +10,6 @@ import org.bukkit.inventory.ItemStack
import org.bukkit.permissions.Permission import org.bukkit.permissions.Permission
import taboolib.module.chat.colored import taboolib.module.chat.colored
interface ItemLoader {
val prefix: String?
fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item
}
interface Item { interface Item {
@@ -0,0 +1,45 @@
package com.github.xbaimiao.shoppro.core.item
import com.github.xbaimiao.shoppro.core.shop.Shop
import com.github.xbaimiao.shoppro.core.vault.Currency
import com.github.xbaimiao.shoppro.core.vault.CurrencyType
import com.github.xbaimiao.shoppro.core.vault.VaultImpl
import org.bukkit.Material
import org.bukkit.configuration.ConfigurationSection
import taboolib.library.xseries.parseToMaterial
import taboolib.module.chat.colored
abstract class ItemLoader {
abstract val prefix: String?
abstract fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item
open fun parseToMaterial(section: ConfigurationSection): Material {
return section.getString("material")!!.parseToMaterial()
}
fun ConfigurationSection.toItemSetting(char: Char, shop: Shop): ShopItem.ItemSetting {
var currency: Currency = VaultImpl
this.getString("currency")?.let {
currency = CurrencyType.formString(it).func.invoke(it)
}
return ShopItem.ItemSetting(
key = char,
material = parseToMaterial(this),
name = this.getString("name")!!.colored(),
lore = this.getStringList("lore").colored(),
vanilla = this.getBoolean("vanilla", true),
commands = this.getStringList("commands"),
shop = shop,
script = this.getString("condition"),
price = this.getDouble("price"),
limitServer = this.getLong("limit"),
limitPlayer = this.getLong("limit-player"),
currency = currency,
conditionIcon = this.getString("condition-icon")?.parseToMaterial(),
conditionLore = this.getStringList("condition-lore"),
conditionName = this.getString("condition-name"),
)
}
}
@@ -0,0 +1,40 @@
package com.github.xbaimiao.shoppro.core.item
import com.github.xbaimiao.shoppro.util.KetherUtil
import com.github.xbaimiao.shoppro.util.Util.replacePapi
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import taboolib.module.chat.colored
/**
* @author 小白
* @date 2023/5/10 09:43
**/
interface KetherCondition {
val conditionScript: String?
val conditionIcon: Material?
val conditionLore: List<String>
val conditionName: String?
fun check(player: Player): Boolean {
if (conditionScript == null) {
return true
}
return KetherUtil.instantKether(player, conditionScript!!).asBoolean(false)
}
fun conditionItem(player: Player): ItemStack {
if (conditionIcon == null || conditionName == null) {
return ItemStack(Material.AIR)
}
return taboolib.platform.util.buildItem(conditionIcon!!) {
name = conditionName!!.colored().replacePapi(player)
conditionLore.forEach {
lore += it.colored().replacePapi(player)
}
}
}
}
@@ -3,26 +3,72 @@ package com.github.xbaimiao.shoppro.core.item
import com.github.xbaimiao.shoppro.ShopPro import com.github.xbaimiao.shoppro.ShopPro
import com.github.xbaimiao.shoppro.core.shop.Shop import com.github.xbaimiao.shoppro.core.shop.Shop
import com.github.xbaimiao.shoppro.core.vault.Currency import com.github.xbaimiao.shoppro.core.vault.Currency
import com.github.xbaimiao.shoppro.core.vault.VaultImpl
import com.github.xbaimiao.shoppro.util.Util.format import com.github.xbaimiao.shoppro.util.Util.format
import com.github.xbaimiao.shoppro.util.Util.howManyItems import com.github.xbaimiao.shoppro.util.Util.howManyItems
import com.github.xbaimiao.shoppro.util.Util.replacePapi import com.github.xbaimiao.shoppro.util.Util.replacePapi
import org.bukkit.Material
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import taboolib.platform.util.modifyLore import taboolib.platform.util.modifyLore
abstract class ShopItem : Item { abstract class ShopItem(
override val key: Char,
override val material: Material,
override val name: String,
override val lore: List<String>,
override val vanilla: Boolean,
override val commands: List<String>,
override val shop: Shop,
override val conditionScript: String?,
override val conditionIcon: Material?,
override val conditionLore: List<String>,
override val conditionName: String?,
val price: Double,
val limitServer: Long,
val limitPlayer: Long,
val currency: Currency
) : Item, KetherCondition {
abstract val price: Double constructor(itemSetting: ItemSetting) : this(
abstract val limitServer: Long itemSetting.key,
abstract val limitPlayer: Long itemSetting.material,
itemSetting.name,
itemSetting.lore,
itemSetting.vanilla,
itemSetting.commands,
itemSetting.shop,
itemSetting.script,
itemSetting.conditionIcon,
itemSetting.conditionLore,
itemSetting.conditionName,
itemSetting.price,
itemSetting.limitServer,
itemSetting.limitPlayer,
itemSetting.currency
)
class ItemSetting(
val key: Char,
val material: Material,
val name: String,
val lore: List<String>,
val vanilla: Boolean,
val commands: List<String>,
val shop: Shop,
val script: String?,
val conditionIcon: Material?,
val conditionLore: List<String>,
val conditionName: String?,
val price: Double,
val limitServer: Long,
val limitPlayer: Long,
var currency: Currency
)
override fun isCommodity(): Boolean { override fun isCommodity(): Boolean {
return true return true
} }
var currency: Currency = VaultImpl
abstract fun vanillaItem(): ItemStack abstract fun vanillaItem(): ItemStack
abstract fun equal(itemStack: ItemStack): Boolean abstract fun equal(itemStack: ItemStack): Boolean
@@ -4,29 +4,19 @@ import com.github.xbaimiao.shoppro.core.item.Item
import com.github.xbaimiao.shoppro.core.item.ItemLoader import com.github.xbaimiao.shoppro.core.item.ItemLoader
import com.github.xbaimiao.shoppro.core.item.ShopItem import com.github.xbaimiao.shoppro.core.item.ShopItem
import com.github.xbaimiao.shoppro.core.shop.Shop import com.github.xbaimiao.shoppro.core.shop.Shop
import com.github.xbaimiao.shoppro.core.vault.CurrencyType
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import taboolib.library.xseries.XMaterial import taboolib.library.xseries.XMaterial
import taboolib.library.xseries.parseToMaterial import taboolib.library.xseries.parseToMaterial
import taboolib.module.chat.colored
import taboolib.platform.util.ItemBuilder import taboolib.platform.util.ItemBuilder
import java.util.* import java.util.*
class HeadShopItem( class HeadShopItem(
override val key: Char,
headString: String, headString: String,
override val price: Double, itemSetting: ItemSetting,
override val limitServer: Long,
override val limitPlayer: Long,
override val name: String,
override val lore: List<String>,
override val vanilla: Boolean,
override val commands: List<String>,
override val shop: Shop,
val item: Material val item: Material
) : ShopItem() { ) : ShopItem(itemSetting) {
override val material: Material = XMaterial.PLAYER_HEAD.parseMaterial()!! override val material: Material = XMaterial.PLAYER_HEAD.parseMaterial()!!
@@ -54,28 +44,20 @@ class HeadShopItem(
} }
} }
companion object : ItemLoader { companion object : ItemLoader() {
override var prefix: String? = "HEAD" override var prefix: String? = "HEAD"
override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item { override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item {
return HeadShopItem( return HeadShopItem(
char,
section.getString("material")!!, section.getString("material")!!,
section.getDouble("price"), section.toItemSetting(char, shop),
section.getLong("limit"),
section.getLong("limit-player"),
section.getString("name")!!.colored(),
section.getStringList("lore").colored(),
section.getBoolean("vanilla", true),
section.getStringList("commands"),
shop,
section.getString("item")!!.parseToMaterial() section.getString("item")!!.parseToMaterial()
).also { )
section.getString("currency")?.let { currency ->
it.currency = CurrencyType.formString(currency).func.invoke(currency)
}
} }
override fun parseToMaterial(section: ConfigurationSection): Material {
return section.getString("item")!!.parseToMaterial()
} }
} }
@@ -15,8 +15,12 @@ import taboolib.platform.util.modifyLore
import java.util.* import java.util.*
class ItemImpl( class ItemImpl(
materialString: String, override val lore: List<String>, override val name: String, materialString: String,
override val key: Char, override val vanilla: Boolean, override val commands: List<String>, override val lore: List<String>,
override val name: String,
override val key: Char,
override val vanilla: Boolean,
override val commands: List<String>,
override val shop: Shop override val shop: Shop
) : Item { ) : Item {
@@ -66,7 +70,7 @@ class ItemImpl(
return item return item
} }
companion object : ItemLoader { companion object : ItemLoader() {
override var prefix: String? = null override var prefix: String? = null
@@ -9,20 +9,11 @@ import org.bukkit.Material
import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import taboolib.library.xseries.XMaterial import taboolib.library.xseries.XMaterial
import taboolib.module.chat.colored
class ItemsAdderShopItem( class ItemsAdderShopItem(
override val key: Char,
override val price: Double,
iaMaterial: String, iaMaterial: String,
override val limitServer: Long, itemSetting: ItemSetting
override val limitPlayer: Long, ) : ShopItem(itemSetting) {
override val name: String,
override val lore: List<String>,
override val vanilla: Boolean,
override val commands: List<String>,
override val shop: Shop
) : ShopItem() {
override val material: Material override val material: Material
@@ -56,26 +47,21 @@ class ItemsAdderShopItem(
} }
} }
companion object : ItemLoader { companion object : ItemLoader() {
override var prefix: String? = "IA" override var prefix: String? = "IA"
override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item { override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item {
return ItemsAdderShopItem( return ItemsAdderShopItem(
char,
section.getDouble("price"),
section.getString("material")!!, section.getString("material")!!,
section.getLong("limit"), section.toItemSetting(char, shop)
section.getLong("limit-player"), )
section.getString("name")!!.colored(),
section.getStringList("lore").colored(),
section.getBoolean("vanilla", true),
section.getStringList("commands"),
shop
).also {
section.getString("currency")?.let { currency ->
it.currency = CurrencyType.formString(currency).func.invoke(currency)
} }
override fun parseToMaterial(section: ConfigurationSection): Material {
val iaMaterial = section.getString("material")!!
iaMaterial.split(":").let { strings ->
return XMaterial.matchXMaterial(strings[1]).get().parseMaterial()!!
} }
} }
@@ -5,25 +5,13 @@ import com.github.xbaimiao.shoppro.core.item.ItemLoader
import com.github.xbaimiao.shoppro.core.item.ShopItem import com.github.xbaimiao.shoppro.core.item.ShopItem
import com.github.xbaimiao.shoppro.core.shop.Shop import com.github.xbaimiao.shoppro.core.shop.Shop
import com.github.xbaimiao.shoppro.core.vault.CurrencyType import com.github.xbaimiao.shoppro.core.vault.CurrencyType
import org.bukkit.Material
import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import taboolib.library.xseries.parseToMaterial
import taboolib.module.chat.colored
import taboolib.platform.util.hasLore import taboolib.platform.util.hasLore
class VanillaShopItem( class VanillaShopItem(
override val key: Char, itemSetting: ItemSetting
override val material: Material, ) : ShopItem(itemSetting) {
override val price: Double,
override val limitServer: Long,
override val limitPlayer: Long,
override val name: String,
override val lore: List<String>,
override val vanilla: Boolean,
override val commands: List<String>,
override val shop: Shop
) : ShopItem() {
override fun vanillaItem(): ItemStack { override fun vanillaItem(): ItemStack {
return taboolib.platform.util.buildItem(material) return taboolib.platform.util.buildItem(material)
@@ -40,27 +28,12 @@ class VanillaShopItem(
} }
} }
companion object : ItemLoader { companion object : ItemLoader() {
override var prefix: String? = null override var prefix: String? = null
override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item { override fun formSection(char: Char, section: ConfigurationSection, shop: Shop): Item {
return VanillaShopItem( return VanillaShopItem(section.toItemSetting(char, shop))
char,
section.getString("material")!!.parseToMaterial(),
section.getDouble("price"),
section.getLong("limit"),
section.getLong("limit-player"),
section.getString("name")!!.colored(),
section.getStringList("lore").colored(),
section.getBoolean("vanilla", true),
section.getStringList("commands"),
shop
).also {
section.getString("currency")?.let { currency ->
it.currency = CurrencyType.formString(currency).func.invoke(currency)
}
}
} }
} }
@@ -25,5 +25,4 @@ abstract class Shop {
abstract fun open(player: Player) abstract fun open(player: Player)
} }
@@ -5,6 +5,7 @@ import com.github.xbaimiao.shoppro.api.ShopProBuyEvent
import com.github.xbaimiao.shoppro.api.ShopProSellEvent import com.github.xbaimiao.shoppro.api.ShopProSellEvent
import com.github.xbaimiao.shoppro.core.database.LimitData import com.github.xbaimiao.shoppro.core.database.LimitData
import com.github.xbaimiao.shoppro.core.item.Item import com.github.xbaimiao.shoppro.core.item.Item
import com.github.xbaimiao.shoppro.core.item.KetherCondition
import com.github.xbaimiao.shoppro.core.item.ShopItem import com.github.xbaimiao.shoppro.core.item.ShopItem
import com.github.xbaimiao.shoppro.util.Util.howManyItems import com.github.xbaimiao.shoppro.util.Util.howManyItems
import com.github.xbaimiao.shoppro.util.Util.replacePapi import com.github.xbaimiao.shoppro.util.Util.replacePapi
@@ -88,7 +89,16 @@ class ShopImpl(private val configuration: Configuration) : Shop() {
it.isCancelled = true it.isCancelled = true
} }
for (item in this@ShopImpl.items) { for (item in this@ShopImpl.items) {
var canBuyOrSell = true
if (item is KetherCondition && !item.check(player)) {
canBuyOrSell = false
}
if (!canBuyOrSell && item is KetherCondition) {
set(item.key, item.conditionItem(player))
continue
}
set(item.key, item.update(player)) set(item.key, item.update(player))
// buy and sell
if (item is ShopItem) { if (item is ShopItem) {
if (getType() == ShopType.BUY) { if (getType() == ShopType.BUY) {
onClick(item.key) { event -> onClick(item.key) { event ->
@@ -0,0 +1,30 @@
package com.github.xbaimiao.shoppro.util
/**
* @author Arasple
* @date 2021/1/31 11:53
*/
@JvmInline
value class EvalResult(val any: Any? = null) {
fun asBoolean(def: Boolean = false): Boolean {
return when (any) {
is Boolean -> any
is String -> Regexs.parseBoolean(any)
else -> def || Regexs.parseBoolean(any.toString())
}
}
fun asString(): String {
return any.toString()
}
companion object {
val TRUE = EvalResult(true)
val FALSE = EvalResult(false)
}
}
@@ -0,0 +1,43 @@
package com.github.xbaimiao.shoppro.util
import org.bukkit.entity.Player
import taboolib.common.platform.function.adaptPlayer
import taboolib.library.kether.LocalizedException
import taboolib.module.kether.KetherShell
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
/**
* @author 小白
* @date 2023/5/10 09:47
**/
object KetherUtil {
@JvmStatic
fun eval(player: Player, script: String): CompletableFuture<Any?> {
return try {
KetherShell.eval(script, namespace = listOf("shoppro")) {
sender = adaptPlayer(player)
}
} catch (e: LocalizedException) {
println("§c[ShopPro] §8Unexpected exception while parsing kether shell:")
e.localizedMessage.split("\n").forEach {
println(" §8$it")
}
CompletableFuture.completedFuture(false)
}
}
@JvmStatic
fun instantKether(player: Player, script: String, timeout: Long = 100): EvalResult {
return try {
EvalResult(eval(player, script).get(timeout, TimeUnit.MILLISECONDS))
} catch (e: TimeoutException) {
println("§c[ShopPro] §8Timeout while parsing kether shell:")
e.localizedMessage?.split("\n")?.forEach { println(" §8$it") }
EvalResult.FALSE
}
}
}
@@ -0,0 +1,27 @@
package com.github.xbaimiao.shoppro.util
/**
* @author Arasple
* @date 2021/1/24 16:57
*/
object Regexs {
private val PLACEHOLDER_API = "(%)(.+?)(%)|(?!\\{\")((\\{)(.+?)(}))".toRegex()
val JSON_TEXTURE = "\\{\\s*\"".toRegex()
val ICON_KEY = "`(.+?)`".toRegex()
val SENTENCE = "`(.+?)`".toRegex()
val STRING = "\\{(\\w+)}".toRegex()
private val TRUE = "true|yes|on".toRegex()
val FALSE = "false|no|off".toRegex()
val BOOLEAN = "true|yes|on|false|no|off".toRegex()
fun containsPlaceholder(string: String): Boolean {
return PLACEHOLDER_API.find(string) != null
}
fun parseBoolean(string: String): Boolean {
return string.lowercase().matches(TRUE)
}
}
+9
View File
@@ -27,6 +27,15 @@ items:
limit-player: 500 limit-player: 500
# 物品金额 # 物品金额
price: 1 price: 1
# 条件
condition: 'permission shop.sell.stone'
# 条件不满足无法显示,玩家买不了,但能看到的样子
condition-icon: barrier
condition-name: '条件不满足'
# 未解锁状态下的lore描述
condition-lore:
- '未解锁名称描述1'
- '未解锁名称描述2'
lore: lore:
- '&e| &7这里可以出售你背包里面的&6 ${name}' - '&e| &7这里可以出售你背包里面的&6 ${name}'
- '&e| &7收购单价 &6${price}' - '&e| &7收购单价 &6${price}'