From 833d6014ea0a6bdaaacad604a4dd397613856856 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 11 Mar 2021 21:09:22 +0800 Subject: [PATCH 1/3] Rewrite the GuiEvent.SET_SCREEN mixin to fix #35 --- .../mixin/fabric/client/MixinMinecraft.java | 83 +++++-------------- .../architectury/test/events/DebugEvents.java | 13 ++- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java index b1c5dd28..5e23ad17 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java @@ -23,40 +23,35 @@ import me.shedaniel.architectury.event.events.GuiEvent; import me.shedaniel.architectury.event.events.InteractionEvent; import me.shedaniel.architectury.event.events.client.ClientPlayerEvent; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.ConnectScreen; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.client.main.GameConfig; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.io.File; - @Unique @Mixin(Minecraft.class) public abstract class MixinMinecraft { - // @formatter:off @Shadow @Nullable public LocalPlayer player; - + @Shadow @Nullable public HitResult hitResult; - - @Shadow public abstract void setScreen(@Nullable Screen screen); - - private boolean setScreenCancelled; - - private String hostname; - private int port; - // @formatter:on + + @Shadow + public abstract void setScreen(@Nullable Screen screen); + + @Unique + private ThreadLocal setScreenCancelled = new ThreadLocal<>(); @Inject(method = "clearLevel(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/chat/NarratorChatListener;clear()V")) @@ -80,9 +75,9 @@ public abstract class MixinMinecraft { @ModifyVariable( method = "setScreen", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;respawn()V", - shift = At.Shift.BY, - by = 2), + target = "Lnet/minecraft/client/player/LocalPlayer;respawn()V", + shift = At.Shift.BY, + by = 2), argsOnly = true ) public Screen modifyScreen(Screen screen) { @@ -90,7 +85,7 @@ public abstract class MixinMinecraft { InteractionResultHolder event = GuiEvent.SET_SCREEN.invoker().modifyScreen(screen); switch (event.getResult()) { case FAIL: - setScreenCancelled = true; + setScreenCancelled.set(true); return old; case SUCCESS: screen = event.getObject(); @@ -98,56 +93,24 @@ public abstract class MixinMinecraft { old.removed(); } default: - setScreenCancelled = false; + setScreenCancelled.set(false); return screen; } } @Inject( method = "setScreen", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;respawn()V", - shift = At.Shift.BY, - by = 3), + at = @At(value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/client/Minecraft;screen:Lnet/minecraft/client/gui/screens/Screen;", + shift = At.Shift.BY, + by = -1), cancellable = true ) public void cancelSetScreen(@Nullable Screen screen, CallbackInfo ci) { - if (setScreenCancelled) { + if (setScreenCancelled.get()) { ci.cancel(); - } - } - - @Redirect( - method = "", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V"), - slice = @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;resizeDisplay()V"), - to = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/LoadingOverlay;registerTextures(Lnet/minecraft/client/Minecraft;)V") - ) - ) - public void minecraftWhy(Minecraft mc, Screen screen) { - } - - @Inject( - method = "", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;resizeDisplay()V"), - locals = LocalCapture.CAPTURE_FAILHARD - ) - public void saveLocals(GameConfig gc, CallbackInfo ci, File f, String string2, int j) { - hostname = string2; - port = j; - } - - @SuppressWarnings({"UnresolvedMixinReference", "ConstantConditions"}) - @Inject( - method = {"method_29338", "lambda$null$1"}, // .lambda$null$1 - at = @At("RETURN") - ) - public void registerMainScreens(CallbackInfo ci) { - if (hostname != null) { - setScreen(new ConnectScreen(new TitleScreen(), (Minecraft) ((Object) this), hostname, port)); - } else { - setScreen(new TitleScreen(true)); + setScreenCancelled.set(false); } } } diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java index fd391068..8626510c 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java @@ -27,6 +27,7 @@ import me.shedaniel.architectury.platform.Platform; import me.shedaniel.architectury.utils.Env; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.core.Position; import net.minecraft.core.Vec3i; import net.minecraft.network.chat.TranslatableComponent; @@ -211,10 +212,6 @@ public class DebugEvents { ClientPlayerEvent.CLIENT_PLAYER_RESPAWN.register((oldPlayer, newPlayer) -> { SINK.accept(newPlayer.getScoreboardName() + " respawned (client)"); }); - GuiEvent.SET_SCREEN.register((screen -> { - SINK.accept("Screen has been changed to " + toSimpleName(screen)); - return InteractionResultHolder.pass(screen); - })); GuiEvent.INIT_PRE.register((screen, widgets, children) -> { SINK.accept(toSimpleName(screen) + " initializes"); return InteractionResult.PASS; @@ -271,6 +268,14 @@ public class DebugEvents { SINK.accept("Raw Key pressed: " + InputConstants.getKey(keyCode, scanCode).getDisplayName().getString()); return InteractionResult.PASS; }); + GuiEvent.SET_SCREEN.register(screen -> { + if (screen instanceof ChatScreen) { + return InteractionResultHolder.fail(screen); + } + + SINK.accept("Screen has been changed to " + toSimpleName(screen)); + return InteractionResultHolder.pass(screen); + }); } private static String toSimpleName(Object o) { From 389034e1ff6d2d1c1e8a46b2888de9d61d1ad485 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 11 Mar 2021 21:11:43 +0800 Subject: [PATCH 2/3] Change at --- .../architectury/mixin/fabric/client/MixinMinecraft.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java index 5e23ad17..a83c8f4c 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinMinecraft.java @@ -74,10 +74,11 @@ public abstract class MixinMinecraft { @ModifyVariable( method = "setScreen", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;respawn()V", + at = @At(value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/client/Minecraft;screen:Lnet/minecraft/client/gui/screens/Screen;", shift = At.Shift.BY, - by = 2), + by = -1), argsOnly = true ) public Screen modifyScreen(Screen screen) { From 47da69c510b3afc06dd78d59bcadde5e5a059849 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 16 Mar 2021 16:51:01 +0100 Subject: [PATCH 3/3] Bump to 1.9 This is to indicate possibly changed mod behaviour (e.g. with KubeJS UI) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f925bb87..9a08d0d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ supported_version=1.16.4/5 archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=1.8 +base_version=1.9 maven_group=me.shedaniel fabric_loader_version=0.11.1