From d7d925b18cc9626aa38dd540fd84bd81a571c618 Mon Sep 17 00:00:00 2001 From: Iseason <1347811744@qq.com> Date: Sat, 31 Aug 2024 18:47:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8A=E6=B8=B8=20?= =?UTF-8?q?=E6=94=AF=E6=8C=811.20.1=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 51 ++---- core/build.gradle.kts | 31 ++-- .../iseason/bukkittemplate/command/Parmas.kt | 2 +- .../bukkittemplate/config/DatabaseConfig.kt | 67 ++++++-- .../bukkittemplate/config/SimpleYAMLConfig.kt | 2 +- .../bukkittemplate/utils/JavaVersion.kt | 32 ++++ .../utils/bukkit/EntityUtils.kt | 8 +- .../bukkittemplate/utils/bukkit/EventUtils.kt | 4 +- .../bukkittemplate/utils/bukkit/ItemUtils.kt | 162 +++--------------- .../utils/bukkit/MessageUtils.kt | 4 +- gradle.properties | 21 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- plugin/build.gradle.kts | 44 ++--- .../sakuracdk/commands/AdminCommands.kt | 18 +- .../sakuracdk/commands/CDKCommand.kt | 48 ++---- .../sakuracdk/commands/KitCommand.kt | 2 +- .../sakuracdk/commands/UserCommand.kt | 19 +- .../sakuracdk/config/CDKsYml.kt | 98 ++++++----- .../sakuracdk/entity/BaseCDK.kt | 1 - .../sakuracdk/entity/CDKs.kt | 12 +- .../sakuracdk/entity/Kits.kt | 3 +- .../sakuracdk/entity/NormalCDKYml.kt | 26 --- .../sakuracdk/entity/RandomCDKYml.kt | 21 +-- .../sakuracdk/entity/Rewards.kt | 7 +- settings.gradle.kts | 11 +- 25 files changed, 292 insertions(+), 404 deletions(-) create mode 100644 core/src/main/kotlin/top/iseason/bukkittemplate/utils/JavaVersion.kt diff --git a/build.gradle.kts b/build.gradle.kts index 3b5d227..e11006e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,27 +1,16 @@ plugins { kotlin("jvm") - id("com.github.johnrengelman.shadow") -} - -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath("com.guardsquare:proguard-gradle:7.4.0-beta01") - } + id("com.gradleup.shadow") } subprojects { group = rootProject.group version = rootProject.version apply { - plugin() plugin() plugin() } repositories { -// 阿里的服务器速度快一点 maven { name = "aliyun" url = uri("https://maven.aliyun.com/repository/public") @@ -36,6 +25,10 @@ subprojects { name = "spigot" url = uri("https://hub.spigotmc.org/nexus/content/repositories/public/") } + maven { + name = "papermc" + url = uri("https://repo.papermc.io/repository/maven-public/") + } maven { name = "jitpack" url = uri("https://jitpack.io") @@ -54,42 +47,22 @@ subprojects { dependencies { val kotlinVersion: String by rootProject val exposedVersion: String by rootProject - val nbtEditorVersion: String by rootProject - + compileOnly("de.tr7zw:item-nbt-api-plugin:2.13.2") compileOnly(platform("org.jetbrains.kotlin:kotlin-bom:$kotlinVersion")) //基础库 compileOnly(kotlin("stdlib")) - compileOnly("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") + compileOnly("org.spigotmc", "spigot-api", "1.20.3-R0.1-SNAPSHOT", "compile") compileOnly("me.clip:placeholderapi:2.11.3") - implementation("io.github.bananapuncher714:nbteditor:$nbtEditorVersion") // 数据库 - compileOnly("org.jetbrains.exposed:exposed-core:$exposedVersion") { - isTransitive = false - targetConfiguration = "runtime" - } - compileOnly("org.jetbrains.exposed:exposed-dao:$exposedVersion") { - isTransitive = false - targetConfiguration = "runtime" - } - compileOnly("org.jetbrains.exposed:exposed-jdbc:$exposedVersion") { - isTransitive = false - targetConfiguration = "runtime" - } - compileOnly("org.jetbrains.exposed:exposed-java-time:$exposedVersion") { - isTransitive = false - targetConfiguration = "runtime" - } + compileOnly("org.jetbrains.exposed", "exposed-core", exposedVersion, "compile") + compileOnly("org.jetbrains.exposed", "exposed-dao", exposedVersion, "compile") + compileOnly("org.jetbrains.exposed", "exposed-jdbc", exposedVersion, "compile") + compileOnly("org.jetbrains.exposed", "exposed-java-time", exposedVersion, "compile") + compileOnly("com.zaxxer:HikariCP:4.0.3") } - tasks { - compileJava { - options.encoding = "UTF-8" - sourceCompatibility = "1.8" - targetCompatibility = "1.8" - } - } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 53a4c71..81aa318 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,37 +1,40 @@ plugins { kotlin("jvm") - id("org.jetbrains.dokka") version "1.8.20" + id("org.jetbrains.dokka") version "1.9.20" } group = "top.iseason.bukkittemplate" -val exposedVersion: String by rootProject repositories { maven { name = "MMOItems" url = uri("https://nexus.phoenixdevt.fr/repository/maven-public/") } + maven { + name = "Oraxen" + url = uri("https://repo.oraxen.com/releases") + } } dependencies { // compileOnly("org.spigotmc:spigot-api:1.19.4-R0.1-SNAPSHOT") - dokkaHtmlPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.8.10") + dokkaHtmlPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.9.20") - compileOnly("net.kyori:adventure-text-minimessage:4.13.0") - compileOnly("net.kyori:adventure-platform-bukkit:4.3.0") - implementation("org.bstats:bstats-bukkit:3.0.1") + compileOnly("net.kyori:adventure-text-minimessage:4.17.0") + compileOnly("net.kyori:adventure-platform-bukkit:4.3.2") + implementation("org.bstats:bstats-bukkit:3.0.2") - compileOnly("net.Indyuce:MMOItems-API:6.9.2-SNAPSHOT") { isTransitive = false } - compileOnly("com.github.LoneDev6:api-itemsadder:3.4.1-r4") { isTransitive = false } - compileOnly("com.github.oraxen:oraxen:1.155.3") { isTransitive = false } + compileOnly("net.Indyuce:MMOItems-API:6.9.4-SNAPSHOT") { isTransitive = false } + compileOnly("com.github.LoneDev6:api-itemsadder:3.6.1") { isTransitive = false } + compileOnly("io.th0rgal:oraxen:1.175.0") { isTransitive = false } } tasks { + kotlin { + jvmToolchain(8) + } + compileJava { + options.encoding = "UTF-8" options.isFailOnError = false - options.isWarnings = false - options.isVerbose = false - } - build { - dependsOn(named("shadowJar")) } dokkaHtml.configure { dokkaSourceSets { diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/command/Parmas.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/command/Parmas.kt index 509ae01..c47a909 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/command/Parmas.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/command/Parmas.kt @@ -90,7 +90,7 @@ object ParamSuggestCache { /** * 建议物品材质名 */ - val materialTypes = Material.values().map { + val materialTypes = Material.entries.map { it.name.lowercase() } diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/config/DatabaseConfig.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/config/DatabaseConfig.kt index 2af797b..36338da 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/config/DatabaseConfig.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/config/DatabaseConfig.kt @@ -12,6 +12,7 @@ import org.jetbrains.exposed.sql.statements.StatementContext import org.jetbrains.exposed.sql.statements.expandArgs import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.transaction +import org.jetbrains.exposed.sql.transactions.transactionManager import top.iseason.bukkittemplate.BukkitTemplate import top.iseason.bukkittemplate.DisableHook import top.iseason.bukkittemplate.config.annotations.Comment @@ -19,6 +20,8 @@ import top.iseason.bukkittemplate.config.annotations.FilePath import top.iseason.bukkittemplate.config.annotations.Key import top.iseason.bukkittemplate.debug.debug import top.iseason.bukkittemplate.debug.info +import top.iseason.bukkittemplate.utils.JavaVersion +import java.io.Closeable import java.io.File import java.util.* @@ -124,6 +127,8 @@ object DatabaseConfig : SimpleYAMLConfig() { @Key var data_source__leakDetectionThreshold = 0L + private var ds: Closeable? = null + // table缓存 private var tables: Array = emptyArray() @@ -132,12 +137,22 @@ object DatabaseConfig : SimpleYAMLConfig() { private var isConnecting = false lateinit var connection: Database private set - private var ds: HikariDataSource? = null init { DisableHook.addTask { closeDB() } } + init { + val runtimeManager = BukkitTemplate.getRuntimeManager() + .addRepository("https://maven.aliyun.com/repository/public") + .addRepository("https://repo.maven.apache.org/maven2/") + if (JavaVersion.isGreaterOrEqual(11)) { + runtimeManager.downloadDependency("com.zaxxer:HikariCP:5.1.0", 1) + } else { + runtimeManager.downloadDependency("com.zaxxer:HikariCP:4.0.3", 1) + } + } + override fun onLoaded(section: ConfigurationSection) { isAutoUpdate = autoReload reConnected() @@ -176,26 +191,30 @@ object DatabaseConfig : SimpleYAMLConfig() { } val config = when (database_type) { "MySQL" -> HikariConfig(props).apply { - runtimeManager.downloadADependency("mysql:mysql-connector-java:8.0.30") + runtimeManager.downloadADependency("mysql:mysql-connector-java:8.0.33") jdbcUrl = "jdbc:mysql://$address/$database_name$params" //可能兼容旧的mysql驱动 driverClassName = "com.mysql.jdbc.Driver" } "MariaDB" -> HikariConfig(props).apply { - runtimeManager.downloadADependency("org.mariadb.jdbc:mariadb-java-client:3.1.3") + runtimeManager.downloadADependency("org.mariadb.jdbc:mariadb-java-client:3.4.1") jdbcUrl = "jdbc:mariadb://$address/$database_name$params" driverClassName = "org.mariadb.jdbc.Driver" } "SQLite" -> HikariConfig(props).apply { - runtimeManager.downloadADependencyAssembly("org.xerial:sqlite-jdbc:3.41.2.0") + runtimeManager.downloadADependencyAssembly("org.xerial:sqlite-jdbc:3.46.1.0") jdbcUrl = "jdbc:sqlite:$address$params" driverClassName = "org.sqlite.JDBC" } "H2" -> HikariConfig().apply { - runtimeManager.downloadADependency("com.h2database:h2:2.2.220") + if (JavaVersion.isGreaterOrEqual(11)) { + runtimeManager.downloadADependency("com.h2database:h2:2.3.232") + } else { + runtimeManager.downloadADependency("com.h2database:h2:2.2.224") + } jdbcUrl = "jdbc:h2:$address/$database_name$params" driverClassName = "org.h2.Driver" } @@ -207,13 +226,22 @@ object DatabaseConfig : SimpleYAMLConfig() { } "Oracle" -> HikariConfig(props).apply { - runtimeManager.downloadADependency("com.oracle.database.jdbc:ojdbc8:21.9.0.0") + val oracleVersion = "23.5.0.24.07" + if (JavaVersion.isGreaterOrEqual(11)) { + runtimeManager.downloadADependency("com.oracle.database.jdbc:ojdbc11:$oracleVersion") + } else { + runtimeManager.downloadADependency("com.oracle.database.jdbc:ojdbc8:$oracleVersion") + } jdbcUrl = "dbc:oracle:thin:@//$address/$database_name$params" driverClassName = "oracle.jdbc.OracleDriver" } "SQLServer" -> HikariConfig(props).apply { - runtimeManager.downloadADependency("com.microsoft.sqlserver:mssql-jdbc:11.2.3.jre8") + if (JavaVersion.isGreaterOrEqual(11)) { + runtimeManager.downloadADependency("com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11") + } else { + runtimeManager.downloadADependency("com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8") + } jdbcUrl = "jdbc:sqlserver://$address;DatabaseName=$database_name$params" driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver" } @@ -233,10 +261,12 @@ object DatabaseConfig : SimpleYAMLConfig() { } catch (_: Throwable) { } } - ds = HikariDataSource(config) - connection = Database.connect(ds!!, databaseConfig = org.jetbrains.exposed.sql.DatabaseConfig.invoke { - sqlLogger = MySqlLogger - }) + val hikariDataSource = HikariDataSource(config) + ds = hikariDataSource + connection = + Database.connect(hikariDataSource, databaseConfig = org.jetbrains.exposed.sql.DatabaseConfig.invoke { + sqlLogger = MySqlLogger + }) isConnected = true info("&a数据库链接成功: &6$database_type") }.getOrElse { @@ -267,8 +297,8 @@ object DatabaseConfig : SimpleYAMLConfig() { this.tables = tables runCatching { dbTransaction { - SchemaUtils.createMissingTablesAndColumns(*tables) -// SchemaUtils.create(*tables) + SchemaUtils.create(*tables) +// SchemaUtils.createMissingTablesAndColumns(tables = tables, inBatch = false, withLogs = false) } }.getOrElse { it.printStackTrace() } } @@ -300,5 +330,12 @@ object MySqlLogger : SqlLogger { /** * 使用本插件数据库的事务 */ -fun dbTransaction(statement: Transaction.() -> T) = - transaction(DatabaseConfig.connection, statement) +fun dbTransaction(readOnly: Boolean = false, statement: Transaction.() -> T): T { + val db = DatabaseConfig.connection + return transaction( + db.transactionManager.defaultIsolationLevel, + readOnly, + db, + statement + ) +} \ No newline at end of file diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/config/SimpleYAMLConfig.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/config/SimpleYAMLConfig.kt index 58912cb..9d65b7b 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/config/SimpleYAMLConfig.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/config/SimpleYAMLConfig.kt @@ -71,7 +71,7 @@ open class SimpleYAMLConfig( /** * 本配置类的所有项 */ - private val keys = buildList { + private val keys = mutableListOf().apply { //当前类是否标注了 @Key val isAllKey = this@SimpleYAMLConfig.javaClass.getAnnotation(Key::class.java) != null var superClass: Class<*>? = this@SimpleYAMLConfig::class.java diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/JavaVersion.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/JavaVersion.kt new file mode 100644 index 0000000..7f92916 --- /dev/null +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/JavaVersion.kt @@ -0,0 +1,32 @@ +package top.iseason.bukkittemplate.utils + +import kotlin.text.indexOf +import kotlin.text.substring +import kotlin.text.toInt + +object JavaVersion { + val version: Int + + init { + val versionString = System.getProperty("java.version") + val indexOf = versionString.indexOf('.') + version = try { + if (indexOf > 0) { + val substring = versionString.substring(0, indexOf) + if (substring == "1") { + val indexOf1 = versionString.indexOf('.', indexOf + 1) + versionString.substring(indexOf + 1, indexOf1).toInt() + } else { + substring.toInt() + } + } else { + versionString.toInt() + } + } catch (_: Exception) { + 8 + } + } + + fun isGreaterOrEqual(version: Int): Boolean = this.version >= version + +} \ No newline at end of file diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EntityUtils.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EntityUtils.kt index 5654feb..d6a60b6 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EntityUtils.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EntityUtils.kt @@ -2,7 +2,6 @@ package top.iseason.bukkittemplate.utils.bukkit -import io.github.bananapuncher714.nbteditor.NBTEditor import org.bukkit.Material import org.bukkit.entity.Entity import org.bukkit.entity.EntityType @@ -47,7 +46,7 @@ object EntityUtils { if (this !is Entity) return for (addItem in addItems) { if (addItem == null) continue - val item = world.spawnEntity(location, EntityType.DROPPED_ITEM) as Item + val item = world.spawnEntity(location, EntityType.entries[1]) as Item //1.20.6改了枚举名 目前看来1号都是掉落物 item.setItemStack(addItem) } } @@ -68,11 +67,6 @@ object EntityUtils { */ fun Player.getHeldItem(): ItemStack? = inventory.getHeldItem() - /** - * 序列化为json - */ - fun Entity.toJson(): String = NBTEditor.getNBTCompound(this).toJson() - /** * 扣除某种物品数量 * @return true 数量足够 diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EventUtils.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EventUtils.kt index e37ad18..3ead2a7 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EventUtils.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/EventUtils.kt @@ -54,9 +54,9 @@ object EventUtils { action: E.() -> Unit ): FakeEventListener { val fakeEventListener = FakeEventListener { _, event -> - runCatching { + if (clazz.isAssignableFrom(event.javaClass)) { action.invoke(event as E) - }.getOrElse { it.printStackTrace() } + } } Bukkit.getPluginManager() .registerEvent( diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/ItemUtils.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/ItemUtils.kt index b9f26db..ece4f50 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/ItemUtils.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/ItemUtils.kt @@ -4,9 +4,8 @@ package top.iseason.bukkittemplate.utils.bukkit import com.google.common.base.Enums -import com.google.gson.Gson -import io.github.bananapuncher714.nbteditor.NBTEditor -import io.github.bananapuncher714.nbteditor.NBTEditor.NBTCompound +import de.tr7zw.nbtapi.NBT +import de.tr7zw.nbtapi.utils.MinecraftVersion import org.bukkit.* import org.bukkit.attribute.Attribute import org.bukkit.attribute.AttributeModifier @@ -33,7 +32,6 @@ import java.io.ByteArrayOutputStream import java.util.* import java.util.zip.GZIPInputStream import java.util.zip.GZIPOutputStream -import kotlin.math.abs /** @@ -179,7 +177,7 @@ object ItemUtils { /** * 物品转为Json文本 */ - fun ItemStack.toJson(): String = NBTEditor.getNBTCompound(this).toJson() + fun ItemStack.toJson(): String = NBT.itemStackToNBT(this).toString() /** * 序列化为bukkit支持的配置 @@ -190,9 +188,6 @@ object ItemUtils { yaml["material"] = type.toString() if (amount != 1) yaml["amount"] = amount if (!hasItemMeta()) return yaml - // 额外的NBt - val toJson = NBTEditor.getNBTCompound(this, "tag").toJson() - val json = Gson().fromJson(toJson, Map::class.java).toMutableMap() val data = this.data if (data != null && data.data != 0.toByte()) { @@ -210,7 +205,6 @@ object ItemUtils { val durability = this@toSection.durability if (durability != 0.toShort()) { yaml["damage"] = durability - json.remove("Damage") } // 附魔 if (hasEnchants()) { @@ -218,13 +212,11 @@ object ItemUtils { val namespacedKey = it.key.key if (namespacedKey.namespace == NamespacedKey.MINECRAFT) namespacedKey.key else namespacedKey.toString() }) - json.remove("Enchantments") } // flags val itemFlags = itemFlags if (itemFlags.isNotEmpty()) { yaml["flags"] = itemFlags.map { it.name } - json.remove("HideFlags") } when (this) { // 附魔书附魔 @@ -232,22 +224,13 @@ object ItemUtils { if (hasStoredEnchants()) { yaml.createSection("stored-enchants", storedEnchants.mapKeys { it.key.key }) - json.remove("StoredEnchantments") } - - // 头颅 - is SkullMeta -> { - val texture = NBTEditor.getTexture(this@toSection) - if (texture != null) yaml["skull"] = texture - else if (hasOwner()) yaml["skull-owner"] = owner - json.remove("SkullOwner") - } // 皮革 is LeatherArmorMeta -> yaml["color"] = color.toRGBString() // 药水 is PotionMeta -> { - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_9)) { + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_9_R1)) { yaml["base-effect"] = "${basePotionData.type.name},${basePotionData.isExtended},${basePotionData.isUpgraded}" if (customEffects.isNotEmpty()) @@ -257,9 +240,6 @@ object ItemUtils { val potion = Potion.fromItemStack(this@toSection) yaml["base-effect"] = "${potion.type.name},${potion.hasExtendedDuration()},${potion.isSplash}" } - json.remove("Potion") - json.remove("CustomPotionEffects") - json.remove("CustomPotionColor") } is BlockStateMeta -> { @@ -282,7 +262,6 @@ object ItemUtils { }.toBase64() } } - json.remove("BlockEntityTag") } is FireworkMeta -> { @@ -296,33 +275,28 @@ object ItemUtils { colors["base"] = effect.colors.map { it.toRGBString() } colors["fade"] = effect.fadeColors.map { it.toRGBString() } } - json.remove("Fireworks") } is BookMeta -> { val bookInfo = yaml.createSection("book") bookInfo["title"] = title bookInfo["author"] = author - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_9)) { + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_9_R1)) { bookInfo["generation"] = generation?.name } bookInfo["pages"] = pages - json.remove("generation") - json.remove("author") - json.remove("title") - json.remove("pages") } is MapMeta -> { val mapSection = yaml.createSection("map") mapSection["scaling"] = isScaling - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_11)) { + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_11_R1)) { if (hasLocationName()) mapSection["location"] = locationName if (hasColor()) { mapSection["color"] = color?.toRGBString() } } - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_14)) { + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_14_R1)) { if (hasMapView()) { val mapView: MapView = mapView!! val view = mapSection.createSection("view") @@ -334,40 +308,34 @@ object ItemUtils { view["unlimited-tracking"] = mapView.isUnlimitedTracking } } - json.remove("map") - json.remove("Decorations") } } //老版本刷怪蛋 1.13 以下 - if (NBTEditor.getMinecraftVersion().lessThanOrEqualTo(NBTEditor.MinecraftVersion.v1_13)) { - if (NBTEditor.getMinecraftVersion().lessThanOrEqualTo(NBTEditor.MinecraftVersion.v1_11)) { + if (!MinecraftVersion.isNewerThan(MinecraftVersion.MC1_13_R1)) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_11_R1)) { if (data is SpawnEgg) yaml["creature"] = (data as SpawnEgg).spawnedType.getName() } else if (this is SpawnEggMeta) { yaml["creature"] = spawnedType.getName() } - json.remove("EntityTag") } // 1.11以上 - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_11)) { + if (MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_11_R1)) { // 无法破坏 if (isUnbreakable) { yaml["unbreakable"] = true - json.remove("Unbreakable") } // 旗帜 if (this is BannerMeta) { yaml.createSection( "banner", patterns.associate { it.pattern.name to it.color.name }) - json.remove("Patterns") - } } // 1.14 以上 - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_14)) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_14_R1)) { if (hasAttributeModifiers()) { val mutableMapOf = mutableMapOf() attributeModifiers!!.forEach { t, u -> @@ -380,12 +348,10 @@ object ItemUtils { mutableMapOf[u.name] = serialize } yaml.createSection("attributes", mutableMapOf) - json.remove("AttributeModifiers") } // 模型 if (hasCustomModelData()) { yaml["custom-model-data"] = customModelData - json.remove("custom_model_data") } when (this) { //弩 @@ -394,8 +360,6 @@ object ItemUtils { for ((i, projectiles) in chargedProjectiles.withIndex()) { yaml["projectiles.$i"] = projectiles.toSection() } - json.remove("ChargedProjectiles") - json.remove("Charged") } } // 热带鱼桶 @@ -403,62 +367,26 @@ object ItemUtils { yaml["pattern"] = pattern.name yaml["color"] = bodyColor.name yaml["pattern-color"] = patternColor.name - json.remove("BucketVariantTag") - json.remove("EntityTag") } // 迷之炖菜 is SuspiciousStewMeta -> { yaml["effects"] = customEffects.map { it.toEffectString() } - json.remove("Effects") } } } } - if (NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_16) && this is CompassMeta - ) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_16_R1) && this is CompassMeta) { val subSection: ConfigurationSection = yaml.createSection("lodestone") subSection["tracked"] = isLodestoneTracked - json.remove("LodestoneTracked") if (hasLodestone()) { val location = lodestone subSection["location"] = location!!.toLocationString() } - json.remove("LodestoneDimension") - json.remove("LodestonePos") } - if (NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_17) && this is AxolotlBucketMeta - ) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_17_R1) && this is AxolotlBucketMeta) { if (hasVariant()) yaml["variant"] = variant.toString() - json.remove("Variant") - } - json.remove("display") - //写入数据 - if (json.isNotEmpty()) { - fun deepFor(map: Map<*, *>, config: ConfigurationSection) { - for ((k, v) in map) { - if (v is Map<*, *>) { - deepFor(v, config.createSection(k.toString())) - } else { - if ((v is Double) && (abs(v - Math.round(v)) < Double.MIN_VALUE)) { - config.set(k.toString(), v.toInt()) - } else if (v is String && v.endsWith('d')) { - val double = runCatching { - v.substring(0, v.length - 1).toDouble() - }.getOrNull() - if (double == null) config.set(k.toString(), v) - else - config.set(k.toString(), double) - } else { - config.set(k.toString(), v) - } - } - } - } - deepFor(json, yaml.createSection("nbt")) -// yaml["nbt"] = json } + return yaml } @@ -471,8 +399,6 @@ object ItemUtils { val material = Material.matchMaterial(mat) var item = material?.item ?: itemProviders.firstNotNullOfOrNull { it.provide(mat) } ?: return null //处理头颅 - val url = section.getString("skull") - if (url != null) item = NBTEditor.getHead(url) item.amount = section.getInt("amount", 1) item.durability = section.getInt("damage", 0).toShort() val subId = section.getInt("data", 0) @@ -503,15 +429,15 @@ object ItemUtils { is LeatherArmorMeta -> section.getString("color")?.also { setColor(fromColorStr(it)) } // 药水 is PotionMeta -> { - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_9)) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_19_R1)) { section.getString("base-effect")?.also { val split = it.trim().split(',') val type = runCatching { PotionType.valueOf(split[0].uppercase()) }.getOrElse { return@also } basePotionData = PotionData( type, - split.getOrNull(1)?.toBoolean() ?: false, - split.getOrNull(2)?.toBoolean() ?: false + split.getOrNull(1)?.toBoolean() == true, + split.getOrNull(2)?.toBoolean() == true ) } section.getStringList("effects").forEach { ef -> @@ -582,8 +508,7 @@ object ItemUtils { book.getString("author")?.also { author = it.toColor() } pages = book.getStringList("pages").toColor() } - if (book != null && NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_9) + if (book != null && !MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_19_R1) ) { book.getString("generation")?.also { generation = kotlin.runCatching { BookMeta.Generation.valueOf(it.uppercase()) }.getOrNull() @@ -594,14 +519,12 @@ object ItemUtils { is MapMeta -> { val mapSection = section.getConfigurationSection("map") isScaling = mapSection?.getBoolean("scaling") ?: false - if (mapSection != null && NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_11) + if (mapSection != null && !MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_11_R1) ) { mapSection.getString("location")?.also { locationName = it.toColor() } mapSection.getString("color")?.also { color = fromColorStr(it) } } - if (mapSection != null && NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_14) + if (mapSection != null && !MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_14_R1) ) { mapSection.getConfigurationSection("view")?.also { runCatching { @@ -618,8 +541,8 @@ object ItemUtils { } } } - if (NBTEditor.getMinecraftVersion().lessThanOrEqualTo(NBTEditor.MinecraftVersion.v1_13)) { - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_11)) { + if (!MinecraftVersion.isNewerThan(MinecraftVersion.MC1_13_R1)) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_11_R1)) { if (this is SpawnEggMeta) { val creatureName = section.getString("creature") if (creatureName != null) { @@ -643,8 +566,7 @@ object ItemUtils { } } } - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_14) - ) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_14_R1)) { val section2 = section.getConfigurationSection("attributes") section2?.getKeys(false)?.forEach { name -> val section3 = section2.getConfigurationSection(name)!! @@ -665,7 +587,7 @@ object ItemUtils { addAttributeModifier(attribute, AttributeModifier(uuid, name, amount, operation, slot)) } } - if (NBTEditor.getMinecraftVersion().greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_14)) { + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_14_R1)) { val modelData = section.getInt("custom-model-data") if (modelData != 0) setCustomModelData(modelData) if (this is CrossbowMeta) { @@ -692,8 +614,7 @@ object ItemUtils { setPattern(pattern) } } - if (NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_15) && this is SuspiciousStewMeta + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_15_R1) && this is SuspiciousStewMeta ) { for (effects in section.getStringList("effects")) { val fromEffectString = fromEffectString(effects) @@ -701,8 +622,7 @@ object ItemUtils { addCustomEffect(fromEffectString, true) } } - if (NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_16) && this is CompassMeta + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_16_R1) && this is CompassMeta ) { val lodestoneSection = section.getConfigurationSection("lodestone") @@ -712,8 +632,7 @@ object ItemUtils { } } - if (NBTEditor.getMinecraftVersion() - .greaterThanOrEqualTo(NBTEditor.MinecraftVersion.v1_17) && this is AxolotlBucketMeta + if (!MinecraftVersion.isAtLeastVersion(MinecraftVersion.MC1_17_R1) && this is AxolotlBucketMeta ) { val variantStr = section.getString("variant") if (variantStr != null) { @@ -725,31 +644,6 @@ object ItemUtils { } } - // 处理nbt - val nbtSection = section.getConfigurationSection("nbt") ?: return item - val map = mutableMapOf() - fun deepFor(config: ConfigurationSection, map: MutableMap) { - for ((key, value) in config.getValues(false)) { - if (value is ConfigurationSection) { - val newMap = mutableMapOf() - map[key] = newMap - deepFor(value, newMap) - continue - } - map[key] = value - } - } - deepFor(nbtSection, map) - val nbtCompound = NBTEditor.getNBTCompound(item, "tag") - map.forEach { (k, v) -> - if (v is Map<*, *>) { - val toJson = NBTCompound.fromJson(Gson().toJson(v)) - nbtCompound.set(toJson, k) - } else - nbtCompound.set(v, k) - } - item = NBTEditor.set(item, nbtCompound) -// println(NBTEditor.getNBTCompound(item, "tag").toJson()) return item } @@ -855,7 +749,7 @@ object ItemUtils { /** * 由json字符串转ItemStack */ - fun fromJson(json: String): ItemStack = NBTEditor.getItemFromTag(NBTEditor.getNBTCompound(json)) + fun fromJson(json: String): ItemStack? = NBT.itemStackFromNBT(NBT.parseNBT(json)) private fun Color.toRGBString(): String = "${red},${green},${blue}" private fun fromColorStr(str: String): Color { diff --git a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/MessageUtils.kt b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/MessageUtils.kt index 988cc0d..43742fb 100644 --- a/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/MessageUtils.kt +++ b/core/src/main/kotlin/top/iseason/bukkittemplate/utils/bukkit/MessageUtils.kt @@ -121,8 +121,8 @@ object MessageUtils { val dd = BukkitTemplate.getRuntimeManager() .addRepository("https://maven.aliyun.com/repository/public") .addRepository("https://repo.maven.apache.org/maven2/") - dd.addDependency("net.kyori:adventure-platform-bukkit:4.3.0", 4) - dd.addDependency("net.kyori:adventure-text-minimessage:4.13.0", 1) + dd.addDependency("net.kyori:adventure-platform-bukkit:4.3.2", 4) + dd.addDependency("net.kyori:adventure-text-minimessage:4.14.0", 1) dd.downloadAll() audiences = BukkitAudiences.create(BukkitTemplate.getPlugin()) miniMessageLoaded = true diff --git a/gradle.properties b/gradle.properties index 787620e..2185eeb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,25 +2,26 @@ pluginName=SakuraCDK group=top.iseason.bukkit.sakuracdk author=Iseason -jarOutputFile=build -version=1.0.6 +jarOutputFile=${root}/build +version=1.0.7 # api设置 -kotlinVersion=1.9.0 -shadowJarVersion=8.1.1 -nbtEditorVersion=7.18.6 +kotlinVersion=2.0.20 +shadowJarVersion=8.3.0 + # 编译设置 -# 是否混淆 +## 是否混淆 obfuscated=false ## 混淆的词典,留空默认使用 a-Z obfuscatedDictionary=proguard-dictionary\\iIl-dictionary.txt -# 是否删除未使用代码 +## 是否删除未使用代码 shrink=true -# exposed 数据库框架版本 -exposedVersion=0.42.0 +## exposed 数据库框架版本 +exposedVersion=0.53.0 kotlin.code.style=official kotlin.incremental=true kotlin.incremental.java=true kotlin.caching.enabled=true kotlin.parallel.tasks.in.project=true org.gradle.caching=true -org.gradle.parallel=true \ No newline at end of file +org.gradle.parallel=true +org.gradle.jvmargs=-Xmx1024m \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 38966c2..90d9697 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=50000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 5fccd74..b1606fa 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -1,9 +1,12 @@ plugins { kotlin("jvm") + id("com.gradleup.shadow") } -repositories { - mavenCentral() +buildscript { + dependencies { + classpath("com.guardsquare:proguard-gradle:7.5.0") + } } dependencies { @@ -18,24 +21,18 @@ dependencies { // 本地依赖放在libs文件夹内 compileOnly(fileTree("libs") { include("*.jar") }) compileOnly("fr.xephi:authme:5.6.0-SNAPSHOT") { isTransitive = false } - implementation("org.bstats:bstats-bukkit:3.0.1") + implementation("org.bstats:bstats-bukkit:3.0.2") } // 插件名称,请在gradle.properties 修改 val pluginName: String by rootProject //包名,请在gradle.properties 修改 -val group: String by rootProject -val groupS = group +//val group: String by rootProject +val groupS = project.group as String // 作者,请在gradle.properties 修改 val author: String by rootProject // jar包输出路径,请在gradle.properties 修改 val jarOutputFile: String by rootProject -//插件版本,请在gradle.properties 修改 -val version: String by rootProject -// shadowJar 版本 ,请在gradle.properties 修改 -val shadowJar: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar by tasks -// exposed 数据库框架版本,请在gradle.properties 修改 -val exposedVersion: String by rootProject val obfuscated: String by rootProject val obfuscatedDictionary: String by rootProject val obfuscationDictionaryFile: File? = if (obfuscatedDictionary.isEmpty()) null @@ -47,28 +44,36 @@ val obfuscatedMainClass = } else "a" val isObfuscated = obfuscated == "true" val shrink: String by rootProject -val defaultFile = File("../build", "${rootProject.name}-${rootProject.version}.jar") +val formatJarOutput = jarOutputFile.replace("\${root}", rootProject.projectDir.absolutePath) val output: File = if (isObfuscated) - File(jarOutputFile, "${rootProject.name}-${rootProject.version}-obfuscated.jar").absoluteFile + File(formatJarOutput, "${rootProject.name}-${rootProject.version}-obfuscated.jar").absoluteFile else - File(jarOutputFile, "${rootProject.name}-${rootProject.version}.jar").absoluteFile + File(formatJarOutput, "${rootProject.name}-${rootProject.version}.jar").absoluteFile tasks { + compileJava { + options.encoding = "UTF-8" + } + java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(8)) + } + } + kotlin { + jvmToolchain(8) + } + shadowJar { if (isObfuscated) { relocate("top.iseason.bukkittemplate.BukkitTemplate", obfuscatedMainClass) } relocate("top.iseason.bukkittemplate", "$groupS.libs.core") relocate("org.bstats", "$groupS.libs.bstats") - relocate("io.github.bananapuncher714.nbteditor", "$groupS.libs.nbteditor") } build { dependsOn("buildPlugin") } - compileKotlin { - kotlinOptions.jvmTarget = "1.8" - } processResources { filesMatching("plugin.yml") { // 删除注释,你可以返回null以删除整行,但是IDEA有bug会报错,故而返回了"" @@ -82,7 +87,6 @@ tasks { "author" to author, "kotlinVersion" to getProperties("kotlinVersion"), "exposedVersion" to getProperties("exposedVersion"), - "nbtEditorVersion" to getProperties("nbtEditorVersion") ) } } @@ -124,7 +128,7 @@ tasks.register("buildPlugin") { //class规则 if (isObfuscated) keep(allowObf, "class $obfuscatedMainClass {}") else keep("class $groupS.libs.core.BukkitTemplate {}") - keep("class kotlin.Metadata {}") + keepkotlinmetadata() keep(allowObf, "class * implements $groupS.libs.core.BukkitPlugin {*;}") keepclassmembers("class * extends $groupS.libs.core.config.SimpleYAMLConfig {*;}") keepclassmembers("class * implements $groupS.libs.core.ui.container.BaseUI {*;}") diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/AdminCommands.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/AdminCommands.kt index 11d71fd..cbea945 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/AdminCommands.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/AdminCommands.kt @@ -61,22 +61,17 @@ fun cdkAdminCommands() { default = PermissionDefault.OP async = true description = "将数据同步至数据库" - params = listOf(Param("", listOf("all", "random", "cdk", "kit"))) + params = listOf(Param("", listOf("all", "random", "normal", "cdks", "kits"))) executor { params, sender -> - val option = params.nextOrNull() ?: "all" + val option = params.nextOrNull()?.lowercase() ?: "all" sender.sendColorMessage("&6开始上传数据...") try { when (option) { - "random" -> { - CDKsYml.onDisable() - CDKsYml.updateRandomData() - } - - "cdk" -> CDKsYml.updateAllData() - "kit" -> KitsYml.updateData() + "random" -> CDKsYml.updateRandomData() + "normal" -> CDKsYml.updateNormalData() + "cdks" -> CDKsYml.updateAllData() + "kits" -> KitsYml.updateData() else -> { - CDKsYml.onDisable() - CDKsYml.updateRandomData() CDKsYml.updateAllData() KitsYml.updateData() } @@ -131,6 +126,7 @@ fun cdkAdminCommands() { KitsYml.load() CDKsYml.load() RewardsYml.load() + Lang.load() sender.sendColorMessage(Lang.command__reload) } } diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/CDKCommand.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/CDKCommand.kt index c173a9b..80b507e 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/CDKCommand.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/CDKCommand.kt @@ -3,14 +3,13 @@ package top.iseason.bukkit.sakuracdk.commands import org.bukkit.permissions.PermissionDefault import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.count -import org.jetbrains.exposed.sql.insert -import org.jetbrains.exposed.sql.select -import top.iseason.bukkit.sakuracdk.SakuraCDK +import org.jetbrains.exposed.sql.selectAll import top.iseason.bukkit.sakuracdk.Utils import top.iseason.bukkit.sakuracdk.config.Config import top.iseason.bukkit.sakuracdk.entity.CDKs import top.iseason.bukkit.sakuracdk.entity.NormalCDK import top.iseason.bukkit.sakuracdk.entity.RandomCDK +import top.iseason.bukkit.sakuracdk.entity.RandomCDKYml import top.iseason.bukkit.sakuracdk.entity.Records import top.iseason.bukkittemplate.command.CommandNode import top.iseason.bukkittemplate.command.CommandNodeExecutor @@ -19,10 +18,6 @@ import top.iseason.bukkittemplate.command.ParmaException import top.iseason.bukkittemplate.config.dbTransaction import top.iseason.bukkittemplate.utils.bukkit.MessageUtils.sendColorMessage import top.iseason.bukkittemplate.utils.bukkit.MessageUtils.sendColorMessages -import java.io.BufferedWriter -import java.io.File -import java.io.FileOutputStream -import java.io.OutputStreamWriter object CDKCreateNode : CommandNode( "randomCDK", @@ -34,29 +29,18 @@ object CDKCreateNode : CommandNode( override var onExecute: CommandNodeExecutor? = CommandNodeExecutor { params, sender -> val id = params.next() val amount = params.next() - val file = File(SakuraCDK.javaPlugin.dataFolder, "random${File.separatorChar}${id}.txt") - if (file.exists()) throw ParmaException("&c文件已存在!") + dbTransaction { - if (!CDKs.select { CDKs.group eq id }.limit(1).empty()) { + if (!CDKs.select(CDKs.group).where { CDKs.group eq id }.limit(1).empty()) { throw ParmaException("&c文件已存在!") } } - file.parentFile.mkdirs() - file.createNewFile() - BufferedWriter(OutputStreamWriter(FileOutputStream(file))).use { bw -> - dbTransaction { - repeat(amount) { - val replaceRandom = Utils.replaceRandom(Config.cdkTemplate) - bw.write(replaceRandom) - bw.newLine() - CDKs.insert { - it[CDKs.id] = replaceRandom - it[CDKs.group] = id - it[CDKs.type] = "random" - } - } - } + val list = ArrayList(amount) + repeat(amount) { + val replaceRandom = Utils.replaceRandom(Config.cdkTemplate) + list.add(replaceRandom) } + RandomCDKYml.saveTxt(id, list) sender.sendColorMessage("文件已创建!") } } @@ -72,15 +56,15 @@ object CDKInfoNode : CommandNode( val cdk = params.next() val mutableListOf = mutableListOf() dbTransaction { - val cdks = CDKs.select { CDKs.id eq cdk }.limit(1).firstOrNull() ?: throw ParmaException("&6cdk不存在") + val cdks = CDKs.selectAll().where { CDKs.id eq cdk }.limit(1).firstOrNull() + ?: throw ParmaException("&6cdk不存在") mutableListOf.add("&aCDK: &6${cdk}") val group = cdks[CDKs.group] val type = cdks[CDKs.type] if (type == "random") { - val findById = RandomCDK.findById(group) ?: throw ParmaException("cdk不存在") - val count = - CDKs.slice(CDKs.id.count()).select { CDKs.group eq group and (CDKs.type eq "random") } - .first()[CDKs.id.count()] + val findById = RandomCDK.findById(group) ?: throw ParmaException("&6cdk不存在") + val count = CDKs.select(CDKs.id.count()).where { CDKs.group eq group and (CDKs.type eq "random") } + .first()[CDKs.id.count()] mutableListOf.add("&a类型: &6random") mutableListOf.add("&a群组: &6$group") mutableListOf.add("&a余量: &6$count") @@ -88,8 +72,8 @@ object CDKInfoNode : CommandNode( mutableListOf.add("&a礼包: &6${findById.kits}") } else if (type == "normal") { val findById = NormalCDK.findById(group) ?: throw ParmaException("cdk不存在") - val count = Records.slice(Records.id.count()).select { Records.group eq group } - .first()[Records.id.count()] + val count = + Records.select(Records.id.count()).where { Records.group eq group }.first()[Records.id.count()] mutableListOf.add("&a类型: &6normal") mutableListOf.add("&a总量: &6${findById.amount}") mutableListOf.add("&a余量: &6${findById.amount - count}") diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/KitCommand.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/KitCommand.kt index 4ffcb6d..88c2d73 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/KitCommand.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/KitCommand.kt @@ -38,7 +38,7 @@ object KitCreateNode : CommandNode( val time = params.next() val expires = try { LocalDateTime.parse(time, DateTimeFormatter.ISO_LOCAL_DATE_TIME) - } catch (e: Exception) { + } catch (_: Exception) { Utils.parseTimeAfter(time) } val kitYml = KitYml(id, LocalDateTime.now(), expires) diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/UserCommand.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/UserCommand.kt index 69f2eee..efc228e 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/UserCommand.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/commands/UserCommand.kt @@ -6,7 +6,7 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.count import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.selectAll import top.iseason.bukkit.sakuracdk.config.Config import top.iseason.bukkit.sakuracdk.config.Lang import top.iseason.bukkit.sakuracdk.entity.* @@ -44,7 +44,7 @@ fun userCommand() { val uniqueId = player.uniqueId var groupTemp: String? dbTransaction { - val cdkResult = CDKs.select { CDKs.id eq cdk }.limit(1).firstOrNull() + val cdkResult = CDKs.selectAll().where { CDKs.id eq cdk }.limit(1).firstOrNull() ?: throw ParmaException(Lang.command__user_cdk_unexist) val group = cdkResult[CDKs.group] groupTemp = group @@ -60,25 +60,26 @@ fun userCommand() { else -> throw ParmaException(Lang.command__user_cdk_unexist) } - if (cdkYml!!.checkExpire()) throw ParmaException(Lang.command__user_cdk_is_expire) + if (cdkYml.checkExpire()) throw ParmaException(Lang.command__user_cdk_is_expire) //检查重复领取 - if (!cdkYml!!.allowRepeat()) { - if (!Records.select { Records.group eq group and (Records.uid eq uniqueId) }.limit(1).empty()) { + if (!cdkYml.allowRepeat()) { + if (!Records.select(Records.group).where { Records.group eq group and (Records.uid eq uniqueId) } + .limit(1).empty()) { throw ParmaException(Lang.command__user_has_accepted) } if (cdkYml is NormalCDKYml) { - val exist = Records.slice(Records.id.count()).select { Records.group eq group } + val exist = Records.select(Records.id.count()).where { Records.group eq group } .first()[Records.id.count()] if (exist >= (cdkYml as NormalCDKYml).amount) throw ParmaException(Lang.command__user_normal_brought_out) } } - val cdkAcceptEvent = CDKAcceptEvent(player, cdkYml!!) + val cdkAcceptEvent = CDKAcceptEvent(player, cdkYml) Bukkit.getPluginManager().callEvent(cdkAcceptEvent) if (cdkAcceptEvent.isCancelled) throw ParmaException("领取失败!") Record.new { this.uid = uniqueId this.cdk = cdk - this.group = groupTemp!! + this.group = groupTemp this.acceptTime = LocalDateTime.now() } if (type == "random") { @@ -89,7 +90,7 @@ fun userCommand() { if (cdkYml == null) throw ParmaException(Lang.command__user_cdk_unexist) //发放礼品 submit { - if (!cdkYml!!.applyPlayer(player)) { + if (!cdkYml.applyPlayer(player)) { player.sendColorMessage(Lang.command__user_kit_is_expire) } else { player.sendColorMessage(Lang.command__user_success) diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/config/CDKsYml.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/config/CDKsYml.kt index edc63dc..8edc746 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/config/CDKsYml.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/config/CDKsYml.kt @@ -3,17 +3,14 @@ package top.iseason.bukkit.sakuracdk.config import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.file.YamlConfiguration import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq +import org.jetbrains.exposed.sql.batchInsert import org.jetbrains.exposed.sql.deleteAll import org.jetbrains.exposed.sql.deleteWhere -import org.jetbrains.exposed.sql.insert -import top.iseason.bukkit.sakuracdk.SakuraCDK import top.iseason.bukkit.sakuracdk.entity.* +import top.iseason.bukkit.sakuracdk.entity.NormalCDKYml import top.iseason.bukkittemplate.config.SimpleYAMLConfig import top.iseason.bukkittemplate.config.annotations.FilePath import top.iseason.bukkittemplate.config.dbTransaction -import java.io.BufferedReader -import java.io.File -import java.io.FileReader @FilePath("cdk.yml") object CDKsYml : SimpleYAMLConfig() { @@ -35,54 +32,75 @@ object CDKsYml : SimpleYAMLConfig() { } } - //将CDK数据上传数据库 - fun uploadAll() { - try { - for (cdkGroup in cdkCache.values) { - cdkGroup.upLoadData() - } - } catch (e: Exception) { - e.printStackTrace() - } - } - fun updateAllData() { dbTransaction { - NormalCDKs.deleteAll() - RandomCDKs.deleteAll() + CDKs.deleteAll() + updateNormalDataT() + updateRandomDataT() } - uploadAll() } /** - * 将随机key同步至数据库 + * 将配置的随机key同步至数据库 */ fun updateRandomData() { dbTransaction { CDKs.deleteWhere { type eq "random" } - val file = File(SakuraCDK.javaPlugin.dataFolder, "random") - if (!file.exists()) return@dbTransaction - file.listFiles()?.forEach { - if (!it.isFile) return@forEach - var name = it.name - if (!name.endsWith(".txt")) return@forEach - name = name.removeSuffix(".txt") - BufferedReader(FileReader(it)).use { br -> - br.lines().forEach forEach2@{ cdk -> - val cdkStr = cdk.trim() - if (cdkStr.isBlank()) return@forEach2 - CDKs.insert { cdks -> - cdks[CDKs.id] = cdkStr - cdks[group] = name - cdks[type] = "random" - } - } - } - } + updateRandomDataT() + } + } + + fun updateRandomDataT() { + val values = cdkCache.values + val randoms = values.filterIsInstance() + RandomCDKs.deleteAll() + val hashMapOf = hashMapOf>() + RandomCDKs.batchInsert(randoms) { + this[RandomCDKs.id] = it.id + this[RandomCDKs.expire] = it.expire + this[RandomCDKs.kits] = it.getKitsString() + this[RandomCDKs.repeat] = it.allowRepeat() + hashMapOf[it.id] = it.cdkSet + } + val flatMap = hashMapOf.flatMap { (group, cdks) -> + cdks.map { it to group } + } + CDKs.batchInsert(flatMap) { + this[CDKs.id] = it.first + this[CDKs.group] = it.second + this[CDKs.type] = "random" } } - //将CDK数据下载至本地 + /** + * 将配置的随机key同步至数据库 + */ + fun updateNormalData() { + dbTransaction { + CDKs.deleteWhere { type eq "normal" } + updateNormalDataT() + } + } + + fun updateNormalDataT() { + val values = cdkCache.values + val normals = values.filterIsInstance() + NormalCDKs.deleteAll() + NormalCDKs.batchInsert(normals) { + this[NormalCDKs.id] = it.id + this[NormalCDKs.expire] = it.expire + this[NormalCDKs.kits] = it.getKitsString() + this[NormalCDKs.amount] = it.amount + } + CDKs.batchInsert(normals) { + this[CDKs.id] = it.id + this[CDKs.group] = it.id + this[CDKs.type] = "normal" + } + + } + + //将CDK配置下载至本地 fun downloadAll() { dbTransaction { for (normalCDK in NormalCDK.all()) { diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/BaseCDK.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/BaseCDK.kt index 6f9cca1..1e3d5bd 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/BaseCDK.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/BaseCDK.kt @@ -12,7 +12,6 @@ abstract class BaseCDK( abstract fun toSection(section: ConfigurationSection) abstract fun getCDKs(): List abstract fun allowRepeat(): Boolean - abstract fun upLoadData() /** * 检查是否过期 diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/CDKs.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/CDKs.kt index 96d961c..88a566e 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/CDKs.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/CDKs.kt @@ -1,6 +1,5 @@ package top.iseason.bukkit.sakuracdk.entity -import org.jetbrains.exposed.sql.select import top.iseason.bukkittemplate.config.StringIdTable import top.iseason.bukkittemplate.config.dbTransaction @@ -13,14 +12,11 @@ object CDKs : StringIdTable() { val mutableListOf = mutableMapOf>() //查询数据 dbTransaction { - CDKs.select { type eq "random" }.forEach { + CDKs.select(CDKs.id, group).where { type eq "random" }.forEach { val group = it[group] - var strings = mutableListOf[group] - if (strings == null) { - strings = mutableListOf() - mutableListOf[group] = strings - } - strings.add(it[CDKs.id].value) + mutableListOf + .computeIfAbsent(group) { mutableListOf() } + .add(it[CDKs.id].value) } } mutableListOf.forEach { (group, cdks) -> diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Kits.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Kits.kt index 03ccda5..c262d53 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Kits.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Kits.kt @@ -2,7 +2,6 @@ package top.iseason.bukkit.sakuracdk.entity import org.jetbrains.exposed.dao.id.IdTable import org.jetbrains.exposed.sql.javatime.datetime -import org.jetbrains.exposed.sql.select import top.iseason.bukkittemplate.config.StringIdTable import top.iseason.bukkittemplate.config.dbTransaction import java.time.LocalDateTime @@ -20,7 +19,7 @@ fun > IdTable.has(id: T): Boolean { return try { var has = false dbTransaction { - has = !this@has.slice(this@has.id).select { this@has.id eq id }.limit(1).empty() + has = !this@has.select(this@has.id).where { this@has.id eq id }.empty() } has } catch (e: Exception) { diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/NormalCDKYml.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/NormalCDKYml.kt index 692374f..757ce40 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/NormalCDKYml.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/NormalCDKYml.kt @@ -2,7 +2,6 @@ package top.iseason.bukkit.sakuracdk.entity import org.bukkit.configuration.ConfigurationSection import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.javatime.datetime import top.iseason.bukkit.sakuracdk.config.CDKsYml import top.iseason.bukkit.sakuracdk.config.KitsYml @@ -21,31 +20,6 @@ class NormalCDKYml( kits: List ) : BaseCDK(id, expire, kits) { - override fun upLoadData() { - dbTransaction { - val findById = NormalCDK.findById(this@NormalCDKYml.id) - if (findById != null) { - findById.expire = this@NormalCDKYml.expire - findById.kits = getKitsString() - findById.amount = this@NormalCDKYml.amount - return@dbTransaction - } - NormalCDK.new(this@NormalCDKYml.id) { - this.expire = this@NormalCDKYml.expire - this.kits = getKitsString() - this.amount = this@NormalCDKYml.amount - } - if (!CDKs.has(this@NormalCDKYml.id)) { - CDKs.insert { - it[CDKs.id] = this@NormalCDKYml.id - it[CDKs.group] = this@NormalCDKYml.id - it[CDKs.type] = "normal" - } - } - } - } - - override fun toSection(section: ConfigurationSection) { section["type"] = "normal" section["amount"] = amount diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/RandomCDKYml.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/RandomCDKYml.kt index 612943f..ff8051b 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/RandomCDKYml.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/RandomCDKYml.kt @@ -5,7 +5,6 @@ import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.deleteWhere import org.jetbrains.exposed.sql.javatime.datetime -import org.jetbrains.exposed.sql.select import top.iseason.bukkit.sakuracdk.SakuraCDK import top.iseason.bukkit.sakuracdk.config.CDKsYml import top.iseason.bukkit.sakuracdk.config.KitsYml @@ -28,24 +27,6 @@ class RandomCDKYml( var allowRepeat = false - override fun upLoadData() { - dbTransaction { - val findById = RandomCDK.findById(group) - if (findById != null) { - findById.expire = this@RandomCDKYml.expire - findById.kits = getKitsString() - findById.repeat = this@RandomCDKYml.allowRepeat - return@dbTransaction - } - RandomCDK.new(group) { - this.expire = this@RandomCDKYml.expire - this.kits = getKitsString() - this.repeat = this@RandomCDKYml.allowRepeat - } - } - } - - fun removeCDK(cdk: String) { cdkSet.remove(cdk) dbTransaction { @@ -139,7 +120,7 @@ class RandomCDK(id: EntityID) : StringEntity(id) { val findById = Kit.findById(s) ?: continue kitYmls.add(findById.toKitYml()) } - cdks = CDKs.slice(CDKs.id).select { CDKs.group eq group }.map { it[CDKs.id].value }.toHashSet() + cdks = CDKs.select(CDKs.id).where { CDKs.group eq group }.map { it[CDKs.id].value }.toHashSet() } } val randomCDKYml = RandomCDKYml(group, expire, kitYmls, cdks) diff --git a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Rewards.kt b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Rewards.kt index f33e2b6..3d08e47 100644 --- a/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Rewards.kt +++ b/plugin/src/main/kotlin/top.iseason.bukkit/sakuracdk/entity/Rewards.kt @@ -6,7 +6,6 @@ import org.bukkit.entity.Player import org.bukkit.scheduler.BukkitTask import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.count -import org.jetbrains.exposed.sql.select import top.iseason.bukkittemplate.config.dbTransaction import top.iseason.bukkittemplate.hook.PlaceHolderHook import top.iseason.bukkittemplate.utils.bukkit.MessageUtils.sendColorMessages @@ -28,12 +27,12 @@ data class Rewards( fun applyOnLogin(player: Player) { val total = dbTransaction { - Records.slice(Records.id.count()).select { Records.group eq this@Rewards.id } + Records.select(Records.id.count()).where { Records.group eq this@Rewards.id } .first()[Records.id.count()] }.toInt() val accepted = dbTransaction { - RewardRecords.slice(RewardRecords.count) - .select { RewardRecords.group eq this@Rewards.id and (RewardRecords.player eq player.name) } + RewardRecords.select(RewardRecords.count) + .where { RewardRecords.group eq this@Rewards.id and (RewardRecords.player eq player.name) } .firstOrNull()?.get(RewardRecords.count) ?: 0 } if (accepted >= total) return diff --git a/settings.gradle.kts b/settings.gradle.kts index 7bb8c12..25f2ecc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,3 @@ -val pluginName: String by settings -rootProject.name = pluginName - pluginManagement { //kotlin 版本 val kotlinVersion: String by settings @@ -8,7 +5,13 @@ pluginManagement { val shadowJarVersion: String by settings plugins { kotlin("jvm") version kotlinVersion - id("com.github.johnrengelman.shadow") version shadowJarVersion + id("com.gradleup.shadow") version shadowJarVersion } } + +val pluginName: String by settings + +rootProject.name = pluginName + include("core", "plugin") +