From c019c224ee09e73b6438adac02ff7c4616cefffe Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Tue, 14 Oct 2025 16:40:33 +0100 Subject: [PATCH 1/2] Why --- .../stationapi/mixin/gui/PlayerEntityMixin.java | 17 +++++++++++++++++ .../resources/station-gui-api-v0.mixins.json | 1 + 2 files changed, 18 insertions(+) create mode 100644 station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java new file mode 100644 index 000000000..aa83d4ad2 --- /dev/null +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java @@ -0,0 +1,17 @@ +package net.modificationstation.stationapi.mixin.gui; + +import net.minecraft.entity.player.PlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(PlayerEntity.class) +public class PlayerEntityMixin { + + @Inject(method = "closeHandledScreen", at = @At("HEAD"), cancellable = true) + private void stationapi_fixPrematureScreenHandlerReset(CallbackInfo ci) { + ci.cancel(); + } + +} diff --git a/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json b/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json index 10e7e8bcf..298fb384c 100644 --- a/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json +++ b/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json @@ -6,6 +6,7 @@ "mixins": [ ], "client": [ + "PlayerEntityMixin", "client.ScreenAccessor", "client.SelectWorldScreenMixin" ], From b825aab31fdaaade0914faff51d735d33df8d038 Mon Sep 17 00:00:00 2001 From: calmilamsy Date: Sat, 15 Aug 2026 16:28:03 +0100 Subject: [PATCH 2/2] Make PR work as requested --- .../api/client/gui/screen/StationScreenHandler.java | 10 ++++++++++ .../stationapi/mixin/gui/PlayerEntityMixin.java | 9 +++++++-- .../stationapi/mixin/gui/ScreenHandlerMixin.java | 12 ++++++++++++ .../src/main/resources/fabric.mod.json | 7 ++++++- .../main/resources/station-gui-api-v0.mixins.json | 1 + 5 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 station-gui-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/StationScreenHandler.java create mode 100644 station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/ScreenHandlerMixin.java diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/StationScreenHandler.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/StationScreenHandler.java new file mode 100644 index 000000000..01c634c93 --- /dev/null +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/api/client/gui/screen/StationScreenHandler.java @@ -0,0 +1,10 @@ +package net.modificationstation.stationapi.api.client.gui.screen; + +import net.minecraft.entity.player.PlayerEntity; +import net.modificationstation.stationapi.api.util.Util; + +public interface StationScreenHandler { + default void stationAPI$onClose(PlayerEntity playerEntity) { + Util.assertImpl(); + } +} diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java index aa83d4ad2..eaec69141 100644 --- a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java @@ -1,7 +1,9 @@ package net.modificationstation.stationapi.mixin.gui; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.ScreenHandler; 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; @@ -9,9 +11,12 @@ @Mixin(PlayerEntity.class) public class PlayerEntityMixin { - @Inject(method = "closeHandledScreen", at = @At("HEAD"), cancellable = true) + @Shadow + public ScreenHandler currentScreenHandler; + + @Inject(method = "closeHandledScreen", at = @At("HEAD")) private void stationapi_fixPrematureScreenHandlerReset(CallbackInfo ci) { - ci.cancel(); + currentScreenHandler.stationAPI$onClose((PlayerEntity) (Object) this); } } diff --git a/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/ScreenHandlerMixin.java b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/ScreenHandlerMixin.java new file mode 100644 index 000000000..d3513ef79 --- /dev/null +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/ScreenHandlerMixin.java @@ -0,0 +1,12 @@ +package net.modificationstation.stationapi.mixin.gui; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.ScreenHandler; +import net.modificationstation.stationapi.api.client.gui.screen.StationScreenHandler; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ScreenHandler.class) +public class ScreenHandlerMixin implements StationScreenHandler { + @Override + public void stationAPI$onClose(PlayerEntity playerEntity) {} +} diff --git a/station-gui-api-v0/src/main/resources/fabric.mod.json b/station-gui-api-v0/src/main/resources/fabric.mod.json index 6ae043ae3..5de66b58e 100644 --- a/station-gui-api-v0/src/main/resources/fabric.mod.json +++ b/station-gui-api-v0/src/main/resources/fabric.mod.json @@ -33,6 +33,11 @@ }, "custom": { - "modmenu:api": true + "modmenu:api": true, + "loom:injected_interfaces": { + "net/minecraft/screen/ScreenHandler": [ + "net/modificationstation/stationapi/api/client/gui/screen/StationScreenHandler" + ] + } } } \ No newline at end of file diff --git a/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json b/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json index 298fb384c..f247ba630 100644 --- a/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json +++ b/station-gui-api-v0/src/main/resources/station-gui-api-v0.mixins.json @@ -4,6 +4,7 @@ "package": "net.modificationstation.stationapi.mixin.gui", "compatibilityLevel": "JAVA_17", "mixins": [ + "ScreenHandlerMixin" ], "client": [ "PlayerEntityMixin",