From 6b74142588855899861e2d0b72b2bd4b47981010 Mon Sep 17 00:00:00 2001 From: RedCarlos26 <58893097+RedCarlos26@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:54:46 -0400 Subject: [PATCH 1/2] Chat friend highlighting option --- .../systems/modules/misc/BetterChat.java | 77 ++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 8323516eeb..2f452785f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -18,11 +18,14 @@ import meteordevelopment.meteorclient.mixininterface.IChatHudLine; import meteordevelopment.meteorclient.mixininterface.IChatHudLineVisible; import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; @@ -89,6 +92,21 @@ public class BetterChat extends Module { .build() ); + private final Setting friendHighlight = sgGeneral.add(new BoolSetting.Builder() + .name("friend-highlight") + .description("Highlights friends' names in chat messages.") + .defaultValue(true) + .build() + ); + + private final Setting friendHighlightColor = sgGeneral.add(new ColorSetting.Builder() + .name("friend-highlight-color") + .description("The color used to highlight friends' names.") + .defaultValue(new SettingColor(0, 255, 180)) + .visible(friendHighlight::get) + .build() + ); + private final Setting coordsProtection = sgGeneral.add(new BoolSetting.Builder() .name("coords-protection") .description("Prevents you from sending messages in chat that may contain coordinates.") @@ -144,7 +162,6 @@ public class BetterChat extends Module { .build() ); - // Longer chat private final Setting infiniteChatBox = sgLongerChat.add(new BoolSetting.Builder() @@ -296,6 +313,10 @@ private void onMessageReceive(ReceiveMessageEvent event) { message = Text.empty().append(timestamp).append(message); } + if (friendHighlight.get()) { + message = applyFriendHighlight(message); + } + event.setMessage(message); } @@ -405,7 +426,6 @@ private record CustomHeadEntry(String prefix, Identifier texture) {} public ChatHudLine.Visible line; - /** Registers a custom player head to render based on a message prefix */ public static void registerCustomHead(String prefix, Identifier texture) { CUSTOM_HEAD_ENTRIES.add(new CustomHeadEntry(prefix, texture)); @@ -421,7 +441,6 @@ public int modifyChatWidth(int width) { return width; } - public void beforeDrawMessage(DrawContext context, int y, int color) { if (!isActive() || !playerHeads.get() || line == null) return; @@ -485,6 +504,58 @@ private GameProfile getSender(IChatHudLine line, String text) { return sender; } + // Friend Highlight + + private Text applyFriendHighlight(Text message) { + // Quick check: does the plain string contain any friend name at all? + String plain = message.getString(); + boolean hasFriend = false; + for (var friend : Friends.get()) { + if (plain.contains(friend.getName())) { + hasFriend = true; + break; + } + } + if (!hasFriend) return message; + + // Rebuild the text component by component, replacing friend names with colored spans + MutableText result = Text.empty(); + message.visit((style, string) -> { + String remaining = string; + while (!remaining.isEmpty()) { + int earliestIndex = -1; + String earliestName = null; + + for (var friend : Friends.get()) { + String name = friend.getName(); + int idx = remaining.indexOf(name); + if (idx != -1 && (earliestIndex == -1 || idx < earliestIndex)) { + earliestIndex = idx; + earliestName = name; + } + } + + if (earliestName == null) { + result.append(Text.literal(remaining).setStyle(style)); + break; + } + + if (earliestIndex > 0) { + result.append(Text.literal(remaining.substring(0, earliestIndex)).setStyle(style)); + } + + result.append(Text.literal(earliestName).setStyle( + style.withColor(friendHighlightColor.get().getPacked()) + )); + + remaining = remaining.substring(earliestIndex + earliestName.length()); + } + return Optional.empty(); + }, Style.EMPTY); + + return result; + } + // Timestamps private SimpleDateFormat dateFormat; From 163557735e39b0e9086acbfb3397daab090155d0 Mon Sep 17 00:00:00 2001 From: RedCarlos26 <58893097+RedCarlos26@users.noreply.github.com> Date: Thu, 26 Mar 2026 20:49:50 -0400 Subject: [PATCH 2/2] Fix feature highlighting similar names bug --- .../meteorclient/systems/modules/misc/BetterChat.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java index 2f452785f2..475b6d0bd6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BetterChat.java @@ -22,7 +22,6 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; @@ -528,8 +527,11 @@ private Text applyFriendHighlight(Text message) { for (var friend : Friends.get()) { String name = friend.getName(); - int idx = remaining.indexOf(name); - if (idx != -1 && (earliestIndex == -1 || idx < earliestIndex)) { + Matcher m = Pattern.compile("\\b" + Pattern.quote(name) + "\\b").matcher(remaining); + if (!m.find()) continue; + + int idx = m.start(); + if (earliestIndex == -1 || idx < earliestIndex) { earliestIndex = idx; earliestName = name; }