From 9c8ec065ff21c685dd4263f3f9ca96a1b867c2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20G=C3=BCttinger?= <38906805+Luca-Guettinger@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:15:27 +0200 Subject: [PATCH] allow scrolling in adventure backpacks --- .../client/gui/GuiWithTanks.java | 26 ++++++++++--------- .../inventory/ContainerAdventure.java | 1 + .../inventory/ContainerBackpack.java | 2 +- .../inventory/ContainerCopter.java | 2 +- .../inventory/ContainerJetpack.java | 2 +- .../META-INF/adventurebackpack_at.cfg | 3 ++- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/darkona/adventurebackpack/client/gui/GuiWithTanks.java b/src/main/java/com/darkona/adventurebackpack/client/gui/GuiWithTanks.java index 2099e97e..95556da6 100644 --- a/src/main/java/com/darkona/adventurebackpack/client/gui/GuiWithTanks.java +++ b/src/main/java/com/darkona/adventurebackpack/client/gui/GuiWithTanks.java @@ -9,6 +9,8 @@ import com.darkona.adventurebackpack.common.Constants.Source; import com.darkona.adventurebackpack.config.Keybindings; import com.darkona.adventurebackpack.init.ModNetwork; +import com.darkona.adventurebackpack.inventory.ContainerAdventure; +import com.darkona.adventurebackpack.inventory.SlotFluid; import com.darkona.adventurebackpack.network.EquipUnequipBackWearablePacket; import com.darkona.adventurebackpack.reference.LoadedMods; import com.darkona.adventurebackpack.util.TConstructTab; @@ -68,19 +70,19 @@ protected void keyTyped(char key, int keycode) { @Override public void handleMouseInput() { - if (Mouse.getEventDWheel() != 0) { - int i = Mouse.getEventX() * this.width / this.mc.displayWidth; - int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; - int marginX = (width - xSize) / 2; - int marginY = (height - ySize) / 2; - - if (i > marginX && i < marginX + xSize) { - if (j > marginY && j < marginY + ySize) { - return; - // forbid mouseWheel when mouse over our GUI, - // Shift+Wheel on stacks of fluid containers places them to clients bucket slots, causes desync - } + if (Mouse.getEventDWheel() != 0 && theSlot instanceof SlotFluid) { + return; // fluid slot processing is server-only, scroll would desync + } + + // skip fluid slot routing on scroll so containers go to regular inventory client-side + if (Mouse.getEventDWheel() != 0 && inventorySlots instanceof ContainerAdventure) { + ((ContainerAdventure) inventorySlots).skipFluidSlots = true; + try { + super.handleMouseInput(); + } finally { + ((ContainerAdventure) inventorySlots).skipFluidSlots = false; } + return; } super.handleMouseInput(); diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java index f4626640..0dfb4e77 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerAdventure.java @@ -28,6 +28,7 @@ public abstract class ContainerAdventure extends Container { private final int[] fluidsAmount; private int itemsCount; private boolean requestedUpdate; + public boolean skipFluidSlots; protected ContainerAdventure(EntityPlayer player, IInventoryTanks inventory, Source source) { this.player = player; diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java index c41d4ff8..5e3b0dc0 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerBackpack.java @@ -113,7 +113,7 @@ private void syncCraftResultToServer() { protected boolean transferStackToPack(ItemStack stack) { if (SlotTool.isValidTool(stack)) { if (!mergeToolSlot(stack)) if (SlotBackpack.isValidItem(stack)) return mergeBackpackInv(stack); - } else if (SlotFluid.isContainer(stack) && !isHoldingSpace()) { + } else if (SlotFluid.isContainer(stack) && !isHoldingSpace() && !skipFluidSlots) { return transferFluidContainer(stack); } else if (SlotBackpack.isValidItem(stack)) { return mergeBackpackInv(stack); diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java index fa90417e..ae3fc64c 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerCopter.java @@ -29,7 +29,7 @@ private void makeSlots(InventoryPlayer invPlayer) { @Override public boolean transferStackToPack(ItemStack stack) { - if (SlotFluid.isContainer(stack)) { + if (SlotFluid.isContainer(stack) && !skipFluidSlots) { FluidTank fuelTank = ((InventoryCopterPack) inventory).getFuelTank(); ItemStack stackOut = getSlot(COPTER_INV_START + 1).getStack(); diff --git a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java index 212e03c6..b34002f8 100644 --- a/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java +++ b/src/main/java/com/darkona/adventurebackpack/inventory/ContainerJetpack.java @@ -45,7 +45,7 @@ protected boolean detectItemChanges() { @Override public boolean transferStackToPack(ItemStack stack) { - if (SlotFluid.isContainer(stack)) { + if (SlotFluid.isContainer(stack) && !skipFluidSlots) { FluidTank waterTank = ((InventoryCoalJetpack) inventory).getWaterTank(); ItemStack stackOut = getSlot(JETPACK_INV_START + 1).getStack(); diff --git a/src/main/resources/META-INF/adventurebackpack_at.cfg b/src/main/resources/META-INF/adventurebackpack_at.cfg index a9371e12..55444389 100644 --- a/src/main/resources/META-INF/adventurebackpack_at.cfg +++ b/src/main/resources/META-INF/adventurebackpack_at.cfg @@ -1 +1,2 @@ -protected net.minecraft.inventory.InventoryCrafting field_70466_a # stackList \ No newline at end of file +protected net.minecraft.inventory.InventoryCrafting field_70466_a # stackList +protected net.minecraft.client.gui.inventory.GuiContainer field_147006_u # theSlot \ No newline at end of file