feat: highlight player names in chat with LuckPerms colors
This commit is contained in:
@@ -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<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) {
|
||||
String prefix = "";
|
||||
try {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"schemaVersion": 1,gi
|
||||
"id": "msnexus",
|
||||
"version": "${version}",
|
||||
"name": "msnexus",
|
||||
|
||||
Reference in New Issue
Block a user