From aea85598315422204174df0623e4f7e095ae46d4 Mon Sep 17 00:00:00 2001 From: maloryware Date: Sun, 3 Aug 2025 03:08:22 +0100 Subject: [PATCH] prepare 1.20.1 backport --- build.gradle | 6 +- .../core/mixin/MixinOptionsScreen.java | 43 ++----- .../screen/MidnightConfigOverviewScreen.java | 70 +++++++++--- .../lib/config/MidnightConfig.java | 86 +++++++++----- .../screen/TexturedOverlayButtonWidget.java | 40 +++++++ .../resources/assets/midnightlib/icon.png | Bin 2232 -> 2801 bytes .../gui/{sprites/icon => }/explorer.png | Bin .../textures/gui/midnightlib_button.png | Bin 0 -> 960 bytes .../textures/gui/{sprites/icon => }/reset.png | Bin .../textures/gui/sprites/icon/midnightlib.png | Bin 136 -> 0 bytes .../main/resources/midnightlib.mixins.json | 13 ++- fabric/build.gradle | 6 +- fabric/src/main/resources/fabric.mod.json | 2 +- gradle.properties | 25 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 108 ------------------ neoforge/gradle.properties | 1 - .../util/neoforge/PlatformFunctionsImpl.java | 33 ------ .../neoforge/MidnightLibNeoForge.java | 52 --------- .../resources/META-INF/neoforge.mods.toml | 31 ----- neoforge/src/main/resources/midnightlib.png | Bin 2801 -> 0 bytes quilt/build.gradle | 2 + settings.gradle | 4 +- 23 files changed, 196 insertions(+), 328 deletions(-) create mode 100644 common/src/main/java/eu/midnightdust/lib/util/screen/TexturedOverlayButtonWidget.java rename common/src/main/resources/assets/midnightlib/textures/gui/{sprites/icon => }/explorer.png (100%) create mode 100644 common/src/main/resources/assets/midnightlib/textures/gui/midnightlib_button.png rename common/src/main/resources/assets/midnightlib/textures/gui/{sprites/icon => }/reset.png (100%) delete mode 100644 common/src/main/resources/assets/midnightlib/textures/gui/sprites/icon/midnightlib.png delete mode 100644 neoforge/build.gradle delete mode 100644 neoforge/gradle.properties delete mode 100644 neoforge/src/main/java/eu/midnightdust/lib/util/neoforge/PlatformFunctionsImpl.java delete mode 100644 neoforge/src/main/java/eu/midnightdust/neoforge/MidnightLibNeoForge.java delete mode 100644 neoforge/src/main/resources/META-INF/neoforge.mods.toml delete mode 100644 neoforge/src/main/resources/midnightlib.png diff --git a/build.gradle b/build.gradle index 43297f8..b22cbbe 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ import groovy.json.JsonOutput plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false id "me.shedaniel.unified-publishing" version "0.1.+" apply false id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } @@ -20,7 +20,7 @@ subprojects { // The following line declares the yarn mappings you may select this one as well. mappings loom.layered { it.mappings("net.fabricmc:yarn:$rootProject.yarn_mappings:v2") - it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version") + // it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version") } } } @@ -44,7 +44,7 @@ allprojects { tasks.withType(JavaCompile) { options.encoding = "UTF-8" - options.release = 21 + options.release = 17 } ext { releaseChangelog = { diff --git a/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java b/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java index 13203b7..1f3da97 100644 --- a/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java +++ b/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java @@ -1,49 +1,30 @@ package eu.midnightdust.core.mixin; +import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.core.screen.MidnightConfigOverviewScreen; +import eu.midnightdust.lib.util.PlatformFunctions; +import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.OptionsScreen; -import net.minecraft.client.gui.widget.TextIconButtonWidget; -import net.minecraft.client.gui.widget.ThreePartsLayoutWidget; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; -import static eu.midnightdust.core.MidnightLib.MOD_ID; -import static eu.midnightdust.core.config.MidnightLibConfig.shouldShowButton; - @Mixin(OptionsScreen.class) -public abstract class MixinOptionsScreen extends Screen { - @Shadow @Final private ThreePartsLayoutWidget layout; - @Unique TextIconButtonWidget midnightlib$button = TextIconButtonWidget.builder(Text.translatable("midnightlib.overview.title"), ( - buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), true) - .texture(Identifier.of(MOD_ID,"icon/"+MOD_ID), 16, 16).dimension(20, 20).build(); - - private MixinOptionsScreen(Text title) {super(title);} - - @Inject(at = @At("HEAD"), method = "init") - public void midnightlib$onInit(CallbackInfo ci) { - if (shouldShowButton()) { - this.midnightlib$setButtonPos(); - this.addDrawableChild(midnightlib$button); - } +public class MixinOptionsScreen extends Screen { + private static final Identifier MIDNIGHTLIB_ICON_TEXTURE = new Identifier("midnightlib","textures/gui/midnightlib_button.png"); + protected MixinOptionsScreen(Text title) { + super(title); } - @Inject(at = @At("TAIL"), method = "refreshWidgetPositions") - public void midnightlib$onResize(CallbackInfo ci) { - if (shouldShowButton()) this.midnightlib$setButtonPos(); + @Inject(at = @At("HEAD"),method = "init") + private void midnightlib$init(CallbackInfo ci) { + if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE) || (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && !PlatformFunctions.isModLoaded("modmenu"))) + this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20, 0, 0, 20, MIDNIGHTLIB_ICON_TEXTURE, 32, 64, (buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), Text.translatable("midnightlib.overview.title"))); } - - @Unique - public void midnightlib$setButtonPos() { - midnightlib$button.setPosition(layout.getWidth() / 2 + 158, layout.getY() + layout.getFooterHeight() - 4); - } -} \ No newline at end of file +} diff --git a/common/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java b/common/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java index 7a1df8a..d08d956 100755 --- a/common/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java +++ b/common/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java @@ -4,18 +4,16 @@ import eu.midnightdust.core.MidnightLib; import eu.midnightdust.lib.config.MidnightConfig; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.*; import net.minecraft.screen.ScreenTexts; -import net.minecraft.text.Text; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import static eu.midnightdust.lib.config.MidnightConfig.MidnightConfigListWidget; +import net.minecraft.text.*; +import java.util.*; @Environment(EnvType.CLIENT) public class MidnightConfigOverviewScreen extends Screen { @@ -25,26 +23,64 @@ public class MidnightConfigOverviewScreen extends Screen { this.parent = parent; } private final Screen parent; - private MidnightConfigListWidget list; + private MidnightOverviewListWidget list; @Override protected void init() { - this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 26, 200, 20).build()); + this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build()); - this.addSelectableChild(this.list = new MidnightConfigListWidget(this.client, this.width, this.height - 57, 24, 25)); + this.list = new MidnightOverviewListWidget(this.client, this.width, this.height, 32, this.height - 32, 25); + if (this.client != null && this.client.world != null) this.list.setRenderBackground(false); + this.addSelectableChild(this.list); List sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet()); Collections.sort(sortedMods); sortedMods.forEach((modid) -> { if (!MidnightLib.hiddenMods.contains(modid)) { - list.addButton(List.of(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) -> - Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this, modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null); - }}); + list.addButton(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) -> + Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()); + } + }); super.init(); } @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); + this.renderBackground(context); this.list.render(context, mouseX, mouseY, delta); - context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 10, 0xFFFFFF); + context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF); + super.render(context, mouseX, mouseY, delta); + } + @Environment(EnvType.CLIENT) + public static class MidnightOverviewListWidget extends ElementListWidget { + TextRenderer textRenderer; + + public MidnightOverviewListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) { + super(minecraftClient, i, j, k, l, m); + this.centerListVertically = false; + textRenderer = minecraftClient.textRenderer; + } + @Override + public int getScrollbarPositionX() {return this.width-7;} + + public void addButton(ClickableWidget button) { + this.addEntry(OverviewButtonEntry.create(button)); + } + @Override + public int getRowWidth() { return 400; } + } + public static class OverviewButtonEntry extends ElementListWidget.Entry { + private final ClickableWidget button; + private final List buttonList = new ArrayList<>(); + + private OverviewButtonEntry(ClickableWidget button) { + this.button = button; + this.buttonList.add(button); + } + public static OverviewButtonEntry create(ClickableWidget button) {return new OverviewButtonEntry(button);} + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + button.setY(y); + button.render(context, mouseX, mouseY, tickDelta); + } + public List children() {return buttonList;} + public List selectableChildren() {return buttonList;} } } \ No newline at end of file diff --git a/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java b/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java index e85d89c..eaf0796 100755 --- a/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java +++ b/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java @@ -2,14 +2,16 @@ package eu.midnightdust.lib.config; import com.google.common.collect.Lists; import com.google.gson.*; import com.google.gson.stream.*; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.serialization.DataResult; import eu.midnightdust.lib.util.PlatformFunctions; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.ConfirmLinkScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.tab.GridScreenTab; import net.minecraft.client.gui.tab.Tab; import net.minecraft.client.gui.tab.TabManager; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.*; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.resource.language.I18n; import net.minecraft.registry.Registries; import net.minecraft.screen.ScreenTexts; @@ -21,7 +23,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.Color; -import java.io.IOException; import java.lang.annotation.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.nio.file.Files; import java.nio.file.Path; @@ -31,6 +32,26 @@ import java.util.regex.Pattern; import static net.minecraft.client.MinecraftClient.IS_SYSTEM_MAC; + +/* FIXME: + * hi martin :wave: + * before anythinge else: + * DON'T ANNOY YOURSELF WITH THIS + * BACKPORT UNLESS YOU REALLY DON'T HAVE + * ANYTHING BETTER TO DO!!!!! + * i don't wish to waste your time in any capacity, + * and this backport is going to be a *huge* mess, + * as you surely know + * so please!! take it easy! + * much love <3 + * . + * this being your codebase, i'm guessing + * (moreso hoping) you'll know what's in need + * of fixing given the rendering changes between + * 1.20 & 1.21 + * gave it my best shot but... got completely lost. + */ + /** MidnightConfig by Martin "Motschen" Prokoph * Single class config library - feel free to copy! * Based on ... @@ -97,8 +118,10 @@ public abstract class MidnightConfig { if (!condition.requiredModId().isEmpty() && !PlatformFunctions.isModLoaded(condition.requiredModId())) this.conditionsMet = false; String requiredOption = condition.requiredOption().contains(":") ? condition.requiredOption() : (this.modid + ":" + condition.requiredOption()); - if (entries.get(requiredOption) instanceof EntryInfo info) + if (entries.get(requiredOption) != null) { + EntryInfo info = entries.get(requiredOption); this.conditionsMet &= List.of(condition.requiredValue()).contains(info.tempValue); + } if (!this.conditionsMet) break; } if (prevConditionState != this.conditionsMet) reloadScreen = true; @@ -120,10 +143,7 @@ public abstract class MidnightConfig { private static final Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.TRANSIENT).excludeFieldsWithModifiers(Modifier.PRIVATE) .addSerializationExclusionStrategy(new NonEntryExclusionStrategy()) - .registerTypeAdapter(Identifier.class, new TypeAdapter() { - public void write(JsonWriter out, Identifier id) throws IOException { out.value(id.toString()); } - public Identifier read(JsonReader in) throws IOException { return Identifier.of(in.nextString()); } - }).setPrettyPrinting().create(); + .registerTypeAdapter(Identifier.class, new Identifier.Serializer()).setPrettyPrinting().create(); public static void loadValuesFromJson(String modid) { try { gson.fromJson(Files.newBufferedReader(path), configClass.get(modid)); } @@ -198,8 +218,7 @@ public abstract class MidnightConfig { info.function = (BiFunction>) (t, b) -> s -> { s = s.trim(); if (!(s.isEmpty() || !isNumber || pattern.matcher(s).matches()) || - (info.dataType == Identifier.class && Identifier.validate(s).isError())) return false; - + (info.dataType == Identifier.class && Identifier.validate(s).equals(DataResult.success(new Identifier(s))))) return false; // inline substitution for "isError" Number value = 0; boolean inLimits = false; info.error = null; if (!(isNumber && s.isEmpty()) && !s.equals("-") && !s.equals(".")) { try { value = f.apply(s); } catch(NumberFormatException e){ return false; } @@ -292,9 +311,9 @@ public abstract class MidnightConfig { super.tick(); if (prevTab != null && prevTab != tabManager.getCurrentTab()) { prevTab = tabManager.getCurrentTab(); - updateList(); list.setScrollY(0); + updateList(); list.setScrollAmount(0); } - scrollProgress = list.getScrollY(); + scrollProgress = list.getScrollAmount(); for (EntryInfo info : entries.values()) info.updateFieldValue(); updateButtons(); if (reloadScreen) { updateList(); reloadScreen = false; } @@ -303,8 +322,10 @@ public abstract class MidnightConfig { if (this.list != null) { for (ButtonEntry entry : this.list.children()) { if (entry.buttons != null && entry.buttons.size() > 1 && entry.info.field != null) { - if (entry.buttons.get(0) instanceof ClickableWidget widget) + if (entry.buttons.get(0) != null) { + ClickableWidget widget = entry.buttons.get(0); if (widget.isFocused() || widget.isHovered()) widget.setTooltip(entry.info.getTooltip(true)); + } if (entry.buttons.get(1) instanceof ButtonWidget button) button.active = !Objects.equals(String.valueOf(entry.info.value), String.valueOf(entry.info.defaultValue)) && entry.info.conditionsMet; }}}} @@ -336,7 +357,7 @@ public abstract class MidnightConfig { Objects.requireNonNull(client).setScreen(parent); }).dimensions(this.width / 2 + 4, this.height - 26, 150, 20).build()); - this.list = new MidnightConfigListWidget(this.client, this.width, this.height - 57, 24, 25); + this.list = new MidnightConfigListWidget(this.client, this.width, this.height, this.height - 57, 24, 25); this.addSelectableChild(this.list); fillList(); if (tabs.size() > 1) list.renderHeaderSeparator = false; } @@ -356,11 +377,11 @@ public abstract class MidnightConfig { } if (info.modid.equals(modid) && (info.tab == null || info.tab == tabManager.getCurrentTab())) { Text name = Objects.requireNonNullElseGet(info.name, () -> Text.translatable(translationPrefix + info.fieldName)); - TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> { + IconButtonWidget resetButton = IconButtonWidget.builder(Text.translatable("controls.reset"), Identifier.of("midnightlib","icon/reset"), (button -> { info.value = info.defaultValue; info.listIndex = 0; info.tempValue = info.toTemporaryValue(); updateList(); - }), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build(); + }) ).build(); resetButton.setPosition(width - 205 + 150 + 25, 0); if (info.function != null) { @@ -408,7 +429,7 @@ public abstract class MidnightConfig { } catch (Exception ignored) {} info.actionButton = colorButton; } else if (e.selectionMode() > -1) { - ButtonWidget explorerButton = TextIconButtonWidget.builder(Text.empty(), + ButtonWidget explorerButton = IconButtonWidget.builder(Text.empty(), Identifier.of("midnightlib", "icon/explorer"), button -> new Thread(() -> { JFileChooser fileChooser = new JFileChooser(info.tempValue); fileChooser.setFileSelectionMode(e.selectionMode()); fileChooser.setDialogType(e.fileChooserType()); @@ -420,8 +441,8 @@ public abstract class MidnightConfig { info.setValue(fileChooser.getSelectedFile().getAbsolutePath()); updateList(); } - }).start(), true - ).texture(Identifier.of("midnightlib", "icon/explorer"), 12, 12).dimension(20, 20).build(); + }).start() + ).build(); explorerButton.setPosition(width - 185, 0); info.actionButton = explorerButton; } @@ -438,7 +459,7 @@ public abstract class MidnightConfig { if (!info.conditionsMet) widgets.forEach(w -> w.active = false); this.list.addButton(widgets, name, info); } else this.list.addButton(List.of(), name, info); - } list.setScrollY(scrollProgress); + } list.setScrollAmount(scrollProgress); updateButtons(); } } @@ -446,20 +467,24 @@ public abstract class MidnightConfig { public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); this.list.render(context, mouseX, mouseY, delta); - if (tabs.size() < 2) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 10, 0xFFFFFF); + if (tabs.size() < 2) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 10, 0xFFFFFFFF); } } @Environment(EnvType.CLIENT) public static class MidnightConfigListWidget extends ElementListWidget { public boolean renderHeaderSeparator = true; - public MidnightConfigListWidget(MinecraftClient client, int width, int height, int y, int itemHeight) { super(client, width, height, y, itemHeight); } - @Override public int getScrollbarX() { return this.width -7; } + public MidnightConfigListWidget(MinecraftClient client, int width, int height, int yStart, int y, int itemHeight) { super(client, width, height, yStart, y, itemHeight); } + @Override public int getScrollbarPositionX() { return this.width -7; } + /* @Override protected void drawHeaderAndFooterSeparators(DrawContext context) { if (renderHeaderSeparator) super.drawHeaderAndFooterSeparators(context); - else context.drawTexture(RenderLayer::getGuiTextured, this.client.world == null ? Screen.FOOTER_SEPARATOR_TEXTURE : Screen.INWORLD_FOOTER_SEPARATOR_TEXTURE, this.getX(), this.getBottom(), 0, 0, this.getWidth(), 2, 32, 2); + else { RenderSystem.enableBlend(); + context.drawTexture(this.client.world == null ? Screen.FOOTER_SEPARATOR_TEXTURE : Screen.INWORLD_FOOTER_SEPARATOR_TEXTURE, this.getX(), this.getBottom(), 0.0F, 0.0F, this.getWidth(), 2, 32, 2); + RenderSystem.disableBlend(); } } + */ public void addButton(List buttons, Text text, EntryInfo info) { this.addEntry(new ButtonEntry(buttons, text, info)); } public void clear() { this.clearEntries(); } @Override public int getRowWidth() { return 10000; } @@ -478,21 +503,22 @@ public abstract class MidnightConfig { int scaledWidth = MinecraftClient.getInstance().getWindow().getScaledWidth(); if (text != null && (!text.getString().contains("spacer") || !buttons.isEmpty())) { - title = new MultilineTextWidget((centered) ? (scaledWidth / 2 - (textRenderer.getWidth(text) / 2)) : 12, 0, Text.of(text), textRenderer); + title = new MultilineTextWidget((centered) ? (scaledWidth / 2 - (textRenderer.getWidth(text) / 2)) : 12, 0, text, textRenderer); + title.setCentered(centered); if (info != null) title.setTooltip(info.getTooltip(false)); - title.setMaxWidth(buttons.size() > 1 ? buttons.get(1).getX() - 24 : scaledWidth - 24); + title.setMaxWidth(!buttons.isEmpty() ? buttons.get(buttons.size() > 2 ? buttons.size()-1 : 0).getX() - 16 : scaledWidth - 24); } } public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { buttons.forEach(b -> { b.setY(y); b.render(context, mouseX, mouseY, tickDelta);}); if (title != null) { title.setY(y+5); - title.renderWidget(context, mouseX, mouseY, tickDelta); - + title.render(context, mouseX, mouseY, tickDelta); boolean tooltipVisible = mouseX >= title.getX() && mouseX < title.getWidth() + title.getX() && mouseY >= title.getY() && mouseY < title.getHeight() + title.getY(); if (tooltipVisible && title.getTooltip() != null) context.drawOrderedTooltip(textRenderer, title.getTooltip().getLines(MinecraftClient.getInstance()), mouseX, mouseY); - if (info.entry != null && !this.buttons.isEmpty() && this.buttons.getFirst() instanceof ClickableWidget widget) { + if (info.entry != null && !this.buttons.isEmpty() && this.buttons.get(0) != null) { + ClickableWidget widget = this.buttons.get(0); int idMode = this.info.entry.idMode(); if (idMode != -1) context.drawItem(idMode == 0 ? Registries.ITEM.get(Identifier.tryParse(this.info.tempValue)).getDefaultStack() : Registries.BLOCK.get(Identifier.tryParse(this.info.tempValue)).asItem().getDefaultStack(), widget.getX() + widget.getWidth() - 18, y + 2); } @@ -502,7 +528,7 @@ public abstract class MidnightConfig { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (this.info != null && this.info.comment != null && !this.info.comment.url().isBlank()) - ConfirmLinkScreen.open(MinecraftClient.getInstance().currentScreen, this.info.comment.url(), true); + ConfirmLinkScreen.open(this.info.comment.url(), MinecraftClient.getInstance().currentScreen, true); return super.mouseClicked(mouseX, mouseY, button); } diff --git a/common/src/main/java/eu/midnightdust/lib/util/screen/TexturedOverlayButtonWidget.java b/common/src/main/java/eu/midnightdust/lib/util/screen/TexturedOverlayButtonWidget.java new file mode 100644 index 0000000..e5f1f38 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/lib/util/screen/TexturedOverlayButtonWidget.java @@ -0,0 +1,40 @@ +package eu.midnightdust.lib.util.screen; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.widget.TexturedButtonWidget; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class TexturedOverlayButtonWidget extends TexturedButtonWidget { + + public TexturedOverlayButtonWidget(int x, int y, int width, int height, int u, int v, Identifier texture, PressAction pressAction) { + super(x, y, width, height, u, v, texture, pressAction); + } + + public TexturedOverlayButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, Identifier texture, PressAction pressAction) { + super(x, y, width, height, u, v, hoveredVOffset, texture, pressAction); + } + + public TexturedOverlayButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight, PressAction pressAction) { + super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction); + } + + public TexturedOverlayButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight, PressAction pressAction, Text text) { + super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, text); + } + + @Override + public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { + int i = 66; + if (!this.isNarratable()) { + i += hoveredVOffset * 2; + } else if (this.isSelected()) { + i += hoveredVOffset; + } + context.drawNineSlicedTexture(WIDGETS_TEXTURE, this.getX(), this.getY(), this.width, this.height, 4, 200, 20, 0, i); + super.renderButton(context, mouseX, mouseY, delta); + } +} diff --git a/common/src/main/resources/assets/midnightlib/icon.png b/common/src/main/resources/assets/midnightlib/icon.png index fee5d5676fb34e5df3197a910dede7e6d498ad90..d31b4c46823b2536b67007b68606f8b82c806a08 100644 GIT binary patch literal 2801 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 QU{Fwby85}Sb4q9e00g0E>Hq)$ literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/midnightlib/textures/gui/sprites/icon/reset.png b/common/src/main/resources/assets/midnightlib/textures/gui/reset.png similarity index 100% rename from common/src/main/resources/assets/midnightlib/textures/gui/sprites/icon/reset.png rename to common/src/main/resources/assets/midnightlib/textures/gui/reset.png diff --git a/common/src/main/resources/assets/midnightlib/textures/gui/sprites/icon/midnightlib.png b/common/src/main/resources/assets/midnightlib/textures/gui/sprites/icon/midnightlib.png deleted file mode 100644 index f76adb6b0fa44613c26f5f52246e26b89cc9cfc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?iy0WWg+Z8+Vb&Z8prDnf zi(^Q|tz-qMKkm#tDvkdw7=Hc|Z17T>^P^u{$f$8blemHVqe=1.21" + "minecraft": ">=1.20" }, "mixins": [ diff --git a/gradle.properties b/gradle.properties index 8d2a03d..955bccb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,18 @@ org.gradle.jvmargs=-Xmx4096M -minecraft_version=1.21.4 -supported_versions=1.21.5 -yarn_mappings=1.21.4+build.1 -enabled_platforms=fabric,neoforge +minecraft_version=1.20.1 +supported_versions=1.20 +yarn_mappings=1.20.1+build.10 +enabled_platforms=fabric archives_base_name=midnightlib -mod_version=1.7.3 +mod_version=1.7.5 maven_group=eu.midnightdust -release_type=release -curseforge_id=488090 -modrinth_id=codAaoxh +# release_type=release +# curseforge_id=488090 +# modrinth_id=codAaoxh -fabric_loader_version=0.16.9 -fabric_api_version=0.110.5+1.21.4 +fabric_loader_version=0.16.14 +fabric_api_version=0.92.6+1.20.1 -neoforge_version=21.4.3-beta -yarn_mappings_patch_neoforge_version = 1.21+build.4 - -mod_menu_version = 9.0.0 \ No newline at end of file +mod_menu_version = 7.2.2 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d18421..2733ed5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 48ebf4f..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,108 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' - id "me.shedaniel.unified-publishing" -} - -repositories { - maven { - name = 'NeoForged' - url = 'https://maven.neoforged.net/releases' - } -} - - -architectury { - platformSetupLoomIde() - neoForge() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -configurations { - common { - canBeResolved = true - canBeConsumed = false - } - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common - - // Files in this configuration will be bundled into your mod using the Shadow plugin. - // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. - shadowBundle { - canBeResolved = true - canBeConsumed = false - } - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version + "-" + project.name + "+" + rootProject.minecraft_version -} - -dependencies { - neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" - - common(project(path: ':common', configuration: 'namedElements')) { transitive false } - shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') -} - -processResources { - inputs.property 'version', rootProject.version - - filesMatching('META-INF/neoforge.mods.toml') { - expand version: rootProject.version - } -} - -shadowJar { - configurations = [project.configurations.shadowBundle] - archiveClassifier = 'dev-shadow' -} - -remapJar { - input.set shadowJar.archiveFile -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -unifiedPublishing { - project { - displayName = "MidnightLib $rootProject.version - NeoForge $project.minecraft_version" - releaseType = "$project.release_type" - changelog = releaseChangelog() - gameVersions = [] - gameLoaders = ["neoforge"] - mainPublication remapJar - - var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN") - if (CURSEFORGE_TOKEN != null) { - curseforge { - token = CURSEFORGE_TOKEN - id = rootProject.curseforge_id - gameVersions.addAll "Java 21", project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - - var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") - if (MODRINTH_TOKEN != null) { - modrinth { - token = MODRINTH_TOKEN - id = rootProject.modrinth_id - version = rootProject.mod_version + "+" + rootProject.minecraft_version + "-" + project.name - gameVersions.addAll project.minecraft_version - if (project.supported_versions != "") gameVersions.addAll project.supported_versions - } - } - } -} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 2914393..0000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=neoforge \ No newline at end of file diff --git a/neoforge/src/main/java/eu/midnightdust/lib/util/neoforge/PlatformFunctionsImpl.java b/neoforge/src/main/java/eu/midnightdust/lib/util/neoforge/PlatformFunctionsImpl.java deleted file mode 100644 index 5e92f60..0000000 --- a/neoforge/src/main/java/eu/midnightdust/lib/util/neoforge/PlatformFunctionsImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package eu.midnightdust.lib.util.neoforge; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.server.command.ServerCommandSource; -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.FMLPaths; - -import java.nio.file.Path; - -import static eu.midnightdust.neoforge.MidnightLibNeoForge.commands; - -public class PlatformFunctionsImpl { - public static String getPlatformName() { - return "neoforge"; - } - /** - * This is our actual method to {@link PlatformFunctions#getConfigDirectory()}. - */ - public static Path getConfigDirectory() { - return FMLPaths.CONFIGDIR.get(); - } - public static boolean isClientEnv() { - return FMLEnvironment.dist.isClient(); - } - public static boolean isModLoaded(String modid) { - return ModList.get().isLoaded(modid); - } - public static void registerCommand(LiteralArgumentBuilder command) { - commands.add(command); - } -} diff --git a/neoforge/src/main/java/eu/midnightdust/neoforge/MidnightLibNeoForge.java b/neoforge/src/main/java/eu/midnightdust/neoforge/MidnightLibNeoForge.java deleted file mode 100644 index 57e2d6b..0000000 --- a/neoforge/src/main/java/eu/midnightdust/neoforge/MidnightLibNeoForge.java +++ /dev/null @@ -1,52 +0,0 @@ -package eu.midnightdust.neoforge; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.midnightdust.core.MidnightLib; -import eu.midnightdust.lib.config.MidnightConfig; -import net.minecraft.server.command.ServerCommandSource; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModList; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.neoforge.client.gui.IConfigScreenFactory; -import net.neoforged.neoforge.event.RegisterCommandsEvent; - -import java.util.ArrayList; -import java.util.ConcurrentModificationException; -import java.util.List; - -@Mod("midnightlib") -public class MidnightLibNeoForge { - public static List> commands = new ArrayList<>(); - - public MidnightLibNeoForge() { - if (FMLEnvironment.dist == Dist.CLIENT) MidnightLib.onInitializeClient(); - } - - @EventBusSubscriber(modid = "midnightlib", bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) - public static class MidnightLibBusEvents { - @SubscribeEvent - public static void onPostInit(FMLClientSetupEvent event) { - ModList.get().forEachModContainer((modid, modContainer) -> { - if (MidnightConfig.configClass.containsKey(modid) && !MidnightLib.hiddenMods.contains(modid)) { - modContainer.registerExtensionPoint(IConfigScreenFactory.class, (minecraftClient, screen) -> MidnightConfig.getScreen(screen, modid)); - } - }); - MidnightLib.registerAutoCommand(); - } - } - - @EventBusSubscriber(modid = "midnightlib") - public static class MidnightLibEvents { - @SubscribeEvent - public static void registerCommands(RegisterCommandsEvent event) { - try { - commands.forEach(command -> event.getDispatcher().register(command)); - } - catch (ConcurrentModificationException ignored) {} - } - } -} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml deleted file mode 100644 index 0887a3c..0000000 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,31 +0,0 @@ -modLoader = "javafml" -loaderVersion = "[2,)" -#issueTrackerURL = "" -license = "MIT License" - -[[mods]] -modId = "midnightlib" -version = "${version}" -displayName = "MidnightLib" -logoFile = "midnightlib.png" -authors = "TeamMidnightDust, Motschen" -description = ''' -Common Library for Team MidnightDust's mods. -''' - -[[mixins]] -config = "midnightlib.mixins.json" - -[[dependencies.midnightlib]] -modId = "neoforge" -mandatory = true -versionRange = "[20.5,)" -ordering = "NONE" -side = "BOTH" - -[[dependencies.midnightlib]] -modId = "minecraft" -mandatory = true -versionRange = "[1.20.5,)" -ordering = "NONE" -side = "BOTH" \ No newline at end of file diff --git a/neoforge/src/main/resources/midnightlib.png b/neoforge/src/main/resources/midnightlib.png deleted file mode 100644 index d31b4c46823b2536b67007b68606f8b82c806a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2801 zcmd5-dpOkDAD)>Q%ov2&+-aJy%(|3lv1VMRVbU~4xvX}EtlZWNa?3SJqS~yIOPQg_ zZ6dcs#$6>s2_d(p5O&-dmwsoT{qMKG|Ms8X`99~I&w0P+^SAo%BIz^tyWPNUIeWMmo|8mgtp#TyV76x)l zOG`m;?AWpYA}J~=0!UO;6p#ZOfEHkgiHTve*$WE`2m~TEHMOUwCnF;xIXRh3CRbHe z6&4oe<>dhoqyYY*p&`IOH8oXRTl?zOtCW-!-~O>5s{KzfRBsX%Sjv*mJz5vJ)~=NQXJ`Ldv(je?!EkvZQ2ZPV+BKV<E?B0GbTi##1o2XaYn&}+3VR`)b%gp@x zf}x$Ir9b<&&8+=Hd+)8U?QHROJNc{gf{yW#-pN%S`|X>smY17LJJajq{X^RyKMZcq zjZTi%56mo1404x0bZmQa`CAi<{Pk(U+9&?%@Y>g%nRWh9%TU+yE`Md4|8&IXTekxQ z0)Irb!cm=C`qLeq6rE*b=>;=~{qdO()TN;K`(~fqu1bGys3m(1J<~9^J9aem^ZnZO*JcK1va@&V#*Jk>-qJ`) zp_PVz=t^ma=`_eSc`eG~p;_KsX-rlz?O|5y$LPR3d#|*u@Z=LSI>PDx0~U<@gcii> z%tuJO`_j=vEUE%F@g(sqE9fQS91~rg*pw!o9?{b$6{6H9n+4g<4kPw zl99J0()G5!nYz9}Fo|N0cStH`VRF4MOPbDL(lsj_>Mfn{AwR{_5LPqLCbmHQajBJL zwf(D}M0iL3_d-z;FqtQ$KvhqhMV;I;?F~|eD`E!aPn}eEOd_2b6ymH!?n$`Z9kg)r zCcZ@8kdcyy5;Y_#<5uiGP%WKee-!yTzvU8e-8|+ydVJjQN(1x5eFZ&sT@9u}FR_eh zPtV76yKSVvG3lz~Ss6u`Ig5LlGm4#GLW1^S$CFxC#3h@t@5Fat`X_rF_vG`lfAVpa zpdT_Bw&_}@2J6G*ed62C-4(0T_ev4#L*z){n*Z>YmXnbvGs7L2A|5k)k<`22Mp{C@ zkCi+T{HZcwpFCTeLBhppYs9uK@GVH&&BTOw5~aPvbP?8`eElvhgc=u)Pa`Eb2U&d2 zeXXW+h3UM2Epwr1yMCH`3j1R1dA|~MSJMd3J7t-Afm?HH-S_31E4u9ny7oH9Cbh(y zeb9gP-1p4**UwK5a3UV1dRSAH1}R*=MlKxU0?qVcPsou+tWp=b(8I8Il|89HuJ+hg zTK*>ER%a`FaFbYQELv$}S+s2Hf^hA|w-iHE>rnyZ)N}~hpNH6Bw5RMBNpJ2uN;JO6 zIM7&Un0?QIu)hlSN?5%~!2CRPTKI%7Yr?c~Zhhi&=V`GB{W{?r8GG%#n{Iy2fxc(W z8b>ii17YSPveiL4p3OPrF*?4>?Sl}aSSt^ju5<+ovk{WF7041FMIZMJwwLapm7jXwV%dyklz%FQ?qKAt+6(Xr6^>Tz-Ct@mj>$eqAEB7()VFKANcr^A^5Qj77$FQFJc30c&s7ihSVS0(5 z(WTh!|1lD+i>jh}pVK&o;Jq!edY*Z(E^FZ1$%^$Mp+wvB<@Uc@}NNvirsT5qH zr9dLr81j|8i9{%ib)IfCkbO}Dk(hgU30ViR9ccPO;3le$_e2zJzGHZ(-A?-X@Bv9a z%L4N$ER41HZ0?Cc!#}hYPwOVGiD+IpFSFb2?F;QReYP2^g?q;xN8f7S)Qi{{zqwc` zse-%cUm$toNR!*8^OppN46kKfINd6nU#Z)yxh|z(Tox5tIhE6U^t&1ll`fuc&8HkEdoL+%6~^lnYe+^ z%Bw3|3gbcK-)I|sfE=42%$felT4k`-X!7U65S=e!VX*f0eYVU-4$6O51QQMat?P_?@Xmm zdYWxHT=Zlgwp+Nf-%MSaO+i)lF=Lu56A(wk?^Ldj8a>fqx|an|L(Yd-QJ*L_cU&8G zI80wYl)0f)GGHl!ojC5%ip2#c{qEx%x{L?%DV`&wY^0@!`1K59