Skip to content

Commit fc50c22

Browse files
committed
Fix mods button not showing up in game menu on server with Server Links Closes #745
- Fixed mods button not showing up on servers with Server Links - Changed functionality of Game Mode display option "Replace Bugs" to "Replace", which now replaces both Give Feedback and Report Bugs, these are now both found in Mod Menu under the Minecraft entry. "Below Bugs" is now "Insert"
1 parent 73829e6 commit fc50c22

11 files changed

Lines changed: 111 additions & 86 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public static Text createModsButtonText(boolean title) {
206206
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.ICON;
207207
var isShort = title ?
208208
titleStyle == ModMenuConfig.TitleMenuButtonStyle.SHRINK :
209-
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.REPLACE_BUGS;
209+
gameMenuStyle == ModMenuConfig.GameMenuButtonStyle.REPLACE;
210210
MutableText modsText = ModMenuScreenTexts.TITLE.copy();
211211
if (ModMenuConfig.MOD_COUNT_LOCATION.getValue().isOnModsButton() && !isIcon) {
212212
String count = ModMenu.getDisplayedModCount();

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.terraformersmc.modmenu.config;
22

3+
import com.google.gson.annotations.SerializedName;
34
import com.terraformersmc.modmenu.api.UpdateChannel;
45
import com.terraformersmc.modmenu.config.option.BooleanConfigOption;
56
import com.terraformersmc.modmenu.config.option.EnumConfigOption;
@@ -20,17 +21,14 @@ public class ModMenuConfig {
2021
public static final BooleanConfigOption COUNT_LIBRARIES = new BooleanConfigOption("count_libraries", true);
2122
public static final BooleanConfigOption COMPACT_LIST = new BooleanConfigOption("compact_list", false);
2223
public static final BooleanConfigOption COUNT_CHILDREN = new BooleanConfigOption("count_children", true);
23-
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>(
24-
"mods_button_style",
24+
public static final EnumConfigOption<TitleMenuButtonStyle> MODS_BUTTON_STYLE = new EnumConfigOption<>("mods_button_style",
2525
TitleMenuButtonStyle.CLASSIC
2626
);
27-
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>(
28-
"game_menu_button_style",
29-
GameMenuButtonStyle.REPLACE_BUGS
27+
public static final EnumConfigOption<GameMenuButtonStyle> GAME_MENU_BUTTON_STYLE = new EnumConfigOption<>("game_menu_button_style",
28+
GameMenuButtonStyle.REPLACE
3029
);
3130
public static final BooleanConfigOption COUNT_HIDDEN_MODS = new BooleanConfigOption("count_hidden_mods", true);
32-
public static final EnumConfigOption<ModCountLocation> MOD_COUNT_LOCATION = new EnumConfigOption<>(
33-
"mod_count_location",
31+
public static final EnumConfigOption<ModCountLocation> MOD_COUNT_LOCATION = new EnumConfigOption<>("mod_count_location",
3432
ModCountLocation.TITLE_SCREEN
3533
);
3634
public static final BooleanConfigOption HIDE_MOD_LINKS = new BooleanConfigOption("hide_mod_links", false);
@@ -70,16 +68,16 @@ public class ModMenuConfig {
7068
new HashSet<>()
7169
);
7270
@FileOnlyConfig
73-
public static final StringSetConfigOption DISABLE_UPDATE_CHECKER = new StringSetConfigOption(
74-
"disable_update_checker",
71+
public static final StringSetConfigOption DISABLE_UPDATE_CHECKER = new StringSetConfigOption("disable_update_checker",
7572
new HashSet<>()
7673
);
7774

7875
public static SimpleOption<?>[] asOptions() {
7976
ArrayList<SimpleOption<?>> options = new ArrayList<>();
8077
for (Field field : ModMenuConfig.class.getDeclaredFields()) {
81-
if (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers()) && OptionConvertable.class.isAssignableFrom(
82-
field.getType()) && !field.isAnnotationPresent(FileOnlyConfig.class)) {
78+
if (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers()) &&
79+
OptionConvertable.class.isAssignableFrom(field.getType()) &&
80+
!field.isAnnotationPresent(FileOnlyConfig.class)) {
8381
try {
8482
options.add(((OptionConvertable) field.get(null)).asOption());
8583
} catch (IllegalAccessException e) {
@@ -131,6 +129,6 @@ public enum TitleMenuButtonStyle {
131129
}
132130

133131
public enum GameMenuButtonStyle {
134-
REPLACE_BUGS, BELOW_BUGS, ICON
132+
@SerializedName(value = "replace", alternate = { "replace_bugs" }) REPLACE, @SerializedName(value = "insert", alternate = { "below_bugs" }) INSERT, ICON
135133
}
136134
}

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
import java.util.List;
2828

2929
public class ModMenuEventHandler {
30-
public static final Identifier FABRIC_ICON_BUTTON_LOCATION = Identifier.of(ModMenu.MOD_ID,
31-
"textures/gui/mods_button.png"
32-
);
30+
public static final Identifier MODS_BUTTON_TEXTURE = Identifier.of(ModMenu.MOD_ID, "textures/gui/mods_button.png");
3331
private static KeyBinding MENU_KEY_BIND;
3432

3533
public static void register() {
@@ -67,7 +65,8 @@ private static void afterTitleScreenInit(Screen screen) {
6765
}
6866
}
6967
if (buttonHasText(button, "menu.online")) {
70-
if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() == ModMenuConfig.TitleMenuButtonStyle.REPLACE_REALMS) {
68+
if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() ==
69+
ModMenuConfig.TitleMenuButtonStyle.REPLACE_REALMS) {
7170
buttons.set(i, new ModMenuButtonWidget(button.getX(),
7271
button.getY(),
7372
button.getWidth(),
@@ -76,7 +75,8 @@ private static void afterTitleScreenInit(Screen screen) {
7675
screen
7776
));
7877
} else {
79-
if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() == ModMenuConfig.TitleMenuButtonStyle.SHRINK) {
78+
if (ModMenuConfig.MODS_BUTTON_STYLE.getValue() ==
79+
ModMenuConfig.TitleMenuButtonStyle.SHRINK) {
8080
button.setWidth(98);
8181
}
8282
modsButtonIndex = i + 1;
@@ -115,7 +115,7 @@ private static void afterTitleScreenInit(Screen screen) {
115115
0,
116116
0,
117117
20,
118-
FABRIC_ICON_BUTTON_LOCATION,
118+
MODS_BUTTON_TEXTURE,
119119
32,
120120
64,
121121
button -> MinecraftClient.getInstance().setScreen(new ModsScreen(screen)),
@@ -137,17 +137,18 @@ public static boolean buttonHasText(Widget widget, String translationKey) {
137137
if (widget instanceof ButtonWidget button) {
138138
Text text = button.getMessage();
139139
TextContent textContent = text.getContent();
140-
return textContent instanceof TranslatableTextContent && ((TranslatableTextContent) textContent).getKey()
141-
.equals(translationKey);
140+
return textContent instanceof TranslatableTextContent &&
141+
((TranslatableTextContent) textContent).getKey().equals(translationKey);
142142
}
143143
return false;
144144
}
145145

146146
public static void shiftButtons(Widget widget, boolean shiftUp, int spacing) {
147147
if (shiftUp) {
148148
widget.setY(widget.getY() - spacing / 2);
149-
} else if (!(widget instanceof ClickableWidget button && button.getMessage()
150-
.equals(Text.translatable("title.credits")))) {
149+
} else if (!(widget instanceof ClickableWidget button &&
150+
button.getMessage().equals(Text.translatable("title.credits"))
151+
)) {
151152
widget.setY(widget.getY() + spacing / 2);
152153
}
153154
}

src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.terraformersmc.modmenu.util.mod.Mod;
1616
import com.terraformersmc.modmenu.util.mod.ModBadgeRenderer;
1717
import net.fabricmc.loader.api.FabricLoader;
18+
import net.minecraft.SharedConstants;
1819
import net.minecraft.client.gui.DrawContext;
1920
import net.minecraft.client.gui.screen.ConfirmLinkScreen;
2021
import net.minecraft.client.gui.screen.ConfirmScreen;
@@ -28,10 +29,7 @@
2829
import net.minecraft.screen.ScreenTexts;
2930
import net.minecraft.text.StringVisitable;
3031
import net.minecraft.text.Text;
31-
import net.minecraft.util.Formatting;
32-
import net.minecraft.util.Identifier;
33-
import net.minecraft.util.Language;
34-
import net.minecraft.util.Util;
32+
import net.minecraft.util.*;
3533
import org.jetbrains.annotations.Nullable;
3634
import org.slf4j.Logger;
3735
import org.slf4j.LoggerFactory;
@@ -83,6 +81,9 @@ public class ModsScreen extends Screen {
8381
public final Map<String, Boolean> modHasConfigScreen = new HashMap<>();
8482
public final Map<String, Throwable> modScreenErrors = new HashMap<>();
8583

84+
private static final Text SEND_FEEDBACK_TEXT = Text.translatable("menu.sendFeedback");
85+
private static final Text REPORT_BUGS_TEXT = Text.translatable("menu.reportBugs");
86+
8687
public ModsScreen(Screen previousScreen) {
8788
super(ModMenuScreenTexts.TITLE);
8889
this.previousScreen = previousScreen;
@@ -108,7 +109,9 @@ protected void init() {
108109
Screen configScreen = ModMenu.getConfigScreen(id, this);
109110
modHasConfigScreen.put(id, configScreen != null);
110111
} catch (java.lang.NoClassDefFoundError e) {
111-
LOGGER.warn("The '" + id + "' mod config screen is not available because " + e.getLocalizedMessage() + " is missing.");
112+
LOGGER.warn(
113+
"The '" + id + "' mod config screen is not available because " + e.getLocalizedMessage() +
114+
" is missing.");
112115
modScreenErrors.put(id, e);
113116
modHasConfigScreen.put(id, false);
114117
} catch (Throwable e) {
@@ -166,8 +169,7 @@ protected void init() {
166169
this.updateFiltersX();
167170

168171
if (!ModMenuConfig.CONFIG_MODE.getValue()) {
169-
this.filtersButton = LegacyTexturedButtonWidget.legacyTexturedBuilder(
170-
ModMenuScreenTexts.TOGGLE_FILTER_OPTIONS,
172+
this.filtersButton = LegacyTexturedButtonWidget.legacyTexturedBuilder(ModMenuScreenTexts.TOGGLE_FILTER_OPTIONS,
171173
button -> {
172174
this.setFilterOptionsShown(!this.filterOptionsShown);
173175
}
@@ -221,12 +223,15 @@ protected void init() {
221223

222224
this.websiteButton = ButtonWidget.builder(ModMenuScreenTexts.WEBSITE, button -> {
223225
final Mod mod = Objects.requireNonNull(selected).getMod();
224-
this.client.setScreen(new ConfirmLinkScreen(confirmed -> {
225-
if (confirmed) {
226-
Util.getOperatingSystem().open(mod.getWebsite());
227-
}
228-
this.client.setScreen(this);
229-
}, mod.getWebsite(), false));
226+
boolean isMinecraft = selected.getMod().getId().equals("minecraft");
227+
228+
if (isMinecraft) {
229+
var url = SharedConstants.getGameVersion().isStable() ? Urls.JAVA_FEEDBACK : Urls.SNAPSHOT_FEEDBACK;
230+
ConfirmLinkScreen.open(this, url, true);
231+
} else {
232+
var url = mod.getWebsite();
233+
ConfirmLinkScreen.open(this, url, false);
234+
}
230235
})
231236
.position(this.rightPaneX + (urlButtonWidths / 2) - (cappedButtonWidth / 2), RIGHT_PANE_Y + 36)
232237
.size(Math.min(urlButtonWidths, 200), 20)
@@ -235,12 +240,14 @@ protected void init() {
235240
// Issues button
236241
this.issuesButton = ButtonWidget.builder(ModMenuScreenTexts.ISSUES, button -> {
237242
final Mod mod = Objects.requireNonNull(selected).getMod();
238-
this.client.setScreen(new ConfirmLinkScreen(confirmed -> {
239-
if (confirmed) {
240-
Util.getOperatingSystem().open(mod.getIssueTracker());
241-
}
242-
this.client.setScreen(this);
243-
}, mod.getIssueTracker(), false));
243+
boolean isMinecraft = selected.getMod().getId().equals("minecraft");
244+
245+
if (isMinecraft) {
246+
ConfirmLinkScreen.open(this, Urls.SNAPSHOT_BUGS, true);
247+
} else {
248+
var url = mod.getIssueTracker();
249+
ConfirmLinkScreen.open(this, url, false);
250+
}
244251
})
245252
.position(this.rightPaneX + urlButtonWidths + 4 + (urlButtonWidths / 2) - (cappedButtonWidth / 2),
246253
RIGHT_PANE_Y + 36
@@ -300,10 +307,8 @@ protected void init() {
300307

301308
@Override
302309
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
303-
return super.keyPressed(keyCode, scanCode, modifiers) || this.searchBox.keyPressed(keyCode,
304-
scanCode,
305-
modifiers
306-
);
310+
return super.keyPressed(keyCode, scanCode, modifiers) ||
311+
this.searchBox.keyPressed(keyCode, scanCode, modifiers);
307312
}
308313

309314
@Override
@@ -340,7 +345,8 @@ public void render(DrawContext DrawContext, int mouseX, int mouseY, float delta)
340345
Text fullModCount = this.computeModCountText(true);
341346
if (!ModMenuConfig.CONFIG_MODE.getValue() && this.updateFiltersX()) {
342347
if (this.filterOptionsShown) {
343-
if (!ModMenuConfig.SHOW_LIBRARIES.getValue() || textRenderer.getWidth(fullModCount) <= this.filtersX - 5) {
348+
if (!ModMenuConfig.SHOW_LIBRARIES.getValue() ||
349+
textRenderer.getWidth(fullModCount) <= this.filtersX - 5) {
344350
DrawContext.drawText(textRenderer,
345351
fullModCount.asOrderedText(),
346352
this.searchBoxX,
@@ -365,7 +371,8 @@ public void render(DrawContext DrawContext, int mouseX, int mouseY, float delta)
365371
);
366372
}
367373
} else {
368-
if (!ModMenuConfig.SHOW_LIBRARIES.getValue() || textRenderer.getWidth(fullModCount) <= modList.getWidth() - 5) {
374+
if (!ModMenuConfig.SHOW_LIBRARIES.getValue() ||
375+
textRenderer.getWidth(fullModCount) <= modList.getWidth() - 5) {
369376
DrawContext.drawText(textRenderer,
370377
fullModCount.asOrderedText(),
371378
this.searchBoxX,
@@ -409,8 +416,7 @@ public void render(DrawContext DrawContext, int mouseX, int mouseY, float delta)
409416
int maxNameWidth = this.width - (x + imageOffset);
410417
if (textRenderer.getWidth(name) > maxNameWidth) {
411418
StringVisitable ellipsis = StringVisitable.plain("...");
412-
trimmedName = StringVisitable.concat(textRenderer.trimToWidth(
413-
name,
419+
trimmedName = StringVisitable.concat(textRenderer.trimToWidth(name,
414420
maxNameWidth - textRenderer.getWidth(ellipsis)
415421
), ellipsis);
416422
}
@@ -421,12 +427,14 @@ public void render(DrawContext DrawContext, int mouseX, int mouseY, float delta)
421427
0xFFFFFF,
422428
true
423429
);
424-
if (mouseX > x + imageOffset && mouseY > RIGHT_PANE_Y + 1 && mouseY < RIGHT_PANE_Y + 1 + textRenderer.fontHeight && mouseX < x + imageOffset + textRenderer.getWidth(
425-
trimmedName)) {
430+
if (mouseX > x + imageOffset && mouseY > RIGHT_PANE_Y + 1 &&
431+
mouseY < RIGHT_PANE_Y + 1 + textRenderer.fontHeight &&
432+
mouseX < x + imageOffset + textRenderer.getWidth(trimmedName)) {
426433
this.setTooltip(ModMenuScreenTexts.modIdTooltip(mod.getId()));
427434
}
428435
if (this.init || modBadgeRenderer == null || modBadgeRenderer.getMod() != mod) {
429-
modBadgeRenderer = new ModBadgeRenderer(x + imageOffset + this.client.textRenderer.getWidth(trimmedName) + 2,
436+
modBadgeRenderer = new ModBadgeRenderer(
437+
x + imageOffset + this.client.textRenderer.getWidth(trimmedName) + 2,
430438
RIGHT_PANE_Y,
431439
width - 28,
432440
selectedEntry.mod,
@@ -528,13 +536,13 @@ public ModListEntry getSelectedEntry() {
528536
public void updateSelectedEntry(ModListEntry entry) {
529537
if (entry != null) {
530538
this.selected = entry;
539+
String modId = selected.getMod().getId();
531540

532541
if (this.configureButton != null) {
533-
String modId = selected.getMod().getId();
534542

535543
this.configureButton.active = modHasConfigScreen.get(modId);
536-
this.configureButton.visible = selected != null && modHasConfigScreen.get(modId) || modScreenErrors.containsKey(
537-
modId);
544+
this.configureButton.visible =
545+
selected != null && modHasConfigScreen.get(modId) || modScreenErrors.containsKey(modId);
538546

539547
if (modScreenErrors.containsKey(modId)) {
540548
Throwable e = modScreenErrors.get(modId);
@@ -544,11 +552,21 @@ public void updateSelectedEntry(ModListEntry entry) {
544552
}
545553
}
546554

555+
var isMinecraft = modId.equals("minecraft");
556+
557+
if (isMinecraft) {
558+
this.websiteButton.setMessage(SEND_FEEDBACK_TEXT);
559+
this.issuesButton.setMessage(REPORT_BUGS_TEXT);
560+
} else {
561+
this.websiteButton.setMessage(ModMenuScreenTexts.WEBSITE);
562+
this.issuesButton.setMessage(ModMenuScreenTexts.ISSUES);
563+
}
564+
547565
this.websiteButton.visible = true;
548-
this.websiteButton.active = selected.getMod().getWebsite() != null;
566+
this.websiteButton.active = isMinecraft || selected.getMod().getWebsite() != null;
549567

550568
this.issuesButton.visible = true;
551-
this.issuesButton.active = selected.getMod().getIssueTracker() != null;
569+
this.issuesButton.active = isMinecraft || selected.getMod().getIssueTracker() != null;
552570
}
553571
}
554572

@@ -565,8 +583,10 @@ public String getSearchInput() {
565583
}
566584

567585
private boolean updateFiltersX() {
568-
if ((this.filtersWidth + textRenderer.getWidth(this.computeModCountText(true)) + 20) >= this.searchRowWidth && ((this.filtersWidth + textRenderer.getWidth(
569-
computeModCountText(false)) + 20) >= this.searchRowWidth || (this.filtersWidth + textRenderer.getWidth(this.computeLibraryCountText()) + 20) >= this.searchRowWidth)) {
586+
if ((this.filtersWidth + textRenderer.getWidth(this.computeModCountText(true)) + 20) >= this.searchRowWidth &&
587+
((this.filtersWidth + textRenderer.getWidth(computeModCountText(false)) + 20) >= this.searchRowWidth ||
588+
(this.filtersWidth + textRenderer.getWidth(this.computeLibraryCountText()) + 20) >= this.searchRowWidth
589+
)) {
570590
this.filtersX = this.paneWidth / 2 - this.filtersWidth / 2;
571591
return !filterOptionsShown;
572592
} else {

0 commit comments

Comments
 (0)