From 395042e7b151a86c03eeb72f6c77a590dd5fa08f Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Fri, 30 May 2025 02:33:58 +0200 Subject: [PATCH 1/9] Fix compatibility with Feather Client --- .../meteorclient/mixin/ChatHudMixin.java | 37 ++++++++++++++++--- src/main/resources/fabric.mod.json | 1 - 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index c4cc2aa58d..9e682d40d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -23,9 +23,11 @@ import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.gui.hud.MessageIndicator; +import net.minecraft.client.util.ChatMessages; import net.minecraft.network.message.MessageSignatureData; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -55,6 +57,8 @@ public abstract class ChatHudMixin implements IChatHud { private int nextId; @Unique private boolean skipOnAddMessage; + @Unique + private boolean isEntryMessage; @Shadow public abstract void addMessage(Text message, @Nullable MessageSignatureData signatureData, @Nullable MessageIndicator indicator); @@ -62,6 +66,12 @@ public abstract class ChatHudMixin implements IChatHud { @Shadow public abstract void addMessage(Text message); + @Shadow + public abstract int getWidth(); + + @Shadow + public abstract double getChatScale(); + @Override public void meteor$add(Text message, int id) { nextId = id; @@ -79,16 +89,20 @@ private void onAddMessageAfterNewChatHudLine(ChatHudLine message, CallbackInfo c ((IChatHudLine) (Object) messages.getFirst()).meteor$setId(nextId); } - @SuppressWarnings("DataFlowIssue") @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/text/OrderedText;Lnet/minecraft/client/gui/hud/MessageIndicator;Z)Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;")) - private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Local(ordinal = 1) int j) { + private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); - if (handler == null) return line; - IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; + if (meteorLine == null) return line; meteorLine.meteor$setSender(handler.meteor$getSender()); - meteorLine.meteor$setStartOfEntry(j == 0); + + // This is the equivalent of j == 0 since isEntryMessage gets set before the for-loop so this will only be true at the first iteration + boolean isStartOfEntry = isEntryMessage; + if (isEntryMessage) { + isEntryMessage = false; + } + meteorLine.meteor$setStartOfEntry(isStartOfEntry); return line; } @@ -167,10 +181,21 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { // Anti spam @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z")) - private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, @Local List list) { + private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci) { if (Modules.get() == null) return; // baritone calls addMessage before we initialise + // We make the list variable on our own as using @Local breaks compatibility with Feather client + int i = MathHelper.floor((double)this.getWidth() / this.getChatScale()); + MessageIndicator.Icon icon = message.getIcon(); + if (icon != null) { + i -= icon.width + 4 + 2; + } + + List list = ChatMessages.breakRenderedChatMessageLines(message.content(), i, this.client.textRenderer); getBetterChat().lines.addFirst(list.size()); + + // We set isEntryMessage here to true since it's the last function called before the for-loop begins + isEntryMessage = true; } @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0dfae4f94f..34568762a8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -52,7 +52,6 @@ }, "breaks": { "optifabric": "*", - "feather": "*", "origins": "*", "sodium": "<0.6.12", "morechathistory": "*" From 8547eacd9ffcab491dff65909aabfbd1fc944672 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Fri, 30 May 2025 06:17:22 +0200 Subject: [PATCH 2/9] Swapped the `isEntryMessage` field with a @Share --- .../meteorclient/mixin/ChatHudMixin.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 9e682d40d4..a2eb771d30 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -8,6 +8,8 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReceiver; import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.mixininterface.IChatHud; @@ -57,8 +59,6 @@ public abstract class ChatHudMixin implements IChatHud { private int nextId; @Unique private boolean skipOnAddMessage; - @Unique - private boolean isEntryMessage; @Shadow public abstract void addMessage(Text message, @Nullable MessageSignatureData signatureData, @Nullable MessageIndicator indicator); @@ -90,7 +90,7 @@ private void onAddMessageAfterNewChatHudLine(ChatHudLine message, CallbackInfo c } @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/text/OrderedText;Lnet/minecraft/client/gui/hud/MessageIndicator;Z)Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;")) - private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line) { + private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Share("isEntryMessage") LocalBooleanRef isEntryMessage) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; if (meteorLine == null) return line; @@ -98,9 +98,9 @@ private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Vi meteorLine.meteor$setSender(handler.meteor$getSender()); // This is the equivalent of j == 0 since isEntryMessage gets set before the for-loop so this will only be true at the first iteration - boolean isStartOfEntry = isEntryMessage; - if (isEntryMessage) { - isEntryMessage = false; + boolean isStartOfEntry = isEntryMessage.get(); + if (isStartOfEntry) { + isEntryMessage.set(false); } meteorLine.meteor$setStartOfEntry(isStartOfEntry); @@ -181,7 +181,7 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { // Anti spam @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z")) - private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci) { + private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, @Share("isEntryMessage") LocalBooleanRef isEntryMessage) { if (Modules.get() == null) return; // baritone calls addMessage before we initialise // We make the list variable on our own as using @Local breaks compatibility with Feather client @@ -195,7 +195,7 @@ private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci) { getBetterChat().lines.addFirst(list.size()); // We set isEntryMessage here to true since it's the last function called before the for-loop begins - isEntryMessage = true; + isEntryMessage.set(true); } @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) From 3e5e7f9d81e60fac2c8affacd6f4bf5005f6c496 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Fri, 30 May 2025 07:33:06 +0200 Subject: [PATCH 3/9] Cleaned up ChatHudMixin --- .../meteorclient/mixin/ChatHudMixin.java | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index a2eb771d30..46c74cd292 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -9,7 +9,9 @@ import com.llamalad7.mixinextras.injector.ModifyReceiver; import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import javassist.bytecode.Opcode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.mixininterface.IChatHud; @@ -25,18 +27,15 @@ import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.client.util.ChatMessages; import net.minecraft.network.message.MessageSignatureData; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; @@ -66,12 +65,6 @@ public abstract class ChatHudMixin implements IChatHud { @Shadow public abstract void addMessage(Text message); - @Shadow - public abstract int getWidth(); - - @Shadow - public abstract double getChatScale(); - @Override public void meteor$add(Text message, int id) { nextId = id; @@ -90,19 +83,13 @@ private void onAddMessageAfterNewChatHudLine(ChatHudLine message, CallbackInfo c } @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/text/OrderedText;Lnet/minecraft/client/gui/hud/MessageIndicator;Z)Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;")) - private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Share("isEntryMessage") LocalBooleanRef isEntryMessage) { + private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Share("jRef") LocalIntRef jRef) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; if (meteorLine == null) return line; meteorLine.meteor$setSender(handler.meteor$getSender()); - - // This is the equivalent of j == 0 since isEntryMessage gets set before the for-loop so this will only be true at the first iteration - boolean isStartOfEntry = isEntryMessage.get(); - if (isStartOfEntry) { - isEntryMessage.set(false); - } - meteorLine.meteor$setStartOfEntry(isStartOfEntry); + meteorLine.meteor$setStartOfEntry(jRef.get() == 0); return line; } @@ -178,24 +165,30 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { return Modules.get().get(NoRender.class).noMessageSignatureIndicator() ? null : indicator; } + // Get the variable `j` for later usage at onAddMessage_modifyChatHudLineVisible + + @ModifyArg(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;")) + private int captureIndex(int index, @Share("jRef") LocalIntRef jRef) { + jRef.set(index); + return index; + } + + // Get list for later usage at anti-spam + + @ModifyVariable(method = "addVisibleMessage", at = @At(value = "STORE", target = "Lnet/minecraft/client/util/ChatMessages;breakRenderedChatMessageLines(Lnet/minecraft/text/StringVisitable;ILnet/minecraft/client/font/TextRenderer;)Ljava/util/List;", opcode = Opcode.ASTORE)) + private List injected(List value, @Share("listRef") LocalRef> listRef) { + listRef.set(value); + return value; + } + // Anti spam @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z")) - private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, @Share("isEntryMessage") LocalBooleanRef isEntryMessage) { + private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, @Share("listRef") LocalRef> listRef) { if (Modules.get() == null) return; // baritone calls addMessage before we initialise - // We make the list variable on our own as using @Local breaks compatibility with Feather client - int i = MathHelper.floor((double)this.getWidth() / this.getChatScale()); - MessageIndicator.Icon icon = message.getIcon(); - if (icon != null) { - i -= icon.width + 4 + 2; - } - - List list = ChatMessages.breakRenderedChatMessageLines(message.content(), i, this.client.textRenderer); + List list = listRef.get(); getBetterChat().lines.addFirst(list.size()); - - // We set isEntryMessage here to true since it's the last function called before the for-loop begins - isEntryMessage.set(true); } @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;remove(I)Ljava/lang/Object;")) From 65afb5e8e326d28f29468e2d4208505883ffc309 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Fri, 30 May 2025 08:16:50 +0200 Subject: [PATCH 4/9] Fixed crashes with Feather --- .../meteorclient/mixin/ChatHudMixin.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index 46c74cd292..a162536bfc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -11,7 +11,6 @@ import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import javassist.bytecode.Opcode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; import meteordevelopment.meteorclient.mixininterface.IChatHud; @@ -27,8 +26,10 @@ import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.gui.hud.MessageIndicator; +import net.minecraft.client.util.ChatMessages; import net.minecraft.network.message.MessageSignatureData; import net.minecraft.text.OrderedText; +import net.minecraft.text.StringVisitable; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -168,17 +169,18 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { // Get the variable `j` for later usage at onAddMessage_modifyChatHudLineVisible @ModifyArg(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;")) - private int captureIndex(int index, @Share("jRef") LocalIntRef jRef) { + private int addVisibleMessage_captureIndex(int index, @Share("jRef") LocalIntRef jRef) { jRef.set(index); return index; } // Get list for later usage at anti-spam - @ModifyVariable(method = "addVisibleMessage", at = @At(value = "STORE", target = "Lnet/minecraft/client/util/ChatMessages;breakRenderedChatMessageLines(Lnet/minecraft/text/StringVisitable;ILnet/minecraft/client/font/TextRenderer;)Ljava/util/List;", opcode = Opcode.ASTORE)) - private List injected(List value, @Share("listRef") LocalRef> listRef) { - listRef.set(value); - return value; + @Redirect(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/ChatMessages;breakRenderedChatMessageLines(Lnet/minecraft/text/StringVisitable;ILnet/minecraft/client/font/TextRenderer;)Ljava/util/List;")) + private List addVisibleMessage_captureList(StringVisitable message, int width, TextRenderer textRenderer, @Share("listRef") LocalRef> listRef) { + List list = ChatMessages.breakRenderedChatMessageLines(message, width, textRenderer); + listRef.set(list); + return list; } // Anti spam From cdc479cdf42f6295856f709734a52170213be173 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:08:06 +0200 Subject: [PATCH 5/9] Rename @Share Co-authored-by: RacoonDog <32882447+RacoonDog@users.noreply.github.com> --- .../java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index a162536bfc..c72a375708 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -84,7 +84,7 @@ private void onAddMessageAfterNewChatHudLine(ChatHudLine message, CallbackInfo c } @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/text/OrderedText;Lnet/minecraft/client/gui/hud/MessageIndicator;Z)Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;")) - private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Share("jRef") LocalIntRef jRef) { + private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @Share("index") LocalIntRef indexRef) { IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; if (meteorLine == null) return line; From 74610de0e2b9ee918cc84bf27f385ee723faf7a3 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:08:17 +0200 Subject: [PATCH 6/9] Rename @Share Co-authored-by: RacoonDog <32882447+RacoonDog@users.noreply.github.com> --- .../java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index c72a375708..d17ae89e96 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -90,7 +90,7 @@ private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Vi if (meteorLine == null) return line; meteorLine.meteor$setSender(handler.meteor$getSender()); - meteorLine.meteor$setStartOfEntry(jRef.get() == 0); + meteorLine.meteor$setStartOfEntry(indexRef.get() == 0); return line; } From d499e448267015eca78c9a5e2109039003d57285 Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:08:29 +0200 Subject: [PATCH 7/9] Rename @Share Co-authored-by: RacoonDog <32882447+RacoonDog@users.noreply.github.com> --- .../java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index d17ae89e96..df55f50291 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -169,7 +169,7 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { // Get the variable `j` for later usage at onAddMessage_modifyChatHudLineVisible @ModifyArg(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;")) - private int addVisibleMessage_captureIndex(int index, @Share("jRef") LocalIntRef jRef) { + private int addVisibleMessage_captureIndex(int index, @Share("index") LocalIntRef indexRef) { jRef.set(index); return index; } From f0fba6c4db4b848557d47ae70ce7a3a1953a913c Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:08:45 +0200 Subject: [PATCH 8/9] Rename @Share Co-authored-by: RacoonDog <32882447+RacoonDog@users.noreply.github.com> --- .../java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java index df55f50291..2fb1471f11 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java @@ -170,7 +170,7 @@ private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { @ModifyArg(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;")) private int addVisibleMessage_captureIndex(int index, @Share("index") LocalIntRef indexRef) { - jRef.set(index); + indexRef.set(index); return index; } From b2046c3d87fb2fb35df9846c71d5c3cf115692ae Mon Sep 17 00:00:00 2001 From: IHaxU <30863082+IHaxU@users.noreply.github.com> Date: Tue, 1 Jul 2025 23:32:46 +0200 Subject: [PATCH 9/9] Fixed meteor crash on collectPlayerEntries caused by Constant Error: `Caused by: org.spongepowered.asm.mixin.injection.throwables.InjectionError: Critical injection failure: Constant modifier method modifyCount(J)J in meteor-client.mixins.json:PlayerListHudMixin from mod meteor-client failed injection check, (0/1) succeeded. Scanned 0 target(s). Using refmap meteor-client-refmap.json` --- .../mixin/PlayerListHudMixin.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java index affa543550..5a52133f79 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java @@ -16,24 +16,38 @@ import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Comparator; import java.util.List; @Mixin(PlayerListHud.class) public abstract class PlayerListHudMixin { + @Shadow + @Final + private MinecraftClient client; + + @Shadow + @Final + private static Comparator ENTRY_ORDERING; + @Shadow protected abstract List collectPlayerEntries(); - @ModifyConstant(constant = @Constant(longValue = 80L), method = "collectPlayerEntries") - private long modifyCount(long count) { + @Inject(method = "collectPlayerEntries", at = @At("HEAD"), cancellable = true) + private void modifyCount(CallbackInfoReturnable> cir) { BetterTab module = Modules.get().get(BetterTab.class); - return module.isActive() ? module.tabSize.get() : count; + if (client.player == null) return; + + if (module.isActive()) { + cir.setReturnValue(client.player.networkHandler.getListedPlayerListEntries().stream().sorted(ENTRY_ORDERING).limit(module.tabSize.get()).toList()); + } } @Inject(method = "getPlayerName", at = @At("HEAD"), cancellable = true)