fix: Resolve tab-completion NoClassDefFoundError, configure TAB RGB gradient/placeholders, and Paper AsyncChatEvent renderer

This commit is contained in:
2026-08-20 21:42:31 +02:00
parent 855d0b7491
commit 73a0a86a46
@@ -2,21 +2,25 @@ package fr.luc.gamingcore.listener;
import fr.luc.gamingcore.Main; import fr.luc.gamingcore.Main;
import fr.luc.gamingcore.manager.GuildManager; import fr.luc.gamingcore.manager.GuildManager;
import fr.luc.gamingcore.util.MessageManager;
import fr.luc.gamingcore.model.Guild; import fr.luc.gamingcore.model.Guild;
import fr.luc.gamingcore.model.GuildMember; import fr.luc.gamingcore.model.GuildMember;
import fr.luc.gamingcore.model.GuildRank; import fr.luc.gamingcore.model.GuildRank;
import fr.luc.gamingcore.util.MessageManager; import io.papermc.paper.chat.ChatRenderer;
import fr.luc.gamingcore.util.TextUtil;
import io.papermc.paper.event.player.AsyncChatEvent; 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 net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
/** /**
* Écouteur gérant le chat privé de guilde. * Écouteur gérant à la fois le chat privé de guilde (#message) et le formatage du chat global avec le tag de guilde.
* Permet aux joueurs d'écrire dans le chat de guilde en préfixant leur message par '#' (ex: # Salut la guilde !).
*/ */
public class GuildChatListener implements Listener { public class GuildChatListener implements Listener {
@@ -25,7 +29,7 @@ public class GuildChatListener implements Listener {
private final MessageManager messageManager; private final MessageManager messageManager;
/** /**
* Constructeur de l'écouteur de chat de guilde. * Constructeur du listener de chat.
* *
* @param plugin Instance principale du plugin. * @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. * @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) { public void onAsyncChat(AsyncChatEvent event) {
String rawText = PlainTextComponentSerializer.plainText().serialize(event.message()).trim(); 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; return;
} }
event.setCancelled(true); // 2. Gestion et Formatage du Chat Global Public
Player sender = event.getPlayer(); event.renderer(new ChatRenderer() {
@Override
Guild guild = guildManager.getGuildByPlayer(sender.getUniqueId()); public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer) {
if (guild == null) { Guild guild = guildManager.getGuildByPlayer(source.getUniqueId());
messageManager.send(sender, "guild.not_in_guild"); if (guild != null) {
return; Component tagComponent = MiniMessage.miniMessage().deserialize("<color:" + guild.getColor() + ">[" + guild.getTag() + "] </color>");
} return tagComponent
.append(sourceDisplayName.color(NamedTextColor.WHITE))
String guildMsg = rawText.substring(1).trim(); .append(Component.text(": ", NamedTextColor.DARK_GRAY))
if (guildMsg.isEmpty()) { .append(message.color(NamedTextColor.WHITE));
return; } else {
} return sourceDisplayName.color(NamedTextColor.WHITE)
.append(Component.text(": ", NamedTextColor.DARK_GRAY))
sendGuildChatMessage(guild, sender, guildMsg); .append(message.color(NamedTextColor.WHITE));
}
}
});
} }
/** /**
@@ -85,11 +111,13 @@ public class GuildChatListener implements Listener {
"{message}", message "{message}", message
); );
for (GuildMember m : guild.getMembers()) { Component component = MiniMessage.miniMessage().deserialize(formatted);
if (m.getOfflinePlayer() != null && m.getOfflinePlayer().isOnline()) {
Player onlinePlayer = m.getOfflinePlayer().getPlayer(); for (GuildMember gm : guild.getMembers()) {
if (onlinePlayer != null) { if (gm.getOfflinePlayer() != null && gm.getOfflinePlayer().isOnline()) {
TextUtil.sendMessage(onlinePlayer, formatted); Player p = gm.getOfflinePlayer().getPlayer();
if (p != null) {
p.sendMessage(component);
} }
} }
} }