From 95dad4d305cd939f4c9d522dd0ddc4c39c4e2c58 Mon Sep 17 00:00:00 2001 From: danyadev Date: Tue, 16 Dec 2025 22:08:46 +0300 Subject: [PATCH] allow draining tank tower from an empty tank above (#359) Co-authored-by: Martin Robertz Co-authored-by: boubou19 --- .../common/tile/TileCertusQuartzTank.java | 60 ++++++++++++------- .../CertusQuartzTankWailaDataProvider.java | 8 ++- .../github/crossmod/waila/Tooltip.java | 8 ++- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java index 5ddb08dc..fb4344aa 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java +++ b/src/main/java/com/glodblock/github/common/tile/TileCertusQuartzTank.java @@ -33,42 +33,57 @@ public class TileCertusQuartzTank extends TileEntity implements IFluidHandler { return tankFluid == null || tankFluid.amount == 0 ? 0 : tankFluid.getFluid().getLuminosity(tankFluid); } - public FluidStack drain(FluidStack fluid, boolean doDrain, boolean findMainTank) { - if (fluid == null || this.getFluid() == null || this.getFluid() != fluid.getFluid()) { + public FluidStack drain(Fluid fluid, int amount, boolean doDrain, boolean findMainTank) { + if (fluid != null && this.getFluid() != fluid) { return null; } if (findMainTank) { // Main tank is the highest tank in the column with desired fluid TileCertusQuartzTank mainTank = this; - TileCertusQuartzTank tankAbove; - while ((tankAbove = mainTank.getTankAbove()) != null) { - // We can't drain tank with different or null fluid - if (fluid.getFluid() != tankAbove.getFluid()) { - break; + if (this.tank.getFluid() != null) { + // Current tank has a fluid, searching for the highest tank with this fluid + TileCertusQuartzTank tankAbove; + while ((tankAbove = mainTank.getTankAbove()) != null) { + // We can't drain tank with different or null fluid + if (tankAbove.getFluid() == null || mainTank.getFluid() != tankAbove.getFluid()) { + break; + } + mainTank = tankAbove; + } + } else { + // Current tank doesn't have a fluid, searching for the first non-empty tank below + TileCertusQuartzTank tankBelow; + while ((tankBelow = mainTank.getTankBelow()) != null) { + // We can't drain tank with different fluid + if (fluid != null && tankBelow.getFluid() != fluid) { + break; + } + mainTank = tankBelow; + if (tankBelow.getFluid() != null) { + break; + } } - mainTank = tankAbove; } - return mainTank.drain(fluid, doDrain, false); + return mainTank.drain(fluid, amount, doDrain, false); } - FluidStack drainedFluid = this.tank.drain(fluid.amount, doDrain); + FluidStack drainedFluid = this.tank.drain(amount, doDrain); int drained = drainedFluid != null ? drainedFluid.amount : 0; if (drained > 0) { update(); } - if (drained < fluid.amount) { + if (drained < amount) { TileCertusQuartzTank tankBelow = this.getTankBelow(); if (tankBelow != null) { - FluidStack fluidToDrain = new FluidStack(fluid.getFluid(), fluid.amount - drained); - FluidStack externallyDrained = tankBelow.drain(fluidToDrain, doDrain, false); + FluidStack externallyDrained = tankBelow.drain(fluid, amount - drained, doDrain, false); if (externallyDrained != null) { - return new FluidStack(fluid.getFluid(), drained + externallyDrained.amount); + return new FluidStack(fluid, drained + externallyDrained.amount); } } } @@ -78,14 +93,14 @@ public class TileCertusQuartzTank extends TileEntity implements IFluidHandler { @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { - return drain(resource, doDrain, true); + if (resource == null) return null; + + return drain(resource.getFluid(), resource.amount, doDrain, true); } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { - if (this.tank.getFluid() == null) return null; - - return drain(from, new FluidStack(this.tank.getFluid(), maxDrain), doDrain); + return drain(null, maxDrain, true, true); } public int fill(FluidStack fluid, boolean doFill, boolean findMainTank) { @@ -174,14 +189,14 @@ public class TileCertusQuartzTank extends TileEntity implements IFluidHandler { } final FluidStack tankFluidStack = this.tank.getFluid(); - final Fluid mainFluid = tankFluidStack != null ? tankFluidStack.getFluid() : null; + Fluid mainFluid = tankFluidStack != null ? tankFluidStack.getFluid() : null; int amount = tankFluidStack == null ? 0 : tankFluidStack.amount; int capacity = this.tank.getCapacity(); TileCertusQuartzTank tankAbove = this; while ((tankAbove = tankAbove.getTankAbove()) != null) { - if (tankAbove.getFluid() == null || mainFluid != tankAbove.getFluid()) { + if (tankAbove.getFluid() != null && mainFluid != tankAbove.getFluid()) { break; } @@ -192,7 +207,10 @@ public class TileCertusQuartzTank extends TileEntity implements IFluidHandler { TileCertusQuartzTank tankBelow = this; while ((tankBelow = tankBelow.getTankBelow()) != null) { - if (mainFluid == null || mainFluid != tankBelow.getFluid()) { + if (mainFluid == null && tankBelow.getFluid() != null) { + mainFluid = tankBelow.getFluid(); + } + if (mainFluid != tankBelow.getFluid()) { break; } diff --git a/src/main/java/com/glodblock/github/crossmod/waila/CertusQuartzTankWailaDataProvider.java b/src/main/java/com/glodblock/github/crossmod/waila/CertusQuartzTankWailaDataProvider.java index 22e418f4..667b0c28 100644 --- a/src/main/java/com/glodblock/github/crossmod/waila/CertusQuartzTankWailaDataProvider.java +++ b/src/main/java/com/glodblock/github/crossmod/waila/CertusQuartzTankWailaDataProvider.java @@ -20,9 +20,11 @@ public class CertusQuartzTankWailaDataProvider extends BaseWailaDataProvider { TileEntity tileEntity = accessor.getTileEntity(); if (tileEntity instanceof TileCertusQuartzTank quartzTank) { FluidTankInfo info = quartzTank.getTankInfo(true)[0]; - if (info.fluid != null) { - currentToolTip - .add(Tooltip.fluidFormat(info.fluid.getLocalizedName(), info.fluid.amount, info.capacity)); + if (info.fluid == null) { + currentToolTip.add(Tooltip.tankEmptyFormat(info.capacity)); + } else { + currentToolTip.add( + Tooltip.tankWithFluidFormat(info.fluid.getLocalizedName(), info.fluid.amount, info.capacity)); } } return currentToolTip; diff --git a/src/main/java/com/glodblock/github/crossmod/waila/Tooltip.java b/src/main/java/com/glodblock/github/crossmod/waila/Tooltip.java index ff03c47a..202af0f6 100644 --- a/src/main/java/com/glodblock/github/crossmod/waila/Tooltip.java +++ b/src/main/java/com/glodblock/github/crossmod/waila/Tooltip.java @@ -15,14 +15,18 @@ public class Tooltip { return String.format("%s: %s mB", name, NumberFormat.getInstance().format(amount)); } - public static String fluidFormat(String name, long amount, long capacity) { + public static String tankWithFluidFormat(String fluidName, long amount, long capacity) { return String.format( "%s: %s mB / %s mB", - name, + fluidName, NumberFormat.getInstance().format(amount), NumberFormat.getInstance().format(capacity)); } + public static String tankEmptyFormat(long capacity) { + return String.format("0 mB / %s mB", NumberFormat.getInstance().format(capacity)); + } + public static String partFluidBusFormat(int amount) { return String .format("%s: %s mB/t", I18n.format(NameConst.WAILA_SPEED), NumberFormat.getInstance().format(amount));