From 33c219759a1b5bd40c2309b6212fab5f83c92778 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sun, 22 Feb 2026 06:20:50 -0500 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9D=82=E9=A1=B9=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 代码清理 - 提升 Folia 兼容性 - 使用 Configlib 重构 `config.yml` 和 `lang.yml` 配置 - 语言文件使用 Minimessage 格式 --- build.gradle.kts | 21 +++++-- gradle/libs.versions.toml | 4 ++ .../playeridcounter/PlayerIDCounter.kt | 60 ++++++------------- .../playeridcounter/config/Config.kt | 54 +++++++++++++++++ .../crashvibe/playeridcounter/config/Lang.kt | 11 ++++ .../playeridcounter/config/PluginConfig.kt | 16 +++++ .../hooks/IDPlaceholderExpansion.kt | 6 +- .../listener/PlayerListener.kt | 23 ++++--- .../crashvibe/playeridcounter/util/Util.kt | 13 +--- src/main/resources/config.yml | 2 - src/main/resources/lang.yml | 4 -- 11 files changed, 135 insertions(+), 79 deletions(-) create mode 100644 src/main/kotlin/org/crashvibe/playeridcounter/config/Config.kt create mode 100644 src/main/kotlin/org/crashvibe/playeridcounter/config/Lang.kt create mode 100644 src/main/kotlin/org/crashvibe/playeridcounter/config/PluginConfig.kt delete mode 100644 src/main/resources/config.yml delete mode 100644 src/main/resources/lang.yml diff --git a/build.gradle.kts b/build.gradle.kts index 51aa3c6..62a21aa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin("jvm") version "2.3.10" + id("com.gradleup.shadow") version "9.3.1" `maven-publish` } @@ -16,11 +17,18 @@ repositories { maven { url = uri("https://repo.helpch.at/releases/") } + + maven { + url = uri("https://repo.tcoded.com/releases/") + } } dependencies { compileOnly(libs.io.papermc.paper.api) compileOnly(libs.me.clip.placeholderapi) + + implementation(libs.de.exlll.configlib.yaml) + implementation(libs.com.tcoded.foliaLib) } tasks { @@ -32,13 +40,18 @@ tasks { options.encoding = "UTF-8" } - jar { - from(configurations.runtimeClasspath.get().map { zipTree(it) }) - duplicatesStrategy = DuplicatesStrategy.EXCLUDE + shadowJar { + archiveFileName.set("${rootProject.name}-${project.version}.${archiveExtension.get()}") + exclude("META-INF/**") + minimize { + exclude(dependency("com.tcoded:FoliaLib:.*")) + } + relocate("de.exlll.configlib", "${project.group}.libs.configlib") + relocate("com.tcoded.folialib", "${project.group}.libs.folialib") } build { - dependsOn(jar) + dependsOn(shadowJar) } kotlin { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bc371de..8bd849f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,11 @@ [versions] me-clip-placeholderapi = "2.12.2" io-papermc-paper-api = "1.21.11-R0.1-SNAPSHOT" +de-exlll-configlib-yaml = "4.8.1" +com-tcoded-foliaLib = "0.5.1" [libraries] me-clip-placeholderapi = { module = "me.clip:placeholderapi", version.ref = "me-clip-placeholderapi" } io-papermc-paper-api = { module = "io.papermc.paper:paper-api", version.ref = "io-papermc-paper-api" } +de-exlll-configlib-yaml = { module = "de.exlll:configlib-yaml", version.ref = "de-exlll-configlib-yaml" } +com-tcoded-foliaLib = { module = "com.tcoded:FoliaLib", version.ref = "com-tcoded-foliaLib" } diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/PlayerIDCounter.kt b/src/main/kotlin/org/crashvibe/playeridcounter/PlayerIDCounter.kt index 49435e9..cd7176e 100644 --- a/src/main/kotlin/org/crashvibe/playeridcounter/PlayerIDCounter.kt +++ b/src/main/kotlin/org/crashvibe/playeridcounter/PlayerIDCounter.kt @@ -1,38 +1,33 @@ package org.crashvibe.playeridcounter +import com.tcoded.folialib.FoliaLib +import net.kyori.adventure.text.logger.slf4j.ComponentLogger import org.bukkit.Bukkit -import org.bukkit.configuration.file.FileConfiguration -import org.bukkit.configuration.file.YamlConfiguration -import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin +import org.crashvibe.playeridcounter.config.Config +import org.crashvibe.playeridcounter.config.Config.getLang import org.crashvibe.playeridcounter.hooks.IDPlaceholderExpansion import org.crashvibe.playeridcounter.listener.PlayerListener -import org.crashvibe.playeridcounter.util.Util.getLang -import java.io.File -import java.io.IOException import java.util.UUID import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicInteger import java.util.function.Consumer -class PlayerIDCounter : JavaPlugin(), Listener { - - lateinit var playersConfigFile: File - lateinit var playersConfig: FileConfiguration - lateinit var langConfig: FileConfiguration +class PlayerIDCounter : JavaPlugin() { override fun onEnable() { instance = this + foliaLib = FoliaLib(instance) - initFiles() // 初始化文件 + Config.init(dataPath) // 初始化文件 playerIds = ConcurrentHashMap() - nextId = AtomicInteger(playersConfig.getInt("next-id", 1)) + nextId = AtomicInteger(Config.playersConfig.getInt("next-id", 1)) - playersConfig.getKeys(false).forEach(Consumer { key: String? -> + Config.playersConfig.getKeys(false).forEach(Consumer { key: String -> if (key != "next-id") { val uuid = UUID.fromString(key) - val id = playersConfig.getInt(key!!) + val id = Config.playersConfig.getInt(key) playerIds[uuid] = id // 加载玩家ID } }) @@ -42,43 +37,22 @@ class PlayerIDCounter : JavaPlugin(), Listener { if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { IDPlaceholderExpansion(instance).register() // 注册PlaceholderAPI } else { - logger.warning(getLang("papi_not_found")) + LOGGER.warn(getLang(Config.langData.papiNotFound)) } - logger.info(getLang("plugin_enabled")) // 插件启用 + LOGGER.info(getLang(Config.langData.pluginEnabled)) // 插件启用 } override fun onDisable() { - savePlayerData() // 保存玩家数据 - logger.info(getLang("plugin_disabled")) // 插件禁用 - } - - private fun initFiles() { - saveDefaultConfig() - - playersConfigFile = File(dataFolder, "players.yml") - if (!playersConfigFile.exists()) { - saveResource("players.yml", false) // 初始化players.yml - } - playersConfig = YamlConfiguration.loadConfiguration(playersConfigFile) - - val langFile = File(dataFolder, "lang.yml") - if (!langFile.exists()) { - saveResource("lang.yml", false) // 初始化lang.yml - } - langConfig = YamlConfiguration.loadConfiguration(langFile) - } - - fun savePlayerData() { - try { - playersConfig.save(playersConfigFile) // 保存玩家数据 - } catch (e: IOException) { - logger.severe("无法保存玩家数据到 players.yml!错误: " + e.message) - } + Config.savePlayerData() // 保存玩家数据 + LOGGER.info(getLang(Config.langData.pluginDisabled)) // 插件禁用 } companion object { + val LOGGER: ComponentLogger = ComponentLogger.logger(PlayerIDCounter::class.java.simpleName) + lateinit var instance: PlayerIDCounter + lateinit var foliaLib: FoliaLib lateinit var playerIds: ConcurrentHashMap lateinit var nextId: AtomicInteger diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/config/Config.kt b/src/main/kotlin/org/crashvibe/playeridcounter/config/Config.kt new file mode 100644 index 0000000..c8952db --- /dev/null +++ b/src/main/kotlin/org/crashvibe/playeridcounter/config/Config.kt @@ -0,0 +1,54 @@ +package org.crashvibe.playeridcounter.config + +import de.exlll.configlib.YamlConfigurations +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.Component.text +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.configuration.file.FileConfiguration +import org.bukkit.configuration.file.YamlConfiguration +import org.crashvibe.playeridcounter.PlayerIDCounter +import org.crashvibe.playeridcounter.PlayerIDCounter.Companion.instance +import java.io.File +import java.io.IOException +import java.nio.file.Path + +object Config { + + lateinit var configData: PluginConfig + private set + lateinit var langData: Lang + private set + lateinit var playersConfigFile: File + lateinit var playersConfig: FileConfiguration + + fun init(configFile: Path) { + configData = YamlConfigurations.update( + configFile.resolve("config.yml"), // 初始化 config.yml + PluginConfig::class.java, + ) + langData = YamlConfigurations.update( + configFile.resolve("lang.yml"), // 初始化 lang.yml + Lang::class.java, + ) + + instance.saveDefaultConfig() + + playersConfigFile = File(instance.dataFolder, "players.yml") + if (!playersConfigFile.exists()) { + instance.saveResource("players.yml", false) // 初始化 players.yml + } + playersConfig = YamlConfiguration.loadConfiguration(playersConfigFile) + } + + fun savePlayerData() { + try { + playersConfig.save(playersConfigFile) // 保存玩家数据 + } catch (e: IOException) { + PlayerIDCounter.LOGGER.error(text("无法保存玩家数据到 players.yml!错误: "), e) + } + } + + fun getLang(key: String): Component { + return MiniMessage.miniMessage().deserialize(key) // 获取语言配置 + } +} diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/config/Lang.kt b/src/main/kotlin/org/crashvibe/playeridcounter/config/Lang.kt new file mode 100644 index 0000000..67b4f9a --- /dev/null +++ b/src/main/kotlin/org/crashvibe/playeridcounter/config/Lang.kt @@ -0,0 +1,11 @@ +package org.crashvibe.playeridcounter.config + +import de.exlll.configlib.Configuration + +@Configuration +data class Lang( + var pluginEnabled: String = "插件已启用!", + var pluginDisabled: String = "插件已禁用!", + var papiNotFound: String = "PlaceholderAPI 未找到,功能可能无法使用!", + var welcomeMessage: String = "欢迎!你的ID是:{id}" +) diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/config/PluginConfig.kt b/src/main/kotlin/org/crashvibe/playeridcounter/config/PluginConfig.kt new file mode 100644 index 0000000..aed1b1a --- /dev/null +++ b/src/main/kotlin/org/crashvibe/playeridcounter/config/PluginConfig.kt @@ -0,0 +1,16 @@ +package org.crashvibe.playeridcounter.config + +import de.exlll.configlib.Configuration + +/** + * 插件配置数据结构 + */ +@Configuration +data class PluginConfig( + var settings: Settings = Settings(), +) { + @Configuration + data class Settings( + var debug: Boolean = false, + ) +} diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/hooks/IDPlaceholderExpansion.kt b/src/main/kotlin/org/crashvibe/playeridcounter/hooks/IDPlaceholderExpansion.kt index dd90965..0f64aa5 100644 --- a/src/main/kotlin/org/crashvibe/playeridcounter/hooks/IDPlaceholderExpansion.kt +++ b/src/main/kotlin/org/crashvibe/playeridcounter/hooks/IDPlaceholderExpansion.kt @@ -4,7 +4,7 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion import org.bukkit.Bukkit import org.bukkit.entity.Player import org.crashvibe.playeridcounter.PlayerIDCounter -import org.crashvibe.playeridcounter.util.Util +import org.crashvibe.playeridcounter.util.getPlayerId class IDPlaceholderExpansion(private val plugin: PlayerIDCounter) : PlaceholderExpansion() { @@ -34,12 +34,12 @@ class IDPlaceholderExpansion(private val plugin: PlayerIDCounter) : PlaceholderE } if (params.equals("id", ignoreCase = true)) { - return Util.getPlayerId(player.uniqueId).toString() // 返回玩家ID + return getPlayerId(player.uniqueId).toString() // 返回玩家ID } if (params.matches("\\d".toRegex())) { val id = params.toInt() - val name: String? = PlayerIDCounter.playerIds + val name = PlayerIDCounter.playerIds .entries .firstOrNull { it.value == id } ?.key diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/listener/PlayerListener.kt b/src/main/kotlin/org/crashvibe/playeridcounter/listener/PlayerListener.kt index 1db88eb..7a1eda7 100644 --- a/src/main/kotlin/org/crashvibe/playeridcounter/listener/PlayerListener.kt +++ b/src/main/kotlin/org/crashvibe/playeridcounter/listener/PlayerListener.kt @@ -1,36 +1,35 @@ package org.crashvibe.playeridcounter.listener -import org.bukkit.Bukkit import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.crashvibe.playeridcounter.PlayerIDCounter -import org.crashvibe.playeridcounter.util.Util -import org.crashvibe.playeridcounter.util.Util.getLang +import org.crashvibe.playeridcounter.config.Config +import org.crashvibe.playeridcounter.config.Config.getLang +import org.crashvibe.playeridcounter.util.getPlayerId class PlayerListener : Listener { @EventHandler fun onPlayerJoin(event: PlayerJoinEvent) { - val instance = PlayerIDCounter.instance val player = event.getPlayer() val uuid = player.uniqueId - Bukkit.getScheduler().runTaskAsynchronously(instance, Runnable { - var id = Util.getPlayerId(uuid) + PlayerIDCounter.foliaLib.scheduler.runAsync { + var id = getPlayerId(uuid) if (id == -1) { id = PlayerIDCounter.nextId.get() PlayerIDCounter.playerIds[uuid] = id - instance.playersConfig.set(uuid.toString(), id) - instance.playersConfig.set("next-id", PlayerIDCounter.nextId.incrementAndGet()) // 分配新ID + Config.playersConfig.set(uuid.toString(), id) + Config.playersConfig.set("next-id", PlayerIDCounter.nextId.incrementAndGet()) // 分配新ID - instance.savePlayerData() + Config.savePlayerData() } - val welcomeMessage = getLang("welcome_message").replace("{id}", id.toString()) + val welcomeMessage = Config.langData.welcomeMessage.replace("{id}", id.toString()) - player.sendMessage(welcomeMessage) // 发送欢迎消息 - }) + player.sendMessage(getLang(welcomeMessage)) // 发送欢迎消息 + } } } diff --git a/src/main/kotlin/org/crashvibe/playeridcounter/util/Util.kt b/src/main/kotlin/org/crashvibe/playeridcounter/util/Util.kt index 44184e3..ead7400 100644 --- a/src/main/kotlin/org/crashvibe/playeridcounter/util/Util.kt +++ b/src/main/kotlin/org/crashvibe/playeridcounter/util/Util.kt @@ -1,17 +1,8 @@ package org.crashvibe.playeridcounter.util -import org.bukkit.ChatColor import org.crashvibe.playeridcounter.PlayerIDCounter -import org.crashvibe.playeridcounter.PlayerIDCounter.Companion.instance import java.util.UUID -object Util { - - fun getPlayerId(uuid: UUID): Int { - return PlayerIDCounter.playerIds.getOrDefault(uuid, -1) // 获取玩家ID - } - - fun getLang(key: String): String { - return ChatColor.translateAlternateColorCodes('&', instance.langConfig.getString(key, key)!!) // 获取语言配置 - } +fun getPlayerId(uuid: UUID): Int { + return PlayerIDCounter.playerIds.getOrDefault(uuid, -1) // 获取玩家ID } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index 18e6ea7..0000000 --- a/src/main/resources/config.yml +++ /dev/null @@ -1,2 +0,0 @@ -settings: - debug: false diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml deleted file mode 100644 index a2d1918..0000000 --- a/src/main/resources/lang.yml +++ /dev/null @@ -1,4 +0,0 @@ -plugin_enabled: "&a插件已启用!" -plugin_disabled: "&c插件已禁用!" -papi_not_found: "&cPlaceholderAPI 未找到,功能可能无法使用!" -welcome_message: "&e欢迎!你的ID是: {id}" From 94a9fd25c1c000bbe60de2807de2957271e1c27c Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sun, 22 Feb 2026 06:32:24 -0500 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28002f5..9d46e66 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,4 +28,4 @@ jobs: uses: actions/upload-artifact@v6 with: name: PlayerIDCounter - path: PlayerIDCounter-*.jar + path: build/libs/PlayerIDCounter-*.jar