From e06916632c37919d31ab962403b52194f0e3c738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Tue, 20 Jan 2026 17:18:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?chore(build):=20=E4=BC=98=E5=8C=96=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 RegisterCommands 异常问题 --- build.gradle.kts | 2 +- gradle.properties | 2 +- .../internal/service/RegisterCommands.kt | 23 +++++++++---------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e3c2a0d7..b70e7761 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -72,7 +72,7 @@ subprojects { disableOnSkippedVersion = false } version { - taboolib = "6.2.4-8d51195" + taboolib = "6.2.4-e6c8347" coroutines = null } } diff --git a/gradle.properties b/gradle.properties index cd196cc0..ed20348d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group=me.arasple.mc.trmenu -version=3.9.17 \ No newline at end of file +version=3.9.18 \ No newline at end of file diff --git a/plugin/src/main/kotlin/trplugins/menu/module/internal/service/RegisterCommands.kt b/plugin/src/main/kotlin/trplugins/menu/module/internal/service/RegisterCommands.kt index 6c14366b..ad3e4073 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/internal/service/RegisterCommands.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/internal/service/RegisterCommands.kt @@ -26,15 +26,12 @@ object RegisterCommands { } fun load() { - submit { - registered.removeIf { - unregisterCommand(it) - true - } - - } + val unregisterList = registered.toList() + unregisterList.forEach { unregisterCommand(it) } + registered.clear() - TrMenu.SETTINGS.getConfigurationSection("RegisterCommands")?.let { it -> + val section = TrMenu.SETTINGS.getConfigurationSection("RegisterCommands") + section?.let { it -> for (main in it.getKeys(false)) { val section = it.getConfigurationSection(main) ?: continue val argument = section.getConfigurationSection("arguments") @@ -81,9 +78,11 @@ object RegisterCommands { // 延迟同步命令到所有在线玩家,避免与 Paper 异步命令发送线程冲突 // Paper 的 sendAsync 会在异步线程遍历命令树,直接调用 updateCommands 可能触发 ConcurrentModificationException submit(delay = 1) { - try { - Bukkit.getOnlinePlayers().forEach { it.updateCommands() } - } catch (_: Throwable) {} + val players = Bukkit.getOnlinePlayers() + if (players.isEmpty()) { + return@submit + } + players.forEach { it.updateCommands() } } } -} \ No newline at end of file +} From 934c635387c34a7e86d822c7374c6d2fa1589b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Tue, 20 Jan 2026 22:10:25 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(util):=20=E6=B7=BB=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E5=8D=81=E5=85=AD=E8=BF=9B=E5=88=B6=E9=A2=9C=E8=89=B2=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 LEGACY_HEX_PATTERN 正则表达式用于匹配 &{#FFFFFF} 格式的颜色代码 - 将 colorify 函数可见性改为 internal 并添加 normalizeLegacyHex 颜色标准化方法 - 在 Hex 工具类中新增 colorify 扩展函数简化字符串颜色转换调用 - 替换 MenuSession 和 MenuSettings 中的 colored、parseRainbow、parseGradients 调用为统一的 colorify 方法 - 移除对 taboolib.module.chat.colored 的依赖减少模块耦合 --- gradle.properties | 2 +- .../trplugins/menu/module/display/MenuSession.kt | 10 ++++------ .../trplugins/menu/module/display/MenuSettings.kt | 8 ++++---- plugin/src/main/kotlin/trplugins/menu/util/Hex.kt | 11 ++++++++++- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/gradle.properties b/gradle.properties index ed20348d..f1632ef6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group=me.arasple.mc.trmenu -version=3.9.18 \ No newline at end of file +version=3.9.19 \ No newline at end of file diff --git a/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSession.kt b/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSession.kt index d9331548..0b383240 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSession.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSession.kt @@ -6,7 +6,6 @@ import taboolib.common.platform.function.submitAsync import taboolib.common.platform.service.PlatformExecutor import taboolib.common.util.replaceWithOrder import taboolib.library.reflex.Reflex.Companion.getProperty -import taboolib.module.chat.colored import taboolib.module.lang.Language import taboolib.platform.compat.replacePlaceholder import trplugins.menu.api.event.MenuCloseEvent @@ -15,8 +14,7 @@ import trplugins.menu.module.display.icon.Icon import trplugins.menu.module.display.icon.IconProperty import trplugins.menu.module.display.layout.Layout import trplugins.menu.module.internal.script.FunctionParser -import trplugins.menu.util.parseGradients -import trplugins.menu.util.parseRainbow +import trplugins.menu.util.colorify import java.util.UUID import java.util.concurrent.ConcurrentHashMap @@ -144,10 +142,10 @@ class MenuSession( } } val content = - (if (preColor) funced else funced.colored().parseRainbow().parseGradients()).replaceWithOrder(*arguments).replaceWithOrder(*implicitArguments) + (if (preColor) funced else funced.colorify()).replaceWithOrder(*arguments).replaceWithOrder(*implicitArguments) val papi = content.replacePlaceholder(placeholderPlayer) - return if (preColor) papi else papi.colored().parseRainbow().parseGradients() + return if (preColor) papi else papi.colorify() } fun parse(string: List): List { @@ -320,4 +318,4 @@ fun Player.session(): MenuSession { } fun ProxyPlayer.session(): MenuSession { return cast().session() -} \ No newline at end of file +} diff --git a/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSettings.kt b/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSettings.kt index 8518a861..f21abd71 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSettings.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/display/MenuSettings.kt @@ -3,12 +3,12 @@ package trplugins.menu.module.display import me.clip.placeholderapi.PlaceholderAPI import org.bukkit.Bukkit import taboolib.common.platform.function.pluginId -import taboolib.module.chat.colored import trplugins.menu.TrMenu import trplugins.menu.api.reaction.Reactions import trplugins.menu.api.receptacle.MenuTaskData import trplugins.menu.module.internal.script.js.ScriptFunction import trplugins.menu.util.Cooldown +import trplugins.menu.util.colorify import trplugins.menu.util.bukkit.ItemMatcher import trplugins.menu.util.collections.CycleList @@ -40,8 +40,8 @@ class MenuSettings( companion object { val PRE_COLOR get() = TrMenu.SETTINGS.getBoolean("Menu.Icon.Item.Pre-Color") - val DEFAULT_NAME_COLOR get() = (TrMenu.SETTINGS.getString("Menu.Icon.Item.Default-Name-Color") ?: "&7").colored() - val DEFAULT_LORE_COLOR get() = (TrMenu.SETTINGS.getString("Menu.Icon.Item.Default-Lore-Color") ?: "&7").colored() + val DEFAULT_NAME_COLOR get() = (TrMenu.SETTINGS.getString("Menu.Icon.Item.Default-Name-Color") ?: "&7").colorify() + val DEFAULT_LORE_COLOR get() = (TrMenu.SETTINGS.getString("Menu.Icon.Item.Default-Lore-Color") ?: "&7").colorify() } @@ -119,4 +119,4 @@ class MenuSettings( } } -} \ No newline at end of file +} diff --git a/plugin/src/main/kotlin/trplugins/menu/util/Hex.kt b/plugin/src/main/kotlin/trplugins/menu/util/Hex.kt index 2becd6c2..d0772c70 100644 --- a/plugin/src/main/kotlin/trplugins/menu/util/Hex.kt +++ b/plugin/src/main/kotlin/trplugins/menu/util/Hex.kt @@ -20,6 +20,8 @@ object Hex { Pattern.compile("<(?rainbow|r)(#(?\\d+))?(:(?\\d*\\.?\\d+))?(:(?\\d*\\.?\\d+))?(:(?l|L|loop))?>") private val GRADIENT_PATTERN = Pattern.compile("<(?gradient|g)(#(?\\d+))?(?(:#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})){2,})(:(?l|L|loop))?>") + private val LEGACY_HEX_PATTERN = + Pattern.compile("&\\{#([A-Fa-f0-9]){6}}") // &{#FFFFFF} private val HEX_PATTERNS = listOf( Pattern.compile("<#([A-Fa-f0-9]){6}>"), // <#FFFFFF> Pattern.compile("\\{#([A-Fa-f0-9]){6}}"), // {#FFFFFF} @@ -70,8 +72,9 @@ object Hex { * @param message The message * @return A color-replaced message */ - private fun colorify(message: String): String { + internal fun colorify(message: String): String { var parsed = message + parsed = normalizeLegacyHex(parsed) parsed = parseRainbow(parsed) parsed = parseGradients(parsed) parsed = parseHex(parsed) @@ -222,6 +225,11 @@ object Hex { return ChatColor.translateAlternateColorCodes('&', message) } + private fun normalizeLegacyHex(message: String): String { + val matcher = LEGACY_HEX_PATTERN.matcher(message) + return if (matcher.find()) matcher.replaceAll("&#\$1") else message + } + /** * Returns the index before the color changes * @@ -422,5 +430,6 @@ object Hex { } } +fun String.colorify() = Hex.colorify(this) fun String.parseRainbow() = Hex.parseRainbow(this) fun String.parseGradients() = Hex.parseGradients(this) \ No newline at end of file