feat: highlight player names in chat with LuckPerms colors

This commit is contained in:
2026-08-16 19:16:25 +02:00
parent 2edff88cac
commit 64bd3141dc
2 changed files with 58 additions and 3 deletions
+57 -2
View File
@@ -12,6 +12,7 @@ import net.minecraft.server.level.ServerPlayer;
import org.examp.john.stealth.StealthStorage; import org.examp.john.stealth.StealthStorage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class ChatHandler { public class ChatHandler {
@@ -30,7 +31,8 @@ public class ChatHandler {
String actualMessage = text.substring(1).trim(); String actualMessage = text.substring(1).trim();
Component globalMessage = Component.empty() Component globalMessage = Component.empty()
.append(formattedName) .append(formattedName)
.append(Component.literal(": " + actualMessage)); .append(Component.literal(": "))
.append(buildMentionMessage(actualMessage, players));
for (ServerPlayer player : players) { for (ServerPlayer player : players) {
player.sendSystemMessage(globalMessage); player.sendSystemMessage(globalMessage);
@@ -62,7 +64,8 @@ public class ChatHandler {
if (!hearers.isEmpty()) { if (!hearers.isEmpty()) {
Component localMessage = Component.empty() Component localMessage = Component.empty()
.append(formattedName) .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); sender.sendSystemMessage(localMessage);
for (ServerPlayer hearer : hearers) { for (ServerPlayer hearer : hearers) {
@@ -84,6 +87,58 @@ public class ChatHandler {
}); });
} }
private static MutableComponent buildMentionMessage(String text, List<ServerPlayer> onlinePlayers) {
List<ServerPlayer> 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) { private static MutableComponent buildFormattedName(ServerPlayer player) {
String prefix = ""; String prefix = "";
try { try {
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,gi
"id": "msnexus", "id": "msnexus",
"version": "${version}", "version": "${version}",
"name": "msnexus", "name": "msnexus",