From 1d75327a4d485ac876c6e7acb6d4289545274415 Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Tue, 30 Dec 2025 20:38:08 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20DisplayNameListener:=20=D0=BF=D1=80=D0=B5=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=20=D0=B8=20=D1=86=D0=B2=D0=B5=D1=82=20=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D1=8E=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B2=D0=BE=D0=B7=D0=BB=D0=B5=20=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=B8=D0=B3=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/loki/lochat/LoChat.java | 7 + .../lochat/commands/ChatColorCommand.java | 7 + .../lochat/listeners/DisplayNameListener.java | 139 ++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 src/main/java/com/loki/lochat/listeners/DisplayNameListener.java diff --git a/src/main/java/com/loki/lochat/LoChat.java b/src/main/java/com/loki/lochat/LoChat.java index d1acd81..5be3a41 100644 --- a/src/main/java/com/loki/lochat/LoChat.java +++ b/src/main/java/com/loki/lochat/LoChat.java @@ -29,6 +29,7 @@ public final class LoChat extends JavaPlugin { private ChatColorManager chatColorManager; private CustomCommandManager customCommandManager; private GradientModule gradientModule; + private com.loki.lochat.listeners.DisplayNameListener displayNameListener; @Override public void onEnable() { @@ -63,6 +64,8 @@ public final class LoChat extends JavaPlugin { // Регистрация листенеров getServer().getPluginManager().registerEvents(new ChatListener(this), this); + displayNameListener = new com.loki.lochat.listeners.DisplayNameListener(this); + getServer().getPluginManager().registerEvents(displayNameListener, this); // Запуск автосообщений autoMessageManager.start(); @@ -188,4 +191,8 @@ public final class LoChat extends JavaPlugin { public CustomCommandManager getCustomCommandManager() { return customCommandManager; } + + public com.loki.lochat.listeners.DisplayNameListener getDisplayNameListener() { + return displayNameListener; + } } diff --git a/src/main/java/com/loki/lochat/commands/ChatColorCommand.java b/src/main/java/com/loki/lochat/commands/ChatColorCommand.java index da9ca32..493075e 100644 --- a/src/main/java/com/loki/lochat/commands/ChatColorCommand.java +++ b/src/main/java/com/loki/lochat/commands/ChatColorCommand.java @@ -53,6 +53,13 @@ public class ChatColorCommand implements CommandExecutor, TabCompleter { // Сохраняем цвет чата игрока plugin.getChatColorManager().setChatColor(player.getUniqueId(), color); + // Обновляем display name игрока + player.getScheduler().run(plugin, task -> { + if (plugin.getDisplayNameListener() != null) { + plugin.getDisplayNameListener().updatePlayerDisplayName(player); + } + }, null); + // Показываем пример с примененным цветом String preview = ChatFormatter.convertAllColors(color + "Пример текста"); player.sendMessage(ChatFormatter.parse("Цвет чата установлен! Пример: " + preview)); diff --git a/src/main/java/com/loki/lochat/listeners/DisplayNameListener.java b/src/main/java/com/loki/lochat/listeners/DisplayNameListener.java new file mode 100644 index 0000000..7591af0 --- /dev/null +++ b/src/main/java/com/loki/lochat/listeners/DisplayNameListener.java @@ -0,0 +1,139 @@ +package com.loki.lochat.listeners; + +import com.loki.lochat.LoChat; +import com.loki.lochat.managers.ChatColorManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +/** + * Слушатель для обновления display name игроков с префиксом и цветом ника + */ +public class DisplayNameListener implements Listener { + + private final LoChat plugin; + private static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage(); + + public DisplayNameListener(LoChat plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + // Обновляем display name через RegionScheduler для Folia + player.getScheduler().run(plugin, task -> { + updatePlayerDisplayName(player); + }, null); + } + + /** + * Обновляет display name игрока с префиксом и цветом ника + */ + public void updatePlayerDisplayName(Player player) { + // Если градиентный модуль включен и обновляет display name, не дублируем + if (plugin.getGradientModule() != null && plugin.getGradientModule().isEnabled()) { + if (plugin.getGradientModule().getConfig().isUpdateDisplayName()) { + // Градиентный модуль сам обновляет display name + return; + } + } + + String displayName = buildDisplayName(player); + Component component = MINI_MESSAGE.deserialize(displayName); + player.displayName(component); + } + + /** + * Строит display name с префиксом и цветом ника + */ + private String buildDisplayName(Player player) { + StringBuilder result = new StringBuilder(); + + // Получаем префикс из градиентного модуля (если есть) + String prefix = null; + if (plugin.getGradientModule() != null && plugin.getGradientModule().isEnabled()) { + var data = plugin.getGradientModule().getDataManager().getPlayerData(player.getUniqueId()); + if (data != null && data.isPrefixEnabled() && data.hasPrefix()) { + prefix = plugin.getGradientModule().getConfig().getPrefixFormat() + .replace("{prefix}", data.getPrefix()); + } + } + + // Добавляем префикс если есть + if (prefix != null && !prefix.isEmpty()) { + result.append(prefix); + } + + // Получаем цвет чата + ChatColorManager colorManager = plugin.getChatColorManager(); + String chatColor = colorManager.getChatColor(player.getUniqueId()); + + // Получаем имя игрока + String playerName = player.getName(); + + // Применяем цвет к нику + if (chatColor != null) { + // Если цвет в формате &X, конвертируем его в MiniMessage + if (chatColor.startsWith("&") && chatColor.length() == 2) { + String miniMessageColor = convertLegacyColorToMiniMessage(chatColor); + if (!miniMessageColor.isEmpty()) { + String tagName = miniMessageColor.substring(1, miniMessageColor.length() - 1); + result.append(miniMessageColor).append(playerName).append(""); + } else { + result.append(playerName); + } + } else { + // Если уже в формате MiniMessage + result.append("<").append(chatColor).append(">").append(playerName).append(""); + } + } else { + // Нет цвета, просто имя + result.append(playerName); + } + + return result.toString(); + } + + /** + * Конвертирует &X код в MiniMessage формат + */ + private String convertLegacyColorToMiniMessage(String legacyColor) { + if (legacyColor == null || legacyColor.length() != 2 || !legacyColor.startsWith("&")) { + return ""; + } + + char code = legacyColor.charAt(1); + return switch (Character.toLowerCase(code)) { + case '0' -> ""; + case '1' -> ""; + case '2' -> ""; + case '3' -> ""; + case '4' -> ""; + case '5' -> ""; + case '6' -> ""; + case '7' -> ""; + case '8' -> ""; + case '9' -> ""; + case 'a' -> ""; + case 'b' -> ""; + case 'c' -> ""; + case 'd' -> ""; + case 'e' -> ""; + case 'f' -> ""; + case 'k' -> ""; + case 'l' -> ""; + case 'm' -> ""; + case 'n' -> ""; + case 'o' -> ""; + case 'r' -> ""; + default -> ""; + }; + } +} +