allow draining tank tower from an empty tank above (#359)

Co-authored-by: Martin Robertz <dream-master@gmx.net>
Co-authored-by: boubou19 <miisterunknown@gmail.com>
This commit is contained in:
authored and GitHub committed 2025-12-16 19:08:46 +00:00
1 parent f24e014bd7
commit 95dad4d305
3 files changed
+47 -23

No files matched your search

@@ -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;
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 (fluid.getFluid() != tankAbove.getFluid()) {
if (tankAbove.getFluid() == null || mainTank.getFluid() != tankAbove.getFluid()) {
break;
}
mainTank = tankAbove;
}
return mainTank.drain(fluid, doDrain, false);
} 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;
}
}
}
FluidStack drainedFluid = this.tank.drain(fluid.amount, doDrain);
return mainTank.drain(fluid, amount, doDrain, false);
}
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;
}
@@ -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;
@@ -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));