From 252f9f75a4fed66112e9f8acdd094def0d9a3114 Mon Sep 17 00:00:00 2001 From: cqb13 Date: Thu, 16 Apr 2026 17:25:36 -0400 Subject: [PATCH 1/3] added control over accounts and proxies button visibility and position --- .../mixin/MultiplayerScreenMixin.java | 60 ++++++++++++++++--- .../meteorclient/systems/config/Config.java | 37 ++++++++++++ 2 files changed, 88 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java index ba74b38a4e..4803963c4f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java @@ -6,6 +6,7 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.gui.GuiThemes; +import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.NameProtect; import meteordevelopment.meteorclient.systems.proxies.Proxies; @@ -42,6 +43,15 @@ public abstract class MultiplayerScreenMixin extends Screen { @Unique private ButtonWidget proxies; + @Unique + private static final int BUTTON_WIDTH = 75; + @Unique + private static final int BUTTON_HEIGHT = 20; + @Unique + private static final int MARGIN = 3; + @Unique + private static final int GAP = 2; + public MultiplayerScreenMixin(Text title) { super(title); } @@ -57,28 +67,60 @@ private void onInit(CallbackInfo info) { if (accounts == null) { accounts = addDrawableChild( new ButtonWidget.Builder(Text.literal("Accounts"), button -> client.setScreen(GuiThemes.get().accountsScreen())) - .size(75, 20) + .size(BUTTON_WIDTH, BUTTON_HEIGHT) .build() ); } - accounts.setPosition(this.width - 75 - 3, 3); if (proxies == null) { proxies = addDrawableChild( - new ButtonWidget.Builder(Text.literal("Proxies"), button -> client.setScreen(GuiThemes.get().proxiesScreen())) - .size(75, 20) - .build() - ); + new ButtonWidget.Builder(Text.literal("Proxies"), button -> client.setScreen(GuiThemes.get().proxiesScreen())) + .size(BUTTON_WIDTH, BUTTON_HEIGHT) + .build() + ); + } + + Config config = Config.get(); + boolean accountsVisible = config.showAccountButton.get(); + boolean proxiesVisible = config.showProxiesButton.get(); + Config.ButtonAnchor accountAnchor = config.accountButtonAnchor.get(); + Config.ButtonAnchor proxiesAnchor = config.proxiesButtonAnchor.get(); + + accounts.visible = accountsVisible; + proxies.visible = proxiesVisible; + + positionButton(accounts, accountAnchor, proxiesVisible && proxiesAnchor == accountAnchor, true); + positionButton(proxies, proxiesAnchor, accountsVisible && accountAnchor == proxiesAnchor, false); + } + + @Unique + private void positionButton(ButtonWidget button, Config.ButtonAnchor anchor, boolean sharingCorner, boolean isAccounts) { + int leftOffset = sharingCorner && isAccounts ? BUTTON_WIDTH + GAP : 0; + int rightOffset = sharingCorner && !isAccounts ? BUTTON_WIDTH + GAP : 0; + + switch (anchor) { + case TopRight -> button.setPosition(this.width - MARGIN - BUTTON_WIDTH - rightOffset, MARGIN); + case TopLeft -> button.setPosition(MARGIN + leftOffset, MARGIN); + case BottomLeft -> button.setPosition(MARGIN + leftOffset, this.height - MARGIN - BUTTON_HEIGHT); + case BottomRight -> button.setPosition(this.width - MARGIN - BUTTON_WIDTH - rightOffset, this.height - MARGIN - BUTTON_HEIGHT); } - proxies.setPosition(this.width - 75 - 3 - 75 - 2, 3); } @Override public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) { super.render(context, mouseX, mouseY, deltaTicks); - int x = 3; - int y = 3; + // Shifts the top left account and proxy text to right if buttons are also top left + Config config = Config.get(); + int x = MARGIN; + if (config.showProxiesButton.get() && config.proxiesButtonAnchor.get() == Config.ButtonAnchor.TopLeft) { + x += BUTTON_WIDTH + GAP; + } + if (config.showAccountButton.get() && config.accountButtonAnchor.get() == Config.ButtonAnchor.TopLeft) { + x += BUTTON_WIDTH + GAP; + } + + int y = MARGIN; // Logged in as context.drawTextWithShadow(mc.textRenderer, loggedInAs, x, y, textColor1); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index f8deb6eff2..18e9c24f97 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -103,6 +103,36 @@ public class Config extends System { .build() ); + public final Setting showAccountButton = sgVisual.add(new BoolSetting.Builder() + .name("accounts-button") + .description("Shows the accounts button in the multiplayer screen.") + .defaultValue(true) + .build() + ); + + public final Setting accountButtonAnchor = sgVisual.add(new EnumSetting.Builder() + .name("accounts-button-position") + .description("Where the accounts button is displayed") + .defaultValue(ButtonAnchor.TopRight) + .visible(showAccountButton::get) + .build() + ); + + public final Setting showProxiesButton = sgVisual.add(new BoolSetting.Builder() + .name("proxies-button") + .description("Shows the proxies button in the multiplayer screen.") + .defaultValue(true) + .build() + ); + + public final Setting proxiesButtonAnchor = sgVisual.add(new EnumSetting.Builder() + .name("proxies-button-position") + .description("Where the proxies button is displayed") + .defaultValue(ButtonAnchor.TopRight) + .visible(showProxiesButton::get) + .build() + ); + // Modules public final Setting> hiddenModules = sgModules.add(new ModuleListSetting.Builder() @@ -206,4 +236,11 @@ private List listFromTag(NbtCompound tag, String key) { for (NbtElement item : tag.getListOrEmpty(key)) list.add(item.asString().orElse("")); return list; } + + public enum ButtonAnchor { + TopLeft, + TopRight, + BottomLeft, + BottomRight, + } } From fc12d5a0002262dd271fdb077d3010b3788043be Mon Sep 17 00:00:00 2001 From: cqb13 Date: Thu, 16 Apr 2026 17:34:42 -0400 Subject: [PATCH 2/3] added control over account and proxy status visibility --- .../mixin/MultiplayerScreenMixin.java | 19 +++++++++++++++---- .../meteorclient/systems/config/Config.java | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java index 4803963c4f..b21df9e725 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java @@ -110,8 +110,13 @@ private void positionButton(ButtonWidget button, Config.ButtonAnchor anchor, boo public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) { super.render(context, mouseX, mouseY, deltaTicks); - // Shifts the top left account and proxy text to right if buttons are also top left Config config = Config.get(); + + if (!config.showAccountStatus.get() && !config.showProxiesStatus.get()) { + return; + } + + // Shifts the top left account and proxy text to right if buttons are also top left int x = MARGIN; if (config.showProxiesButton.get() && config.proxiesButtonAnchor.get() == Config.ButtonAnchor.TopLeft) { x += BUTTON_WIDTH + GAP; @@ -123,10 +128,16 @@ public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks int y = MARGIN; // Logged in as - context.drawTextWithShadow(mc.textRenderer, loggedInAs, x, y, textColor1); - context.drawTextWithShadow(mc.textRenderer, Modules.get().get(NameProtect.class).getName(client.getSession().getUsername()), x + loggedInAsLength, y, textColor2); + if (config.showAccountStatus.get()) { + context.drawTextWithShadow(mc.textRenderer, loggedInAs, x, y, textColor1); + context.drawTextWithShadow(mc.textRenderer, Modules.get().get(NameProtect.class).getName(client.getSession().getUsername()), x + loggedInAsLength, y, textColor2); + + y += textRenderer.fontHeight + 2; + } - y += textRenderer.fontHeight + 2; + if (!config.showProxiesStatus.get()) { + return; + } // Proxy Proxy proxy = Proxies.get().getEnabled(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index 18e9c24f97..a41b8bc18d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -118,6 +118,13 @@ public class Config extends System { .build() ); + public final Setting showAccountStatus = sgVisual.add(new BoolSetting.Builder() + .name("account-status") + .description("Shows information about the current account in the multiplayer screen.") + .defaultValue(true) + .build() + ); + public final Setting showProxiesButton = sgVisual.add(new BoolSetting.Builder() .name("proxies-button") .description("Shows the proxies button in the multiplayer screen.") @@ -133,6 +140,13 @@ public class Config extends System { .build() ); + public final Setting showProxiesStatus = sgVisual.add(new BoolSetting.Builder() + .name("proxy-status") + .description("Shows information about the current proxy in the multiplayer screen.") + .defaultValue(true) + .build() + ); + // Modules public final Setting> hiddenModules = sgModules.add(new ModuleListSetting.Builder() From b9217634571983e3dd0f0461b6478e5f17a9652b Mon Sep 17 00:00:00 2001 From: cqb13 Date: Fri, 17 Apr 2026 19:47:26 -0400 Subject: [PATCH 3/3] Merged button visibility into position makes config a bit less cluttered --- .../mixin/MultiplayerScreenMixin.java | 19 ++++++------ .../meteorclient/systems/config/Config.java | 31 +++++-------------- 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java index b21df9e725..7217abde8b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java @@ -81,20 +81,20 @@ private void onInit(CallbackInfo info) { } Config config = Config.get(); - boolean accountsVisible = config.showAccountButton.get(); - boolean proxiesVisible = config.showProxiesButton.get(); - Config.ButtonAnchor accountAnchor = config.accountButtonAnchor.get(); - Config.ButtonAnchor proxiesAnchor = config.proxiesButtonAnchor.get(); + Config.ButtonPosition accountPos = config.accountButtonAnchor.get(); + Config.ButtonPosition proxiesPos = config.proxiesButtonAnchor.get(); + boolean accountsVisible = accountPos != Config.ButtonPosition.Hidden; + boolean proxiesVisible = proxiesPos != Config.ButtonPosition.Hidden; accounts.visible = accountsVisible; proxies.visible = proxiesVisible; - positionButton(accounts, accountAnchor, proxiesVisible && proxiesAnchor == accountAnchor, true); - positionButton(proxies, proxiesAnchor, accountsVisible && accountAnchor == proxiesAnchor, false); + positionButton(accounts, accountPos, proxiesVisible && proxiesPos == accountPos, true); + positionButton(proxies, proxiesPos, accountsVisible && accountPos == proxiesPos, false); } @Unique - private void positionButton(ButtonWidget button, Config.ButtonAnchor anchor, boolean sharingCorner, boolean isAccounts) { + private void positionButton(ButtonWidget button, Config.ButtonPosition anchor, boolean sharingCorner, boolean isAccounts) { int leftOffset = sharingCorner && isAccounts ? BUTTON_WIDTH + GAP : 0; int rightOffset = sharingCorner && !isAccounts ? BUTTON_WIDTH + GAP : 0; @@ -103,6 +103,7 @@ private void positionButton(ButtonWidget button, Config.ButtonAnchor anchor, boo case TopLeft -> button.setPosition(MARGIN + leftOffset, MARGIN); case BottomLeft -> button.setPosition(MARGIN + leftOffset, this.height - MARGIN - BUTTON_HEIGHT); case BottomRight -> button.setPosition(this.width - MARGIN - BUTTON_WIDTH - rightOffset, this.height - MARGIN - BUTTON_HEIGHT); + default -> button.setPosition(this.width - MARGIN - BUTTON_WIDTH - rightOffset, MARGIN); // Top right } } @@ -118,10 +119,10 @@ public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks // Shifts the top left account and proxy text to right if buttons are also top left int x = MARGIN; - if (config.showProxiesButton.get() && config.proxiesButtonAnchor.get() == Config.ButtonAnchor.TopLeft) { + if (config.proxiesButtonAnchor.get() != Config.ButtonPosition.Hidden && config.proxiesButtonAnchor.get() == Config.ButtonPosition.TopLeft) { x += BUTTON_WIDTH + GAP; } - if (config.showAccountButton.get() && config.accountButtonAnchor.get() == Config.ButtonAnchor.TopLeft) { + if (config.accountButtonAnchor.get() != Config.ButtonPosition.Hidden && config.accountButtonAnchor.get() == Config.ButtonPosition.TopLeft) { x += BUTTON_WIDTH + GAP; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index a41b8bc18d..1667f099dc 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -103,18 +103,10 @@ public class Config extends System { .build() ); - public final Setting showAccountButton = sgVisual.add(new BoolSetting.Builder() + public final Setting accountButtonAnchor = sgVisual.add(new EnumSetting.Builder() .name("accounts-button") - .description("Shows the accounts button in the multiplayer screen.") - .defaultValue(true) - .build() - ); - - public final Setting accountButtonAnchor = sgVisual.add(new EnumSetting.Builder() - .name("accounts-button-position") - .description("Where the accounts button is displayed") - .defaultValue(ButtonAnchor.TopRight) - .visible(showAccountButton::get) + .description("Controls the position and visibility of the accounts button in the multiplayer screen.") + .defaultValue(ButtonPosition.TopRight) .build() ); @@ -125,18 +117,10 @@ public class Config extends System { .build() ); - public final Setting showProxiesButton = sgVisual.add(new BoolSetting.Builder() + public final Setting proxiesButtonAnchor = sgVisual.add(new EnumSetting.Builder() .name("proxies-button") - .description("Shows the proxies button in the multiplayer screen.") - .defaultValue(true) - .build() - ); - - public final Setting proxiesButtonAnchor = sgVisual.add(new EnumSetting.Builder() - .name("proxies-button-position") - .description("Where the proxies button is displayed") - .defaultValue(ButtonAnchor.TopRight) - .visible(showProxiesButton::get) + .description("Controls the position and visibility of the proxies button in the multiplayer screen.") + .defaultValue(ButtonPosition.TopRight) .build() ); @@ -251,10 +235,11 @@ private List listFromTag(NbtCompound tag, String key) { return list; } - public enum ButtonAnchor { + public enum ButtonPosition { TopLeft, TopRight, BottomLeft, BottomRight, + Hidden, } }