From 64bd3141dcb44e2ad3591ef9f0e016a5849f975d Mon Sep 17 00:00:00 2001 From: John Etherfield Date: Sun, 16 Aug 2026 19:16:25 +0200 Subject: [PATCH] feat: highlight player names in chat with LuckPerms colors --- src/main/java/org/examp/john/ChatHandler.java | 59 ++++++++++++++++++- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/examp/john/ChatHandler.java b/src/main/java/org/examp/john/ChatHandler.java index dc6a77a..db75e7b 100644 --- a/src/main/java/org/examp/john/ChatHandler.java +++ b/src/main/java/org/examp/john/ChatHandler.java @@ -12,6 +12,7 @@ import net.minecraft.server.level.ServerPlayer; import org.examp.john.stealth.StealthStorage; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class ChatHandler { @@ -30,7 +31,8 @@ public class ChatHandler { String actualMessage = text.substring(1).trim(); Component globalMessage = Component.empty() .append(formattedName) - .append(Component.literal(": " + actualMessage)); + .append(Component.literal(": ")) + .append(buildMentionMessage(actualMessage, players)); for (ServerPlayer player : players) { player.sendSystemMessage(globalMessage); @@ -62,7 +64,8 @@ public class ChatHandler { if (!hearers.isEmpty()) { Component localMessage = Component.empty() .append(formattedName) - .append(Component.literal(": " + text).withStyle(ChatFormatting.GRAY)); + .append(Component.literal(": ").withStyle(ChatFormatting.GRAY)) + .append(buildMentionMessage(text, players).withStyle(ChatFormatting.GRAY)); sender.sendSystemMessage(localMessage); for (ServerPlayer hearer : hearers) { @@ -84,6 +87,58 @@ public class ChatHandler { }); } + private static MutableComponent buildMentionMessage(String text, List onlinePlayers) { + List sorted = onlinePlayers.stream() + .sorted(Comparator.comparingInt((ServerPlayer p) -> p.getName().getString().length()).reversed()) + .toList(); + + MutableComponent result = Component.empty(); + String remaining = text; + + while (!remaining.isEmpty()) { + int earliestIndex = remaining.length(); + ServerPlayer mentioned = null; + + for (ServerPlayer player : sorted) { + String name = player.getName().getString(); + int index = remaining.toLowerCase().indexOf(name.toLowerCase()); + if (index >= 0 && index < earliestIndex) { + earliestIndex = index; + mentioned = player; + } + } + + if (mentioned == null) { + result.append(Component.literal(remaining)); + break; + } + + if (earliestIndex > 0) { + result.append(Component.literal(remaining.substring(0, earliestIndex))); + } + + result.append(createMentionComponent(mentioned)); + + remaining = remaining.substring(earliestIndex + mentioned.getName().getString().length()); + } + + return result; + } + + private static Component createMentionComponent(ServerPlayer player) { + String prefix = getLuckPermsPrefix(player); + String formattedPrefix = prefix.replace("&", "\u00a7"); + String name = player.getName().getString(); + + return Component.literal(formattedPrefix + name) + .withStyle(Style.EMPTY + .withClickEvent(new ClickEvent.SuggestCommand("/msg " + name + " ")) + .withHoverEvent(new HoverEvent.ShowText( + Component.literal("Натисніть щоб написати " + name) + .withStyle(ChatFormatting.GRAY))) + ); + } + private static MutableComponent buildFormattedName(ServerPlayer player) { String prefix = ""; try { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c7fb683..7584f25 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,5 +1,5 @@ { - "schemaVersion": 1, + "schemaVersion": 1,gi "id": "msnexus", "version": "${version}", "name": "msnexus",