Fix gradient display names - convert &#RRGGBB to §x format for player names above heads

This commit is contained in:
loki5512344 2025-12-30 23:13:54 +01:00
parent 7b76f75e36
commit cc8f4b0f92

View file

@ -7,6 +7,8 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* Утилита для обновления отображаемого имени игрока * Утилита для обновления отображаемого имени игрока
@ -14,11 +16,13 @@ import java.util.List;
public final class DisplayNameUtil { public final class DisplayNameUtil {
private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.builder() private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.builder()
.character('&') .character('§')
.hexCharacter('#') .hexCharacter('#')
.hexColors() .hexColors()
.build(); .build();
private static final Pattern HEX_PATTERN = Pattern.compile("&#([0-9a-fA-F]{6})");
private DisplayNameUtil() {} private DisplayNameUtil() {}
public static void updateDisplayName(GradientModule module, Player player, GradientPlayerData data) { public static void updateDisplayName(GradientModule module, Player player, GradientPlayerData data) {
@ -39,6 +43,8 @@ public final class DisplayNameUtil {
cfg.isUseLegacyRgbFormat(), cfg.isUseLegacyRgbFormat(),
cfg.isContinuousGradient() cfg.isContinuousGradient()
); );
// Конвертируем &#RRGGBB в §x§R§R§G§G§B§B для display name
displayName = convertToLegacyFormat(displayName);
var component = SERIALIZER.deserialize(displayName); var component = SERIALIZER.deserialize(displayName);
player.displayName(component); player.displayName(component);
player.playerListName(component); player.playerListName(component);
@ -55,11 +61,36 @@ public final class DisplayNameUtil {
prefixFormat, prefixFormat,
cfg.isUseLegacyRgbFormat() cfg.isUseLegacyRgbFormat()
); );
// Конвертируем &#RRGGBB в §x§R§R§G§G§B§B для display name
displayName = convertToLegacyFormat(displayName);
var component = SERIALIZER.deserialize(displayName); var component = SERIALIZER.deserialize(displayName);
player.displayName(component); player.displayName(component);
player.playerListName(component); player.playerListName(component);
} }
/**
* Конвертирует &#RRGGBB формат в §x§R§R§G§G§B§B для display name
*/
private static String convertToLegacyFormat(String text) {
if (text == null) return "";
Matcher matcher = HEX_PATTERN.matcher(text);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String hex = matcher.group(1).toLowerCase();
StringBuilder replacement = new StringBuilder("§x");
for (char c : hex.toCharArray()) {
replacement.append("§").append(c);
}
matcher.appendReplacement(sb, replacement.toString());
}
matcher.appendTail(sb);
return sb.toString();
}
private static String buildWithLuckPermsPrefix(String lpPrefix, String nick, private static String buildWithLuckPermsPrefix(String lpPrefix, String nick,
List<String> colors, List<String> colors,
boolean useLegacyFormat, boolean useLegacyFormat,