Skip to content

Commit 9d6d6c6

Browse files
authored
Adapt Mod Menu button for 26.2 Pre-Release 2 (#1028)
- Update to 26.2-pre-2 (thanks, Jab125) * Update gradle.properties * fix visual issues with 26.2 * Update en_us.json * make update available badge respect alpha * Update UpdateCheckerTexturedButtonWidget.java * Update UpdateAvailableBadge.java * fix for 26.2-pre-1 * remove unused accessor * Update UpdateCheckerTexturedButtonWidget.java * Update gradle.properties * Update MixinPauseScreen.java * vanilla parity, don't fade in the update available badge, instead only show it when alpha >= 1.0 * 26.2-pre-2
1 parent 1d7e5e8 commit 9d6d6c6

12 files changed

Lines changed: 125 additions & 146 deletions

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ org.gradle.parallel=true
44
maven_group=com.terraformersmc
55
archive_name=modmenu
66

7-
minecraft_version=26.2-snapshot-7
7+
minecraft_version=26.2-pre-2
88
loader_version=0.19.2
9-
fabric_version=0.148.3+26.2
9+
fabric_version=0.150.1+26.2
1010
text_placeholder_api_version=3.0.0+26.1
1111
quilt_loader_version=0.30.0-beta.7
1212

@@ -21,7 +21,7 @@ default_release_type=alpha
2121
# Modrinth Metadata
2222
modrinth_slug=modmenu
2323
modrinth_id=mOgUt4GM
24-
modrinth_game_versions=26.2-snapshot-6
24+
modrinth_game_versions=26.2-pre-2
2525
modrinth_mod_loaders=fabric, quilt
2626
modrinth_required_dependencies=fabric-api, placeholder-api
2727

src/main/java/com/terraformersmc/modmenu/ModMenu.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public static Component createModsButtonText(boolean title) {
250250
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.ICON;
251251
var isShort = title ?
252252
titleStyle == ModMenuConfig.TitleMenuButtonStyle.SHRINK :
253-
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.REPLACE;
253+
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.ICON;
254254
MutableComponent modsText = ModMenuScreenTexts.TITLE.copy();
255255
if (ModMenuConfig.MOD_COUNT_LOCATION.getValue().isOnModsButton() && !isIcon) {
256256
String count = ModMenu.getDisplayedModCount();

src/main/java/com/terraformersmc/modmenu/config/ModMenuConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public class ModMenuConfig {
2222
public static final BooleanConfigOption COUNT_LIBRARIES = new BooleanConfigOption("count_libraries", true);
2323
public static final BooleanConfigOption COMPACT_LIST = new BooleanConfigOption("compact_list", false);
2424
public static final BooleanConfigOption COUNT_CHILDREN = new BooleanConfigOption("count_children", true);
25-
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>("mods_button_style", TitleMenuButtonStyle.CLASSIC);
26-
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>("game_menu_button_style", GameMenuButtonStyle.REPLACE);
25+
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>("mods_button_style", TitleMenuButtonStyle.ICON);
26+
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>("game_menu_button_style", GameMenuButtonStyle.ICON);
2727
public static final BooleanConfigOption COUNT_HIDDEN_MODS = new BooleanConfigOption("count_hidden_mods", true);
2828
public static final EnumConfigOption<ModCountLocation> MOD_COUNT_LOCATION = new EnumConfigOption<>("mod_count_location", ModCountLocation.TITLE_SCREEN);
2929
public static final BooleanConfigOption HIDE_MOD_LINKS = new BooleanConfigOption("hide_mod_links", false);
@@ -120,6 +120,6 @@ public enum TitleMenuButtonStyle {
120120
}
121121

122122
public enum GameMenuButtonStyle {
123-
@SerializedName(value = "replace", alternate = {"replace_bugs"}) REPLACE, @SerializedName(value = "insert", alternate = {"below_bugs"}) INSERT, ICON
123+
@SerializedName(value = "insert", alternate = {"below_bugs"}) INSERT, @SerializedName(value = "icon", alternate = {"replace", "replace_bugs" /*old REPLACE ids*/}) ICON
124124
}
125125
}

src/main/java/com/terraformersmc/modmenu/event/ModMenuEventHandler.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import com.terraformersmc.modmenu.config.ModMenuConfig;
77
import com.terraformersmc.modmenu.gui.ModsScreen;
88
import com.terraformersmc.modmenu.gui.widget.ModMenuButtonWidget;
9-
import com.terraformersmc.modmenu.gui.widget.UpdateCheckerTexturedButtonWidget;
10-
import com.terraformersmc.modmenu.mixin.AccessorAbstractWidget;
119
import com.terraformersmc.modmenu.util.UpdateCheckerUtil;
1210
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
1311
import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper;
@@ -17,7 +15,6 @@
1715
import net.minecraft.client.Minecraft;
1816
import net.minecraft.client.gui.components.AbstractWidget;
1917
import net.minecraft.client.gui.components.Button;
20-
import net.minecraft.client.gui.components.Tooltip;
2118
import net.minecraft.client.gui.layouts.LayoutElement;
2219
import net.minecraft.client.gui.screens.Screen;
2320
import net.minecraft.client.gui.screens.TitleScreen;
@@ -113,21 +110,6 @@ private static void afterTitleScreenInit(Screen screen) {
113110
screen
114111
)
115112
);
116-
} else if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() == ModMenuConfig.TitleMenuButtonStyle.ICON) {
117-
buttons.add(modsButtonIndex, new UpdateCheckerTexturedButtonWidget(
118-
screen.width / 2 + 104,
119-
buttonsY,
120-
20,
121-
20,
122-
0,
123-
0,
124-
20,
125-
MODS_BUTTON_TEXTURE,
126-
32,
127-
64,
128-
button -> Minecraft.getInstance().gui.setScreen(new ModsScreen(screen)),
129-
ModMenuApi.createModsButtonText()
130-
));
131113
}
132114
}
133115
}
@@ -150,14 +132,6 @@ public static boolean buttonHasText(LayoutElement widget, String... translationK
150132
}
151133
}
152134

153-
public static boolean buttonHasTooltip(LayoutElement widget, Tooltip tooltip) {
154-
if (widget instanceof Button && widget instanceof AccessorAbstractWidget accessor) {
155-
return tooltip == accessor.getTooltip().get();
156-
} else {
157-
return false;
158-
}
159-
}
160-
161135
public static void shiftButtons(LayoutElement widget, boolean shiftUp, int spacing) {
162136
if (shiftUp) {
163137
widget.setY(widget.getY() - spacing / 2);

src/main/java/com/terraformersmc/modmenu/gui/widget/LegacyTexturedButtonWidget.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minecraft.client.gui.components.ImageButton;
66
import net.minecraft.client.renderer.RenderPipelines;
77
import net.minecraft.resources.Identifier;
8+
import net.minecraft.util.ARGB;
89

910
public class LegacyTexturedButtonWidget extends ImageButton {
1011
private final int u;
@@ -61,7 +62,8 @@ public void extractContents(GuiGraphicsExtractor context, int mouseX, int mouseY
6162
this.width,
6263
this.height,
6364
this.textureWidth,
64-
this.textureHeight
65+
this.textureHeight,
66+
ARGB.color(getAlpha(), 0xffffff)
6567
);
6668
}
6769

src/main/java/com/terraformersmc/modmenu/gui/widget/ModMenuButtonWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public ModMenuButtonWidget(int x, int y, int width, int height, net.minecraft.ne
2424
@Override
2525
public void extractContents(GuiGraphicsExtractor drawContext, int mouseX, int mouseY, float delta) {
2626
super.extractContents(drawContext, mouseX, mouseY, delta);
27-
if (ModMenuConfig.BUTTON_UPDATE_BADGE.getValue() && ModMenu.areModUpdatesAvailable()) {
27+
if (ModMenuConfig.BUTTON_UPDATE_BADGE.getValue() && ModMenu.areModUpdatesAvailable() && getAlpha() >= 1.0f) {
2828
UpdateAvailableBadge.renderBadge(
2929
drawContext,
3030
this.width + this.getX() - 13,

src/main/java/com/terraformersmc/modmenu/gui/widget/UpdateCheckerTexturedButtonWidget.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.terraformersmc.modmenu.config.ModMenuConfig;
55
import net.minecraft.client.gui.GuiGraphicsExtractor;
66
import net.minecraft.client.gui.components.Button;
7+
import net.minecraft.client.gui.components.Tooltip;
78
import net.minecraft.resources.Identifier;
89

910
public class UpdateCheckerTexturedButtonWidget extends LegacyTexturedButtonWidget {
@@ -22,12 +23,13 @@ public UpdateCheckerTexturedButtonWidget(
2223
net.minecraft.network.chat.Component message
2324
) {
2425
super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, message);
26+
setTooltip(Tooltip.create(message));
2527
}
2628

2729
@Override
2830
public void extractContents(GuiGraphicsExtractor drawContext, int mouseX, int mouseY, float delta) {
2931
super.extractContents(drawContext, mouseX, mouseY, delta);
30-
if (ModMenuConfig.BUTTON_UPDATE_BADGE.getValue() && ModMenu.areModUpdatesAvailable()) {
32+
if (ModMenuConfig.BUTTON_UPDATE_BADGE.getValue() && ModMenu.areModUpdatesAvailable() && getAlpha() >= 1.0f) {
3133
UpdateAvailableBadge.renderBadge(drawContext, this.getX() + this.width - 5, this.getY() - 3);
3234
}
3335
}

src/main/java/com/terraformersmc/modmenu/mixin/AccessorAbstractWidget.java

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 47 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,71 @@
11
package com.terraformersmc.modmenu.mixin;
22

3+
import com.llamalad7.mixinextras.expression.Definition;
4+
import com.llamalad7.mixinextras.expression.Expression;
5+
import com.llamalad7.mixinextras.sugar.Local;
36
import com.terraformersmc.modmenu.api.ModMenuApi;
47
import com.terraformersmc.modmenu.config.ModMenuConfig;
58
import com.terraformersmc.modmenu.event.ModMenuEventHandler;
69
import com.terraformersmc.modmenu.gui.ModsScreen;
710
import com.terraformersmc.modmenu.gui.widget.ModMenuButtonWidget;
811
import com.terraformersmc.modmenu.gui.widget.UpdateCheckerTexturedButtonWidget;
9-
import net.fabricmc.fabric.api.client.screen.v1.Screens;
10-
import org.spongepowered.asm.mixin.Mixin;
11-
import org.spongepowered.asm.mixin.gen.Accessor;
12-
import org.spongepowered.asm.mixin.injection.At;
13-
import org.spongepowered.asm.mixin.injection.Inject;
14-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15-
16-
import java.util.List;
17-
1812
import net.minecraft.client.Minecraft;
19-
import net.minecraft.client.gui.components.AbstractWidget;
20-
import net.minecraft.client.gui.components.Tooltip;
21-
import net.minecraft.client.gui.layouts.LayoutElement;
13+
import net.minecraft.client.gui.layouts.GridLayout;
14+
import net.minecraft.client.gui.layouts.LinearLayout;
2215
import net.minecraft.client.gui.screens.PauseScreen;
2316
import net.minecraft.client.gui.screens.Screen;
17+
import net.minecraft.client.server.IntegratedServer;
2418
import net.minecraft.network.chat.Component;
19+
import org.spongepowered.asm.mixin.Mixin;
20+
import org.spongepowered.asm.mixin.injection.At;
21+
import org.spongepowered.asm.mixin.injection.Inject;
22+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2523

2624
@Mixin(PauseScreen.class)
2725
public abstract class MixinPauseScreen extends Screen {
2826
protected MixinPauseScreen(Component title) {
2927
super(title);
3028
}
3129

32-
@Accessor
33-
private static Tooltip getCUSTOM_OPTIONS_TOOLTIP() {
34-
throw new AssertionError();
35-
}
36-
37-
@Inject(method = "createPauseMenu", at = @At("TAIL"))
38-
private void onCreatePauseMenu(CallbackInfo ci) {
39-
List<AbstractWidget> buttons = Screens.getWidgets(this);
40-
41-
if (ModMenuConfig.MODIFY_GAME_MENU.getValue()) {
42-
int modsButtonIndex = -1;
43-
final int spacing = 24;
44-
int buttonsY = this.height / 4 + 8;
45-
ModMenuConfig.GameMenuButtonStyle style = ModMenuConfig.GAME_MENU_BUTTON_STYLE.getValue();
46-
int vanillaButtonsY = this.height / 4 + 72 - 16 + 1;
47-
final int fullWidthButton = 204;
48-
for (int i = 0; i < buttons.size(); i++) {
49-
LayoutElement widget = buttons.get(i);
50-
if (style == ModMenuConfig.GameMenuButtonStyle.INSERT) {
51-
if (!(widget instanceof AbstractWidget button) || button.visible) {
52-
ModMenuEventHandler.shiftButtons(widget, modsButtonIndex == -1 || ModMenuEventHandler.buttonHasText(widget, "menu.reportBugs", "menu.server_links") || ModMenuEventHandler.buttonHasTooltip(widget, getCUSTOM_OPTIONS_TOOLTIP()), spacing);
53-
if (modsButtonIndex == -1) {
54-
buttonsY = widget.getY();
55-
}
56-
}
57-
}
30+
@Definition(id = "integratedServer", local = @Local(type = IntegratedServer.class, name = "integratedServer"))
31+
@Expression("integratedServer = ?")
32+
@Inject(method = "createPauseMenu", at = @At("MIXINEXTRAS:EXPRESSION"))
33+
private void insertModMenuIconButton(CallbackInfo ci, @Local(name = "iconButtonRow") LinearLayout iconButtonRow) {
34+
if (!ModMenuConfig.MODIFY_GAME_MENU.getValue()) return;
35+
ModMenuConfig.GameMenuButtonStyle style = ModMenuConfig.GAME_MENU_BUTTON_STYLE.getValue();
36+
if (style == ModMenuConfig.GameMenuButtonStyle.ICON) {
37+
iconButtonRow.addChild(new UpdateCheckerTexturedButtonWidget(
38+
0,
39+
0,
40+
20,
41+
20,
42+
0,
43+
0,
44+
20,
45+
ModMenuEventHandler.MODS_BUTTON_TEXTURE,
46+
32,
47+
64,
48+
_ -> Minecraft.getInstance().gui.setScreen(new ModsScreen(this)),
49+
ModMenuApi.createModsButtonText()
50+
));
51+
}
5852

59-
boolean isShortFeedback = ModMenuEventHandler.buttonHasText(widget, "menu.feedback");
60-
boolean isLongFeedback = ModMenuEventHandler.buttonHasText(widget, "menu.sendFeedback");
61-
if (isShortFeedback || isLongFeedback) {
62-
modsButtonIndex = i + 1;
63-
vanillaButtonsY = widget.getY();
64-
if (style == ModMenuConfig.GameMenuButtonStyle.REPLACE) {
65-
buttons.set(i, new ModMenuButtonWidget(
66-
widget.getX(),
67-
widget.getY(),
68-
isShortFeedback ? widget.getWidth() : fullWidthButton,
69-
widget.getHeight(),
70-
ModMenuApi.createModsButtonText(),
71-
this
72-
));
73-
buttons.stream()
74-
.filter(w -> ModMenuEventHandler.buttonHasText(w, "menu.reportBugs"))
75-
.forEach(w -> {
76-
if (w instanceof AbstractWidget cw) {
77-
cw.visible = false;
78-
cw.active = false;
79-
}
80-
});
81-
} else {
82-
modsButtonIndex = i + 1;
83-
if (!(widget instanceof AbstractWidget button) || button.visible) {
84-
buttonsY = widget.getY();
85-
}
86-
}
87-
}
88-
}
53+
}
8954

90-
if (modsButtonIndex != -1) {
91-
if (style == ModMenuConfig.GameMenuButtonStyle.INSERT) {
92-
buttons.add(modsButtonIndex, new ModMenuButtonWidget(
93-
this.width / 2 - 102,
94-
buttonsY + spacing,
95-
fullWidthButton,
96-
20,
97-
ModMenuApi.createModsButtonText(),
98-
this
99-
));
100-
} else if (style == ModMenuConfig.GameMenuButtonStyle.ICON) {
101-
buttons.add(modsButtonIndex, new UpdateCheckerTexturedButtonWidget(
102-
this.width / 2 + 4 + 100 + 2,
103-
vanillaButtonsY,
104-
20,
105-
20,
106-
0,
107-
0,
108-
20,
109-
ModMenuEventHandler.MODS_BUTTON_TEXTURE,
110-
32,
111-
64,
112-
button -> Minecraft.getInstance().gui.setScreen(new ModsScreen(this)),
113-
ModMenuApi.createModsButtonText()
114-
));
115-
}
116-
}
55+
@Inject(method = "createPauseMenu", at = @At(value = "INVOKE", target = "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;", ordinal = 1, shift = At.Shift.AFTER))
56+
private void insertModMenuFullButton(CallbackInfo ci, @Local(name = "helper") GridLayout.RowHelper helper) {
57+
if (!ModMenuConfig.MODIFY_GAME_MENU.getValue()) return;
58+
ModMenuConfig.GameMenuButtonStyle style = ModMenuConfig.GAME_MENU_BUTTON_STYLE.getValue();
59+
if (style == ModMenuConfig.GameMenuButtonStyle.INSERT) {
60+
final int fullWidthButton = 204; // PauseScreen.BUTTON_WIDTH_FULL
61+
helper.addChild(new ModMenuButtonWidget(
62+
0,
63+
0,
64+
fullWidthButton,
65+
20,
66+
ModMenuApi.createModsButtonText(),
67+
this
68+
), 2);
11769
}
11870
}
11971
}

0 commit comments

Comments
 (0)