diff --git a/src/main/java/pm/c7/scout/client/ScoutClient.java b/src/main/java/pm/c7/scout/client/ScoutClient.java index 4d89373..013f6ca 100644 --- a/src/main/java/pm/c7/scout/client/ScoutClient.java +++ b/src/main/java/pm/c7/scout/client/ScoutClient.java @@ -5,12 +5,11 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; import net.fabricmc.fabric.api.client.rendering.v1.TooltipComponentCallback; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.ingame.ShulkerBoxScreen; import net.minecraft.entity.EntityType; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.util.collection.DefaultedList; @@ -120,83 +119,114 @@ public class ScoutClient implements ClientModInitializer { return; } - var handledScreenAccessor = (HandledScreenAccessor) handledScreen; + var handledScreenAccessor = (HandledScreenAccessor) handledScreen; + ScreenHandler handler = handledScreenAccessor.getHandler(); - var sx = handledScreenAccessor.getX(); - var sy = handledScreenAccessor.getY(); - var sw = handledScreenAccessor.getBackgroundWidth(); - var sh = handledScreenAccessor.getBackgroundHeight(); + var playerInventory = client.player.getInventory(); + + int x = 0; + int y = 0; // satchel - int x = sx; - int y = sy + sh + 2; + var _hotbarSlot1 = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 0).findFirst(); + Slot hotbarSlot1 = _hotbarSlot1.isPresent() ? _hotbarSlot1.get() : null; + if (hotbarSlot1 != null) { + if (!hotbarSlot1.isEnabled()) { + for (int i = 0; i < ScoutUtil.MAX_SATCHEL_SLOTS; i++) { + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.SATCHEL_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(Integer.MAX_VALUE); + slot.setY(Integer.MAX_VALUE); + } + } + } else { + x = hotbarSlot1.x; + y = hotbarSlot1.y + 27; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; - } + for (int i = 0; i < ScoutUtil.MAX_SATCHEL_SLOTS; i++) { + if (i % 9 == 0) { + x = hotbarSlot1.x; + } - for (int i = 0; i < ScoutUtil.MAX_SATCHEL_SLOTS; i++) { - if (i % 9 == 0) { - x = sx + 8; - } + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.SATCHEL_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(x); + slot.setY(y); + } - BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.SATCHEL_SLOT_START - i, client.player.playerScreenHandler); - if (slot != null) { - slot.setX(x - sx); - slot.setY(y - sy); - } + x += 18; - x += 18; - - if ((i + 1) % 9 == 0) { - y += 18; + if ((i + 1) % 9 == 0) { + y += 18; + } + } } } // left pouch - x = sx + 8; - y = (sy + sh) - 100; + var _topLeftSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 9).findFirst(); + Slot topLeftSlot = _topLeftSlot.isPresent() ? _topLeftSlot.get() : null; + if (topLeftSlot != null) { + if (!topLeftSlot.isEnabled()) { + for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.LEFT_POUCH_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(Integer.MAX_VALUE); + slot.setY(Integer.MAX_VALUE); + } + } + } else { + x = topLeftSlot.x; + y = topLeftSlot.y - 18; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; - } + for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { + if (i % 3 == 0) { + x -= 18; + y += 54; + } - for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { - if (i % 3 == 0) { - x -= 18; - y += 54; + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.LEFT_POUCH_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(x); + slot.setY(y); + } + + y -= 18; + } } - - BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.LEFT_POUCH_SLOT_START - i, client.player.playerScreenHandler); - if (slot != null) { - slot.setX(x - sx); - slot.setY(y - sy); - } - - y -= 18; } // right pouch - x = sx + sw - 24; - y = (sy + sh) - 100; + var _topRightSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 17).findFirst(); + Slot topRightSlot = _topRightSlot.isPresent() ? _topRightSlot.get() : null; + if (topRightSlot != null) { + if (!topLeftSlot.isEnabled()) { + for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.RIGHT_POUCH_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(Integer.MAX_VALUE); + slot.setY(Integer.MAX_VALUE); + } + } + } else { + x = topRightSlot.x; + y = topRightSlot.y - 18; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; - } + for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { + if (i % 3 == 0) { + x += 18; + y += 54; + } - for (int i = 0; i < ScoutUtil.MAX_POUCH_SLOTS; i++) { - if (i % 3 == 0) { - x += 18; - y += 54; + BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.RIGHT_POUCH_SLOT_START - i, client.player.playerScreenHandler); + if (slot != null) { + slot.setX(x); + slot.setY(y); + } + + y -= 18; + } } - - BagSlot slot = (BagSlot) ScoutUtil.getBagSlot(ScoutUtil.RIGHT_POUCH_SLOT_START - i, client.player.playerScreenHandler); - if (slot != null) { - slot.setX(x - sx); - slot.setY(y - sy); - } - - y -= 18; } } }); diff --git a/src/main/java/pm/c7/scout/client/ScoutUtilClient.java b/src/main/java/pm/c7/scout/client/ScoutUtilClient.java index 5414039..d4e3cc9 100644 --- a/src/main/java/pm/c7/scout/client/ScoutUtilClient.java +++ b/src/main/java/pm/c7/scout/client/ScoutUtilClient.java @@ -4,9 +4,7 @@ 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 { @@ -21,8 +19,6 @@ public class ScoutUtilClient { // 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 + return screen instanceof CreativeInventoryScreen; } } diff --git a/src/main/java/pm/c7/scout/client/compat/ScoutEmiPlugin.java b/src/main/java/pm/c7/scout/client/compat/ScoutEmiPlugin.java index c97d824..669a181 100644 --- a/src/main/java/pm/c7/scout/client/compat/ScoutEmiPlugin.java +++ b/src/main/java/pm/c7/scout/client/compat/ScoutEmiPlugin.java @@ -4,10 +4,10 @@ import dev.emi.emi.api.EmiPlugin; import dev.emi.emi.api.EmiRegistry; import dev.emi.emi.api.widget.Bounds; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.ingame.ShulkerBoxScreen; import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; import pm.c7.scout.ScoutUtil; import pm.c7.scout.client.ScoutUtilClient; import pm.c7.scout.item.BaseBagItem; @@ -23,30 +23,34 @@ public class ScoutEmiPlugin implements EmiPlugin { MinecraftClient client = MinecraftClient.getInstance(); - var handledScreenAccessor = (HandledScreenAccessor) handledScreen; - + var handledScreenAccessor = (HandledScreenAccessor) handledScreen; + ScreenHandler handler = handledScreenAccessor.getHandler(); var sx = handledScreenAccessor.getX(); var sy = handledScreenAccessor.getY(); var sw = handledScreenAccessor.getBackgroundWidth(); var sh = handledScreenAccessor.getBackgroundHeight(); + var playerInventory = client.player.getInventory(); + ItemStack satchelStack = ScoutUtil.findBagItem(client.player, BagType.SATCHEL, false); if (!satchelStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) satchelStack.getItem(); int slots = bagItem.getSlotCount(); int rows = (int) Math.ceil(slots / 9); - int x = sx; - int y = sy + sh; + var _hotbarSlot1 = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 0).findFirst(); + Slot hotbarSlot1 = _hotbarSlot1.isPresent() ? _hotbarSlot1.get() : null; + if (hotbarSlot1 != null) { + if (hotbarSlot1.isEnabled()) { + int x = sx + hotbarSlot1.x - 8; + int y = sy + hotbarSlot1.y + 22; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; + int w = 176; + int h = (rows * 18) + 8; + + consumer.accept(new Bounds(x, y, w, h)); + } } - - int w = sw; - int h = (rows * 18) + 8; - - consumer.accept(new Bounds(x, y, w, h)); } ItemStack leftPouchStack = ScoutUtil.findBagItem(client.player, BagType.POUCH, false); @@ -55,17 +59,19 @@ public class ScoutEmiPlugin implements EmiPlugin { int slots = bagItem.getSlotCount(); int columns = (int) Math.ceil(slots / 3); - int x = sx - (columns * 18); - int y = (sy + sh) - 100; + var _topLeftSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 9).findFirst(); + Slot topLeftSlot = _topLeftSlot.isPresent() ? _topLeftSlot.get() : null; + if (topLeftSlot != null) { + if (topLeftSlot.isEnabled()) { + int x = sx + topLeftSlot.x - 7 - (columns * 18); + int y = sy + topLeftSlot.y; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; + int w = (columns * 18) + 7; + int h = 68; + + consumer.accept(new Bounds(x, y, w, h)); + } } - - int w = (columns * 18); - int h = 68; - - consumer.accept(new Bounds(x, y, w, h)); } ItemStack rightPouchStack = ScoutUtil.findBagItem(client.player, BagType.POUCH, true); @@ -74,17 +80,19 @@ public class ScoutEmiPlugin implements EmiPlugin { int slots = bagItem.getSlotCount(); int columns = (int) Math.ceil(slots / 3); - int x = sx + sw; - int y = (sy + sh) - 100; + var _topRightSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 17).findFirst(); + Slot topRightSlot = _topRightSlot.isPresent() ? _topRightSlot.get() : null; + if (topRightSlot != null) { + if (topRightSlot.isEnabled()) { + int x = sx + topRightSlot.x; + int y = sy + topRightSlot.y; - if (screen instanceof GenericContainerScreen || screen instanceof ShulkerBoxScreen) { - y -= 1; + int w = (columns * 18) + 7; + int h = 68; + + consumer.accept(new Bounds(x, y, w, h)); + } } - - int w = (columns * 18); - int h = 68; - - consumer.accept(new Bounds(x, y, w, h)); } }); } diff --git a/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java b/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java index b6e13ef..7cd7968 100644 --- a/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java +++ b/src/main/java/pm/c7/scout/mixin/ScreenHandlerMixin.java @@ -9,6 +9,7 @@ import net.minecraft.screen.slot.SlotActionType; import net.minecraft.util.collection.DefaultedList; import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Dynamic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -45,6 +46,7 @@ public abstract class ScreenHandlerMixin { } } + @Dynamic("Workaround for Debugify. Other calls are modified via the attached transformer class.") @Redirect(method = "internalOnSlotClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/collection/DefaultedList;get(I)Ljava/lang/Object;", ordinal = 5)) public Object scout$fixSlotIndexing(DefaultedList self, int index, int slotIndex, int button, SlotActionType actionType, PlayerEntity player) { if (ScoutUtil.isBagSlot(index)) { diff --git a/src/main/java/pm/c7/scout/mixin/client/HandledScreenAccessor.java b/src/main/java/pm/c7/scout/mixin/client/HandledScreenAccessor.java index 77ab6d2..6bd0056 100644 --- a/src/main/java/pm/c7/scout/mixin/client/HandledScreenAccessor.java +++ b/src/main/java/pm/c7/scout/mixin/client/HandledScreenAccessor.java @@ -3,12 +3,14 @@ package pm.c7.scout.mixin.client; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.screen.ScreenHandler; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Environment(EnvType.CLIENT) @Mixin(HandledScreen.class) -public interface HandledScreenAccessor { +public interface HandledScreenAccessor { @Accessor("x") int getX(); @Accessor("y") @@ -17,4 +19,6 @@ public interface HandledScreenAccessor { int getBackgroundWidth(); @Accessor("backgroundHeight") int getBackgroundHeight(); + @Accessor("handler") + T getHandler(); } 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 db5d5bb..f9b952a 100644 --- a/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java +++ b/src/main/java/pm/c7/scout/mixin/client/HandledScreenMixin.java @@ -4,10 +4,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider; -import net.minecraft.client.gui.screen.ingame.ShulkerBoxScreen; import net.minecraft.item.ItemStack; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; @@ -43,54 +41,58 @@ public abstract class HandledScreenMixin extends Screen protected int backgroundWidth; @Shadow protected int backgroundHeight; + @Shadow + protected T handler; @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 && !ScoutUtilClient.isScreenBlacklisted(this)) { + var playerInventory = this.client.player.getInventory(); + ItemStack backStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.SATCHEL, false); if (!backStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) backStack.getItem(); int slots = bagItem.getSlotCount(); - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + var _hotbarSlot1 = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 0).findFirst(); + Slot hotbarSlot1 = _hotbarSlot1.isPresent() ? _hotbarSlot1.get() : null; + if (hotbarSlot1 != null) { + int x = this.x + hotbarSlot1.x - 8; + int y = this.y + hotbarSlot1.y + 22; - int x = this.x; - int y = this.y + this.backgroundHeight - 3; + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - if ((Object) this instanceof GenericContainerScreen || (Object) this instanceof ShulkerBoxScreen) { - y -= 1; - } + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 32, 176, 4); + y += 4; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 32, 176, 4); - y += 4; + int u = 0; + int v = 36; - int u = 0; - int v = 36; + for (int slot = 0; slot < slots; slot++) { + if (slot % 9 == 0) { + x = this.x + hotbarSlot1.x - 8; + u = 0; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 7, 18); + x += 7; + u += 7; + } - for (int slot = 0; slot < slots; slot++) { - if (slot % 9 == 0) { - x = this.x; - u = 0; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 7, 18); - x += 7; - u += 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 18, 18); + + x += 18; + u += 18; + + if ((slot + 1) % 9 == 0) { + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 7, 18); + y += 18; + } } - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 18, 18); + x = this.x + hotbarSlot1.x - 8; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 54, 176, 7); - x += 18; - u += 18; - - if ((slot + 1) % 9 == 0) { - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, u, v, 7, 18); - y += 18; - } + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); } - - x = this.x; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 54, 176, 7); - - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); } } } @@ -98,70 +100,72 @@ 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 && !ScoutUtilClient.isScreenBlacklisted(this)) { + var playerInventory = this.client.player.getInventory(); + ItemStack leftPouchStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.POUCH, false); if (!leftPouchStack.isEmpty()) { BaseBagItem bagItem = (BaseBagItem) leftPouchStack.getItem(); int slots = bagItem.getSlotCount(); int columns = (int) Math.ceil(slots / 3); - int x = this.x; - int y = (this.y + this.backgroundHeight) - 29; + var _topLeftSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 9).findFirst(); + Slot topLeftSlot = _topLeftSlot.isPresent() ? _topLeftSlot.get() : null; + if (topLeftSlot != null) { + int x = this.x + topLeftSlot.x - 8; + int y = this.y + topLeftSlot.y + 53; - if ((Object) this instanceof GenericContainerScreen || (Object) this instanceof ShulkerBoxScreen) { - y -= 1; - } + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 18, 25, 7, 7); - for (int i = 0; i < columns; i++) { - x -= 11; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 11, 7); - } - if (columns > 1) { - for (int i = 0; i < columns - 1; i++) { - x -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 7, 7); + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 18, 25, 7, 7); + for (int i = 0; i < columns; i++) { + x -= 11; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 11, 7); } - } - x -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 25, 7, 7); - - x = this.x + 7; - y -= 54; - for (int slot = 0; slot < slots; slot++) { - if (slot % 3 == 0) { - x -= 18; - y += 54; + if (columns > 1) { + for (int i = 0; i < columns - 1; i++) { + x -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 7, 7); + } } - y -= 18; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 7, 18, 18); - } + x -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 25, 7, 7); - x -= 7; - y += 54; - for (int i = 0; i < 3; i++) { - y -= 18; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 7, 7, 18); - } - - x = this.x; - y -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 18, 0, 7, 7); - for (int i = 0; i < columns; i++) { - x -= 11; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 11, 7); - } - if (columns > 1) { - for (int i = 0; i < columns - 1; i++) { - x -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 7, 7); + x = this.x + topLeftSlot.x - 1; + y -= 54; + for (int slot = 0; slot < slots; slot++) { + if (slot % 3 == 0) { + x -= 18; + y += 54; + } + y -= 18; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 7, 18, 18); } - } - x -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 0, 7, 7); - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + x -= 7; + y += 54; + for (int i = 0; i < 3; i++) { + y -= 18; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 7, 7, 18); + } + + x = this.x + topLeftSlot.x - 8; + y -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 18, 0, 7, 7); + for (int i = 0; i < columns; i++) { + x -= 11; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 11, 7); + } + if (columns > 1) { + for (int i = 0; i < columns - 1; i++) { + x -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 7, 7); + } + } + x -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 0, 0, 7, 7); + + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + } } ItemStack rightPouchStack = ScoutUtil.findBagItem(this.client.player, BaseBagItem.BagType.POUCH, true); @@ -170,64 +174,64 @@ public abstract class HandledScreenMixin extends Screen int slots = bagItem.getSlotCount(); int columns = (int) Math.ceil(slots / 3); - int x = this.x + this.backgroundWidth - 7; - int y = (this.y + this.backgroundHeight) - 29; + var _topRightSlot = handler.slots.stream().filter(slot->slot.inventory.equals(playerInventory) && slot.getIndex() == 17).findFirst(); + Slot topRightSlot = _topRightSlot.isPresent() ? _topRightSlot.get() : null; + if (topRightSlot != null) { + int x = this.x + topRightSlot.x + 17; + int y = this.y + topRightSlot.y + 53; - if ((Object) this instanceof GenericContainerScreen || (Object) this instanceof ShulkerBoxScreen) { - y -= 1; - } + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 25, 25, 7, 7); - x += 7; - for (int i = 0; i < columns; i++) { - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 11, 7); - x += 11; - } - if (columns > 1) { - for (int i = 0; i < columns - 1; i++) { - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 7, 7); - x += 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 25, 25, 7, 7); + x += 7; + for (int i = 0; i < columns; i++) { + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 11, 7); + x += 11; } - } - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 25, 7, 7); - - x = this.x + this.backgroundWidth - 25; - y -= 54; - for (int slot = 0; slot < slots; slot++) { - if (slot % 3 == 0) { - x += 18; - y += 54; + if (columns > 1) { + for (int i = 0; i < columns - 1; i++) { + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 25, 7, 7); + x += 7; + } } - y -= 18; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 7, 18, 18); - } + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 25, 7, 7); - x += 18; - y += 54; - for (int i = 0; i < 3; i++) { - y -= 18; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 7, 7, 18); - } - - x = this.x + this.backgroundWidth - 7; - y -= 7; - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 25, 0, 7, 7); - x += 7; - for (int i = 0; i < columns; i++) { - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 11, 7); - x += 11; - } - if (columns > 1) { - for (int i = 0; i < columns - 1; i++) { - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 7, 7); - x += 7; + x = this.x + topRightSlot.x - 1; + y -= 54; + for (int slot = 0; slot < slots; slot++) { + if (slot % 3 == 0) { + x += 18; + y += 54; + } + y -= 18; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 7, 18, 18); } - } - graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 0, 7, 7); - graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + x += 18; + y += 54; + for (int i = 0; i < 3; i++) { + y -= 18; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 7, 7, 18); + } + + x = this.x + topRightSlot.x + 17; + y -= 7; + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 25, 0, 7, 7); + x += 7; + for (int i = 0; i < columns; i++) { + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 11, 7); + x += 11; + } + if (columns > 1) { + for (int i = 0; i < columns - 1; i++) { + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 7, 0, 7, 7); + x += 7; + } + } + graphics.drawTexture(ScoutUtil.SLOT_TEXTURE, x, y, 32, 0, 7, 7); + + graphics.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + } } } }