From 5f7181f6f10addc448d27aef322fd9da0ce29ba5 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 2 Feb 2026 07:46:10 -0600 Subject: [PATCH] Put common auto-update GUI code in a single file --- .../commonMixins/DhUpdateScreenBase.java | 88 +++++++++++++++++++ .../fabric/mixins/client/MixinMinecraft.java | 77 +--------------- .../mixins/client/MixinOptionsScreen.java | 3 +- .../forge/mixins/client/MixinMinecraft.java | 48 +--------- .../mixins/client/MixinOptionsScreen.java | 2 +- .../mixins/client/MixinMinecraft.java | 78 +--------------- .../mixins/client/MixinOptionsScreen.java | 3 +- 7 files changed, 101 insertions(+), 198 deletions(-) create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/commonMixins/DhUpdateScreenBase.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/DhUpdateScreenBase.java b/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/DhUpdateScreenBase.java new file mode 100644 index 000000000..976732d8c --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/DhUpdateScreenBase.java @@ -0,0 +1,88 @@ +package com.seibel.distanthorizons.common.commonMixins; + +import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch; +import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen; +import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.jar.installer.GitlabGetter; +import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter; +import com.seibel.distanthorizons.core.jar.updater.SelfUpdater; +import com.seibel.distanthorizons.core.logging.DhLogger; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; + +import java.util.ArrayList; + +public class DhUpdateScreenBase +{ + private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + + private static final Minecraft MC = Minecraft.getInstance(); + + + + public static void tryShowUpdateScreenAndRunAutoUpdateStartup(Runnable runnable) + { + // always needs to be called, otherwise auto update setup won't be completed + boolean newUpdateAvailable = SelfUpdater.onStart(); + if (!newUpdateAvailable) + { + return; + } + + if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()) + { + LOGGER.info("Auto update disabled, ignoring new version..."); + return; + } + + + runnable = () -> + { + String versionId; + EDhApiUpdateBranch updateBranch = EDhApiUpdateBranch.convertAutoToStableOrNightly(Config.Client.Advanced.AutoUpdater.updateBranch.get()); + if (updateBranch == EDhApiUpdateBranch.STABLE) + { + versionId = ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()); + } + else + { + ArrayList pipelines = GitlabGetter.INSTANCE.projectPipelines; + if (pipelines != null + && pipelines.size() > 0) + { + versionId = pipelines.getFirst().get("sha"); + } + else + { + versionId = null; + } + } + + if (versionId == null) + { + LOGGER.info("Unable to find new DH update for the ["+updateBranch+"] branch. Assuming DH is up to date..."); + return; + } + + + try + { + MC.setScreen(new UpdateModScreen( + new TitleScreen(false), + versionId + )); + } + catch (Exception e) + { + // info instead of error since this can be ignored and probably just means + // there isn't a new DH version available + LOGGER.info("Unable to show DH update screen, reason: ["+e.getMessage()+"]."); + } + }; + runnable.run(); + } + +} diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java index e52968461..8a89adcd0 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java @@ -1,24 +1,14 @@ package com.seibel.distanthorizons.fabric.mixins.client; -import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch; -import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen; +import com.seibel.distanthorizons.common.commonMixins.DhUpdateScreenBase; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; -import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.core.jar.installer.GitlabGetter; -import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter; import com.seibel.distanthorizons.core.jar.updater.SelfUpdater; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; -import com.seibel.distanthorizons.coreapi.ModInfo; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.multiplayer.ClientLevel; import com.seibel.distanthorizons.core.logging.DhLogger; 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; @@ -37,19 +27,9 @@ public abstract class MixinMinecraft private static final DhLogger LOGGER = new DhLoggerBuilder().build(); - @Shadow - public abstract boolean isLocalServer(); - @Unique private ClientLevel lastLevel; - /** - * Can be enabled for testing the auto updater UI.
- * will always show the auto updater if set to true. - */ - @Unique - private static final boolean DEBUG_ALWAYS_SHOW_UPDATER = false; - #if MC_VER < MC_1_20_2 @@ -68,13 +48,13 @@ public abstract class MixinMinecraft public void onOpenScreen(Minecraft instance, Screen guiScreen) { #endif - if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() && !DEBUG_ALWAYS_SHOW_UPDATER) // Don't do anything if the user doesn't want it + if (!Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get()) // Don't do anything if the user doesn't want it { instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened return; } - if (SelfUpdater.onStart() || DEBUG_ALWAYS_SHOW_UPDATER) + if (SelfUpdater.onStart()) { try { @@ -105,56 +85,7 @@ public abstract class MixinMinecraft ) private void buildInitialScreens(Runnable runnable) { - boolean showUpdater = SelfUpdater.onStart(); // always needs to be called, otherwise auto update setup won't be completed - - // TODO merge logic for forge, neo, and fabric - if ( - ( - // Don't do anything if the user doesn't want it - showUpdater - && Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() - ) - || DEBUG_ALWAYS_SHOW_UPDATER - ) - { - runnable = () -> - { - String versionId; - EDhApiUpdateBranch updateBranch = EDhApiUpdateBranch.convertAutoToStableOrNightly(Config.Client.Advanced.AutoUpdater.updateBranch.get()); - if (updateBranch == EDhApiUpdateBranch.STABLE) - { - versionId = ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()); - } - else - { - versionId = GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"); - } - - if (versionId != null) - { - try - { - Minecraft.getInstance().setScreen(new UpdateModScreen( - // TODO: Change to runnable, instead of tittle screen - new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons - versionId - )); - } - catch (Exception e) - { - // info instead of error since this can be ignored and probably just means - // there isn't a new DH version available - LOGGER.info("Unable to show DH update screen, reason: ["+e.getMessage()+"]."); - } - } - else - { - LOGGER.info("Unable to find new DH update for the ["+updateBranch+"] branch. Assuming DH is up to date..."); - } - }; - } - - runnable.run(); + DhUpdateScreenBase.tryShowUpdateScreenAndRunAutoUpdateStartup(runnable); } #endif diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java index 1ba7e14a5..60652a9d8 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java @@ -96,7 +96,7 @@ public class MixinOptionsScreen extends Screen protected MixinOptionsScreen(Component title) { super(title); } @Inject(at = @At("RETURN"), method = "init") - private void lodconfig$init(CallbackInfo ci) + private void dhConfig$init(CallbackInfo ci) { if (Config.Client.showDhOptionsButtonInMinecraftUi.get()) { @@ -110,7 +110,6 @@ public class MixinOptionsScreen extends Screen this.addRenderableWidget(this.getOptionsButton()); // add the button to the correct location in the UI - // TODO is there a better way to do this instead of using access transformers to inject into the exact UI elements? LinearLayout layout = (LinearLayout) this.layout.headerFrame.children.get(0).child; // determine how wide the other option buttons are so we can put our botton to the left of them all diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java index b2353cc84..c61e62ec9 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java @@ -2,6 +2,7 @@ package com.seibel.distanthorizons.forge.mixins.client; import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch; import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen; +import com.seibel.distanthorizons.common.commonMixins.DhUpdateScreenBase; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.jar.installer.GitlabGetter; @@ -86,52 +87,7 @@ public class MixinMinecraft ) private void buildInitialScreens(Runnable runnable) { - boolean showUpdater = SelfUpdater.onStart(); // always needs to be called, otherwise auto update setup won't be completed - - // TODO merge logic for forge, neo, and fabric - if ( - showUpdater - && Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() // Don't do anything if the user doesn't want it - ) - { - runnable = () -> - { - String versionId; - EDhApiUpdateBranch updateBranch = EDhApiUpdateBranch.convertAutoToStableOrNightly(Config.Client.Advanced.AutoUpdater.updateBranch.get()); - if (updateBranch == EDhApiUpdateBranch.STABLE) - { - versionId = ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()); - } - else - { - versionId = GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"); - } - - if (versionId != null) - { - try - { - - Minecraft.getInstance().setScreen(new UpdateModScreen( - // TODO: Change to runnable, instead of tittle screen - new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons - versionId - )); - } - catch (Exception e) - { - // info instead of error since this can be ignored and probably just means - // there isn't a new DH version available - LOGGER.info("Unable to show DH update screen, reason: ["+e.getMessage()+"]."); - } - } - else - { - LOGGER.info("Unable to find new DH update for the ["+updateBranch+"] branch. Assuming DH is up to date..."); - } - }; - runnable.run(); - } + DhUpdateScreenBase.tryShowUpdateScreenAndRunAutoUpdateStartup(runnable); } #endif diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinOptionsScreen.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinOptionsScreen.java index 7a7371123..473f5f0a3 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinOptionsScreen.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinOptionsScreen.java @@ -54,7 +54,7 @@ public class MixinOptionsScreen extends Screen } @Inject(at = @At("HEAD"), method = "init") - private void lodconfig$init(CallbackInfo ci) + private void dhConfig$init(CallbackInfo ci) { if (Config.Client.showDhOptionsButtonInMinecraftUi.get()) { diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinMinecraft.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinMinecraft.java index fcbb2cb27..14315512b 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinMinecraft.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinMinecraft.java @@ -1,20 +1,9 @@ package com.seibel.distanthorizons.neoforge.mixins.client; -import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch; -import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen; -import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.core.jar.installer.GitlabGetter; -import com.seibel.distanthorizons.core.jar.installer.ModrinthGetter; +import com.seibel.distanthorizons.common.commonMixins.DhUpdateScreenBase; import com.seibel.distanthorizons.core.jar.updater.SelfUpdater; -import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants; -import com.seibel.distanthorizons.coreapi.ModInfo; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; -import com.seibel.distanthorizons.core.logging.DhLogger; import org.spongepowered.asm.mixin.Mixin; -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.Redirect; @@ -28,18 +17,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) public class MixinMinecraft { - @Unique - private static final DhLogger LOGGER = new DhLoggerBuilder().build(); - - /** - * Can be enabled for testing the auto updater UI.
- * will always show the auto updater if set to true. - */ - @Unique - private static final boolean DEBUG_ALWAYS_SHOW_UPDATER = false; - - - #if MC_VER >= MC_1_20_2 @Redirect( method = "Lnet/minecraft/client/Minecraft;onGameLoadFinished(Lnet/minecraft/client/Minecraft$GameLoadCookie;)V", @@ -47,56 +24,7 @@ public class MixinMinecraft ) private void buildInitialScreens(Runnable runnable) { - boolean showUpdater = SelfUpdater.onStart(); // always needs to be called, otherwise auto update setup won't be completed - - // TODO merge logic for forge, neo, and fabric - if ( - ( - // Don't do anything if the user doesn't want it - showUpdater - && Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() - ) - || DEBUG_ALWAYS_SHOW_UPDATER - ) - { - runnable = () -> - { - String versionId; - EDhApiUpdateBranch updateBranch = EDhApiUpdateBranch.convertAutoToStableOrNightly(Config.Client.Advanced.AutoUpdater.updateBranch.get()); - if (updateBranch == EDhApiUpdateBranch.STABLE) - { - versionId = ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()); - } - else - { - versionId = GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha"); - } - - if (versionId != null) - { - try - { - Minecraft.getInstance().setScreen(new UpdateModScreen( - // TODO: Change to runnable, instead of tittle screen - new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons - versionId - )); - } - catch (Exception e) - { - // info instead of error since this can be ignored and probably just means - // there isn't a new DH version available - LOGGER.info("Unable to show DH update screen, reason: ["+e.getMessage()+"]."); - } - } - else - { - LOGGER.info("Unable to find new DH update for the ["+updateBranch+"] branch. Assuming DH is up to date..."); - } - }; - } - - runnable.run(); + DhUpdateScreenBase.tryShowUpdateScreenAndRunAutoUpdateStartup(runnable); } #endif @@ -106,4 +34,6 @@ public class MixinMinecraft SelfUpdater.onClose(); } + + } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinOptionsScreen.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinOptionsScreen.java index 053797334..fef9ae629 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinOptionsScreen.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinOptionsScreen.java @@ -96,7 +96,7 @@ public class MixinOptionsScreen extends Screen protected MixinOptionsScreen(Component title) { super(title); } @Inject(at = @At("RETURN"), method = "init") - private void lodconfig$init(CallbackInfo ci) + private void dhConfig$init(CallbackInfo ci) { if (Config.Client.showDhOptionsButtonInMinecraftUi.get()) { @@ -110,7 +110,6 @@ public class MixinOptionsScreen extends Screen this.addRenderableWidget(this.getOptionsButton()); // add the button to the correct location in the UI - // TODO is there a better way to do this instead of using access transformers to inject into the exact UI elements? LinearLayout layout = (LinearLayout) this.layout.headerFrame.children.get(0).child; // determine how wide the other option buttons are so we can put our botton to the left of them all