blob: c4e60e754e075970a39c0ae667941c88830f01b3 [file] [log] [blame] [raw]
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);
}
}