From 161e38cbda299f8f64860fb0aa9653016f48cfd7 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Sat, 25 Feb 2023 22:06:29 +0800 Subject: [PATCH] fix fluid dupe from simulate drain --- .../gui/container/ContainerFluidMonitor.java | 32 +++++++++++++------ .../common/parts/PartFluidExportBus.java | 16 ++++------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidMonitor.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidMonitor.java index 68786d71..86dd44db 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidMonitor.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidMonitor.java @@ -224,26 +224,38 @@ public class ContainerFluidMonitor extends FCContainerMonitor { MutablePair fillStack = Util.FluidUtil.fillStack(out, toExtract.getFluidStack()); if (fillStack.right == null || fillStack.left <= 0) continue; toExtract.setStackSize((long) fillStack.left * fluidContainer.stackSize); - IAEFluidStack tmp = this.host.getFluidInventory() - .extractItems(toExtract, Actionable.SIMULATE, this.getActionSource()); - if (tmp == null) continue; - fillStack.right.stackSize = (int) (tmp.getStackSize() / fillStack.left); - this.dropItem(fillStack.right); - out.stackSize = fillStack.right.stackSize; + // The real result may don't match simulation result. if (fillStack.right.getItem() instanceof IFluidContainerItem) { - this.host.getFluidInventory().extractItems(toExtract, Actionable.MODULATE, this.getActionSource()); - if ((int) (tmp.getStackSize() % fillStack.left) > 0) { + IAEFluidStack real = this.host.getFluidInventory() + .extractItems(toExtract, Actionable.MODULATE, this.getActionSource()); + if (real == null) continue; + // Refill the container + out = fluidContainer.copy(); + out.stackSize = 1; + fillStack = Util.FluidUtil.fillStack(out, real.getFluidStack()); + fillStack.right.stackSize = (int) (real.getStackSize() / fillStack.left); + out.stackSize = fillStack.right.stackSize; + if ((int) (real.getStackSize() % fillStack.left) > 0) { this.dropItem( Util.FluidUtil.setFluidContainerAmount( fillStack.right, - (int) (tmp.getStackSize() % fillStack.left)), + (int) (real.getStackSize() % fillStack.left)), 1); out.stackSize++; } } else if (FluidContainerRegistry.isContainer(fillStack.right)) { + IAEFluidStack real = this.host.getFluidInventory() + .extractItems(toExtract, Actionable.MODULATE, this.getActionSource()); + if (real == null) continue; + // Refill the container + out = fluidContainer.copy(); + out.stackSize = 1; + fillStack = Util.FluidUtil.fillStack(out, real.getFluidStack()); + fillStack.right.stackSize = (int) (real.getStackSize() / fillStack.left); + out.stackSize = fillStack.right.stackSize; toExtract.setStackSize((long) fillStack.right.stackSize * fillStack.left); - this.host.getFluidInventory().extractItems(toExtract, Actionable.MODULATE, this.getActionSource()); } + this.dropItem(fillStack.right); } else if (!Util.FluidUtil.isEmpty(fluidContainer)) { // add fluid to ae network AEFluidStack fluidStack = Util.getAEFluidFromItem(fluidContainer); diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java b/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java index 93d4bbeb..b7f7d478 100644 --- a/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java @@ -110,17 +110,15 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq this.source); } - final IAEFluidStack out = inv.extractItems(toExtract, Actionable.SIMULATE, this.source); + final IAEFluidStack real = inv.extractItems(toExtract, Actionable.MODULATE, this.source); - if (out != null && isAllowed) { - int wasInserted = fh.fill(this.getSide().getOpposite(), out.getFluidStack(), true); - - if (wasInserted > 0) { - toExtract.setStackSize(wasInserted); - inv.extractItems(toExtract, Actionable.MODULATE, this.source); - - return TickRateModulation.FASTER; + if (real != null && isAllowed) { + int realInserted = fh.fill(this.getSide().getOpposite(), real.getFluidStack(), true); + if (realInserted < real.getStackSize()) { + toExtract.setStackSize(real.getStackSize() - realInserted); + inv.injectItems(toExtract, Actionable.MODULATE, this.source); } + return TickRateModulation.FASTER; } if (this.isCraftingEnabled()) {