From 5fdb86f5bbb17789cb94de3667e6725708654e4c Mon Sep 17 00:00:00 2001 From: Jab125 <67534807+Jab125@users.noreply.github.com> Date: Fri, 25 Sep 2026 23:13:35 +1000 Subject: [PATCH 1/4] Empty commit From 99b09ff45ed67c93882f6b4a00c2e27e9bae546d Mon Sep 17 00:00:00 2001 From: Jab125 <67534807+Jab125@users.noreply.github.com> Date: Wed, 30 Sep 2026 00:42:49 +1000 Subject: [PATCH 2/4] Update Minecraft and Fabric versions in gradle.properties --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 61ccfe1b5..ee84ac80c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,9 @@ org.gradle.parallel=true maven_group=com.terraformersmc archive_name=modmenu -minecraft_version=26.4-snapshot-1 +minecraft_version=26.4-snapshot-2 loader_version=0.19.5 -fabric_version=0.161.1+26.4 +fabric_version=0.161.2+26.4 text_placeholder_api_version=3.2.0+26.3 quilt_loader_version=0.31.0-beta.4 From 5f6c92d064d9600ab9b0ba98e2d0a25444473235 Mon Sep 17 00:00:00 2001 From: Jab125 <67534807+Jab125@users.noreply.github.com> Date: Sat, 3 Oct 2026 00:18:29 +1000 Subject: [PATCH 3/4] fix compile errors --- .../modmenu/event/ModMenuEventHandler.java | 4 ++-- .../com/terraformersmc/modmenu/gui/ModsScreen.java | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/terraformersmc/modmenu/event/ModMenuEventHandler.java b/src/main/java/com/terraformersmc/modmenu/event/ModMenuEventHandler.java index bf7c10832..f751b8249 100644 --- a/src/main/java/com/terraformersmc/modmenu/event/ModMenuEventHandler.java +++ b/src/main/java/com/terraformersmc/modmenu/event/ModMenuEventHandler.java @@ -56,7 +56,7 @@ private static void afterTitleScreenInit(Screen screen) { AbstractWidget widget = buttons.get(i); if (widget instanceof Button button) { if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() == ModMenuConfig.TitleMenuButtonStyle.CLASSIC) { - if (button.visible) { + if (button.isVisible()) { shiftButtons(button, modsButtonIndex == -1, spacing); if (modsButtonIndex == -1) { buttonsY = button.getY(); @@ -80,7 +80,7 @@ private static void afterTitleScreenInit(Screen screen) { } modsButtonIndex = i + 1; - if (button.visible) { + if (button.isVisible()) { buttonsY = button.getY(); } } diff --git a/src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java b/src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java index 22e114e55..7a7aaa65b 100644 --- a/src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java +++ b/src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java @@ -525,8 +525,8 @@ public void onClose() { private void setFilterOptionsShown(boolean filterOptionsShown) { this.filterOptionsShown = filterOptionsShown; - this.sortingButton.visible = filterOptionsShown; - this.librariesButton.visible = filterOptionsShown; + this.sortingButton.setVisible(filterOptionsShown); + this.librariesButton.setVisible(filterOptionsShown); } public ModListEntry getSelectedEntry() { @@ -545,8 +545,7 @@ public void updateSelectedEntry(ModListEntry entry) { if (this.configureButton != null) { this.configureButton.active = getModHasConfigScreen(modId); - this.configureButton.visible = - getModHasConfigScreen(modId) || modScreenErrors.containsKey(modId); + this.configureButton.setVisible(getModHasConfigScreen(modId) || modScreenErrors.containsKey(modId)); if (modScreenErrors.containsKey(modId)) { Throwable e = modScreenErrors.get(modId); @@ -560,10 +559,10 @@ public void updateSelectedEntry(ModListEntry entry) { this.websiteButton.setMessage(isMinecraft ? SEND_FEEDBACK_TEXT : ModMenuScreenTexts.WEBSITE); this.issuesButton.setMessage(isMinecraft ? REPORT_BUGS_TEXT : ModMenuScreenTexts.ISSUES); - this.websiteButton.visible = true; + this.websiteButton.setVisible(true); this.websiteButton.active = isMinecraft || selected.getMod().getWebsite() != null; - this.issuesButton.visible = true; + this.issuesButton.setVisible(true); this.issuesButton.active = isMinecraft || selected.getMod().getIssueTracker() != null; } From d1a0e4f9d73e804977e42916c3349fe4b95e4c72 Mon Sep 17 00:00:00 2001 From: Jab125 <67534807+Jab125@users.noreply.github.com> Date: Wed, 7 Oct 2026 03:11:40 +1100 Subject: [PATCH 4/4] 26.4 snapshot 3 --- gradle.properties | 4 +-- .../gui/widget/SmallModMenuButtonWidget.java | 9 ++++--- .../gui/widget/entries/ModListEntry.java | 5 +--- .../modmenu/mixin/MixinPauseScreen.java | 11 ++++---- .../modmenu/mixin/MixinTitleScreen.java | 2 +- .../terraformersmc/modmenu/util/mod/Mod.java | 4 +-- .../util/mod/fabric/FabricDummyParentMod.java | 4 +-- .../util/mod/fabric/FabricIconHandler.java | 27 +++++++++++-------- .../modmenu/util/mod/fabric/FabricMod.java | 6 ++--- 9 files changed, 38 insertions(+), 34 deletions(-) diff --git a/gradle.properties b/gradle.properties index ee84ac80c..b2f150f05 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,9 @@ org.gradle.parallel=true maven_group=com.terraformersmc archive_name=modmenu -minecraft_version=26.4-snapshot-2 +minecraft_version=26.4-snapshot-3 loader_version=0.19.5 -fabric_version=0.161.2+26.4 +fabric_version=0.162.2+26.4 text_placeholder_api_version=3.2.0+26.3 quilt_loader_version=0.31.0-beta.4 diff --git a/src/main/java/com/terraformersmc/modmenu/gui/widget/SmallModMenuButtonWidget.java b/src/main/java/com/terraformersmc/modmenu/gui/widget/SmallModMenuButtonWidget.java index 04d3be2af..4f73d5592 100644 --- a/src/main/java/com/terraformersmc/modmenu/gui/widget/SmallModMenuButtonWidget.java +++ b/src/main/java/com/terraformersmc/modmenu/gui/widget/SmallModMenuButtonWidget.java @@ -4,13 +4,15 @@ import com.terraformersmc.modmenu.ModMenu; import com.terraformersmc.modmenu.config.ModMenuConfig; import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.ScaledWidgetSprites; import net.minecraft.client.gui.components.SpriteIconButton; +import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.components.WidgetSprites; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import org.jspecify.annotations.Nullable; -public class SmallModMenuButtonWidget extends SpriteIconButton.CenteredIcon { +public class SmallModMenuButtonWidget extends SpriteIconButton { public static final Identifier MODS_SPRITE_ENABLED = Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, "mods/enabled"); public static final Identifier MODS_SPRITE_DISABLED = Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, "mods/disabled"); public static final Identifier MODS_SPRITE_FOCUSED = Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, "mods/focused"); @@ -28,10 +30,9 @@ public SmallModMenuButtonWidget( WidgetSprites sprite, OnPress onPress, @Nullable Component tooltip, - @Nullable CreateNarration narration, + CreateNarration narration, boolean switchToLoadingAfterPress) { - super(width, height, message, spriteWidth, spriteHeight, spriteOffsetX, spriteOffsetY, sprite, onPress, tooltip, narration, switchToLoadingAfterPress); - this.setPosition(x, y); + super(x, y, width, height, message, new ScaledWidgetSprites(sprite, spriteWidth, spriteHeight), DisplayState.ICON_ONLY, onPress, tooltip == null ? null : Tooltip.create(tooltip), narration, switchToLoadingAfterPress); } @Override diff --git a/src/main/java/com/terraformersmc/modmenu/gui/widget/entries/ModListEntry.java b/src/main/java/com/terraformersmc/modmenu/gui/widget/entries/ModListEntry.java index c1c1938ba..37aa153ce 100644 --- a/src/main/java/com/terraformersmc/modmenu/gui/widget/entries/ModListEntry.java +++ b/src/main/java/com/terraformersmc/modmenu/gui/widget/entries/ModListEntry.java @@ -14,7 +14,6 @@ import net.minecraft.client.gui.components.ObjectSelectionList; import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.client.renderer.RenderPipelines; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; @@ -206,9 +205,7 @@ public Mod getMod() { public Identifier getIconTexture() { if (this.iconLocation == null) { - this.iconLocation = Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, mod.getId() + "_icon"); - DynamicTexture icon = mod.getIcon(list.getFabricIconHandler(), 64 * this.client.options.guiScale().get()); - this.client.getTextureManager().register(this.iconLocation, icon); + return this.iconLocation = mod.getIcon(list.getFabricIconHandler(), 64 * this.client.options.guiScale().get()); } return iconLocation; diff --git a/src/main/java/com/terraformersmc/modmenu/mixin/MixinPauseScreen.java b/src/main/java/com/terraformersmc/modmenu/mixin/MixinPauseScreen.java index 1a0b7e30d..540804bff 100644 --- a/src/main/java/com/terraformersmc/modmenu/mixin/MixinPauseScreen.java +++ b/src/main/java/com/terraformersmc/modmenu/mixin/MixinPauseScreen.java @@ -14,15 +14,14 @@ import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.screens.PauseScreen; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.server.IntegratedServer; import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.terraformersmc.modmenu.gui.widget.SmallModMenuButtonWidget.MODS_SPRITE_ENABLED; import static com.terraformersmc.modmenu.gui.widget.SmallModMenuButtonWidget.MODS_SPRITE_DISABLED; +import static com.terraformersmc.modmenu.gui.widget.SmallModMenuButtonWidget.MODS_SPRITE_ENABLED; import static com.terraformersmc.modmenu.gui.widget.SmallModMenuButtonWidget.MODS_SPRITE_FOCUSED; @@ -32,8 +31,10 @@ protected MixinPauseScreen(Component title) { super(title); } - @Definition(id = "integratedServer", local = @Local(type = IntegratedServer.class, name = "integratedServer")) - @Expression("integratedServer = ?") + @Definition(id = "helper", local = @Local(type = GridLayout.RowHelper.class, name = "helper")) + @Definition(id = "addChild", method = "Lnet/minecraft/client/gui/layouts/GridLayout$RowHelper;addChild(Lnet/minecraft/client/gui/layouts/LayoutElement;ILnet/minecraft/client/gui/layouts/LayoutSettings;)Lnet/minecraft/client/gui/layouts/LayoutElement;") + @Definition(id = "iconButtonRow", local = @Local(type = LinearLayout.class, name = "iconButtonRow")) + @Expression("helper.addChild(iconButtonRow, 2, ?)") @Inject(method = "createPauseMenu", at = @At("MIXINEXTRAS:EXPRESSION")) private void insertModMenuIconButton(CallbackInfo ci, @Local(name = "iconButtonRow") LinearLayout iconButtonRow) { if (!ModMenuConfig.MODIFY_GAME_MENU.getValue()) return; @@ -56,7 +57,7 @@ private void insertModMenuIconButton(CallbackInfo ci, @Local(name = "iconButtonR ), _ -> Minecraft.getInstance().gui.setScreen(new ModsScreen(this)), ModMenuApi.createModsButtonText(), - null, + _ -> ModMenuApi.createModsButtonText().copy(), false )); diff --git a/src/main/java/com/terraformersmc/modmenu/mixin/MixinTitleScreen.java b/src/main/java/com/terraformersmc/modmenu/mixin/MixinTitleScreen.java index 17f1137ef..6fa4e4254 100644 --- a/src/main/java/com/terraformersmc/modmenu/mixin/MixinTitleScreen.java +++ b/src/main/java/com/terraformersmc/modmenu/mixin/MixinTitleScreen.java @@ -86,7 +86,7 @@ private void addModMenuIconWidget(CallbackInfo ci, @Local(name = "currentButton" ), _ -> Minecraft.getInstance().gui.setScreen(new ModsScreen(screen)), ModMenuApi.createModsButtonText(), - null, + _ -> ModMenuApi.createModsButtonText().copy(), false )); } diff --git a/src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java b/src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java index 6f02de0c6..7a9fcf174 100644 --- a/src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java +++ b/src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java @@ -9,6 +9,7 @@ import eu.pb4.placeholders.api.ParserContext; import net.fabricmc.loader.api.metadata.ContactInformation; import net.minecraft.locale.Language; +import net.minecraft.resources.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,7 +17,6 @@ import java.util.*; import java.util.stream.Collectors; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; @@ -36,7 +36,7 @@ default String getTranslatedName() { } } - @NotNull DynamicTexture getIcon(FabricIconHandler iconHandler, int i); + @NotNull Identifier getIcon(FabricIconHandler iconHandler, int i); @NotNull default String getSummary() { diff --git a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricDummyParentMod.java b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricDummyParentMod.java index 51023d73c..e917abfa1 100644 --- a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricDummyParentMod.java +++ b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricDummyParentMod.java @@ -8,7 +8,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ContactInformation; -import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.resources.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,7 +42,7 @@ public FabricDummyParentMod(FabricMod host, String id) { } @Override - public @NotNull DynamicTexture getIcon(FabricIconHandler iconHandler, int i) { + public @NotNull Identifier getIcon(FabricIconHandler iconHandler, int i) { String iconSourceId = host.getId(); FabricMod.ModMenuData.DummyParentData parentData = host.getModMenuData().getDummyParentData(); String iconPath = null; diff --git a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricIconHandler.java b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricIconHandler.java index 7e03208a2..90f266921 100644 --- a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricIconHandler.java +++ b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricIconHandler.java @@ -3,7 +3,9 @@ import com.mojang.blaze3d.platform.NativeImage; import com.terraformersmc.modmenu.ModMenu; import net.fabricmc.loader.api.ModContainer; -import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.texture.TextureResources; import net.minecraft.resources.Identifier; import org.apache.commons.lang3.Validate; import org.slf4j.Logger; @@ -20,12 +22,13 @@ public class FabricIconHandler implements Closeable { private static final Logger LOGGER = LoggerFactory.getLogger("Mod Menu | FabricIconHandler"); - private final Map modIconCache = new HashMap<>(); + private final Map modIconCache = new HashMap<>(); - public DynamicTexture createIcon(ModContainer iconSource, String iconPath) { + public Identifier createIcon(ModContainer iconSource, String iconPath) { try { + TextureManager textureManager = Minecraft.getInstance().getTextureManager(); Path path = iconSource.getPath(iconPath); - DynamicTexture cachedIcon = getCachedModIcon(path); + Identifier cachedIcon = getCachedModIcon(path); if (cachedIcon != null) { return cachedIcon; @@ -34,10 +37,11 @@ public DynamicTexture createIcon(ModContainer iconSource, String iconPath) { try (InputStream inputStream = Files.newInputStream(path)) { NativeImage image = NativeImage.read(Objects.requireNonNull(inputStream)); Validate.validState(image.getHeight() == image.getWidth(), "Must be square icon"); - DynamicTexture tex = new DynamicTexture(() -> Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, iconPath).toString(), image); - cacheModIcon(path, tex); + Identifier location = Identifier.fromNamespaceAndPath(ModMenu.MOD_ID, iconPath); + textureManager.register(location, TextureResources.from2dImage(() -> "Mod icon " + location, image)); + cacheModIcon(path, location); - return tex; + return location; } } catch (IllegalStateException e) { if (e.getMessage().equals("Must be square icon")) { @@ -59,16 +63,17 @@ public DynamicTexture createIcon(ModContainer iconSource, String iconPath) { @Override public void close() { - for (DynamicTexture tex : modIconCache.values()) { - tex.close(); + TextureManager textureManager = Minecraft.getInstance().getTextureManager(); + for (Identifier tex : modIconCache.values()) { + textureManager.release(tex); } } - DynamicTexture getCachedModIcon(Path path) { + Identifier getCachedModIcon(Path path) { return modIconCache.get(path); } - void cacheModIcon(Path path, DynamicTexture tex) { + void cacheModIcon(Path path, Identifier tex) { modIconCache.put(path, tex); } } diff --git a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricMod.java b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricMod.java index 3c5c0ab4e..41fd1524e 100644 --- a/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricMod.java +++ b/src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricMod.java @@ -13,8 +13,8 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.*; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.resources.language.I18n; +import net.minecraft.resources.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -161,7 +161,7 @@ public FabricMod(ModContainer modContainer, Set modpackMods) { } @Override - public @NotNull DynamicTexture getIcon(FabricIconHandler iconHandler, int i) { + public @NotNull Identifier getIcon(FabricIconHandler iconHandler, int i) { String iconSourceId = getId(); String iconPath = metadata.getIconPath(i).orElse("assets/" + getId() + "/icon.png"); if ("minecraft".equals(getId())) { @@ -177,7 +177,7 @@ public FabricMod(ModContainer modContainer, Set modpackMods) { .getModContainer(iconSourceId) .orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id " + finalIconSourceId)); - DynamicTexture icon = iconHandler.createIcon(iconSource, iconPath); + Identifier icon = iconHandler.createIcon(iconSource, iconPath); if (icon == null) { if (defaultIconWarning) { LOGGER.warn("Warning! Mod {} has a broken icon, loading default icon", metadata.getId());