Skip to content

Commit 1df2071

Browse files
committed
Fix crash when loading the pause menu.
- Fix crash when loading the pause menu * Rename mixin classes to Mojang names * Use Fabric Screen API instead of accessors to modify the pause screen
1 parent e40d155 commit 1df2071

6 files changed

Lines changed: 124 additions & 142 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.terraformersmc.modmenu.gui.ModsScreen;
88
import com.terraformersmc.modmenu.gui.widget.ModMenuButtonWidget;
99
import com.terraformersmc.modmenu.gui.widget.UpdateCheckerTexturedButtonWidget;
10-
import com.terraformersmc.modmenu.mixin.AccessorClickableWidget;
10+
import com.terraformersmc.modmenu.mixin.AccessorAbstractWidget;
1111
import com.terraformersmc.modmenu.util.UpdateCheckerUtil;
1212
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
1313
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
@@ -151,7 +151,7 @@ public static boolean buttonHasText(LayoutElement widget, String... translationK
151151
}
152152

153153
public static boolean buttonHasTooltip(LayoutElement widget, Tooltip tooltip) {
154-
if (widget instanceof Button && widget instanceof AccessorClickableWidget accessor) {
154+
if (widget instanceof Button && widget instanceof AccessorAbstractWidget accessor) {
155155
return tooltip == accessor.getTooltip().get();
156156
} else {
157157
return false;

src/main/java/com/terraformersmc/modmenu/mixin/AccessorClickableWidget.java renamed to src/main/java/com/terraformersmc/modmenu/mixin/AccessorAbstractWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.spongepowered.asm.mixin.gen.Accessor;
77

88
@Mixin(AbstractWidget.class)
9-
public interface AccessorClickableWidget {
9+
public interface AccessorAbstractWidget {
1010
@Accessor
1111
WidgetTooltipHolder getTooltip();
1212
}

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

Lines changed: 0 additions & 15 deletions
This file was deleted.

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

Lines changed: 0 additions & 121 deletions
This file was deleted.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.terraformersmc.modmenu.mixin;
2+
3+
import com.terraformersmc.modmenu.api.ModMenuApi;
4+
import com.terraformersmc.modmenu.config.ModMenuConfig;
5+
import com.terraformersmc.modmenu.event.ModMenuEventHandler;
6+
import com.terraformersmc.modmenu.gui.ModsScreen;
7+
import com.terraformersmc.modmenu.gui.widget.ModMenuButtonWidget;
8+
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+
18+
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;
22+
import net.minecraft.client.gui.screens.PauseScreen;
23+
import net.minecraft.client.gui.screens.Screen;
24+
import net.minecraft.network.chat.Component;
25+
26+
@Mixin(PauseScreen.class)
27+
public abstract class MixinPauseScreen extends Screen {
28+
protected MixinPauseScreen(Component title) {
29+
super(title);
30+
}
31+
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.getButtons(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+
}
58+
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+
}
89+
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().setScreen(new ModsScreen(this)),
113+
ModMenuApi.createModsButtonText()
114+
));
115+
}
116+
}
117+
}
118+
}
119+
}

src/main/resources/mixins.modmenu.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
"package": "com.terraformersmc.modmenu.mixin",
55
"compatibilityLevel": "JAVA_25",
66
"client": [
7-
"AccessorClickableWidget",
8-
"AccessorGridWidget",
9-
"MixinGameMenu",
7+
"AccessorAbstractWidget",
8+
"MixinPauseScreen",
109
"MixinTitleScreen"
1110
],
1211
"injectors": {

0 commit comments

Comments
 (0)