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 new file mode 100644 index 000000000..eaec69141 --- /dev/null +++ b/station-gui-api-v0/src/main/java/net/modificationstation/stationapi/mixin/gui/PlayerEntityMixin.java @@ -0,0 +1,22 @@ +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; + +@Mixin(PlayerEntity.class) +public class PlayerEntityMixin { + + @Shadow + public ScreenHandler currentScreenHandler; + + @Inject(method = "closeHandledScreen", at = @At("HEAD")) + private void stationapi_fixPrematureScreenHandlerReset(CallbackInfo ci) { + 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 10e7e8bcf..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,8 +4,10 @@ "package": "net.modificationstation.stationapi.mixin.gui", "compatibilityLevel": "JAVA_17", "mixins": [ + "ScreenHandlerMixin" ], "client": [ + "PlayerEntityMixin", "client.ScreenAccessor", "client.SelectWorldScreenMixin" ],