From e675e1d821586041d0b1cfc98dcb1c35089f4794 Mon Sep 17 00:00:00 2001 From: Alessandro Proto Date: Fri, 18 Sep 2026 18:59:31 +0200 Subject: [PATCH 1/2] Refactor `StylingModule` and add toggleable nameplate formatting - Removed deprecated `chatFormat` config in favor of `chatFormats`. - Added `enableNameplateFormatting` config option. - Ensured graceful handling of invalid nameplate colors with logging. - Introduced helper method for parsing nameplate color formatting. --- .../modules/styling/StylingModule.java | 55 +++++++++++++------ .../modules/styling/data/StylingConfig.java | 7 +-- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java index 2ce6f95..4b8e8e9 100644 --- a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java @@ -6,20 +6,20 @@ import me.alexdevs.solstice.api.module.ModuleBase; import me.alexdevs.solstice.api.text.Format; import me.alexdevs.solstice.api.utils.PlayerUtils; +import me.alexdevs.solstice.api.utils.SolsticeIdentifier; import me.alexdevs.solstice.integrations.LuckPermsIntegration; import me.alexdevs.solstice.modules.styling.data.StylingConfig; import me.lucko.fabric.api.permissions.v0.Permissions; - import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; -import me.alexdevs.solstice.api.utils.SolsticeIdentifier; import net.minecraft.server.ServerScoreboard; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; import net.minecraft.world.scores.PlayerTeam; import java.util.Locale; +import java.util.Optional; public class StylingModule extends ModuleBase.Toggleable { public static final String ADVANCED_CHAT_FORMATTING_PERMISSION = "solstice.chat.advanced"; @@ -48,13 +48,6 @@ public void init() { }); SolsticeEvents.READY.register((instance, server) -> { - var config = getConfig(); - if (config.chatFormat != null) { - config.chatFormats.put("default", config.chatFormat); - config.chatFormat = null; - Solstice.configManager.save(); - } - // Cleanup var scoreboard = server.getScoreboard(); for (var team : scoreboard.getPlayerTeams()) { @@ -66,14 +59,15 @@ public void init() { ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { var player = handler.getPlayer(); - if (player.getTeam() == null) { + var config = getConfig(); + if (player.getTeam() == null && config.enableNameplateFormatting) { ServerScoreboard scoreboard = server.getScoreboard(); var username = PlayerUtils.getName(player.getGameProfile()); PlayerTeam team = scoreboard.addPlayerTeam("sol_" + username); team.setDisplayName(player.getDisplayName()); - //? if >= 26.1 + //? if >=26.1 //team.setColor(java.util.Optional.ofNullable(this.getNameplateColor(player)).map(c -> net.minecraft.world.scores.TeamColor.valueOf(c.name()))); - //? if < 26.1 + //? if <26.1 team.setColor(this.getNameplateColor(player)); team.setPlayerPrefix(this.getNameplatePrefix(player)); team.setPlayerSuffix(this.getNameplateSuffix(player)); @@ -126,6 +120,11 @@ public void broadcastActivity(PlayerList playerList, Component component, boolea public ChatFormatting getNameplateColor(ServerPlayer player) { var config = this.getConfig(); + + if (!config.enableNameplateFormatting) { + return ChatFormatting.WHITE; + } + var primaryGroup = LuckPermsIntegration.getPrimaryGroup(player); var color = "WHITE"; if (config.nameplateFormats.containsKey(primaryGroup)) { @@ -134,14 +133,33 @@ public ChatFormatting getNameplateColor(ServerPlayer player) { color = config.nameplateFormats.getOrDefault("default", DEFAULT_NAMEPLATE).color(); } - //? if >= 26.1 - //return ChatFormatting.valueOf(color.toUpperCase(Locale.ROOT)); - //? if < 26.1 - return ChatFormatting.getByName(color); + var parsedColor = parseFormattingColor(color); + + if (parsedColor.isEmpty()) { + Solstice.LOGGER.error("Invalid nameplate color: {}", color); + } + + return parsedColor.orElse(ChatFormatting.WHITE); + } + + private static Optional parseFormattingColor(String color) { + try { + //? if >=26.1 + //return Optional.of(ChatFormatting.valueOf(color.toUpperCase(Locale.ROOT))); + //? if <26.1 + return Optional.ofNullable(ChatFormatting.getByName(color)); + } catch (IllegalArgumentException e) { + return Optional.empty(); + } } public Component getNameplatePrefix(ServerPlayer player) { var config = getConfig(); + + if (!config.enableNameplateFormatting) { + return Component.empty(); + } + var primaryGroup = LuckPermsIntegration.getPrimaryGroup(player); var format = ""; if (config.nameplateFormats.containsKey(primaryGroup)) { @@ -155,6 +173,11 @@ public Component getNameplatePrefix(ServerPlayer player) { public Component getNameplateSuffix(ServerPlayer player) { var config = getConfig(); + + if (!config.enableNameplateFormatting) { + return Component.empty(); + } + var primaryGroup = LuckPermsIntegration.getPrimaryGroup(player); var format = ""; if (config.nameplateFormats.containsKey(primaryGroup)) { diff --git a/src/main/java/me/alexdevs/solstice/modules/styling/data/StylingConfig.java b/src/main/java/me/alexdevs/solstice/modules/styling/data/StylingConfig.java index 5bba1b6..a11c0b5 100644 --- a/src/main/java/me/alexdevs/solstice/modules/styling/data/StylingConfig.java +++ b/src/main/java/me/alexdevs/solstice/modules/styling/data/StylingConfig.java @@ -29,15 +29,14 @@ public class StylingConfig { @Comment("Goal advancement format.") public String advancementGoal = "\uD83C\uDF96 %player:displayname% completed the goal ${title}"; - @Comment("!! This setting is deprecated. Use chat-formats instead. !!") - @Deprecated - public @Nullable String chatFormat = null; - @Comment("Chat format per group. group = format") public Map chatFormats = Map.of( "default", "%player:displayname%: ${message}" ); + @Comment("Enable nameplate customizations.") + public boolean enableNameplateFormatting = true; + @Comment("Nameplate formatting per group. group = format.\nPlaceholders here are not refreshed often.") public Map nameplateFormats = Map.of( "default", new NameplateFormat("", "", "green") From 7bd06f0d23656c9c0385efb2873083d9509cdce0 Mon Sep 17 00:00:00 2001 From: Alessandro Proto Date: Fri, 18 Sep 2026 20:01:54 +0200 Subject: [PATCH 2/2] Update styling module documentation for nameplate formatting - Add `enable-nameplate-formatting` config section. - Clarify nameplate placeholder behavior on player login. - Remove outdated `do-color-nameplate` config documentation. (where is this coming from??) --- docs/modules/styling.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/modules/styling.md b/docs/modules/styling.md index ef80684..b1bf966 100644 --- a/docs/modules/styling.md +++ b/docs/modules/styling.md @@ -105,10 +105,18 @@ These options can be configured in the `styling` section of the config file. ![Chat message](../assets/text_formatting/chat.webp) +!!! config "enable-nameplate-formatting" + + Enable nameplate formatting. Default: `true`. + + Clients need to reconnect to apply changes. + !!! config "nameplate-formats" Scoreboard nameplate format per LuckPerms group. Controls the prefix and suffix displayed above players' heads. + Clients need to reconnect to apply changes. + ```hocon nameplate-formats { default { @@ -120,11 +128,7 @@ These options can be configured in the `styling` section of the config file. !!! warning - Nameplate placeholders are not refreshed frequently. Avoid placeholders that change often. - -!!! config "do-color-nameplate" - - Whether to color the username part in the scoreboard nameplate. Default: `true`. + Nameplate placeholders are calculated on player login. Avoid placeholders that change often. !!! config "emote-format"