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..f1632ef6 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.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/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 +} 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