From a3fa000645fdb43b3c01b96a3da1ab865379d58a Mon Sep 17 00:00:00 2001 From: Julian Chang Date: Mon, 5 Oct 2026 07:42:04 -0400 Subject: [PATCH] Port modern GUI scaling --- .../mixin/bugfix/gui/GameOptionsMixin.java | 29 ++++++++++++++++++ .../sarcio/mixin/bugfix/gui/WindowMixin.java | 30 +++++++++++++++++++ src/main/resources/sarcio.mixins.json | 1 + 3 files changed, 60 insertions(+) create mode 100644 src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/WindowMixin.java diff --git a/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/GameOptionsMixin.java b/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/GameOptionsMixin.java index 135f797..7d2ea30 100644 --- a/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/GameOptionsMixin.java +++ b/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/GameOptionsMixin.java @@ -3,16 +3,25 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.options.GameOptions; import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.render.Window; import com.google.common.util.concurrent.ListenableFuture; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(GameOptions.class) public class GameOptionsMixin { + @Shadow + @Final + private static String[] GUI_SCALE_SETTINGS; + @Inject(method = "isPressed", at = @At("HEAD"), cancellable = true) private static void sarcio$ignoreUnicodeKeys(KeyBinding key, CallbackInfoReturnable cir) { if (key.getKeyCode() >= 256) { @@ -24,4 +33,24 @@ public class GameOptionsMixin { private ListenableFuture sarcio$deferResourceRefresh(Minecraft mc, Operation> original) { return null; } + + @WrapOperation(method = "set(Lnet/minecraft/client/options/GameOptions$Option;I)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/options/GameOptions;guiScale:I", opcode = Opcodes.PUTFIELD)) + private void sarcio$cycleGuiScale(GameOptions options, int masked, Operation original, @Local(argsOnly = true) int value) { + int current = options.guiScale; + int max; + try { + options.guiScale = 0; + max = new Window(Minecraft.getInstance()).getScale(); + } finally { + options.guiScale = current; + } + original.call(options, Math.floorMod(Math.min(current, max) + value, max + 1)); + } + + @Inject(method = "translateIntegerValue", at = @At("HEAD"), cancellable = true) + private static void sarcio$numericGuiScale(String[] translationKeys, int value, CallbackInfoReturnable cir) { + if (translationKeys == GUI_SCALE_SETTINGS && value > 0) { + cir.setReturnValue(Integer.toString(value)); + } + } } diff --git a/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/WindowMixin.java b/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/WindowMixin.java new file mode 100644 index 0000000..56cb20d --- /dev/null +++ b/src/main/java/dev/rdh/sarcio/mixin/bugfix/gui/WindowMixin.java @@ -0,0 +1,30 @@ +package dev.rdh.sarcio.mixin.bugfix.gui; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.render.Window; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(Window.class) +public class WindowMixin { + @Shadow + private int scale; + + @WrapOperation(method = "(Lnet/minecraft/client/Minecraft;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/Window;scale:I", opcode = Opcodes.PUTFIELD)) + private void sarcio$roundUnicodeScaleUp(Window window, int value, Operation original) { + original.call(window, value == this.scale - 1 ? value + 2 : value); + } + + @Definition(id = "scale", field = "Lnet/minecraft/client/render/Window;scale:I") + @Expression("this.scale != 1") + @ModifyExpressionValue(method = "(Lnet/minecraft/client/Minecraft;)V", at = @At("MIXINEXTRAS:EXPRESSION")) + private boolean sarcio$roundScaleOneUp(boolean original) { + return true; + } +} diff --git a/src/main/resources/sarcio.mixins.json b/src/main/resources/sarcio.mixins.json index 47f044b..308432b 100644 --- a/src/main/resources/sarcio.mixins.json +++ b/src/main/resources/sarcio.mixins.json @@ -75,6 +75,7 @@ "bugfix.render.ItemModelShaperMixin", "bugfix.ResourcePacksMixin", "bugfix.gui.GameOptionsMixin", + "bugfix.gui.WindowMixin", "bugfix.gui.SoundSliderWidgetMixin", "bugfix.gui.InventoryMenuMixin", "bugfix.gui.DeathScreenMixin",