From c1b089783e8090800efef1882915496278256eeb Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sat, 26 Sep 2026 21:42:55 +0300 Subject: [PATCH 01/30] Make hardcoded text translatable --- .../java/io/github/prospector/modmenu/gui/ModListScreen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index c5ce372d..6f390839 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -186,8 +186,8 @@ public void drawButton(Minecraft mc, int mouseX, int mouseY) { this.buttons.add(configureButton); this.buttons.add(websiteButton); this.buttons.add(issuesButton); - this.buttons.add(ButtonUtil.createButton(MODS_FOLDER_BUTTON_ID, this.width / 2 - 154, this.height - 28, 150, 20, "Open Mods Folder")); - this.buttons.add(ButtonUtil.createButton(DONE_BUTTON_ID, this.width / 2 + 4, this.height - 28, 150, 20, "Done")); + this.buttons.add(ButtonUtil.createButton(MODS_FOLDER_BUTTON_ID, this.width / 2 - 154, this.height - 28, 150, 20, I18n.getInstance().translateKey("modmenu.modsFolder"))); + this.buttons.add(ButtonUtil.createButton(DONE_BUTTON_ID, this.width / 2 + 4, this.height - 28, 150, 20, I18n.getInstance().translateKey("modmenu.done"))); this.searchBox.setFocused(true); init = true; From 47dee80b7a508fc8e12a182aa5f937d3183f30f4 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 00:57:16 +0300 Subject: [PATCH 02/30] Update ModListScreen.java --- .../prospector/modmenu/gui/ModListScreen.java | 65 +++++++++++-------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index 6f390839..07366dc3 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -253,9 +253,9 @@ public ModListWidget getModList() { @Override public void keyPressed(char char_1, int int_1, int mouseX, int mouseY) { this.searchBox.textboxKeyTyped(char_1, int_1); - if (int_1 == 1) { - this.mc.displayScreen(this.parent); - } + if (int_1 == 1) { + this.mc.displayScreen(this.parent); + } modList.keyPressed(int_1, 0, 0); descriptionListWidget.keyPressed(int_1, 0, 0); } @@ -275,12 +275,23 @@ public void mouseReleased(int mouseX, int mouseY, int mouseButton) { descriptionListWidget.mouseReleased(mouseX, mouseY, mouseButton); } } - + @Override public void render(int mouseX, int mouseY, float delta) { I18n i18n = I18n.getInstance(); - int mouseDX = Mouse.getEventDX() * this.width / this.mc.resolution.getScaledWidthScreenCoords(); // field_6326_c - int mouseDY = this.height - Mouse.getEventDY() * this.height / this.mc.resolution.getScaledHeightScreenCoords() - 1; // field_6325_d + + int dWheel = Mouse.getDWheel(); + if (dWheel != 0) { + double scrollDelta = dWheel > 0 ? 1.0 : -1.0; + if (this.modList != null && this.modList.isMouseOver(mouseX, mouseY)) { + this.modList.mouseScrolled(mouseX, mouseY, scrollDelta); + } else if (this.descriptionListWidget != null && this.descriptionListWidget.isMouseOver(mouseX, mouseY)) { + this.descriptionListWidget.mouseScrolled(mouseX, mouseY, scrollDelta); + } + } + + int mouseDX = Mouse.getDX() * this.width / this.mc.resolution.getScaledWidthScreenCoords(); // field_6326_c + int mouseDY = Mouse.getDY() * this.height / this.mc.resolution.getScaledHeightScreenCoords(); // field_6325_d for (int button = 0; button < Mouse.getButtonCount(); button++) { if (Mouse.isButtonDown(button)) { modList.mouseDragged(mouseX, mouseY, button, mouseDX, mouseDY); @@ -318,8 +329,8 @@ public void render(int mouseX, int mouseY, float delta) { GLRenderer.setColor4f(1, 1, 1, 1); this.selected.bindIconTexture(); - ModListEntry.internalRender(paneY, x); - int lineSpacing = 9 + 1; + ModListEntry.internalRender(paneY, x); + int lineSpacing = 9 + 1; int imageOffset = 36; String name = metadata.getName(); if (name.equals("Minecraft")){ // BAD CODE @@ -328,8 +339,8 @@ public void render(int mouseX, int mouseY, float delta) { name = HardcodedUtil.formatFabricModuleName(name); String trimmedName = name; int maxNameWidth = this.width - (x + imageOffset); - trimmedName = getString(font, name, trimmedName, maxNameWidth); - this.drawStringNoShadow(font, trimmedName, x + imageOffset, paneY + 1, 0xFFFFFF); + trimmedName = getString(font, name, trimmedName, maxNameWidth); + this.drawStringNoShadow(font, trimmedName, x + imageOffset, paneY + 1, 0xFFFFFF); if (mouseX > x + imageOffset && mouseY > paneY + 1 && mouseY < paneY + 1 + 9 && mouseX < x + imageOffset + fontRenderer.stringWidth(trimmedName)) { setTooltip(i18n.translateKeyAndFormat("modmenu.modIdToolTip", metadata.getId())); } @@ -349,10 +360,10 @@ public void render(int mouseX, int mouseY, float delta) { List names = new ArrayList<>(); metadata.getAuthors().stream() - .filter(Objects::nonNull) - .map(Person::getName) - .filter(Objects::nonNull) - .forEach(names::add); + .filter(Objects::nonNull) + .map(Person::getName) + .filter(Objects::nonNull) + .forEach(names::add); if (!names.isEmpty()) { if (names.size() > 1) { @@ -372,19 +383,19 @@ public void render(int mouseX, int mouseY, float delta) { GLRenderer.popFrame(); } - static String getString(FontRenderer fontRenderer, String name, String trimmedName, int maxNameWidth) { - if (fontRenderer.stringWidth(name) > maxNameWidth) { - int maxWidth = maxNameWidth - fontRenderer.stringWidth("..."); - trimmedName = ""; - while (fontRenderer.stringWidth(trimmedName) < maxWidth && trimmedName.length() < name.length()) { - trimmedName += name.charAt(trimmedName.length()); - } - trimmedName = trimmedName.isEmpty() ? "..." : trimmedName.substring(0, trimmedName.length() - 1) + "..."; - } - return trimmedName; - } - - public void overlayBackground(int x1, int y1, int x2, int y2, int red, int green, int blue, int startAlpha, int endAlpha) { + static String getString(FontRenderer fontRenderer, String name, String trimmedName, int maxNameWidth) { + if (fontRenderer.stringWidth(name) > maxNameWidth) { + int maxWidth = maxNameWidth - fontRenderer.stringWidth("..."); + trimmedName = ""; + while (fontRenderer.stringWidth(trimmedName) < maxWidth && trimmedName.length() < name.length()) { + trimmedName += name.charAt(trimmedName.length()); + } + trimmedName = trimmedName.isEmpty() ? "..." : trimmedName.substring(0, trimmedName.length() - 1) + "..."; + } + return trimmedName; + } + + public void overlayBackground(int x1, int y1, int x2, int y2, int red, int green, int blue, int startAlpha, int endAlpha) { GLRenderer.pushFrame(); GLRenderer.setShader(Shaders.INTERFACE); From ac46e10aeac6f10ed263b4e5c3229b376fcbb523 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 00:58:57 +0300 Subject: [PATCH 03/30] Update ModListWidget.java --- .../prospector/modmenu/gui/ModListWidget.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/ModListWidget.java index 0b2dbc52..eeeee233 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListWidget.java @@ -239,25 +239,34 @@ public void mouseClicked(int double_1, int double_2, int int_1) { if (this.isMouseOver(double_1, double_2)) { ModListEntry entry = this.getEntryAtPos(double_1, double_2); if (entry != null) { - if (entry.list.getFocused() != null) { - if (!entry.list.getFocused().equals(entry)) { - this.setFocused(entry); - this.setSelected(entry); - this.setDragging(true); - super.mouseClicked(double_1, double_2, int_1); - } - } else { - this.setFocused(entry); - this.setSelected(entry); - this.setDragging(true); - super.mouseClicked(double_1, double_2, int_1); - } + if (entry.list.getFocused() != null) { + if (!entry.list.getFocused().equals(entry)) { + this.setFocused(entry); + this.setSelected(entry); + this.setDragging(true); + super.mouseClicked(double_1, double_2, int_1); + } + } else { + this.setFocused(entry); + this.setSelected(entry); + this.setDragging(true); + super.mouseClicked(double_1, double_2, int_1); + } } else if (int_1 == 0) { this.clickedHeader((int) (double_1 - (double) (this.left + this.width / 2 - this.getRowWidth() / 2)), (int) (double_2 - (double) this.top) + (int) this.getScrollAmount() - 4); } } } + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollDelta) { + if (this.isMouseOver(mouseX, mouseY)) { + setScrollAmount(getScrollAmount() - scrollDelta * 20.0); + return true; + } + return false; + } + public final ModListEntry getEntryAtPos(double x, double y) { int int_5 = MathHelper.floor(y - (double) this.top) - this.headerHeight + (int) this.getScrollAmount() - 4; // convertToBlockCoord int index = int_5 / this.itemHeight; From 5cc4e9b42b0ab9ef91ef381711a5979a06728cfb Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 00:59:42 +0300 Subject: [PATCH 04/30] Update EntryListWidget.java --- .../modmenu/gui/EntryListWidget.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java index 4dfdb578..828c1c16 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java @@ -39,7 +39,7 @@ public abstract class EntryListWidget> extend protected boolean renderSelection = true; protected boolean renderHeader; protected int headerHeight; - private boolean scrolling; + protected boolean scrolling; private E selected; private E focused; @@ -168,7 +168,6 @@ protected void renderDecorations(int i, int j) { } public void render(int i, int j, float f) { - oldY = j; this.renderBackground(); int k = this.getScrollbarPosition(); int l = k + 6; @@ -321,25 +320,25 @@ protected int getScrollbarPosition() { return this.width / 2 + 124; } - @Override + @Override public void mouseClicked(int d, int e, int i) { this.updateScrollingState(d, e, i); if (this.isMouseOver(d, e)) { E entry = this.getEntryAtPosition(d, e); if (entry != null) { - if (entry.list.getFocused() != null) { - if (!entry.list.getFocused().equals(entry)) { - this.focused = entry; - this.selected = entry; - this.dragging = true; - super.mouseClicked(d, e, i); - } - } else { - this.focused = entry; - this.selected = entry; - this.dragging = true; - super.mouseClicked(d, e, i); - } + if (entry.list.getFocused() != null) { + if (!entry.list.getFocused().equals(entry)) { + this.focused = entry; + this.selected = entry; + this.dragging = true; + super.mouseClicked(d, e, i); + } + } else { + this.focused = entry; + this.selected = entry; + this.dragging = true; + super.mouseClicked(d, e, i); + } } else if (i == 0) { this.clickedHeader((int)(d - (double)(this.left + this.width / 2 - this.getRowWidth() / 2)), (int)(e - (double)this.top) + (int)this.getScrollAmount() - 4); } @@ -353,14 +352,12 @@ public boolean mouseReleased(double d, double e, int i) { return false; } - double oldY = -1; public boolean mouseDragged(double mouseX, double mouseY, int mouseButton, double mouseDX, double mouseDY) { - if (mouseButton == 0 && isMouseOver(mouseX, mouseY)) { - setScrollAmount(getScrollAmount() - mouseY + oldY); + if (this.scrolling) { + setScrollAmount(getScrollAmount() - mouseDY); return true; - } else { - return false; } + return false; } public boolean mouseScrolled(double d, double e, double f) { From 454d3343063982b2dc8b04e02145e34931dc549f Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 15:58:13 +0300 Subject: [PATCH 05/30] Update DescriptionListWidget.java --- .../modmenu/gui/DescriptionListWidget.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java index 24d758de..97ee2717 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java @@ -44,11 +44,20 @@ public void render(int mouseX, int mouseY, float delta) { lastSelected = selectedEntry; clearEntries(); setScrollAmount(-Double.MAX_VALUE); - String description = lastSelected.getMetadata().getDescription(); - String id = lastSelected.getMetadata().getId(); - Collection authors = lastSelected.getMetadata().getAuthors(); - Collection contributors = lastSelected.getMetadata().getContributors(); - Collection licenses = lastSelected.getMetadata().getLicense(); + String id = selectedEntry.getMetadata().getId(); + String descKey = "modmenu.descriptionTranslation." + id; + String translatedDesc = i18n.translateKey(descKey); + + String description; + if (!translatedDesc.equals(descKey)) { + description = translatedDesc; + } else { + description = selectedEntry.getMetadata().getDescription(); + } + + Collection authors = selectedEntry.getMetadata().getAuthors(); + Collection contributors = selectedEntry.getMetadata().getContributors(); + Collection licenses = selectedEntry.getMetadata().getLicense(); if (description.isEmpty() && HardcodedUtil.getHardcodedDescriptions().containsKey(id)) { description = HardcodedUtil.getHardcodedDescription(id); } From a1267461e5a40439b80982ccf4422480accb25d2 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 15:58:52 +0300 Subject: [PATCH 06/30] Update ModListEntry.java --- .../prospector/modmenu/gui/ModListEntry.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java index ccc28f42..749d0418 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java @@ -14,6 +14,7 @@ import net.minecraft.client.render.renderer.Shaders; import net.minecraft.client.render.renderer.State; import net.minecraft.client.render.tessellator.TessellatorGeneral; +import net.minecraft.core.lang.I18n; import org.lwjgl.opengl.GL11; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,9 +53,15 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou GLRenderer.setColor4f(1, 1, 1, 1); // We LOVE random color calls this.bindIconTexture(); internalRender(y, x); - String name = metadata.getName(); - if (name.equals("Minecraft")){ // BAD CODE - name = "Better than Adventure"; + String id = metadata.getId(); + String translationKey = "modmenu.nameTranslation." + id; + String translatedName = I18n.getInstance().translateKey(translationKey); + String name; + if (!translatedName.equals(translationKey)) { + name = translatedName; + } else { + name = metadata.getName(); + name = HardcodedUtil.formatFabricModuleName(name); } name = HardcodedUtil.formatFabricModuleName(name); String trimmedName = name; @@ -63,9 +70,13 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou trimmedName = ModListScreen.getString(fontRenderer, name, trimmedName, maxNameWidth); this.drawStringNoShadow(font, trimmedName, x + 32 + 3, y + 1, 0xFFFFFF); new BadgeRenderer(client, x + 32 + 3 + font.stringWidth(name) + 2, y, x + rowWidth, container, list.getParent()).draw(mouseX, mouseY); - String description = metadata.getDescription(); - if (description.isEmpty() && HardcodedUtil.getHardcodedDescriptions().containsKey(metadata.getId())) { - description = HardcodedUtil.getHardcodedDescription(metadata.getId()); + String descKey = "modmenu.descriptionTranslation." + id; + String translatedDesc = I18n.getInstance().translateKey(descKey); + String description; + if (!translatedDesc.equals(descKey)) { + description = translatedDesc; + } else { + description = metadata.getDescription(); } RenderUtils.INSTANCE.drawWrappedString(this, description, (x + 32 + 3 + 4), (y + 9 + 2), rowWidth - 32 - 7, 2, 0x808080); From c5010eafd543bedff975b087177d06084c41f30f Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:00:00 +0300 Subject: [PATCH 07/30] Update ModListScreen.java --- .../prospector/modmenu/gui/ModListScreen.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index 07366dc3..949ac1d0 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -279,7 +279,7 @@ public void mouseReleased(int mouseX, int mouseY, int mouseButton) { @Override public void render(int mouseX, int mouseY, float delta) { I18n i18n = I18n.getInstance(); - + int dWheel = Mouse.getDWheel(); if (dWheel != 0) { double scrollDelta = dWheel > 0 ? 1.0 : -1.0; @@ -332,11 +332,18 @@ public void render(int mouseX, int mouseY, float delta) { ModListEntry.internalRender(paneY, x); int lineSpacing = 9 + 1; int imageOffset = 36; - String name = metadata.getName(); - if (name.equals("Minecraft")){ // BAD CODE - name = "Better than Adventure"; + String id = metadata.getId(); + String translationKey = "modmenu.nameTranslation." + id; + String translatedName = i18n.translateKey(translationKey); + String name; + if (!translatedName.equals(translationKey)) { + name = translatedName; + } else { + name = metadata.getName(); + name = HardcodedUtil.formatFabricModuleName(name); } name = HardcodedUtil.formatFabricModuleName(name); + String trimmedName = name; int maxNameWidth = this.width - (x + imageOffset); trimmedName = getString(font, name, trimmedName, maxNameWidth); From f10187bda527bcafbc78bd001a319a6fed00a9d8 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:05:26 +0300 Subject: [PATCH 08/30] Update en_US.lang --- src/main/resources/assets/modmenu/lang/en_US/en_US.lang | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index 899411a9..c58b624c 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -26,3 +26,12 @@ modmenu.sorting.ascending=A-Z modmenu.sorting.decending=Z-A modmenu.minecraft=Minecraft modmenu.forge=Forge + +modmenu.nameTranslation.minecraft=Better than Adventure! +modmenu.descriptionTranslation.minecraft=The base game. +modmenu.nameTranslation.fabricloader=Fabric Loader +modmenu.descriptionTranslation.fabricloader=The base mod loader. +modmenu.nameTranslation.modmenu=Mod Menu +modmenu.descriptionTranslation.modmenu=Adds a mod menu to view the list of mods you have installed. +modmenu.nameTranslation.java=Java +modmenu.descriptionTranslation.java=The Java runtime environment. From 6cfd00cb08aeb9c2f43c3f969ad9d53df40a93cd Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 27 Sep 2026 23:50:25 +0300 Subject: [PATCH 09/30] Update ModListScreen.java --- .../io/github/prospector/modmenu/gui/ModListScreen.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index 949ac1d0..cd576d17 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -17,6 +17,7 @@ import net.minecraft.client.render.renderer.Shaders; import net.minecraft.client.render.renderer.State; import net.minecraft.client.render.tessellator.TessellatorGeneral; +import net.minecraft.client.util.helper.UrlHelper; import net.minecraft.core.Global; import net.minecraft.core.lang.I18n; import org.lwjgl.Sys; @@ -207,13 +208,11 @@ protected void buttonClicked(ButtonElement button) { break; } case WEBSITE_BUTTON_ID: { - final ModMetadata metadata = Objects.requireNonNull(selected).getMetadata(); - metadata.getContact().get("homepage").ifPresent(Sys::openURL); + Objects.requireNonNull(selected).getMetadata().getContact().get("homepage").ifPresent(UrlHelper::openURL); break; } case ISSUES_BUTTON_ID: { - final ModMetadata metadata = Objects.requireNonNull(selected).getMetadata(); - metadata.getContact().get("issues").ifPresent(Sys::openURL); + Objects.requireNonNull(selected).getMetadata().getContact().get("issues").ifPresent(UrlHelper::openURL); break; } case TOGGLE_FILTER_OPTIONS_BUTTON_ID: { From bb6fde283d8618c6a4ea7590f11bb02f80d26317 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 28 Sep 2026 10:33:36 +0300 Subject: [PATCH 10/30] Update HardcodedUtil.java --- .../java/io/github/prospector/modmenu/util/HardcodedUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java b/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java index ca10db64..d9a753f4 100644 --- a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java +++ b/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java @@ -15,10 +15,6 @@ public final class HardcodedUtil { private static final Set FABRIC_MODS = new HashSet<>(); private static final HashMap HARDCODED_DESCRIPTIONS = new HashMap<>(); - public static void initializeHardcodings() { - HARDCODED_DESCRIPTIONS.put("minecraft", new Random().nextInt(1000) == 0 ? "The based game." : "The base game."); - } - public static void hardcodeModuleMetadata(ModContainer mod, ModMetadata metadata, String id) { Matcher matcher = FABRIC_PATTERN.matcher(id); if (matcher.matches() || id.equals("fabric-api-base") || id.equals("fabric-renderer-indigo")) { From 2648d1ad85ae3e9bea5508dc788c7d77834fb580 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 28 Sep 2026 13:30:23 +0300 Subject: [PATCH 11/30] Update ModListScreen.java --- .../io/github/prospector/modmenu/gui/ModListScreen.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index cd576d17..13b04e3d 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -355,12 +355,9 @@ public void render(int mouseX, int mouseY, float delta) { init = false; } badgeRenderer.draw(mouseX, mouseY); - String versionString; - if (metadata.getName().equals("Minecraft")){ // BAD CODE - versionString = Global.VERSION; - } else { - versionString = metadata.getVersion().getFriendlyString(); - } + String versionString = metadata.getId().equals("minecraft") + ? Global.VERSION + : metadata.getVersion().getFriendlyString(); this.drawStringNoShadow(font, "v" + versionString, x + imageOffset, paneY + 2 + lineSpacing, 0x808080); String authors; List names = new ArrayList<>(); From df9918ac1883d7efe88070487ca74eecf07a0b4f Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:14:16 +0300 Subject: [PATCH 12/30] Update DescriptionListWidget.java --- .../github/prospector/modmenu/gui/DescriptionListWidget.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java index 97ee2717..2a16d0aa 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java @@ -58,9 +58,6 @@ public void render(int mouseX, int mouseY, float delta) { Collection authors = selectedEntry.getMetadata().getAuthors(); Collection contributors = selectedEntry.getMetadata().getContributors(); Collection licenses = selectedEntry.getMetadata().getLicense(); - if (description.isEmpty() && HardcodedUtil.getHardcodedDescriptions().containsKey(id)) { - description = HardcodedUtil.getHardcodedDescription(id); - } if (lastSelected != null && description != null && !description.isEmpty()) { for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, description.replaceAll("\n", "\n\n"), getRowWidth())) { children().add(new DescriptionEntry(line)); From 6ace480a828291b2d650836e3ac4502bdb499396 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:14:57 +0300 Subject: [PATCH 13/30] Update HardcodedUtil.java --- .../io/github/prospector/modmenu/util/HardcodedUtil.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java b/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java index d9a753f4..983adf5e 100644 --- a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java +++ b/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java @@ -13,7 +13,6 @@ public final class HardcodedUtil { private static final Pattern FABRIC_PATTERN = Pattern.compile("^fabric-.*(-v\\d+)$"); private static final Set FABRIC_MODS = new HashSet<>(); - private static final HashMap HARDCODED_DESCRIPTIONS = new HashMap<>(); public static void hardcodeModuleMetadata(ModContainer mod, ModMetadata metadata, String id) { Matcher matcher = FABRIC_PATTERN.matcher(id); @@ -65,15 +64,7 @@ private static String capitalize(String str) { return sb.toString(); } - public static String getHardcodedDescription(String id) { - return HARDCODED_DESCRIPTIONS.getOrDefault(id, ""); - } - public static Set getFabricMods() { return FABRIC_MODS; } - - public static HashMap getHardcodedDescriptions() { - return HARDCODED_DESCRIPTIONS; - } } From d105283e80037060ff4cf73a81432e7390d93cfe Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sat, 3 Oct 2026 23:18:54 +0300 Subject: [PATCH 14/30] Update DescriptionListWidget.java --- .../modmenu/gui/DescriptionListWidget.java | 80 ++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java index 2a16d0aa..d6bcddc4 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java @@ -1,14 +1,18 @@ package io.github.prospector.modmenu.gui; -import io.github.prospector.modmenu.util.HardcodedUtil; import io.github.prospector.modmenu.util.RenderUtils; +import net.fabricmc.loader.api.metadata.ContactInformation; import net.fabricmc.loader.api.metadata.Person; import net.minecraft.client.Minecraft; import net.minecraft.client.render.font.FontRenderer; +import net.minecraft.client.util.helper.UrlHelper; import net.minecraft.core.lang.I18n; +import net.minecraft.core.net.command.TextFormatting; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; public class DescriptionListWidget extends EntryListWidget { private final ModListScreen parent; @@ -36,6 +40,37 @@ protected int getScrollbarPosition() { return this.width - 6 + left; } + protected class LinkEntry extends DescriptionEntry { + private final String link; + private final int indent; + private int lastRenderX; + private int lastRenderY; + + public LinkEntry(String text, String link, int indent) { + super(text); + this.link = link; + this.indent = indent; + } + + @Override + public void render(int index, int y, int x, int itemWidth, int itemHeight, int mouseX, int mouseY, boolean isSelected, float delta) { + this.lastRenderX = x + indent; + this.lastRenderY = y; + + String formattedText = TextFormatting.formatted(text, TextFormatting.BLUE, TextFormatting.UNDERLINE); + this.drawStringShadow(this.fontRenderer, formattedText, lastRenderX, lastRenderY, 0xFFFFFF); + } + + public void mouseClicked(int mouseX, int mouseY, int button) { + if (button == 0) { + int textWidth = fontRenderer.stringWidth(text); + if (mouseX >= lastRenderX && mouseX <= lastRenderX + textWidth && mouseY >= lastRenderY && mouseY <= lastRenderY + 12) { + UrlHelper.openURL(link); + } + } + } + } + @Override public void render(int mouseX, int mouseY, float delta) { I18n i18n = I18n.getInstance(); @@ -58,11 +93,13 @@ public void render(int mouseX, int mouseY, float delta) { Collection authors = selectedEntry.getMetadata().getAuthors(); Collection contributors = selectedEntry.getMetadata().getContributors(); Collection licenses = selectedEntry.getMetadata().getLicense(); + if (lastSelected != null && description != null && !description.isEmpty()) { for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, description.replaceAll("\n", "\n\n"), getRowWidth())) { children().add(new DescriptionEntry(line)); } } + if (!authors.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.authors"))); @@ -70,6 +107,7 @@ public void render(int mouseX, int mouseY, float delta) { children().add(new DescriptionEntry(" " + person.getName())); } } + if (!contributors.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.contributors"))); @@ -77,6 +115,36 @@ public void render(int mouseX, int mouseY, float delta) { children().add(new DescriptionEntry(" " + person.getName())); } } + + ContactInformation contact = selectedEntry.getMetadata().getContact(); + Map links = new HashMap<>(contact.asMap()); + + links.remove("homepage"); + links.remove("issues"); + + if (!links.isEmpty()) { + children().add(new DescriptionEntry("")); + + for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, i18n.translateKey("modmenu.links"), getRowWidth())) { + children().add(new DescriptionEntry(line)); + } + + links.forEach((key, value) -> { + int indent = 8; + String translationKey = "modmenu." + key; + String translatedKey = i18n.translateKey(translationKey); + + if (translatedKey.equals(translationKey)) { + translatedKey = Character.toUpperCase(key.charAt(0)) + key.substring(1); + } + + for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, translatedKey, getRowWidth() - 16)) { + children().add(new LinkEntry(line, value, indent)); + indent = 16; + } + }); + } + if (!licenses.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.licenses"))); @@ -88,6 +156,16 @@ public void render(int mouseX, int mouseY, float delta) { super.render(mouseX, mouseY, delta); } + @Override + public void mouseClicked(int mouseX, int mouseY, int button) { + super.mouseClicked(mouseX, mouseY, button); + for (DescriptionEntry entry : children()) { + if (entry instanceof LinkEntry) { + entry.mouseClicked(mouseX, mouseY, button); + } + } + } + @Override protected void renderHoleBackground(int y1, int y2, int startAlpha, int endAlpha) { // Awful hack but it makes the background "seamless" From eabac7f9ccdb5bfa98d5780427a7ac6c357621e0 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sat, 3 Oct 2026 23:20:11 +0300 Subject: [PATCH 15/30] Update en_US.lang --- .../assets/modmenu/lang/en_US/en_US.lang | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index c58b624c..d4fd3cdc 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -27,6 +27,31 @@ modmenu.sorting.decending=Z-A modmenu.minecraft=Minecraft modmenu.forge=Forge +modmenu.links=Links: +modmenu.sources=Source +modmenu.bluesky=Bluesky +modmenu.buymeacoffee=Buy Me a Coffee +modmenu.coindrop=Coindrop +modmenu.crowdin=Crowdin +modmenu.curseforge=CurseForge +modmenu.discord=Discord +modmenu.donate=Donate +modmenu.flattr=Flattr +modmenu.github_releases=GitHub Releases +modmenu.github_sponsors=GitHub Sponsors +modmenu.kofi=Ko-fi +modmenu.liberapay=Liberapay +modmenu.mastodon=Mastodon +modmenu.modrinth=Modrinth +modmenu.opencollective=Open Collective +modmenu.patreon=Patreon +modmenu.paypal=PayPal +modmenu.reddit=Reddit +modmenu.twitch=Twitch +modmenu.wiki=Wiki +modmenu.twitter=X (Twitter) +modmenu.youtube=YouTube + modmenu.nameTranslation.minecraft=Better than Adventure! modmenu.descriptionTranslation.minecraft=The base game. modmenu.nameTranslation.fabricloader=Fabric Loader From 594828d67ce96360e57d4464e47f32d8d22217df Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 12:17:52 +0300 Subject: [PATCH 16/30] Update ModListScreen.java --- .../github/prospector/modmenu/gui/ModListScreen.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index 13b04e3d..a58422a3 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -17,6 +17,7 @@ import net.minecraft.client.render.renderer.Shaders; import net.minecraft.client.render.renderer.State; import net.minecraft.client.render.tessellator.TessellatorGeneral; +import net.minecraft.client.util.helper.FileOpener; import net.minecraft.client.util.helper.UrlHelper; import net.minecraft.core.Global; import net.minecraft.core.lang.I18n; @@ -231,10 +232,13 @@ protected void buttonClicked(ButtonElement button) { } case MODS_FOLDER_BUTTON_ID: { File modsFolder = new File(FabricLoader.getInstance().getGameDir().toFile(), "mods"); + if (!modsFolder.exists()) { + modsFolder.mkdirs(); + } try { - Sys.openURL(modsFolder.toURI().toURL().toString()); - } catch (MalformedURLException e) { - LOGGER.error("Malformed mods folder URL", e); + FileOpener.open(modsFolder); + } catch (Exception e) { + LOGGER.error("Failed to open mods folder", e); } break; } From 1a7f705c2966ffae7bdf8e6db5035c362bf783fa Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 14:11:31 +0300 Subject: [PATCH 17/30] remove harcoded util --- .../io/github/prospector/modmenu/ModMenu.java | 4 -- .../modmenu/config/ModMenuConfig.java | 6 +- .../prospector/modmenu/gui/ModListEntry.java | 7 +- .../prospector/modmenu/gui/ModListScreen.java | 5 -- .../modmenu/util/BadgeRenderer.java | 10 +-- .../modmenu/util/HardcodedUtil.java | 70 ------------------- .../modmenu/util/ModListSearch.java | 22 ++++-- .../assets/modmenu/lang/en_US/en_US.lang | 21 ++++-- 8 files changed, 38 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java diff --git a/src/main/java/io/github/prospector/modmenu/ModMenu.java b/src/main/java/io/github/prospector/modmenu/ModMenu.java index 69c195d7..0c2a9b8b 100644 --- a/src/main/java/io/github/prospector/modmenu/ModMenu.java +++ b/src/main/java/io/github/prospector/modmenu/ModMenu.java @@ -6,7 +6,6 @@ import com.google.gson.GsonBuilder; import io.github.prospector.modmenu.api.ModMenuApi; import io.github.prospector.modmenu.config.ModMenuConfigManager; -import io.github.prospector.modmenu.util.HardcodedUtil; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; @@ -88,7 +87,6 @@ public void onInitialize() { }); configScreenFactories.put("minecraft", (screenBase -> new ScreenOptions(screenBase, OptionsPages.GENERAL))); Collection mods = FabricLoader.getInstance().getAllMods(); - HardcodedUtil.initializeHardcodings(); for (ModContainer mod : mods) { ModMetadata metadata = mod.getMetadata(); String id = metadata.getId(); @@ -129,8 +127,6 @@ public void onInitialize() { list.add(mod); }); } - } else { - HardcodedUtil.hardcodeModuleMetadata(mod, metadata, id); } } } diff --git a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java index 128a3df5..172a9261 100644 --- a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java +++ b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java @@ -1,7 +1,5 @@ package io.github.prospector.modmenu.config; - -import io.github.prospector.modmenu.util.HardcodedUtil; import net.fabricmc.loader.api.ModContainer; import net.minecraft.core.lang.I18n; @@ -30,8 +28,8 @@ public Sorting getSorting() { } public enum Sorting { - ASCENDING(Comparator.comparing(modContainer -> HardcodedUtil.formatFabricModuleName(modContainer.getMetadata().getName())), "modmenu.sorting.ascending"), - DECENDING(ASCENDING.getComparator().reversed(), "modmenu.sorting.decending"); + ASCENDING(Comparator.comparing(modContainer -> modContainer.getMetadata().getName(), String.CASE_INSENSITIVE_ORDER),"modmenu.sorting.ascending"), + DESCENDING(ASCENDING.getComparator().reversed(),"modmenu.sorting.decending"); final Comparator comparator; final String key; diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java index 749d0418..42612eec 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java @@ -3,7 +3,6 @@ import io.github.prospector.modmenu.ModMenu; import io.github.prospector.modmenu.util.BadgeRenderer; -import io.github.prospector.modmenu.util.HardcodedUtil; import io.github.prospector.modmenu.util.RenderUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; @@ -61,9 +60,7 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou name = translatedName; } else { name = metadata.getName(); - name = HardcodedUtil.formatFabricModuleName(name); } - name = HardcodedUtil.formatFabricModuleName(name); String trimmedName = name; int maxNameWidth = rowWidth - 32 - 3; FontRenderer font = this.fontRenderer; @@ -108,9 +105,7 @@ private BufferedImage createIcon() { } if (!Files.exists(path)) { ModContainer modMenu = FabricLoader.getInstance().getModContainer(ModMenu.MOD_ID).orElseThrow(IllegalAccessError::new); - if (HardcodedUtil.getFabricMods().contains(metadata.getId())) { - path = modMenu.getPath("assets/" + ModMenu.MOD_ID + "/fabric_icon.png"); - } else if (metadata.getId().equals("minecraft")) { + if (metadata.getId().equals("minecraft")) { path = modMenu.getPath("assets/" + ModMenu.MOD_ID + "/mc_icon.png"); } else if (metadata.getId().equals("java")) { path = modMenu.getPath("assets/" + ModMenu.MOD_ID + "/java_icon.png"); diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index a58422a3..71a05283 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -4,7 +4,6 @@ import io.github.prospector.modmenu.config.ModMenuConfigManager; import io.github.prospector.modmenu.util.BadgeRenderer; import io.github.prospector.modmenu.util.ButtonUtil; -import io.github.prospector.modmenu.util.HardcodedUtil; import io.github.prospector.modmenu.util.RenderUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; @@ -21,7 +20,6 @@ import net.minecraft.client.util.helper.UrlHelper; import net.minecraft.core.Global; import net.minecraft.core.lang.I18n; -import org.lwjgl.Sys; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL41; @@ -30,7 +28,6 @@ import org.spongepowered.include.com.google.common.base.Joiner; import java.io.File; -import java.net.MalformedURLException; import java.text.NumberFormat; import java.util.*; @@ -343,9 +340,7 @@ public void render(int mouseX, int mouseY, float delta) { name = translatedName; } else { name = metadata.getName(); - name = HardcodedUtil.formatFabricModuleName(name); } - name = HardcodedUtil.formatFabricModuleName(name); String trimmedName = name; int maxNameWidth = this.width - (x + imageOffset); diff --git a/src/main/java/io/github/prospector/modmenu/util/BadgeRenderer.java b/src/main/java/io/github/prospector/modmenu/util/BadgeRenderer.java index a19b7673..97b0bbe5 100644 --- a/src/main/java/io/github/prospector/modmenu/util/BadgeRenderer.java +++ b/src/main/java/io/github/prospector/modmenu/util/BadgeRenderer.java @@ -33,19 +33,19 @@ public void draw(int mouseX, int mouseY) { this.badgeX = startX; this.badgeY = startY; if (ModMenu.LIBRARY_MODS.contains(metadata.getId())) { - drawBadge(i18n.translateKey("modmenu.library"), 0x8810d098, 0x88046146, mouseX, mouseY); + drawBadge(i18n.translateKey("modmenu.badge.library"), 0x8810d098, 0x88046146, mouseX, mouseY); } if (ModMenu.CLIENTSIDE_MODS.contains(metadata.getId())) { - drawBadge(i18n.translateKey("modmenu.clientsideOnly"), 0x884383E3, 0x880E4699, mouseX, mouseY); + drawBadge(i18n.translateKey("modmenu.badge.clientsideOnly"), 0x884383E3, 0x880E4699, mouseX, mouseY); } if (ModMenu.DEPRECATED_MODS.contains(metadata.getId())) { - drawBadge(i18n.translateKey("modmenu.deprecated"), 0xFF841426, 0xFF530C17, mouseX, mouseY); + drawBadge(i18n.translateKey("modmenu.badge.deprecated"), 0xFF841426, 0xFF530C17, mouseX, mouseY); } if (ModMenu.PATCHWORK_FORGE_MODS.contains(metadata.getId())) { - drawBadge(i18n.translateKey("modmenu.forge"), 0x887C89A3, 0x88202C43, mouseX, mouseY); + drawBadge(i18n.translateKey("modmenu.badge.forge"), 0x887C89A3, 0x88202C43, mouseX, mouseY); } if (metadata.getId().equals("minecraft")) { - drawBadge(i18n.translateKey("modmenu.minecraft"), 0x88BCBCBC, 0x88535353, mouseX, mouseY); + drawBadge(i18n.translateKey("modmenu.badge.minecraft"), 0x88BCBCBC, 0x88535353, mouseX, mouseY); } if (ModMenu.CUSTOM_BADGE_MODS.containsKey(metadata.getId())) { Map> map = ModMenu.CUSTOM_BADGE_MODS.get(metadata.getId()); diff --git a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java b/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java deleted file mode 100644 index 983adf5e..00000000 --- a/src/main/java/io/github/prospector/modmenu/util/HardcodedUtil.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.github.prospector.modmenu.util; - - -import io.github.prospector.modmenu.ModMenu; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.fabricmc.loader.api.metadata.ModMetadata; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class HardcodedUtil { - private static final Pattern FABRIC_PATTERN = Pattern.compile("^fabric-.*(-v\\d+)$"); - private static final Set FABRIC_MODS = new HashSet<>(); - - public static void hardcodeModuleMetadata(ModContainer mod, ModMetadata metadata, String id) { - Matcher matcher = FABRIC_PATTERN.matcher(id); - if (matcher.matches() || id.equals("fabric-api-base") || id.equals("fabric-renderer-indigo")) { - FABRIC_MODS.add(id); - if (FabricLoader.getInstance().isModLoaded("fabric")) { - Optional parent = FabricLoader.getInstance().getModContainer("fabric"); - parent.ifPresent(modContainer -> { - final List list = ModMenu.PARENT_MAP.computeIfAbsent(modContainer, k -> new ArrayList<>()); - list.add(mod); - });; - } - ModMenu.addLibraryMod(id); - if (id.equals("fabric-keybindings-v0") || id.equals("fabric-models-v0") || id.equals("fabric-renderer-api-v1") || id.equals("fabric-renderer-indigo") || id.equals("fabric-rendering-fluids-v1") || id.equals("fabric-rendering-v0") || id.equals("fabric-textures-v0")) { - ModMenu.CLIENTSIDE_MODS.add(id); - } - } - if (id.equals("fabricloader") || id.equals("fabric") || metadata.getName().endsWith(" API")) { - ModMenu.addLibraryMod(id); - } - } - - public static String formatFabricModuleName(String name) { - Matcher matcher = FABRIC_PATTERN.matcher(name); - if (matcher.matches() || name.equals("fabric-renderer-indigo") || name.equals("fabric-api-base")) { - if (matcher.matches()) { - String v = matcher.group(1); - name = capitalize(name.replace(v, "").replace("-", " ")); - name = name + " (" + v.replace("-", "") + ")"; - } else { - name = capitalize(name.replace("-", " ")); - } - name = name.replace("Api", "API"); - name = name.replace("Blockentity", "BlockEntity"); - } - return name; - } - - private static String capitalize(String str) { - StringBuilder sb = new StringBuilder(); - boolean capitalizeNext = true; - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - if (capitalizeNext) - c = Character.toTitleCase(c); - capitalizeNext = Character.isWhitespace(c); - sb.append(c); - } - return sb.toString(); - } - - public static Set getFabricMods() { - return FABRIC_MODS; - } -} diff --git a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java index a21e9e56..c12f70d0 100644 --- a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java +++ b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java @@ -6,6 +6,7 @@ import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import net.fabricmc.loader.api.metadata.Person; +import net.minecraft.core.lang.I18n; import java.util.List; import java.util.Locale; @@ -33,13 +34,20 @@ private static boolean passesFilters(ModListScreen screen, ModContainer containe //Some basic search, could do with something more advanced but this will do for now - if (HardcodedUtil.formatFabricModuleName(metadata.getName()).toLowerCase(Locale.ROOT).contains(query) //Search mod name - || modId.toLowerCase(Locale.ROOT).contains(query) // Search mod name - || authorMatches(container, query) //Search via author - || (ModMenu.LIBRARY_MODS.contains(modId) && "api library".contains(query)) //Search for lib mods - || ("clientside".contains(query) && ModMenu.CLIENTSIDE_MODS.contains(modId)) //Search for clientside mods - || ("deprecated".contains(query) && ModMenu.DEPRECATED_MODS.contains(modId)) //Search for clientside mods - || ("configurations configs configures configurable".contains(query) && ModMenu.hasConfigScreenFactory(modId)) //Search for mods that can be configured + I18n i18n = I18n.getInstance(); + String translationKey = "modmenu.nameTranslation." + modId; + String translatedName = I18n.getInstance().translateKey(translationKey); + + String modName = !translatedName.equals(translationKey) ? translatedName : metadata.getName(); + + if (modName.toLowerCase(Locale.ROOT).contains(query) // Search mod name + || modId.toLowerCase(Locale.ROOT).contains(query) // Search mod name + || authorMatches(container, query) // Search via author + || (ModMenu.LIBRARY_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.library").toLowerCase(Locale.ROOT).contains(query)) // Search for lib mods + || (ModMenu.CLIENTSIDE_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.clientside").toLowerCase(Locale.ROOT).contains(query)) // Search for clientside mods + || (ModMenu.DEPRECATED_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.deprecated").toLowerCase(Locale.ROOT).contains(query)) // Search for deprecated mods + || (ModMenu.PATCHWORK_FORGE_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.patchwork").toLowerCase(Locale.ROOT).contains(query)) // Search for forge and patchwork + || (ModMenu.hasConfigScreenFactory(modId) && i18n.translateKey("modmenu.searchTerms.configurable").toLowerCase(Locale.ROOT).contains(query)) // Search for mods that can be configured ) { return true; } diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index d4fd3cdc..5f5ef371 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -13,9 +13,6 @@ modmenu.authors=Authors: modmenu.contributors=Contributors: modmenu.licenses=Licenses: modmenu.search=Search for mods -modmenu.clientsideOnly=Client -modmenu.library=Library -modmenu.deprecated=Deprecated modmenu.toggleFilterOptions=Toggle Filter Options modmenu.showLibraries=Libraries: %s modmenu.showLibraries.true=Shown @@ -24,8 +21,20 @@ modmenu.showingMods=Showing %s Mods modmenu.sorting=Sort: %s modmenu.sorting.ascending=A-Z modmenu.sorting.decending=Z-A -modmenu.minecraft=Minecraft -modmenu.forge=Forge + +modmenu.searchTerms.library=api library +modmenu.searchTerms.patchwork=patchwork forge fml +modmenu.searchTerms.modpack=modpack pack +modmenu.searchTerms.deprecated=deprecated outdated old +modmenu.searchTerms.clientside=clientside gameside +modmenu.searchTerms.configurable=configurations configs configures configurable options settings +modmenu.searchTerms.hasUpdate=updates version + +modmenu.badge.clientsideOnly=Client +modmenu.badge.library=Library +modmenu.badge.deprecated=Deprecated +modmenu.badge.minecraft=Minecraft +modmenu.badge.forge=Forge modmenu.links=Links: modmenu.sources=Source @@ -59,4 +68,4 @@ modmenu.descriptionTranslation.fabricloader=The base mod loader. modmenu.nameTranslation.modmenu=Mod Menu modmenu.descriptionTranslation.modmenu=Adds a mod menu to view the list of mods you have installed. modmenu.nameTranslation.java=Java -modmenu.descriptionTranslation.java=The Java runtime environment. +modmenu.descriptionTranslation.java=The Java runtime environment. \ No newline at end of file From 83b4a6f63845703575d131f9f1d890e8851eb5cc Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 15:47:35 +0300 Subject: [PATCH 18/30] Update en_US.lang --- src/main/resources/assets/modmenu/lang/en_US/en_US.lang | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index 5f5ef371..eab3e7b7 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -23,12 +23,10 @@ modmenu.sorting.ascending=A-Z modmenu.sorting.decending=Z-A modmenu.searchTerms.library=api library -modmenu.searchTerms.patchwork=patchwork forge fml -modmenu.searchTerms.modpack=modpack pack -modmenu.searchTerms.deprecated=deprecated outdated old modmenu.searchTerms.clientside=clientside gameside +modmenu.searchTerms.deprecated=deprecated outdated old +modmenu.searchTerms.patchwork=patchwork forge fml modmenu.searchTerms.configurable=configurations configs configures configurable options settings -modmenu.searchTerms.hasUpdate=updates version modmenu.badge.clientsideOnly=Client modmenu.badge.library=Library @@ -68,4 +66,4 @@ modmenu.descriptionTranslation.fabricloader=The base mod loader. modmenu.nameTranslation.modmenu=Mod Menu modmenu.descriptionTranslation.modmenu=Adds a mod menu to view the list of mods you have installed. modmenu.nameTranslation.java=Java -modmenu.descriptionTranslation.java=The Java runtime environment. \ No newline at end of file +modmenu.descriptionTranslation.java=The Java runtime environment. From 2f6d126cd280782b26f38ffc508c13f2066a96df Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 18:30:31 +0300 Subject: [PATCH 19/30] Update DescriptionListWidget.java --- .../modmenu/gui/DescriptionListWidget.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java index d6bcddc4..12e2065d 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/DescriptionListWidget.java @@ -90,16 +90,29 @@ public void render(int mouseX, int mouseY, float delta) { description = selectedEntry.getMetadata().getDescription(); } - Collection authors = selectedEntry.getMetadata().getAuthors(); - Collection contributors = selectedEntry.getMetadata().getContributors(); - Collection licenses = selectedEntry.getMetadata().getLicense(); - + if ("java".equals(id)) { + String vendor = System.getProperty("java.vendor", "Unknown Vendor"); + String javaDist = i18n.translateKeyAndFormat("modmenu.javaDistributionName", vendor); + description = (description != null ? description : "") + "\n" + javaDist; + } + if (lastSelected != null && description != null && !description.isEmpty()) { - for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, description.replaceAll("\n", "\n\n"), getRowWidth())) { - children().add(new DescriptionEntry(line)); + String[] paragraphs = description.split("\r?\n"); + for (String paragraph : paragraphs) { + if (paragraph.isEmpty()) { + children().add(new DescriptionEntry("")); + continue; + } + for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(textRenderer, paragraph, getRowWidth())) { + children().add(new DescriptionEntry(line)); + } } } - + + Collection authors = selectedEntry.getMetadata().getAuthors(); + Collection contributors = selectedEntry.getMetadata().getContributors(); + Collection licenses = selectedEntry.getMetadata().getLicense(); + if (!authors.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.authors"))); @@ -107,7 +120,7 @@ public void render(int mouseX, int mouseY, float delta) { children().add(new DescriptionEntry(" " + person.getName())); } } - + if (!contributors.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.contributors"))); @@ -115,7 +128,7 @@ public void render(int mouseX, int mouseY, float delta) { children().add(new DescriptionEntry(" " + person.getName())); } } - + ContactInformation contact = selectedEntry.getMetadata().getContact(); Map links = new HashMap<>(contact.asMap()); @@ -144,7 +157,7 @@ public void render(int mouseX, int mouseY, float delta) { } }); } - + if (!licenses.isEmpty()) { if (!children().isEmpty()) children().add(new DescriptionEntry("")); children().add(new DescriptionEntry(i18n.translateKey("modmenu.licenses"))); From 41adc87d25fd65e22f5b826b1399c8af342bdaf0 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 18:31:28 +0300 Subject: [PATCH 20/30] Update ModListEntry.java --- .../prospector/modmenu/gui/ModListEntry.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java index 42612eec..81427ecc 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java @@ -44,6 +44,7 @@ public ModListEntry(Minecraft mc, ModContainer container, ModListWidget list) { @Override public void render(int index, int y, int x, int rowWidth, int rowHeight, int mouseX, int mouseY, boolean isSelected, float delta) { + I18n i18n = I18n.getInstance(); x += getXOffset(); rowWidth -= getXOffset(); @@ -52,9 +53,10 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou GLRenderer.setColor4f(1, 1, 1, 1); // We LOVE random color calls this.bindIconTexture(); internalRender(y, x); + String id = metadata.getId(); String translationKey = "modmenu.nameTranslation." + id; - String translatedName = I18n.getInstance().translateKey(translationKey); + String translatedName = i18n.translateKey(translationKey); String name; if (!translatedName.equals(translationKey)) { name = translatedName; @@ -67,15 +69,30 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou trimmedName = ModListScreen.getString(fontRenderer, name, trimmedName, maxNameWidth); this.drawStringNoShadow(font, trimmedName, x + 32 + 3, y + 1, 0xFFFFFF); new BadgeRenderer(client, x + 32 + 3 + font.stringWidth(name) + 2, y, x + rowWidth, container, list.getParent()).draw(mouseX, mouseY); + String descKey = "modmenu.descriptionTranslation." + id; - String translatedDesc = I18n.getInstance().translateKey(descKey); + String translatedDesc = i18n.translateKey(descKey); String description; if (!translatedDesc.equals(descKey)) { description = translatedDesc; } else { description = metadata.getDescription(); } - RenderUtils.INSTANCE.drawWrappedString(this, description, (x + 32 + 3 + 4), (y + 9 + 2), rowWidth - 32 - 7, 2, 0x808080); + + if ("java".equals(id)) { + String vendor = System.getProperty("java.vendor", "Unknown Vendor"); + String javaDist = i18n.translateKeyAndFormat("modmenu.javaDistributionName", vendor); + description = (description != null ? description : "") + " " + javaDist; + } + + if (description != null) { + String cleanDescription = description.replaceAll("\r?\n", " "); + int textX = x + 32 + 3 + 4; + int textY = y + 9 + 2; + int maxWidth = rowWidth - 32 - 7; + + RenderUtils.INSTANCE.drawWrappedString(this, cleanDescription, textX, textY, maxWidth, 2, 0x808080); + } GLRenderer.popFrame(); } From c8be18f8ac15efee9f98c3de08458f9543099e41 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 18:49:13 +0300 Subject: [PATCH 21/30] Update ModMenuConfig.java --- .../java/io/github/prospector/modmenu/config/ModMenuConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java index 172a9261..4a40bc91 100644 --- a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java +++ b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java @@ -1,5 +1,6 @@ package io.github.prospector.modmenu.config; + import net.fabricmc.loader.api.ModContainer; import net.minecraft.core.lang.I18n; From f21ff5bd2913467636f6dfada2191d131486e6eb Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 18:51:03 +0300 Subject: [PATCH 22/30] Update ModListSearch.java --- .../java/io/github/prospector/modmenu/util/ModListSearch.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java index c12f70d0..b7942b1e 100644 --- a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java +++ b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java @@ -32,14 +32,12 @@ private static boolean passesFilters(ModListScreen screen, ModContainer containe ModMetadata metadata = container.getMetadata(); String modId = metadata.getId(); - //Some basic search, could do with something more advanced but this will do for now I18n i18n = I18n.getInstance(); String translationKey = "modmenu.nameTranslation." + modId; String translatedName = I18n.getInstance().translateKey(translationKey); - String modName = !translatedName.equals(translationKey) ? translatedName : metadata.getName(); - + if (modName.toLowerCase(Locale.ROOT).contains(query) // Search mod name || modId.toLowerCase(Locale.ROOT).contains(query) // Search mod name || authorMatches(container, query) // Search via author From 72f175f786f3c50f4822c2c6e3605cc0fb0ac070 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 19:04:22 +0300 Subject: [PATCH 23/30] Update ModListEntry.java --- .../prospector/modmenu/gui/ModListEntry.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java index 81427ecc..2486ae2f 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListEntry.java @@ -82,16 +82,29 @@ public void render(int index, int y, int x, int rowWidth, int rowHeight, int mou if ("java".equals(id)) { String vendor = System.getProperty("java.vendor", "Unknown Vendor"); String javaDist = i18n.translateKeyAndFormat("modmenu.javaDistributionName", vendor); - description = (description != null ? description : "") + " " + javaDist; + description = (description != null ? description : "") + "\n" + javaDist; } if (description != null) { - String cleanDescription = description.replaceAll("\r?\n", " "); int textX = x + 32 + 3 + 4; int textY = y + 9 + 2; int maxWidth = rowWidth - 32 - 7; - - RenderUtils.INSTANCE.drawWrappedString(this, cleanDescription, textX, textY, maxWidth, 2, 0x808080); + int maxLines = 2; + int currentLine = 0; + + font = this.fontRenderer; + String[] paragraphs = description.split("\r?\n"); + + for (String paragraph : paragraphs) { + if (currentLine >= maxLines) break; + + for (String line : RenderUtils.INSTANCE.wrapStringToWidthAsList(font, paragraph, maxWidth)) { + if (currentLine >= maxLines) break; + + this.drawStringNoShadow(font, line, textX, textY + (currentLine * 9), 0x808080); + currentLine++; + } + } } GLRenderer.popFrame(); From 7bbaffeea07cc0b8b36b1c04b43b5cd35be4d288 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 19:05:34 +0300 Subject: [PATCH 24/30] Update ModMenu.java --- src/main/java/io/github/prospector/modmenu/ModMenu.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/io/github/prospector/modmenu/ModMenu.java b/src/main/java/io/github/prospector/modmenu/ModMenu.java index 0c2a9b8b..8d2e42bf 100644 --- a/src/main/java/io/github/prospector/modmenu/ModMenu.java +++ b/src/main/java/io/github/prospector/modmenu/ModMenu.java @@ -128,6 +128,14 @@ public void onInitialize() { }); } } + + // Hardcode marking as library + if (id.equals("fabricloader") + || id.equals("fabric") + || id.equals("java") + || id.equals("mixinextras")) { + addLibraryMod(id); + } } } From 78a0e6a5637df00e0b6a68383e2bb3a963ad075b Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Sun, 4 Oct 2026 19:06:57 +0300 Subject: [PATCH 25/30] Update en_US.lang --- src/main/resources/assets/modmenu/lang/en_US/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index eab3e7b7..5c381906 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -67,3 +67,4 @@ modmenu.nameTranslation.modmenu=Mod Menu modmenu.descriptionTranslation.modmenu=Adds a mod menu to view the list of mods you have installed. modmenu.nameTranslation.java=Java modmenu.descriptionTranslation.java=The Java runtime environment. +modmenu.javaDistributionName=Running: %s From e327f4d125ada041ada2d991997b99dfc8be9f8e Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:14:54 +0300 Subject: [PATCH 26/30] Update ModMenuConfig.java --- .../java/io/github/prospector/modmenu/config/ModMenuConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java index 4a40bc91..c0d4351b 100644 --- a/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java +++ b/src/main/java/io/github/prospector/modmenu/config/ModMenuConfig.java @@ -30,7 +30,7 @@ public Sorting getSorting() { public enum Sorting { ASCENDING(Comparator.comparing(modContainer -> modContainer.getMetadata().getName(), String.CASE_INSENSITIVE_ORDER),"modmenu.sorting.ascending"), - DESCENDING(ASCENDING.getComparator().reversed(),"modmenu.sorting.decending"); + DESCENDING(ASCENDING.getComparator().reversed(),"modmenu.sorting.descending"); final Comparator comparator; final String key; From 858691719d9f087a227dd3b471d40d0b2c41c160 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 5 Oct 2026 11:15:15 +0300 Subject: [PATCH 27/30] Update en_US.lang --- src/main/resources/assets/modmenu/lang/en_US/en_US.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang index 5c381906..774002d2 100644 --- a/src/main/resources/assets/modmenu/lang/en_US/en_US.lang +++ b/src/main/resources/assets/modmenu/lang/en_US/en_US.lang @@ -20,7 +20,7 @@ modmenu.showLibraries.false=Hidden modmenu.showingMods=Showing %s Mods modmenu.sorting=Sort: %s modmenu.sorting.ascending=A-Z -modmenu.sorting.decending=Z-A +modmenu.sorting.descending=Z-A modmenu.searchTerms.library=api library modmenu.searchTerms.clientside=clientside gameside From cbc3647246b3d070f98ab0fbade181df4e0e6649 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:08:20 +0300 Subject: [PATCH 28/30] remove unique badge --- .../prospector/modmenu/impl/ModMenuApiImpl.java | 17 ----------------- src/main/resources/fabric.mod.json | 3 --- 2 files changed, 20 deletions(-) delete mode 100644 src/main/java/io/github/prospector/modmenu/impl/ModMenuApiImpl.java diff --git a/src/main/java/io/github/prospector/modmenu/impl/ModMenuApiImpl.java b/src/main/java/io/github/prospector/modmenu/impl/ModMenuApiImpl.java deleted file mode 100644 index 4496da66..00000000 --- a/src/main/java/io/github/prospector/modmenu/impl/ModMenuApiImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.prospector.modmenu.impl; - - -import io.github.prospector.modmenu.api.ModMenuApi; -import io.github.prospector.modmenu.util.TriConsumer; - -public class ModMenuApiImpl implements ModMenuApi { - @Override - public String getModId() { - return "modmenu"; - } - - @Override - public void attachCustomBadges(TriConsumer consumer) { - consumer.accept("Mod Menu", 0xff7a2b7c, 0xff510d54); - } -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index db1082c7..0175450e 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,9 +9,6 @@ "entrypoints": { "main": [ "io.github.prospector.modmenu.ModMenu" - ], - "modmenu": [ - "io.github.prospector.modmenu.impl.ModMenuApiImpl" ] }, "contact": { From eec369ae09233022170b89244781fce7b8d36cfd Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:27:20 +0300 Subject: [PATCH 29/30] Search mod description --- .../prospector/modmenu/gui/ModListScreen.java | 11 +++---- .../modmenu/util/ModListSearch.java | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java index 71a05283..70ea1a4f 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java +++ b/src/main/java/io/github/prospector/modmenu/gui/ModListScreen.java @@ -62,10 +62,12 @@ public class ModListScreen extends Screen { private static final int TOGGLE_SHOW_LIBRARIES_BUTTON_ID = 5; private static final int MODS_FOLDER_BUTTON_ID = 6; private static final int DONE_BUTTON_ID = 7; + + I18n i18n = I18n.getInstance(); public ModListScreen(Screen previousGui) { this.parent = previousGui; - this.textTitle = I18n.getInstance().translateKey("modmenu.title"); + this.textTitle = i18n.translateKey("modmenu.title"); } public void updateEvents() { @@ -92,7 +94,6 @@ public void tick() { @Override public void init() { - I18n i18n = I18n.getInstance(); Keyboard.enableRepeatEvents(true); FontRenderer font = this.fontRenderer; paneY = 48; @@ -185,8 +186,8 @@ public void drawButton(Minecraft mc, int mouseX, int mouseY) { this.buttons.add(configureButton); this.buttons.add(websiteButton); this.buttons.add(issuesButton); - this.buttons.add(ButtonUtil.createButton(MODS_FOLDER_BUTTON_ID, this.width / 2 - 154, this.height - 28, 150, 20, I18n.getInstance().translateKey("modmenu.modsFolder"))); - this.buttons.add(ButtonUtil.createButton(DONE_BUTTON_ID, this.width / 2 + 4, this.height - 28, 150, 20, I18n.getInstance().translateKey("modmenu.done"))); + this.buttons.add(ButtonUtil.createButton(MODS_FOLDER_BUTTON_ID, this.width / 2 - 154, this.height - 28, 150, 20, i18n.translateKey("modmenu.modsFolder"))); + this.buttons.add(ButtonUtil.createButton(DONE_BUTTON_ID, this.width / 2 + 4, this.height - 28, 150, 20, i18n.translateKey("modmenu.done"))); this.searchBox.setFocused(true); init = true; @@ -278,8 +279,6 @@ public void mouseReleased(int mouseX, int mouseY, int mouseButton) { @Override public void render(int mouseX, int mouseY, float delta) { - I18n i18n = I18n.getInstance(); - int dWheel = Mouse.getDWheel(); if (dWheel != 0) { double scrollDelta = dWheel > 0 ? 1.0 : -1.0; diff --git a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java index b7942b1e..d9dd0f39 100644 --- a/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java +++ b/src/main/java/io/github/prospector/modmenu/util/ModListSearch.java @@ -24,8 +24,8 @@ public static List search(ModListScreen screen, String query, List return candidates; } return candidates.stream() - .filter(modContainer -> passesFilters(screen, modContainer, query.toLowerCase(Locale.ROOT))) - .collect(Collectors.toList()); + .filter(modContainer -> passesFilters(screen, modContainer, query.toLowerCase(Locale.ROOT))) + .collect(Collectors.toList()); } private static boolean passesFilters(ModListScreen screen, ModContainer container, String query) { @@ -34,12 +34,18 @@ private static boolean passesFilters(ModListScreen screen, ModContainer containe //Some basic search, could do with something more advanced but this will do for now I18n i18n = I18n.getInstance(); - String translationKey = "modmenu.nameTranslation." + modId; - String translatedName = I18n.getInstance().translateKey(translationKey); - String modName = !translatedName.equals(translationKey) ? translatedName : metadata.getName(); - + + String nameTranslation = "modmenu.nameTranslation." + modId; + String translatedName = i18n.translateKey(nameTranslation); + String modName = !translatedName.equals(nameTranslation) ? translatedName : metadata.getName(); + + String descriptionTranslation = "modmenu.descriptionTranslation." + modId; + String translatedDescription = i18n.translateKey(descriptionTranslation); + String modDescription = !translatedDescription.equals(descriptionTranslation) ? translatedDescription : metadata.getDescription(); + if (modName.toLowerCase(Locale.ROOT).contains(query) // Search mod name - || modId.toLowerCase(Locale.ROOT).contains(query) // Search mod name + || modDescription.toLowerCase(Locale.ROOT).contains(query) // Search mod description + || modId.toLowerCase(Locale.ROOT).contains(query) // Search mod id || authorMatches(container, query) // Search via author || (ModMenu.LIBRARY_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.library").toLowerCase(Locale.ROOT).contains(query)) // Search for lib mods || (ModMenu.CLIENTSIDE_MODS.contains(modId) && i18n.translateKey("modmenu.searchTerms.clientside").toLowerCase(Locale.ROOT).contains(query)) // Search for clientside mods @@ -63,11 +69,10 @@ private static boolean passesFilters(ModListScreen screen, ModContainer containe private static boolean authorMatches(ModContainer modContainer, String query) { return modContainer.getMetadata().getAuthors().stream() - .filter(Objects::nonNull) - .map(Person::getName) - .filter(Objects::nonNull) - .map(s -> s.toLowerCase(Locale.ROOT)) - .anyMatch(s -> s.contains(query.toLowerCase(Locale.ROOT))); + .filter(Objects::nonNull) + .map(Person::getName) + .filter(Objects::nonNull) + .map(s -> s.toLowerCase(Locale.ROOT)) + .anyMatch(s -> s.contains(query.toLowerCase(Locale.ROOT))); } - } From 8dee600f215b4b1bf55aa315f06cb3582567a7c6 Mon Sep 17 00:00:00 2001 From: Starman <135715391+StarmanMine142@users.noreply.github.com> Date: Mon, 5 Oct 2026 22:38:47 +0300 Subject: [PATCH 30/30] remove unnecessary @SuppressWarnings --- .../java/io/github/prospector/modmenu/gui/EntryListWidget.java | 3 +-- .../io/github/prospector/modmenu/mixin/MixinGuiIngameMenu.java | 1 - .../io/github/prospector/modmenu/util/TestModContainer.java | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java b/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java index 828c1c16..09fc45c0 100644 --- a/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java +++ b/src/main/java/io/github/prospector/modmenu/gui/EntryListWidget.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Objects; -@SuppressWarnings({"unchecked", "unused"}) +@SuppressWarnings({"unused"}) @Environment(EnvType.CLIENT) public abstract class EntryListWidget> extends Screen { protected static final int DRAG_OUTSIDE = -2; @@ -575,6 +575,5 @@ public boolean charTyped(char c, int i) { public boolean changeFocus(boolean bl) { return false; } - } } diff --git a/src/main/java/io/github/prospector/modmenu/mixin/MixinGuiIngameMenu.java b/src/main/java/io/github/prospector/modmenu/mixin/MixinGuiIngameMenu.java index 50678bb6..89672d30 100644 --- a/src/main/java/io/github/prospector/modmenu/mixin/MixinGuiIngameMenu.java +++ b/src/main/java/io/github/prospector/modmenu/mixin/MixinGuiIngameMenu.java @@ -15,7 +15,6 @@ @Mixin(value = ScreenPause.class, remap = false) public class MixinGuiIngameMenu extends Screen { - @SuppressWarnings("unchecked") @Inject(at = @At("RETURN"), method = "init") public void modmenu$drawMenuButton(CallbackInfo info) { I18n i18n = I18n.getInstance(); diff --git a/src/main/java/io/github/prospector/modmenu/util/TestModContainer.java b/src/main/java/io/github/prospector/modmenu/util/TestModContainer.java index 8657b19a..a67f0374 100644 --- a/src/main/java/io/github/prospector/modmenu/util/TestModContainer.java +++ b/src/main/java/io/github/prospector/modmenu/util/TestModContainer.java @@ -214,7 +214,6 @@ public Map getCustomValues() { return new HashMap<>(); } - @SuppressWarnings("UnstableApiUsage") @Override public boolean containsCustomElement(String key) { return false;