From 73a0a86a46342c6880cf4aa23a733e126aaaaa6b Mon Sep 17 00:00:00 2001 From: GeminiAntigravityCLI Date: Thu, 20 Aug 2026 21:42:31 +0200 Subject: [PATCH] fix: Resolve tab-completion NoClassDefFoundError, configure TAB RGB gradient/placeholders, and Paper AsyncChatEvent renderer --- .../listener/GuildChatListener.java | 84 ++++++++++++------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/src/main/java/fr/luc/gamingcore/listener/GuildChatListener.java b/src/main/java/fr/luc/gamingcore/listener/GuildChatListener.java index da77602..ca1afb9 100644 --- a/src/main/java/fr/luc/gamingcore/listener/GuildChatListener.java +++ b/src/main/java/fr/luc/gamingcore/listener/GuildChatListener.java @@ -2,21 +2,25 @@ package fr.luc.gamingcore.listener; import fr.luc.gamingcore.Main; import fr.luc.gamingcore.manager.GuildManager; +import fr.luc.gamingcore.util.MessageManager; import fr.luc.gamingcore.model.Guild; import fr.luc.gamingcore.model.GuildMember; import fr.luc.gamingcore.model.GuildRank; -import fr.luc.gamingcore.util.MessageManager; -import fr.luc.gamingcore.util.TextUtil; +import io.papermc.paper.chat.ChatRenderer; import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; /** - * Écouteur gérant le chat privé de guilde. - * Permet aux joueurs d'écrire dans le chat de guilde en préfixant leur message par '#' (ex: # Salut la guilde !). + * Écouteur gérant à la fois le chat privé de guilde (#message) et le formatage du chat global avec le tag de guilde. */ public class GuildChatListener implements Listener { @@ -25,7 +29,7 @@ public class GuildChatListener implements Listener { private final MessageManager messageManager; /** - * Constructeur de l'écouteur de chat de guilde. + * Constructeur du listener de chat. * * @param plugin Instance principale du plugin. */ @@ -36,32 +40,54 @@ public class GuildChatListener implements Listener { } /** - * Intercepte les messages de chat commençant par '#' pour les rediriger exclusivement vers la guilde du joueur. + * Intercepte les messages de chat pour : + * 1. Rediriger les messages commençant par '#' vers le chat privé de guilde. + * 2. Formater le chat global public avec le tag coloré [TAG] Pseudo: Message. * * @param event L'événement AsyncChatEvent de Paper. */ - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onAsyncChat(AsyncChatEvent event) { String rawText = PlainTextComponentSerializer.plainText().serialize(event.message()).trim(); - if (!rawText.startsWith("#")) { + + // 1. Gestion du Chat de Guilde (#) + if (rawText.startsWith("#")) { + event.setCancelled(true); + Player sender = event.getPlayer(); + + Guild guild = guildManager.getGuildByPlayer(sender.getUniqueId()); + if (guild == null) { + messageManager.send(sender, "guild.not_in_guild"); + return; + } + + String guildMsg = rawText.substring(1).trim(); + if (guildMsg.isEmpty()) { + return; + } + + sendGuildChatMessage(guild, sender, guildMsg); return; } - event.setCancelled(true); - Player sender = event.getPlayer(); - - Guild guild = guildManager.getGuildByPlayer(sender.getUniqueId()); - if (guild == null) { - messageManager.send(sender, "guild.not_in_guild"); - return; - } - - String guildMsg = rawText.substring(1).trim(); - if (guildMsg.isEmpty()) { - return; - } - - sendGuildChatMessage(guild, sender, guildMsg); + // 2. Gestion et Formatage du Chat Global Public + event.renderer(new ChatRenderer() { + @Override + public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer) { + Guild guild = guildManager.getGuildByPlayer(source.getUniqueId()); + if (guild != null) { + Component tagComponent = MiniMessage.miniMessage().deserialize("[" + guild.getTag() + "] "); + return tagComponent + .append(sourceDisplayName.color(NamedTextColor.WHITE)) + .append(Component.text(": ", NamedTextColor.DARK_GRAY)) + .append(message.color(NamedTextColor.WHITE)); + } else { + return sourceDisplayName.color(NamedTextColor.WHITE) + .append(Component.text(": ", NamedTextColor.DARK_GRAY)) + .append(message.color(NamedTextColor.WHITE)); + } + } + }); } /** @@ -85,11 +111,13 @@ public class GuildChatListener implements Listener { "{message}", message ); - for (GuildMember m : guild.getMembers()) { - if (m.getOfflinePlayer() != null && m.getOfflinePlayer().isOnline()) { - Player onlinePlayer = m.getOfflinePlayer().getPlayer(); - if (onlinePlayer != null) { - TextUtil.sendMessage(onlinePlayer, formatted); + Component component = MiniMessage.miniMessage().deserialize(formatted); + + for (GuildMember gm : guild.getMembers()) { + if (gm.getOfflinePlayer() != null && gm.getOfflinePlayer().isOnline()) { + Player p = gm.getOfflinePlayer().getPlayer(); + if (p != null) { + p.sendMessage(component); } } }