From 237ce56614fcd52cd04495c005493bee2283bc9e Mon Sep 17 00:00:00 2001 From: TDSTOS Date: Wed, 25 Mar 2026 18:29:21 +0100 Subject: [PATCH] Support Component placeholders in language API Add support for passing Components as placeholders in LanguageManager (getComponent, getMessageList) and add Player extension overloads (sendMsg, trans) that accept component pairs. Replace usages of legacy serialized strings with direct Component placeholders across kits, scoreboard, and listeners (remove legacySerializer imports/usages). Also normalize placeholder keys (remove angle brackets in ConnectListener) and scope legacySerializer as private in Extensions. --- .../mcscrims/speedhg/command/KitCommand.kt | 5 ++-- .../speedhg/config/LanguageManager.kt | 19 +++++++++++-- .../mcscrims/speedhg/kit/impl/GoblinKit.kt | 3 +-- .../speedhg/listener/ConnectListener.kt | 4 +-- .../speedhg/scoreboard/ScoreboardManager.kt | 27 ++++++++----------- .../club/mcscrims/speedhg/util/Extensions.kt | 20 +++++++++++++- 6 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt b/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt index 09e30b9..cd1fad5 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt @@ -4,7 +4,6 @@ import club.mcscrims.speedhg.SpeedHG import club.mcscrims.speedhg.game.GameState import club.mcscrims.speedhg.kit.Playstyle import club.mcscrims.speedhg.kit.impl.BackupKit -import club.mcscrims.speedhg.util.legacySerializer import club.mcscrims.speedhg.util.sendMsg import org.bukkit.command.Command import org.bukkit.command.CommandExecutor @@ -74,14 +73,14 @@ class KitCommand : CommandExecutor, TabCompleter { plugin.kitManager.selectPlaystyle( player, playstyle ) plugin.kitManager.applyKit( player ) - player.sendMsg( "commands.kit.selected", "playstyle" to playstyle.displayName, "kit" to legacySerializer.serialize( kit.displayName )) + player.sendMsg( "commands.kit.selected", mapOf( "playstyle" to playstyle.displayName ), "kit" to kit.displayName ) return true } plugin.kitManager.selectKit( player, kit ) plugin.kitManager.selectPlaystyle( player, playstyle ) - player.sendMsg( "commands.kit.selected", "playstyle" to playstyle.displayName, "kit" to legacySerializer.serialize( kit.displayName )) + player.sendMsg( "commands.kit.selected", mapOf( "playstyle" to playstyle.displayName ), "kit" to kit.displayName ) return true } diff --git a/src/main/kotlin/club/mcscrims/speedhg/config/LanguageManager.kt b/src/main/kotlin/club/mcscrims/speedhg/config/LanguageManager.kt index 04db74f..57a1975 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/config/LanguageManager.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/config/LanguageManager.kt @@ -90,6 +90,19 @@ class LanguageManager( return data?.lists?.get( key ) ?: listOf( "Missing List: $key" ) } + fun getMessageList( + player: Player, + key: String, + placeholders: Map, + components: Map = mapOf() + ): List + { + val rawList = getRawMessageList( player, key ) + val compTags = components.map { (k, v) -> Placeholder.component( k, v ) } + val tags = placeholders.map { (k, v) -> Placeholder.parsed( k, v ) }.plus( compTags ) + return rawList.map { str -> miniMessage.deserialize( str, *tags.toTypedArray() ) } + } + fun getDefaultRawMessageList( key: String ): List @@ -101,13 +114,15 @@ class LanguageManager( fun getComponent( player: Player, key: String, - placeholders: Map + placeholders: Map, + components: Map = mapOf() ): Component { val prefixRaw = getRawMessage( player, "default.prefix" ) val prefixTag = Placeholder.parsed( "prefix", prefixRaw ) val raw = getRawMessage( player, key ) - val tags = placeholders.map { (k, v) -> Placeholder.parsed( k, v ) }.plus( prefixTag ) + val compTags = components.map { (k, v) -> Placeholder.component( k, v ) } + val tags = placeholders.map { (k, v) -> Placeholder.parsed( k, v ) }.plus( prefixTag ).plus( compTags ) return miniMessage.deserialize( raw, *tags.toTypedArray() ) } diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt index 0778a24..9f94eb9 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt @@ -8,7 +8,6 @@ import club.mcscrims.speedhg.kit.ability.ActiveAbility import club.mcscrims.speedhg.kit.ability.PassiveAbility import club.mcscrims.speedhg.util.ItemBuilder import club.mcscrims.speedhg.util.WorldEditUtils -import club.mcscrims.speedhg.util.legacySerializer import club.mcscrims.speedhg.util.trans import net.kyori.adventure.text.Component import org.bukkit.Bukkit @@ -157,7 +156,7 @@ class GoblinKit : Kit() { activeStealTasks[ player.uniqueId ] = task player.playSound( player.location, Sound.ENTITY_EVOKER_CAST_SPELL, 1f, 1.5f ) - player.sendActionBar(player.trans( "kits.goblin.messages.stole_kit", "kit" to legacySerializer.serialize( targetKit.displayName ))) + player.sendActionBar(player.trans( "kits.goblin.messages.stole_kit", mapOf(), "kit" to targetKit.displayName )) return AbilityResult.Success } diff --git a/src/main/kotlin/club/mcscrims/speedhg/listener/ConnectListener.kt b/src/main/kotlin/club/mcscrims/speedhg/listener/ConnectListener.kt index 639000c..fd02a5d 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/listener/ConnectListener.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/listener/ConnectListener.kt @@ -28,7 +28,7 @@ class ConnectListener : Listener { return Bukkit.getOnlinePlayers().forEach { p -> - p.sendMsg( "game.join", "" to player.name ) + p.sendMsg( "game.join", "name" to player.name ) } player.showTitle(Title.title( @@ -49,7 +49,7 @@ class ConnectListener : Listener { return Bukkit.getOnlinePlayers().forEach { p -> - p.sendMsg( "game.quit", "" to player.name ) + p.sendMsg( "game.quit", "name" to player.name ) } } diff --git a/src/main/kotlin/club/mcscrims/speedhg/scoreboard/ScoreboardManager.kt b/src/main/kotlin/club/mcscrims/speedhg/scoreboard/ScoreboardManager.kt index 769fd1b..c346368 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/scoreboard/ScoreboardManager.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/scoreboard/ScoreboardManager.kt @@ -2,9 +2,7 @@ package club.mcscrims.speedhg.scoreboard import club.mcscrims.speedhg.SpeedHG import club.mcscrims.speedhg.game.GameState -import club.mcscrims.speedhg.util.legacySerializer import club.mcscrims.speedhg.util.trans -import club.mcscrims.speedhg.util.transList import fr.mrmicky.fastboard.adventure.FastBoard import net.kyori.adventure.text.Component import org.bukkit.Bukkit @@ -66,7 +64,7 @@ class ScoreboardManager( val online = Bukkit.getOnlinePlayers().size.toString() val max = Bukkit.getMaxPlayers().toString() - val kitName = legacySerializer.serialize(plugin.kitManager.getSelectedKit( player )?.displayName ?: Component.text( "None" )) + val kitName = plugin.kitManager.getSelectedKit( player )?.displayName ?: Component.text( "None" ) val lines: List @@ -74,12 +72,11 @@ class ScoreboardManager( { val timeString = if ( state == GameState.STARTING ) formatTime( gm.timer ) else "Waiting..." - lines = player.transList( "scoreboard.lobby", mapOf( - "online" to online, - "max" to max, - "kit" to kitName, - "time" to timeString - )) + lines = plugin.languageManager.getMessageList( + player, "scoreboard.lobby", + mapOf( "online" to online, "max" to max, "time" to timeString ), + mapOf( "kit" to kitName ) + ) } else { @@ -88,13 +85,11 @@ class ScoreboardManager( val kills = player.getStatistic( Statistic.PLAYER_KILLS ).toString() val border = String.format( "%.0f", player.world.worldBorder.size ) - lines = player.transList( "scoreboard.ingame", mapOf( - "timer" to timeString, - "alive" to alive, - "kills" to kills, - "border" to border, - "kit" to kitName - )) + lines = plugin.languageManager.getMessageList( + player, "scoreboard.ingame", + mapOf( "timer" to timeString, "alive" to alive, "kills" to kills, "border" to border ), + mapOf( "kit" to kitName ) + ) } board.updateLines( lines ) diff --git a/src/main/kotlin/club/mcscrims/speedhg/util/Extensions.kt b/src/main/kotlin/club/mcscrims/speedhg/util/Extensions.kt index dde2a33..48587a7 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/util/Extensions.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/util/Extensions.kt @@ -8,7 +8,7 @@ import org.bukkit.entity.Player private val langManager get() = SpeedHG.instance.languageManager -internal val legacySerializer = LegacyComponentSerializer.builder() +private val legacySerializer = LegacyComponentSerializer.builder() .character('ยง') .hexColors() .useUnusualXRepeatedCharacterHexFormat() @@ -22,6 +22,15 @@ fun Player.sendMsg( this.sendMessage( component ) } +fun Player.sendMsg( + key: String, + placeholders: Map, + vararg components: Pair +) { + val component = langManager.getComponent( this, key, placeholders, components.toMap() ) + this.sendMessage( component ) +} + fun Player.trans( key: String, vararg placeholders: Pair @@ -30,6 +39,15 @@ fun Player.trans( return langManager.getComponent( this, key, placeholders.toMap() ) } +fun Player.trans( + key: String, + placeholders: Map, + vararg components: Pair +): Component +{ + return langManager.getComponent( this, key, placeholders, components.toMap() ) +} + fun Player.transList( key: String, placeholders: Map