From 8b1dff3f21d79c3f8c157cf44aaabd84947d7fff Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Fri, 6 Dec 2024 19:30:11 +0100 Subject: [PATCH] Fix pattern dividing (#246) Co-authored-by: Martin Robertz --- .../client/gui/base/FCGuiEncodeTerminal.java | 4 +- .../ContainerFluidPatternTerminal.java | 4 +- .../base/FCContainerEncodeTerminal.java | 115 +++++++++++------- .../network/CPacketFluidPatternTermBtns.java | 13 +- 4 files changed, 81 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java b/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java index 13cdac56..5bce694e 100644 --- a/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/base/FCGuiEncodeTerminal.java @@ -5,6 +5,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.glodblock.github.FluidCraft; @@ -116,10 +117,11 @@ public abstract class FCGuiEncodeTerminal extends GuiItemMonitor { "PatternTerminal.Combine", this.combineDisableBtn == btn ? "1" : "0")); } else if (ModAndClassUtil.isDoubleButton && doubleBtn == btn) { + final int eventButton = Mouse.getEventButton(); FluidCraft.proxy.netHandler.sendToServer( new CPacketFluidPatternTermBtns( "PatternTerminal.Double", - Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? "1" : "0")); + (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? "1" : "0") + (eventButton == 1 ? "1" : "0"))); } else if (ModAndClassUtil.isBeSubstitutionsButton && beSubstitutionsDisabledBtn == btn) { FluidCraft.proxy.netHandler .sendToServer(new CPacketFluidPatternTermBtns("PatternTerminal.beSubstitute", "1")); diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPatternTerminal.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPatternTerminal.java index 7dadc7e3..798624d2 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPatternTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPatternTerminal.java @@ -153,9 +153,9 @@ public class ContainerFluidPatternTerminal extends FCContainerEncodeTerminal { } @Override - public void doubleStacks(boolean isShift) { + public void doubleStacks(boolean isShift, boolean divide) { if (!isCraftingMode()) { - super.doubleStacks(isShift); + super.doubleStacks(isShift, divide); } } } diff --git a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java index 6f47be0d..8ab459ae 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/container/base/FCContainerEncodeTerminal.java @@ -537,57 +537,82 @@ public abstract class FCContainerEncodeTerminal extends ContainerItemMonitor return false; } - static boolean canDouble(SlotFake[] slots, int mult) { - for (Slot s : slots) { - ItemStack st = s.getStack(); - if (st != null) { - if (st.getItem() instanceof ItemFluidPacket) { - long result = (long) ItemFluidPacket.getFluidAmount(st) * mult; - if (result > Integer.MAX_VALUE) { - return false; - } - } else { - long result = (long) s.getStack().stackSize * mult; - if (result > Integer.MAX_VALUE) { - return false; - } - } - } - } - return true; - } - - static void doubleStacksInternal(SlotFake[] slots, int mult) { - List enabledSlots = Arrays.stream(slots).filter(SlotFake::isEnabled).collect(Collectors.toList()); - for (final Slot s : enabledSlots) { - ItemStack st = s.getStack(); - if (st != null) { - if (st.getItem() instanceof ItemFluidPacket) { - ItemFluidPacket.setFluidAmount(st, ItemFluidPacket.getFluidAmount(st) * mult); - } else { - st.stackSize *= mult; - } - } - } - } - - public void doubleStacks(boolean isShift) { + public void doubleStacks(boolean isShift, boolean divide) { if (!isCraftingMode()) { - if (isShift) { - if (canDouble(this.craftingSlots, 8) && canDouble(this.outputSlots, 8)) { - doubleStacksInternal(this.craftingSlots, 8); - doubleStacksInternal(this.outputSlots, 8); - } - } else { - if (canDouble(this.craftingSlots, 2) && canDouble(this.outputSlots, 2)) { - doubleStacksInternal(this.craftingSlots, 2); - doubleStacksInternal(this.outputSlots, 2); - } + final int mult = (isShift ? 8 : 2) * (divide ? -1 : 1); + if (canMultiplyOrDivide(this.craftingSlots, mult) && canMultiplyOrDivide(this.outputSlots, mult)) { + multiplyOrDivideStacksInternal(this.craftingSlots, mult); + multiplyOrDivideStacksInternal(this.outputSlots, mult); } this.detectAndSendChanges(); } } + static boolean canMultiplyOrDivide(SlotFake[] slots, int mult) { + if (mult > 0) { + for (Slot s : slots) { + ItemStack st = s.getStack(); + if (st == null) continue; + final long count; + if (st.getItem() instanceof ItemFluidPacket) { + count = ItemFluidPacket.getFluidAmount(st); + } else { + count = s.getStack().stackSize; + } + long result = count * mult; + if (result > Integer.MAX_VALUE) { + return false; + } + } + return true; + } else if (mult < 0) { + mult = Math.abs(mult); + for (Slot s : slots) { + ItemStack st = s.getStack(); + if (st == null) continue; + final int count; + if (st.getItem() instanceof ItemFluidPacket) { + count = ItemFluidPacket.getFluidAmount(st); + } else { + count = s.getStack().stackSize; + } + if (count % mult != 0) { + return false; + } + } + return true; + } + return false; + } + + static void multiplyOrDivideStacksInternal(SlotFake[] slots, int mult) { + List enabledSlots = Arrays.stream(slots).filter(SlotFake::isEnabled).collect(Collectors.toList()); + if (mult > 0) { + for (final Slot s : enabledSlots) { + ItemStack st = s.getStack(); + if (st != null) { + if (st.getItem() instanceof ItemFluidPacket) { + ItemFluidPacket.setFluidAmount(st, ItemFluidPacket.getFluidAmount(st) * mult); + } else { + st.stackSize *= mult; + } + } + } + } else if (mult < 0) { + mult = Math.abs(mult); + for (final Slot s : enabledSlots) { + ItemStack st = s.getStack(); + if (st != null) { + if (st.getItem() instanceof ItemFluidPacket) { + ItemFluidPacket.setFluidAmount(st, ItemFluidPacket.getFluidAmount(st) / mult); + } else { + st.stackSize /= mult; + } + } + } + } + } + @Override public void acceptPattern(IAEItemStack[] inputs, IAEItemStack[] outputs) { if (this.patternTerminal != null) { diff --git a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java index 92138255..8af7d79d 100644 --- a/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java +++ b/src/main/java/com/glodblock/github/network/CPacketFluidPatternTermBtns.java @@ -77,23 +77,22 @@ public class CPacketFluidPatternTermBtns implements IMessage { case "PatternTerminal.Clear" -> cpt.clear(); case "PatternTerminal.Substitute" -> cpt.getPatternTerminal().setSubstitution(Value.equals("1")); case "PatternTerminal.Invert" -> cpt.getPatternTerminal().setInverted(Value.equals("1")); - case "PatternTerminal.Double" -> cpt.doubleStacks(Value.equals("1")); + case "PatternTerminal.Double" -> cpt.doubleStacks(Value.charAt(0) == '1', Value.charAt(1) == '1'); case "PatternTerminal.Combine" -> cpt.getPatternTerminal().setCombineMode(Value.equals("1")); case "PatternTerminal.beSubstitute" -> cpt.getPatternTerminal().setBeSubstitute(Value.equals("1")); - case "PatternTerminal.ActivePage" -> cpt.getPatternTerminal() - .setActivePage(Integer.parseInt(Value)); + case "PatternTerminal.ActivePage" -> + cpt.getPatternTerminal().setActivePage(Integer.parseInt(Value)); case "PatternTerminal.Prioritize" -> { switch (Value) { case "0", "1" -> cpt.getPatternTerminal().setPrioritization(Value.equals("1")); case "2" -> cpt.getPatternTerminal().sortCraftingItems(); } } - case "PatternTerminal.AutoFillerPattern" -> cpt.getPatternTerminal() - .setAutoFillPattern(Value.equals("1")); + case "PatternTerminal.AutoFillerPattern" -> + cpt.getPatternTerminal().setAutoFillPattern(Value.equals("1")); } cpt.getPatternTerminal().saveSettings(); - } else if (Name.startsWith("StorageBus.") && c instanceof ContainerFluidStorageBus) { - final ContainerFluidStorageBus ccw = (ContainerFluidStorageBus) c; + } else if (Name.startsWith("StorageBus.") && c instanceof ContainerFluidStorageBus ccw) { if (Name.equals("StorageBus.Action")) { if (Value.equals("Partition")) { ccw.partition();