From 3762a6d2051673716d1f1aeb9b66b7bc85b66c29 Mon Sep 17 00:00:00 2001 From: vaporvee Date: Tue, 24 Jun 2025 02:51:29 +0200 Subject: [PATCH] fixed forge window hide, made code more robust in general, support for custom start sounds --- README.md | 3 +- .../com/vaporvee/loadsupport/CommonClass.java | 5 --- .../java/com/vaporvee/loadsupport/Config.java | 2 +- .../loadsupport/ScreenEventHandler.java | 1 + ...seMixin.java => MinecraftUnloadMixin.java} | 12 ++++++- .../loadsupport/mixin/WindowHideMixin.java | 35 ------------------- .../loadsupport/modules/Allocated.java | 3 -- .../loadsupport/modules/StartSound.java | 18 ++++++---- .../main/resources/loadsupport.mixins.json | 3 +- gradle.properties | 2 +- 10 files changed, 27 insertions(+), 57 deletions(-) rename common/src/main/java/com/vaporvee/loadsupport/mixin/{MinecraftPauseMixin.java => MinecraftUnloadMixin.java} (58%) delete mode 100644 common/src/main/java/com/vaporvee/loadsupport/mixin/WindowHideMixin.java diff --git a/README.md b/README.md index 598e083..bd04f96 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It is fully configurable in `config/loadsupport.toml`. ## Config 🚀 The config in `config/loadsupport.toml` is pretty self explainatory: ```toml -startSound = true +loadFinishSound = "minecraft:ui.toast.challenge_complete" minMemory = 4.0 errorTitle = "Error: Not enough Java memory!" errorMinMemory = "Please allocate at least {minMemory} GB of Java memory to your Minecraft instance!" @@ -15,7 +15,6 @@ memoryInfoLink = "https://github.com/vaporvee/LoadSupport/wiki/How-to-allocate-m `{minMemory}` and `{currentMemory}` get replaced by their actual values. ## Planned Features 👀 -- 🔊 Customizable startup sound - 🪛 Ingame settings (Modlist support) - 🧩 More features letting the player know why Minecraft is not loading diff --git a/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java b/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java index 6c9a957..318feb6 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java +++ b/common/src/main/java/com/vaporvee/loadsupport/CommonClass.java @@ -17,14 +17,9 @@ public class CommonClass { return true; } public static Config config; - public static long window; private static void InitConfig() { AutoConfig.register(Config.class, Toml4jConfigSerializer::new); config = AutoConfig.getConfigHolder(Config.class).getConfig(); } - - public static void HideWindow() { - GLFW.glfwHideWindow(window); - } } \ No newline at end of file diff --git a/common/src/main/java/com/vaporvee/loadsupport/Config.java b/common/src/main/java/com/vaporvee/loadsupport/Config.java index d963f70..81006a8 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/Config.java +++ b/common/src/main/java/com/vaporvee/loadsupport/Config.java @@ -4,7 +4,7 @@ import me.shedaniel.autoconfig.ConfigData; @me.shedaniel.autoconfig.annotation.Config(name = Constants.MOD_ID) public class Config implements ConfigData { - public boolean startSound = true; + public String loadFinishSound = "minecraft:ui.toast.challenge_complete"; public float minMemory = 4.0f; public String errorTitle = "Error: Not enough Java memory!"; public String errorMinMemory = "Please allocate at least {minMemory} GB of Java memory to your Minecraft instance!"; diff --git a/common/src/main/java/com/vaporvee/loadsupport/ScreenEventHandler.java b/common/src/main/java/com/vaporvee/loadsupport/ScreenEventHandler.java index c870d6d..7fb3dad 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/ScreenEventHandler.java +++ b/common/src/main/java/com/vaporvee/loadsupport/ScreenEventHandler.java @@ -1,6 +1,7 @@ package com.vaporvee.loadsupport; import com.vaporvee.loadsupport.modules.StartSound; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.AccessibilityOnboardingScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.TitleScreen; diff --git a/common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftPauseMixin.java b/common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftUnloadMixin.java similarity index 58% rename from common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftPauseMixin.java rename to common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftUnloadMixin.java index b675519..09a203e 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftPauseMixin.java +++ b/common/src/main/java/com/vaporvee/loadsupport/mixin/MinecraftUnloadMixin.java @@ -2,16 +2,26 @@ package com.vaporvee.loadsupport.mixin; import com.vaporvee.loadsupport.modules.Allocated; import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) -public class MinecraftPauseMixin { +public class MinecraftUnloadMixin { @Inject(method = "run", at = @At("HEAD"), cancellable = true) private void onRunHead(CallbackInfo ci) { if (!Allocated.enoughMemory) { + long window = Minecraft.getInstance().getWindow().getWindow(); + GLFW.glfwHideWindow(window); while (Allocated.isWindowOpen()) { try { Thread.sleep(100); } catch (InterruptedException ignored) {} } diff --git a/common/src/main/java/com/vaporvee/loadsupport/mixin/WindowHideMixin.java b/common/src/main/java/com/vaporvee/loadsupport/mixin/WindowHideMixin.java deleted file mode 100644 index bddd3a0..0000000 --- a/common/src/main/java/com/vaporvee/loadsupport/mixin/WindowHideMixin.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.vaporvee.loadsupport.mixin; - -import com.mojang.blaze3d.platform.DisplayData; -import com.mojang.blaze3d.platform.ScreenManager; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.platform.WindowEventHandler; -import com.vaporvee.loadsupport.CommonClass; -import com.vaporvee.loadsupport.modules.Allocated; -import com.vaporvee.loadsupport.platform.Services; -import org.lwjgl.glfw.GLFW; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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; - -@Mixin(Window.class) -public class WindowHideMixin { - - @Final - @Shadow - private long window; - - @Inject(method = "", at = @At("RETURN")) - private void afterInit(WindowEventHandler eventHandler, ScreenManager screenManager, DisplayData displayData, String preferredFullscreenVideoMode, String title, CallbackInfo ci) { - CommonClass.window = window; - if(Objects.equals(Services.PLATFORM.getPlatformName(), "Fabric") && !Allocated.enoughMemory){ // Fabric loads early enough to fire it here - CommonClass.HideWindow(); // Hide main Minecraft Window which gets frozen by mixin - } - } -} - diff --git a/common/src/main/java/com/vaporvee/loadsupport/modules/Allocated.java b/common/src/main/java/com/vaporvee/loadsupport/modules/Allocated.java index 5921c86..7aa063f 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/modules/Allocated.java +++ b/common/src/main/java/com/vaporvee/loadsupport/modules/Allocated.java @@ -104,9 +104,6 @@ public class Allocated { errorWindow.add(buttonPanel, BorderLayout.SOUTH); errorWindow.setVisible(true); }); - if(Objects.equals(Services.PLATFORM.getPlatformName(), "NeoForge")){// NeoForge loads too late so we need to fire it here - CommonClass.HideWindow(); // Hide main Minecraft Window which gets frozen by mixin - } } } catch (RuntimeException | ClassNotFoundException | InstantiationException | IllegalAccessException e) { Constants.LOG.error(String.valueOf(e)); diff --git a/common/src/main/java/com/vaporvee/loadsupport/modules/StartSound.java b/common/src/main/java/com/vaporvee/loadsupport/modules/StartSound.java index 99630a3..4699c82 100644 --- a/common/src/main/java/com/vaporvee/loadsupport/modules/StartSound.java +++ b/common/src/main/java/com/vaporvee/loadsupport/modules/StartSound.java @@ -1,19 +1,23 @@ package com.vaporvee.loadsupport.modules; import com.vaporvee.loadsupport.CommonClass; +import com.vaporvee.loadsupport.Constants; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.sounds.SoundEvents; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; public class StartSound { private static boolean startedOnce = false; public static void play() { - if (!startedOnce && CommonClass.config.startSound) { - startedOnce = true; - Minecraft.getInstance().getSoundManager().play( - SimpleSoundInstance.forUI(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 1.0F) - ); + if (startedOnce) return; + startedOnce = true; + ResourceLocation rl = ResourceLocation.tryParse(CommonClass.config.loadFinishSound); + if(rl == null) { + Constants.LOG.error("Cannot find load sound resource: \"{}\"", CommonClass.config.loadFinishSound); + return; } + Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvent.createVariableRangeEvent(rl), 1.0F)); } -} \ No newline at end of file +} diff --git a/common/src/main/resources/loadsupport.mixins.json b/common/src/main/resources/loadsupport.mixins.json index 60f2333..b05d8a1 100644 --- a/common/src/main/resources/loadsupport.mixins.json +++ b/common/src/main/resources/loadsupport.mixins.json @@ -6,8 +6,7 @@ "compatibilityLevel": "JAVA_18", "mixins": [], "client": [ - "MinecraftPauseMixin", - "WindowHideMixin" + "MinecraftUnloadMixin" ], "server": [], "injectors": { diff --git a/gradle.properties b/gradle.properties index 4a22d64..f357fbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ # Every field you add must be added to buildSrc/src/main/groovy/multiloader-common.gradle expandProps map. # Project -version=1.2.0 +version=1.2.1 group=com.vaporvee.loadsupport java_version=21