Добавлен DisplayNameListener: префикс и цвет ника теперь отображаются возле ника в игре
This commit is contained in:
parent
ee67dcc12a
commit
1d75327a4d
3 changed files with 153 additions and 0 deletions
|
|
@ -29,6 +29,7 @@ public final class LoChat extends JavaPlugin {
|
||||||
private ChatColorManager chatColorManager;
|
private ChatColorManager chatColorManager;
|
||||||
private CustomCommandManager customCommandManager;
|
private CustomCommandManager customCommandManager;
|
||||||
private GradientModule gradientModule;
|
private GradientModule gradientModule;
|
||||||
|
private com.loki.lochat.listeners.DisplayNameListener displayNameListener;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
|
@ -63,6 +64,8 @@ public final class LoChat extends JavaPlugin {
|
||||||
|
|
||||||
// Регистрация листенеров
|
// Регистрация листенеров
|
||||||
getServer().getPluginManager().registerEvents(new ChatListener(this), this);
|
getServer().getPluginManager().registerEvents(new ChatListener(this), this);
|
||||||
|
displayNameListener = new com.loki.lochat.listeners.DisplayNameListener(this);
|
||||||
|
getServer().getPluginManager().registerEvents(displayNameListener, this);
|
||||||
|
|
||||||
// Запуск автосообщений
|
// Запуск автосообщений
|
||||||
autoMessageManager.start();
|
autoMessageManager.start();
|
||||||
|
|
@ -188,4 +191,8 @@ public final class LoChat extends JavaPlugin {
|
||||||
public CustomCommandManager getCustomCommandManager() {
|
public CustomCommandManager getCustomCommandManager() {
|
||||||
return customCommandManager;
|
return customCommandManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public com.loki.lochat.listeners.DisplayNameListener getDisplayNameListener() {
|
||||||
|
return displayNameListener;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,13 @@ public class ChatColorCommand implements CommandExecutor, TabCompleter {
|
||||||
// Сохраняем цвет чата игрока
|
// Сохраняем цвет чата игрока
|
||||||
plugin.getChatColorManager().setChatColor(player.getUniqueId(), color);
|
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 + "Пример текста");
|
String preview = ChatFormatter.convertAllColors(color + "Пример текста");
|
||||||
player.sendMessage(ChatFormatter.parse("<green>Цвет чата установлен! Пример: " + preview));
|
player.sendMessage(ChatFormatter.parse("<green>Цвет чата установлен! Пример: " + preview));
|
||||||
|
|
|
||||||
139
src/main/java/com/loki/lochat/listeners/DisplayNameListener.java
Normal file
139
src/main/java/com/loki/lochat/listeners/DisplayNameListener.java
Normal file
|
|
@ -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("</").append(tagName).append(">");
|
||||||
|
} else {
|
||||||
|
result.append(playerName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Если уже в формате MiniMessage
|
||||||
|
result.append("<").append(chatColor).append(">").append(playerName).append("</").append(chatColor).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' -> "<black>";
|
||||||
|
case '1' -> "<dark_blue>";
|
||||||
|
case '2' -> "<dark_green>";
|
||||||
|
case '3' -> "<dark_aqua>";
|
||||||
|
case '4' -> "<dark_red>";
|
||||||
|
case '5' -> "<dark_purple>";
|
||||||
|
case '6' -> "<gold>";
|
||||||
|
case '7' -> "<gray>";
|
||||||
|
case '8' -> "<dark_gray>";
|
||||||
|
case '9' -> "<blue>";
|
||||||
|
case 'a' -> "<green>";
|
||||||
|
case 'b' -> "<aqua>";
|
||||||
|
case 'c' -> "<red>";
|
||||||
|
case 'd' -> "<light_purple>";
|
||||||
|
case 'e' -> "<yellow>";
|
||||||
|
case 'f' -> "<white>";
|
||||||
|
case 'k' -> "<obfuscated>";
|
||||||
|
case 'l' -> "<bold>";
|
||||||
|
case 'm' -> "<strikethrough>";
|
||||||
|
case 'n' -> "<underlined>";
|
||||||
|
case 'o' -> "<italic>";
|
||||||
|
case 'r' -> "<reset>";
|
||||||
|
default -> "";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue