Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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-3
loader_version=0.19.5
fabric_version=0.161.1+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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -80,7 +80,7 @@ private static void afterTitleScreenInit(Screen screen) {
}

modsButtonIndex = i + 1;
if (button.visible) {
if (button.isVisible()) {
buttonsY = button.getY();
}
}
Expand Down
11 changes: 5 additions & 6 deletions src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;


Expand All @@ -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;
Expand All @@ -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

));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
));
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
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;

import java.io.IOException;
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;

Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,12 +22,13 @@
public class FabricIconHandler implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger("Mod Menu | FabricIconHandler");

private final Map<Path, DynamicTexture> modIconCache = new HashMap<>();
private final Map<Path, Identifier> 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;
Expand All @@ -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")) {
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -161,7 +161,7 @@ public FabricMod(ModContainer modContainer, Set<String> 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())) {
Expand All @@ -177,7 +177,7 @@ public FabricMod(ModContainer modContainer, Set<String> 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());
Expand Down
Loading