Initial commit: LoChat v1.0.0 with Gradient module

This commit is contained in:
loki5512344 2025-12-29 14:57:49 +01:00
commit 252b0a60db
86 changed files with 8922 additions and 0 deletions

View file

@ -0,0 +1,115 @@
package ru.lovar.gradientnick.util;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player;
import ru.lovar.gradientnick.GradientNick;
import ru.lovar.gradientnick.config.ConfigManager;
import ru.lovar.gradientnick.data.PlayerData;
/**
* Утилита для обновления отображаемого имени игрока
*/
public final class DisplayNameUtil {
private static final LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.builder()
.character('&')
.hexCharacter('#')
.hexColors()
.build();
private DisplayNameUtil() {}
/**
* Обновляет displayName и playerListName игрока
*/
public static void updateDisplayName(GradientNick plugin, Player player, PlayerData data) {
ConfigManager cfg = plugin.getConfigManager();
// Определяем префикс: кастомный или групповой от LuckPerms
String prefix = null;
String prefixFormat = cfg.getPrefixFormat();
if (data.isPrefixEnabled() && data.hasPrefix()) {
// Кастомный префикс включён
prefix = data.getPrefix();
} else {
// Кастомный выключен — берём групповой из LuckPerms
String lpPrefix = plugin.getLuckPermsHook().getActivePrefix(player);
if (lpPrefix != null && !lpPrefix.isEmpty()) {
// Групповой префикс — применяем градиент на всё (префикс + ник)
String displayName = buildWithLuckPermsPrefix(
lpPrefix,
player.getName(),
data.isColorEnabled() ? data.getColors() : null,
cfg.isUseLegacyRgbFormat(),
cfg.isContinuousGradient()
);
var component = SERIALIZER.deserialize(displayName);
player.displayName(component);
player.playerListName(component);
return;
}
}
String displayName = GradientUtil.buildDisplayName(
prefix,
player.getName(),
data.isColorEnabled() ? data.getColors() : null,
cfg.isGradientOnPrefix(),
cfg.isContinuousGradient(),
prefixFormat,
cfg.isUseLegacyRgbFormat()
);
var component = SERIALIZER.deserialize(displayName);
player.displayName(component);
player.playerListName(component);
}
/**
* Строит displayName с префиксом от LuckPerms
* Если есть цвета и continuousGradient — применяем единый градиент на всё
*/
private static String buildWithLuckPermsPrefix(String lpPrefix, String nick,
java.util.List<String> colors,
boolean useLegacyFormat,
boolean continuousGradient) {
if (colors == null || colors.isEmpty()) {
// Нет цветов — просто префикс + ник
return lpPrefix + nick;
}
if (continuousGradient) {
// Единый градиент на префикс + ник
// Убираем цветовые коды из LP префикса чтобы применить наш градиент
String cleanPrefix = stripColors(lpPrefix);
String fullText = cleanPrefix + nick;
return GradientUtil.applyGradient(fullText, colors, useLegacyFormat);
} else {
// Градиент только на ник, префикс от LP оставляем
return lpPrefix + GradientUtil.applyGradient(nick, colors, useLegacyFormat);
}
}
/**
* Убирает цветовые коды из строки
*/
private static String stripColors(String text) {
if (text == null) return null;
// Убираем §x§R§R§G§G§B§B, §c, &c, &#RRGGBB форматы
return text.replaceAll("(?i)(§x(§[0-9a-f]){6}|§[0-9a-fk-or]|&[0-9a-fk-or]|&#[0-9a-f]{6})", "");
}
/**
* Строит цветной префикс для LuckPerms
*/
public static String buildColoredPrefix(GradientNick plugin, PlayerData data) {
if (!data.hasPrefix() || !data.isPrefixEnabled()) return null;
ConfigManager cfg = plugin.getConfigManager();
String prefix = cfg.getPrefixFormat().replace("{prefix}", data.getPrefix()).stripTrailing();
return (data.hasColors() && data.isColorEnabled() && cfg.isGradientOnPrefix())
? GradientUtil.applyGradient(prefix, data.getColors(), cfg.isUseLegacyRgbFormat())
: prefix;
}
}