From a70df52234a7e7e3740163b80146733431241995 Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Mon, 18 Mar 2024 11:27:01 -0600 Subject: [PATCH] Isolate other clientside only things (fixes GH-3 for real this time) --- src/main/java/pm/c7/scout/ScoutUtil.java | 21 -------------- .../java/pm/c7/scout/client/ScoutClient.java | 2 +- .../pm/c7/scout/client/ScoutUtilClient.java | 28 ++++++++++++++++++ .../pm/c7/scout/mixin/ScreenHandlerMixin.java | 13 --------- .../{ => client}/DefaultedListMixin.java | 8 +++-- .../mixin/client/HandledScreenMixin.java | 12 ++++---- .../mixin/client/ScreenHandlerMixin.java | 29 +++++++++++++++++++ 7 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 src/main/java/pm/c7/scout/client/ScoutUtilClient.java rename src/main/java/pm/c7/scout/mixin/{ => client}/DefaultedListMixin.java (74%) create mode 100644 src/main/java/pm/c7/scout/mixin/client/ScreenHandlerMixin.java diff --git a/src/main/java/pm/c7/scout/ScoutUtil.java b/src/main/java/pm/c7/scout/ScoutUtil.java index f9dda92..5be812d 100644 --- a/src/main/java/pm/c7/scout/ScoutUtil.java +++ b/src/main/java/pm/c7/scout/ScoutUtil.java @@ -3,11 +3,6 @@ package pm.c7.scout; import dev.emi.trinkets.api.SlotReference; import dev.emi.trinkets.api.TrinketComponent; import dev.emi.trinkets.api.TrinketsApi; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.BeaconScreen; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; -import net.minecraft.client.gui.screen.ingame.MerchantScreen; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; @@ -130,20 +125,4 @@ public class ScoutUtil { out.addAll(scoutScreenHandler.scout$getRightPouchSlots()); return out; } - - public static @Nullable PlayerScreenHandler getPlayerScreenHandler() { - var client = MinecraftClient.getInstance(); - if (client != null && client.player != null) { - return client.player.playerScreenHandler; - } - - return null; - } - - // FIXME: registry system for mods to register their own blacklisted screens - public static boolean isScreenBlacklisted(Screen screen) { - return screen instanceof CreativeInventoryScreen - || screen instanceof MerchantScreen // FIXME: needs repositioning - || screen instanceof BeaconScreen; // FIXME: needs repositioning - } } diff --git a/src/main/java/pm/c7/scout/client/ScoutClient.java b/src/main/java/pm/c7/scout/client/ScoutClient.java index dac134d..4d89373 100644 --- a/src/main/java/pm/c7/scout/client/ScoutClient.java +++ b/src/main/java/pm/c7/scout/client/ScoutClient.java @@ -110,7 +110,7 @@ public class ScoutClient implements ClientModInitializer { ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (screen instanceof HandledScreen handledScreen && client.player != null) { - if (ScoutUtil.isScreenBlacklisted(screen)) { + if (ScoutUtilClient.isScreenBlacklisted(screen)) { // realistically no one is going to have a screen bigger than 2147483647 pixels for (Slot slot : ScoutUtil.getAllBagSlots(client.player.playerScreenHandler)) { BagSlot bagSlot = (BagSlot) slot; diff --git a/src/main/java/pm/c7/scout/client/ScoutUtilClient.java b/src/main/java/pm/c7/scout/client/ScoutUtilClient.java new file mode 100644 index 0000000..5414039 --- /dev/null +++ b/src/main/java/pm/c7/scout/client/ScoutUtilClient.java @@ -0,0 +1,28 @@ +package pm.c7.scout.client; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.BeaconScreen; +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; +import net.minecraft.client.gui.screen.ingame.MerchantScreen; +import net.minecraft.screen.PlayerScreenHandler; + +public class ScoutUtilClient { + public static @Nullable PlayerScreenHandler getPlayerScreenHandler() { + var client = MinecraftClient.getInstance(); + if (client != null && client.player != null) { + return client.player.playerScreenHandler; + } + + return null; + } + + // FIXME: registry system for mods to register their own blacklisted screens + public static boolean isScreenBlacklisted(Screen screen) { + return screen instanceof CreativeInventoryScreen + || screen instanceof MerchantScreen // FIXME: needs repositioning + || screen instanceof BeaconScreen; // FIXME: needs repositioning + } +} diff --git a/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java b/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java index 2f90eac..b6e13ef 100644 --- a/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java +++ b/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java @@ -15,7 +15,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import pm.c7.scout.ScoutMixin.Transformer; import pm.c7.scout.ScoutUtil; @@ -23,18 +22,6 @@ import pm.c7.scout.ScoutUtil; @Mixin(value = ScreenHandler.class, priority = 950) @Transformer(ScreenHandlerTransformer.class) public abstract class ScreenHandlerMixin { - @Inject(method = "getSlot", at = @At("HEAD"), cancellable = true) - public void scout$fixGetSlot(int index, CallbackInfoReturnable cir) { - var playerScreenHandler = ScoutUtil.getPlayerScreenHandler(); - if (ScoutUtil.isBagSlot(index)) { - if (playerScreenHandler != null) { - cir.setReturnValue(ScoutUtil.getBagSlot(index, playerScreenHandler)); - } else { - cir.setReturnValue(null); - } - } - } - @Inject(method = "internalOnSlotClick", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/screen/ScreenHandler;getCursorStack()Lnet/minecraft/item/ItemStack;", ordinal = 11), locals = LocalCapture.CAPTURE_FAILEXCEPTION) public void scout$fixDoubleClick(int slotIndex, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci, PlayerInventory playerInventory, Slot slot3) { var cursorStack = this.getCursorStack(); diff --git a/src/main/java/pm/c7/scout/mixin/DefaultedListMixin.java b/src/main/java/pm/c7/scout/mixin/client/DefaultedListMixin.java similarity index 74% rename from src/main/java/pm/c7/scout/mixin/DefaultedListMixin.java rename to src/main/java/pm/c7/scout/mixin/client/DefaultedListMixin.java index 84dd057..842ab05 100644 --- a/src/main/java/pm/c7/scout/mixin/DefaultedListMixin.java +++ b/src/main/java/pm/c7/scout/mixin/client/DefaultedListMixin.java @@ -1,18 +1,22 @@ -package pm.c7.scout.mixin; +package pm.c7.scout.mixin.client; 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.CallbackInfoReturnable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.util.collection.DefaultedList; import pm.c7.scout.ScoutUtil; +import pm.c7.scout.client.ScoutUtilClient; +@Environment(EnvType.CLIENT) @Mixin(DefaultedList.class) public class DefaultedListMixin { @Inject(method = "get", at = @At("HEAD"), cancellable = true) public void scout$fixIndexingSlots(int index, CallbackInfoReturnable cir) { - var playerScreenHandler = ScoutUtil.getPlayerScreenHandler(); + var playerScreenHandler = ScoutUtilClient.getPlayerScreenHandler(); if (ScoutUtil.isBagSlot(index)) { if (playerScreenHandler != null) { cir.setReturnValue(ScoutUtil.getBagSlot(index, playerScreenHandler)); diff --git a/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java b/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java index 8c8d438..db5d5bb 100644 --- a/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java +++ b/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java @@ -1,6 +1,5 @@ package pm.c7.scout.mixin.client; -import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; @@ -21,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import pm.c7.scout.ScoutMixin; import pm.c7.scout.ScoutUtil; +import pm.c7.scout.client.ScoutUtilClient; import pm.c7.scout.item.BaseBagItem; import pm.c7.scout.screen.BagSlot; @@ -46,7 +46,7 @@ public abstract class HandledScreenMixin extends Screen @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawBackground(Lnet/minecraft/client/gui/DrawContext;FII)V")) private void scout$drawSatchelRow(DrawContext graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (this.client != null && this.client.player != null && !ScoutUtil.isScreenBlacklisted(this)) { + if (this.client != null && this.client.player != null && !ScoutUtilClient.isScreenBlacklisted(this)) { ItemStack backStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.SATCHEL, false); if (!backStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) backStack.getItem(); @@ -97,7 +97,7 @@ public abstract class HandledScreenMixin extends Screen @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;disableDepthTest()V", remap = false)) private void scout$drawPouchSlots(DrawContext graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (this.client != null && this.client.player != null && !ScoutUtil.isScreenBlacklisted(this)) { + if (this.client != null && this.client.player != null && !ScoutUtilClient.isScreenBlacklisted(this)) { ItemStack leftPouchStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.POUCH, false); if (!leftPouchStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) leftPouchStack.getItem(); @@ -234,7 +234,7 @@ public abstract class HandledScreenMixin extends Screen @Inject(method = "isClickOutsideBounds", at = @At("TAIL"), cancellable = true) private void scout$adjustOutsideBounds(double mouseX, double mouseY, int left, int top, int button, CallbackInfoReturnable callbackInfo) { - if (this.client != null && this.client.player != null && !ScoutUtil.isScreenBlacklisted(this)) { + if (this.client != null && this.client.player != null && !ScoutUtilClient.isScreenBlacklisted(this)) { ItemStack backStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.SATCHEL, false); if (!backStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) backStack.getItem(); @@ -272,7 +272,7 @@ public abstract class HandledScreenMixin extends Screen @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawForeground(Lnet/minecraft/client/gui/DrawContext;II)V")) public void scout$drawOurSlots(DrawContext graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (this.client != null && this.client.player != null && !ScoutUtil.isScreenBlacklisted(this)) { + if (this.client != null && this.client.player != null && !ScoutUtilClient.isScreenBlacklisted(this)) { for (int i = ScoutUtil.SATCHEL_SLOT_START; i > ScoutUtil.BAG_SLOTS_END; i--) { BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(i, this.client.player.playerScreenHandler); if (slot != null && slot.isEnabled()) { @@ -298,7 +298,7 @@ public abstract class HandledScreenMixin extends Screen @Inject(method = "getSlotAt", at = @At("RETURN"), cancellable = true) public void scout$addSlots(double x, double y, CallbackInfoReturnable cir) { - if (this.client != null && this.client.player != null && !ScoutUtil.isScreenBlacklisted(this)) { + if (this.client != null && this.client.player != null && !ScoutUtilClient.isScreenBlacklisted(this)) { for (int i = ScoutUtil.SATCHEL_SLOT_START; i > ScoutUtil.BAG_SLOTS_END; i--) { BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(i, this.client.player.playerScreenHandler); if (this.isPointOverSlot(slot, x, y) && slot != null && slot.isEnabled()) { diff --git a/src/main/java/pm/c7/scout/mixin/client/ScreenHandlerMixin.java b/src/main/java/pm/c7/scout/mixin/client/ScreenHandlerMixin.java new file mode 100644 index 0000000..0673613 --- /dev/null +++ b/src/main/java/pm/c7/scout/mixin/client/ScreenHandlerMixin.java @@ -0,0 +1,29 @@ +package pm.c7.scout.mixin.client; + +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.CallbackInfoReturnable; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import pm.c7.scout.ScoutUtil; +import pm.c7.scout.client.ScoutUtilClient; + +@Environment(EnvType.CLIENT) +@Mixin(value = ScreenHandler.class, priority = 950) +public abstract class ScreenHandlerMixin { + @Inject(method = "getSlot", at = @At("HEAD"), cancellable = true) + public void scout$fixGetSlot(int index, CallbackInfoReturnable cir) { + var playerScreenHandler = ScoutUtilClient.getPlayerScreenHandler(); + if (ScoutUtil.isBagSlot(index)) { + if (playerScreenHandler != null) { + cir.setReturnValue(ScoutUtil.getBagSlot(index, playerScreenHandler)); + } else { + cir.setReturnValue(null); + } + } + } +}