diff --git a/src/main/java/com/loki/lochat/commands/GlobalChatCommand.java b/src/main/java/com/loki/lochat/commands/GlobalChatCommand.java index 8072a53..d340b4e 100644 --- a/src/main/java/com/loki/lochat/commands/GlobalChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/GlobalChatCommand.java @@ -2,6 +2,8 @@ package com.loki.lochat.commands; import com.loki.lochat.LoChat; import com.loki.lochat.utils.ChatFormatter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -11,6 +13,7 @@ import org.jetbrains.annotations.NotNull; public class GlobalChatCommand implements CommandExecutor { private final LoChat plugin; + private static final MiniMessage MM = MiniMessage.miniMessage(); public GlobalChatCommand(LoChat plugin) { this.plugin = plugin; @@ -42,7 +45,11 @@ public class GlobalChatCommand implements CommandExecutor { } String message = String.join(" ", args); - plugin.getChatManager().sendGlobalMessage(player, message); + + // Конвертируем String в Component для новой сигнатуры ChatManager + Component messageComponent = MM.deserialize(message); + + plugin.getChatManager().sendGlobalMessage(player, messageComponent); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/commands/LoChatCommand.java b/src/main/java/com/loki/lochat/commands/LoChatCommand.java index 88cef9d..4ca949f 100644 --- a/src/main/java/com/loki/lochat/commands/LoChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/LoChatCommand.java @@ -1,7 +1,8 @@ package com.loki.lochat.commands; import com.loki.lochat.LoChat; -import com.loki.lochat.utils.ChatFormatter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -15,6 +16,7 @@ import java.util.List; public class LoChatCommand implements CommandExecutor, TabCompleter { private final LoChat plugin; + private static final MiniMessage MM = MiniMessage.miniMessage(); public LoChatCommand(LoChat plugin) { this.plugin = plugin; @@ -24,40 +26,40 @@ public class LoChatCommand implements CommandExecutor, TabCompleter { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("lochat.admin")) { - sender.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getNoPermission())); + sender.sendMessage(MM.deserialize(plugin.getMessageConfig().getNoPermission())); return true; } if (args.length == 0) { - sender.sendMessage(ChatFormatter.parse("&#FFD700LoChat v" + plugin.getDescription().getVersion())); - sender.sendMessage(ChatFormatter.parse("󅒐Команды:")); - sender.sendMessage(ChatFormatter.parse("&#FFFF00/lochat reload - Перезагрузить конфиги")); - sender.sendMessage(ChatFormatter.parse("&#FFFF00/lochat commands - Список кастомных команд")); - sender.sendMessage(ChatFormatter.parse("&#FFFF00/lochat commands reload - Перезагрузить кастомные команды")); + sender.sendMessage(MM.deserialize("&#FFD700LoChat v" + plugin.getDescription().getVersion())); + sender.sendMessage(MM.deserialize("󅒐Команды:")); + sender.sendMessage(MM.deserialize("&#FFFF00/lochat reload - Перезагрузить конфиги")); + sender.sendMessage(MM.deserialize("&#FFFF00/lochat commands - Список кастомных команд")); + sender.sendMessage(MM.deserialize("&#FFFF00/lochat commands reload - Перезагрузить кастомные команды")); return true; } switch (args[0].toLowerCase()) { case "reload" -> { plugin.reload(); - sender.sendMessage(ChatFormatter.parse("�FF00Конфигурация перезагружена!")); + sender.sendMessage(MM.deserialize("�FF00Конфигурация перезагружена!")); } case "commands" -> { if (args.length > 1 && args[1].equalsIgnoreCase("reload")) { plugin.getCustomCommandManager().reload(); - sender.sendMessage(ChatFormatter.parse("�FF00Кастомные команды перезагружены!")); + sender.sendMessage(MM.deserialize("�FF00Кастомные команды перезагружены!")); } else { var commands = plugin.getCustomCommandManager().getCommands(); - sender.sendMessage(ChatFormatter.parse("&#FFD700Кастомные команды (" + commands.size() + "):")); + sender.sendMessage(MM.deserialize("&#FFD700Кастомные команды (" + commands.size() + "):")); for (var cmd : commands.values()) { - sender.sendMessage(ChatFormatter.parse("&e/" + cmd.name + " 󅒐(" + cmd.type + ")")); + sender.sendMessage(MM.deserialize("&e/" + cmd.name + " 󅒐(" + cmd.type + ")")); if (!cmd.aliases.isEmpty()) { - sender.sendMessage(ChatFormatter.parse("󅒐 Алиасы: " + String.join(", ", cmd.aliases))); + sender.sendMessage(MM.deserialize("󅒐 Алиасы: " + String.join(", ", cmd.aliases))); } } } } - default -> sender.sendMessage(ChatFormatter.parse("&#FF0000Неизвестная команда. Используйте /lochat для помощи.")); + default -> sender.sendMessage(MM.deserialize("&#FF0000Неизвестная команда. Используйте /lochat для помощи.")); } return true; @@ -94,4 +96,4 @@ public class LoChatCommand implements CommandExecutor, TabCompleter { return new ArrayList<>(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/commands/LocalChatCommand.java b/src/main/java/com/loki/lochat/commands/LocalChatCommand.java index 8e3c139..86a6fad 100644 --- a/src/main/java/com/loki/lochat/commands/LocalChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/LocalChatCommand.java @@ -2,6 +2,8 @@ package com.loki.lochat.commands; import com.loki.lochat.LoChat; import com.loki.lochat.utils.ChatFormatter; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -11,6 +13,7 @@ import org.jetbrains.annotations.NotNull; public class LocalChatCommand implements CommandExecutor { private final LoChat plugin; + private static final MiniMessage MM = MiniMessage.miniMessage(); public LocalChatCommand(LoChat plugin) { this.plugin = plugin; @@ -29,7 +32,11 @@ public class LocalChatCommand implements CommandExecutor { } String message = String.join(" ", args); - plugin.getChatManager().sendLocalMessage(player, message); + + // Конвертируем String в Component для новой сигнатуры ChatManager + Component messageComponent = MM.deserialize(message); + + plugin.getChatManager().sendLocalMessage(player, messageComponent); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/managers/ChatManager.java b/src/main/java/com/loki/lochat/managers/ChatManager.java index affb242..cff9f3b 100644 --- a/src/main/java/com/loki/lochat/managers/ChatManager.java +++ b/src/main/java/com/loki/lochat/managers/ChatManager.java @@ -5,6 +5,7 @@ import com.loki.lochat.utils.ChatFormatter; import com.loki.lochat.utils.DistanceUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -18,37 +19,37 @@ public class ChatManager { private final LoChat plugin; private final Set globalChatDisabled = ConcurrentHashMap.newKeySet(); private static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage(); + private static final PlainTextComponentSerializer PLAIN = PlainTextComponentSerializer.plainText(); public ChatManager(LoChat plugin) { this.plugin = plugin; } - public void sendGlobalMessage(Player sender, String message) { + public void sendGlobalMessage(Player sender, Component message) { if (!plugin.getConfigManager().isGlobalEnabled()) { sender.sendMessage(plugin.getMessageConfig().getComponent("global.disabled")); return; } + // Конвертируем Component в String для обработки упоминаний + String messageText = PLAIN.serialize(message); + // Обработка упоминаний @ник Set mentionedPlayers = new HashSet<>(); - String processedMessage = plugin.getMentionManager().processMentions(message, mentionedPlayers); + String processedMessage = plugin.getMentionManager().processMentions(messageText, mentionedPlayers); String format = plugin.getConfigManager().getGlobalFormat(); String prefix = plugin.getConfigManager().getGlobalPrefix(); - boolean hasColor = sender.hasPermission("chat.global.color"); // Получаем отображаемое имя игрока (с градиентом если есть) String playerDisplay = getPlayerDisplay(sender); - - // Обрабатываем сообщение игрока (смайлики, цвета если есть право) - String finalMessage = ChatFormatter.processPlayerMessage(processedMessage, sender, hasColor); // Отправка каждому игроку персонализированное сообщение for (Player player : Bukkit.getOnlinePlayers()) { if (isGlobalChatDisabled(player.getUniqueId())) continue; // Персонализируем сообщение для этого игрока (выделяем его ник) - String personalizedMsg = plugin.getMentionManager().getPersonalizedMessage(finalMessage, player); + String personalizedMsg = plugin.getMentionManager().getPersonalizedMessage(processedMessage, player); // Формируем итоговую строку String formatted = format @@ -61,34 +62,33 @@ public class ChatManager { player.sendMessage(component); // Проверяем упоминание ника без @ и уведомляем - plugin.getMentionManager().notifyIfMentioned(message, player, sender); + plugin.getMentionManager().notifyIfMentioned(messageText, player, sender); } // Уведомление упомянутых через @ plugin.getMentionManager().notifyMentioned(mentionedPlayers); - plugin.getLogger().info("[G] " + sender.getName() + ": " + ChatFormatter.stripTags(message)); + plugin.getLogger().info("[G] " + sender.getName() + ": " + ChatFormatter.stripTags(messageText)); } - public void sendLocalMessage(Player sender, String message) { + public void sendLocalMessage(Player sender, Component message) { if (!plugin.getConfigManager().isLocalEnabled()) { return; } + // Конвертируем Component в String для обработки упоминаний + String messageText = PLAIN.serialize(message); + // Обработка упоминаний @ник Set mentionedPlayers = new HashSet<>(); - String processedMessage = plugin.getMentionManager().processMentions(message, mentionedPlayers); + String processedMessage = plugin.getMentionManager().processMentions(messageText, mentionedPlayers); int radius = plugin.getConfigManager().getLocalRadius(); String format = plugin.getConfigManager().getLocalFormat(); String prefix = plugin.getConfigManager().getLocalPrefix(); - boolean hasColor = sender.hasPermission("chat.local.color"); // Получаем отображаемое имя игрока (с градиентом если есть) String playerDisplay = getPlayerDisplay(sender); - - // Обрабатываем сообщение игрока (смайлики, цвета если есть право) - String finalMessage = ChatFormatter.processPlayerMessage(processedMessage, sender, hasColor); boolean foundRecipient = false; Set recipients = new HashSet<>(); @@ -96,7 +96,7 @@ public class ChatManager { for (Player player : Bukkit.getOnlinePlayers()) { if (DistanceUtil.isInRange(sender, player, radius)) { // Персонализируем сообщение для этого игрока - String personalizedMsg = plugin.getMentionManager().getPersonalizedMessage(finalMessage, player); + String personalizedMsg = plugin.getMentionManager().getPersonalizedMessage(processedMessage, player); // Формируем итоговую строку String formatted = prefix + " " + format @@ -110,7 +110,7 @@ public class ChatManager { recipients.add(player); // Проверяем упоминание ника без @ - plugin.getMentionManager().notifyIfMentioned(message, player, sender); + plugin.getMentionManager().notifyIfMentioned(messageText, player, sender); if (!player.equals(sender)) { foundRecipient = true; @@ -153,4 +153,4 @@ public class ChatManager { public boolean isGlobalChatDisabled(UUID player) { return globalChatDisabled.contains(player); } -} +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/utils/ChatFormatter.java b/src/main/java/com/loki/lochat/utils/ChatFormatter.java index 3e0f192..d845f5d 100644 --- a/src/main/java/com/loki/lochat/utils/ChatFormatter.java +++ b/src/main/java/com/loki/lochat/utils/ChatFormatter.java @@ -2,13 +2,110 @@ package com.loki.lochat.utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.entity.Player; public final class ChatFormatter { private static final MiniMessage MM = MiniMessage.miniMessage(); + private static final PlainTextComponentSerializer PLAIN = + PlainTextComponentSerializer.plainText(); private ChatFormatter() {} + /* ===================== BASIC ===================== */ + + public static Component parse(String message) { + if (message == null) return Component.empty(); + return MM.deserialize(message); + } + + public static Component parse(String message, String... replacements) { + if (message == null) return Component.empty(); + String result = message; + for (int i = 0; i + 1 < replacements.length; i += 2) { + result = result.replace(replacements[i], replacements[i + 1]); + } + return MM.deserialize(result); + } + + public static String stripTags(String message) { + if (message == null) return ""; + return PLAIN.serialize(MM.deserialize(message)); + } + + public static String toPlain(Component component) { + return component == null ? "" : PLAIN.serialize(component); + } + + /* ===================== COLORS ===================== */ + + /** + * Legacy-совместимость. + * Сейчас просто возвращает MiniMessage-ready строку. + */ + public static String convertAllColors(String message) { + if (message == null) return ""; + return message; + } + + /* ===================== EMOJIS ===================== */ + + public static String replaceEmojis(String message) { + return message; + } + + public static String replaceEmojis(String message, Player player) { + return message; + } + + /* ===================== CHAT ===================== */ + + /** + * Legacy API для ChatManager + */ + public static String processPlayerMessage( + String message, + Player player, + boolean hasColorPermission + ) { + return message; + } + + /* ===================== ANNOUNCE ===================== */ + + public static Component formatAnnouncement(String format, String message) { + return parse(format.replace("", message)); + } + + /* ===================== PM ===================== */ + + public static Component formatPmSentNew( + String format, + Player sender, + Player receiver, + String message + ) { + return parse(format + .replace("{sender}", sender.getName()) + .replace("{receiver}", receiver.getName()) + .replace("{message}", message)); + } + + public static Component formatPmReceivedNew( + String format, + Player sender, + Player receiver, + String message + ) { + return parse(format + .replace("{sender}", sender.getName()) + .replace("{receiver}", receiver.getName()) + .replace("{message}", message)); + } + + /* ===================== FORMAT (Component-based) ===================== */ + public static Component format( String format, Component name,