package mekanism.common.content.boiler; import mekanism.api.Coord4D; import mekanism.common.content.boiler.SynchronizedBoilerData.ValveData; import mekanism.common.tile.TileEntityBoiler; import mekanism.common.util.MekanismUtils; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidTank; public abstract class BoilerTank implements IFluidTank { public TileEntityBoiler steamBoiler; public BoilerTank(TileEntityBoiler tileEntity) { steamBoiler = tileEntity; } public abstract void setFluid(FluidStack stack); @Override public int getCapacity() { return steamBoiler.structure != null ? steamBoiler.structure.volume * BoilerUpdateProtocol.WATER_PER_TANK : 0; } @Override public int fill(FluidStack resource, boolean doFill) { if(steamBoiler.structure != null && !steamBoiler.getWorldObj().isRemote) { if(resource == null || resource.fluidID <= 0) { return 0; } if(getFluid() == null || getFluid().fluidID <= 0) { if(resource.amount <= getCapacity()) { if(doFill) { setFluid(resource.copy()); } if(resource.amount > 0 && doFill) { MekanismUtils.saveChunk(steamBoiler); updateValveData(true); steamBoiler.sendPacketToRenderer(); updateValveData(false); } return resource.amount; } else { if(doFill) { setFluid(resource.copy()); getFluid().amount = getCapacity(); } if(getCapacity() > 0 && doFill) { MekanismUtils.saveChunk(steamBoiler); updateValveData(true); steamBoiler.sendPacketToRenderer(); updateValveData(false); } return getCapacity(); } } if(!getFluid().isFluidEqual(resource)) { return 0; } int space = getCapacity() - getFluid().amount; if(resource.amount <= space) { if(doFill) { getFluid().amount += resource.amount; } if(resource.amount > 0 && doFill) { MekanismUtils.saveChunk(steamBoiler); updateValveData(true); steamBoiler.sendPacketToRenderer(); updateValveData(false); } return resource.amount; } else { if(doFill) { getFluid().amount = getCapacity(); } if(space > 0 && doFill) { MekanismUtils.saveChunk(steamBoiler); updateValveData(true); steamBoiler.sendPacketToRenderer(); updateValveData(false); } return space; } } return 0; } public void updateValveData(boolean value) { if(steamBoiler.structure != null) { for(ValveData data : steamBoiler.structure.valves) { if(data.location.equals(Coord4D.get(steamBoiler))) { data.serverFluid = value; } } } } @Override public FluidStack drain(int maxDrain, boolean doDrain) { if(steamBoiler.structure != null && !steamBoiler.getWorldObj().isRemote) { if(getFluid() == null || getFluid().fluidID <= 0) { return null; } if(getFluid().amount <= 0) { return null; } int used = maxDrain; if(getFluid().amount < used) { used = getFluid().amount; } if(doDrain) { getFluid().amount -= used; } FluidStack drained = new FluidStack(getFluid().fluidID, used); if(getFluid().amount <= 0) { setFluid(null); } if(drained.amount > 0 && doDrain) { MekanismUtils.saveChunk(steamBoiler); steamBoiler.sendPacketToRenderer(); } return drained; } return null; } @Override public int getFluidAmount() { if(steamBoiler.structure != null) { return getFluid().amount; } return 0; } @Override public FluidTankInfo getInfo() { return new FluidTankInfo(this); } }