From 2873324263feae34a8c338365481c2f30f06dca7 Mon Sep 17 00:00:00 2001 From: Acuadragon100 <30689683+Acuadragon100@users.noreply.github.com> Date: Tue, 28 Apr 2026 15:38:37 +0200 Subject: [PATCH 1/2] Delay the initial setScreen call so that Forge mods can catch the event to display a custom menu screen. --- .../forgeinjects/client/MinecraftInject.java | 50 +++++++++++++++++++ .../resources/kilt_forge_injects.mixins.json | 3 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java b/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java index cc64ddbe2..f59f67e56 100644 --- a/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java +++ b/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java @@ -12,6 +12,7 @@ import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import com.mojang.realmsclient.client.RealmsClient; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.Timer; @@ -28,6 +29,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.packs.repository.PackRepository; +import net.minecraft.server.packs.resources.ReloadInstance; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -367,4 +369,52 @@ private void rightClickAir(CallbackInfo ci, @Local ItemStack stack, @Local Inter public ForgeGui kilt$getForgeGui() { return (ForgeGui) this.kilt$forgeGui; } + + // Use lower priority for screen delay. This gives priority to Fabric mods, + // allowing them to set their menu screen without interference from the Forge event. + @Mixin(value = Minecraft.class, priority = 500) + public static class Early { + + @Unique + private Runnable kilt$setScreen; + + @WrapOperation( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V" + ) + ) + public void kilt$delaySettingInitialBanScreen(Minecraft instance, Screen guiScreen, Operation original) { + kilt$setScreen = () -> original.call(instance, guiScreen); + } + + @WrapOperation( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V" + ) + ) + public void kilt$delaySettingInitialScreen( + Minecraft instance, RealmsClient realmsClient, ReloadInstance reloadInstance, + GameConfig.QuickPlayData quickPlayData, Operation original + ) { + kilt$setScreen = () -> original.call(instance, realmsClient, reloadInstance, quickPlayData); + } + + @Inject( + method = "method_29338", + at = @At( + value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;onGameLoadFinished()V" + ), + order = 1001 // Needs to be after forge load. + ) + private void kilt$setScreenAfterLoading(CallbackInfo ci) { + if (kilt$setScreen != null) { + kilt$setScreen.run(); + kilt$setScreen = null; + } + } + } } \ No newline at end of file diff --git a/src/main/resources/kilt_forge_injects.mixins.json b/src/main/resources/kilt_forge_injects.mixins.json index 543f802a2..eeeeae09f 100644 --- a/src/main/resources/kilt_forge_injects.mixins.json +++ b/src/main/resources/kilt_forge_injects.mixins.json @@ -570,6 +570,7 @@ "client.KeyboardHandlerInject", "client.KeyMappingInject", "client.MinecraftInject", + "client.MinecraftInject$Early", "client.MouseHandlerInject", "client.OptionsInject", "client.RecipeBookCategoriesInject", @@ -751,5 +752,5 @@ }, "overwrites": { "conformVisibility": true - } + } } From 68a7cd0ac82bd638e26fc416be712484186f1007 Mon Sep 17 00:00:00 2001 From: Acuadragon100 <30689683+Acuadragon100@users.noreply.github.com> Date: Tue, 28 Apr 2026 21:01:29 +0200 Subject: [PATCH 2/2] Move to workarounds folder. --- .../forgeinjects/client/MinecraftInject.java | 50 --------------- .../early_screen_delay/MinecraftMixin.java | 63 +++++++++++++++++++ src/main/resources/Kilt.mixins.json | 3 +- .../resources/kilt_forge_injects.mixins.json | 3 +- 4 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 src/main/java/xyz/bluspring/kilt/mixin/workarounds/early_screen_delay/MinecraftMixin.java diff --git a/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java b/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java index f59f67e56..cc64ddbe2 100644 --- a/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java +++ b/src/main/java/xyz/bluspring/kilt/forgeinjects/client/MinecraftInject.java @@ -12,7 +12,6 @@ import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import com.mojang.realmsclient.client.RealmsClient; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.Timer; @@ -29,7 +28,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.packs.repository.PackRepository; -import net.minecraft.server.packs.resources.ReloadInstance; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -369,52 +367,4 @@ private void rightClickAir(CallbackInfo ci, @Local ItemStack stack, @Local Inter public ForgeGui kilt$getForgeGui() { return (ForgeGui) this.kilt$forgeGui; } - - // Use lower priority for screen delay. This gives priority to Fabric mods, - // allowing them to set their menu screen without interference from the Forge event. - @Mixin(value = Minecraft.class, priority = 500) - public static class Early { - - @Unique - private Runnable kilt$setScreen; - - @WrapOperation( - method = "", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V" - ) - ) - public void kilt$delaySettingInitialBanScreen(Minecraft instance, Screen guiScreen, Operation original) { - kilt$setScreen = () -> original.call(instance, guiScreen); - } - - @WrapOperation( - method = "", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V" - ) - ) - public void kilt$delaySettingInitialScreen( - Minecraft instance, RealmsClient realmsClient, ReloadInstance reloadInstance, - GameConfig.QuickPlayData quickPlayData, Operation original - ) { - kilt$setScreen = () -> original.call(instance, realmsClient, reloadInstance, quickPlayData); - } - - @Inject( - method = "method_29338", - at = @At( - value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;onGameLoadFinished()V" - ), - order = 1001 // Needs to be after forge load. - ) - private void kilt$setScreenAfterLoading(CallbackInfo ci) { - if (kilt$setScreen != null) { - kilt$setScreen.run(); - kilt$setScreen = null; - } - } - } } \ No newline at end of file diff --git a/src/main/java/xyz/bluspring/kilt/mixin/workarounds/early_screen_delay/MinecraftMixin.java b/src/main/java/xyz/bluspring/kilt/mixin/workarounds/early_screen_delay/MinecraftMixin.java new file mode 100644 index 000000000..49cfcbab6 --- /dev/null +++ b/src/main/java/xyz/bluspring/kilt/mixin/workarounds/early_screen_delay/MinecraftMixin.java @@ -0,0 +1,63 @@ +package xyz.bluspring.kilt.mixin.workarounds.early_screen_delay; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.realmsclient.client.RealmsClient; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.main.GameConfig; +import net.minecraft.server.packs.resources.ReloadInstance; +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.callback.CallbackInfo; + +// Use lower priority for screen delay. This gives priority to Fabric mods, +// allowing them to set their menu screen without interference from the Forge event. +@Mixin(value = Minecraft.class, priority = 500) +public class MinecraftMixin { + + @Unique + private Runnable kilt$setScreen; + + @WrapOperation( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V" + ) + ) + public void kilt$delaySettingInitialBanScreen(Minecraft instance, Screen guiScreen, Operation original) { + kilt$setScreen = () -> original.call(instance, guiScreen); + } + + @WrapOperation( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V" + ) + ) + public void kilt$delaySettingInitialScreen( + Minecraft instance, RealmsClient realmsClient, ReloadInstance reloadInstance, + GameConfig.QuickPlayData quickPlayData, Operation original + ) { + kilt$setScreen = () -> original.call(instance, realmsClient, reloadInstance, quickPlayData); + } + + @Inject( + method = "method_29338", + at = @At( + value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;onGameLoadFinished()V" + ), + order = 1001 // Needs to be after forge load. + ) + private void kilt$setScreenAfterLoading(CallbackInfo ci) { + if (kilt$setScreen != null) { + kilt$setScreen.run(); + kilt$setScreen = null; + } + } + +} diff --git a/src/main/resources/Kilt.mixins.json b/src/main/resources/Kilt.mixins.json index 7c628e85c..ed75dd556 100644 --- a/src/main/resources/Kilt.mixins.json +++ b/src/main/resources/Kilt.mixins.json @@ -121,7 +121,8 @@ "compat.ratatouille.ShaderInstanceMixin", "compat.sodium.ItemRendererMixin", "compat.sodium.LevelRendererMixin", - "debug.PoseStackMixin" + "debug.PoseStackMixin", + "workarounds.early_screen_delay.MinecraftMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/kilt_forge_injects.mixins.json b/src/main/resources/kilt_forge_injects.mixins.json index eeeeae09f..543f802a2 100644 --- a/src/main/resources/kilt_forge_injects.mixins.json +++ b/src/main/resources/kilt_forge_injects.mixins.json @@ -570,7 +570,6 @@ "client.KeyboardHandlerInject", "client.KeyMappingInject", "client.MinecraftInject", - "client.MinecraftInject$Early", "client.MouseHandlerInject", "client.OptionsInject", "client.RecipeBookCategoriesInject", @@ -752,5 +751,5 @@ }, "overwrites": { "conformVisibility": true - } + } }