217 lines
4.4 KiB
Java
217 lines
4.4 KiB
Java
package mekanism.api.gas;
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
/**
|
|
* An optional way of managing and/or storing gasses. Would be very useful in TileEntity and Entity gas storage.
|
|
* @author aidancbrady
|
|
*
|
|
*/
|
|
public class GasTank
|
|
{
|
|
public GasStack stored;
|
|
|
|
private int maxGas;
|
|
|
|
private GasTank() {}
|
|
|
|
/**
|
|
* Creates a tank with a defined capacity.
|
|
* @param max - the maximum amount of gas this GasTank can hold
|
|
*/
|
|
public GasTank(int max)
|
|
{
|
|
maxGas = max;
|
|
}
|
|
|
|
/**
|
|
* Sets this tank's GasStack value to a new value. Will cap the amount to this GasTank's capacity.
|
|
* @param stack - value to set this tank's GasStack value to
|
|
*/
|
|
public void setGas(GasStack stack)
|
|
{
|
|
stored = stack;
|
|
|
|
if(stored != null)
|
|
{
|
|
stored.amount = Math.min(getMaxGas(), stored.amount);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Draws a specified amount of gas out of this tank.
|
|
* @param amount - amount to draw
|
|
* @param doDraw - if the gas should actually be removed from this tank
|
|
* @return gas taken from this GasTank as a GasStack value
|
|
*/
|
|
public GasStack draw(int amount, boolean doDraw)
|
|
{
|
|
if(stored == null || amount <= 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
GasStack ret = new GasStack(getGas().getGas(), Math.min(getStored(), amount));
|
|
|
|
if(ret.amount > 0)
|
|
{
|
|
if(doDraw)
|
|
{
|
|
stored.amount -= ret.amount;
|
|
|
|
if(stored.amount <= 0)
|
|
{
|
|
stored = null;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Adds a specified amount of gas to this tank.
|
|
* @param amount - the GasStack for this tank to receive
|
|
* @param doReceive - if the gas should actually be added to this tank
|
|
* @return the amount of gas accepted by this tank
|
|
*/
|
|
public int receive(GasStack amount, boolean doReceive)
|
|
{
|
|
if(amount == null || (stored != null && stored.amount == getMaxGas()))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int toFill = Math.min(getMaxGas()-getStored(), amount.amount);
|
|
|
|
if(doReceive)
|
|
{
|
|
if(stored == null)
|
|
{
|
|
stored = amount;
|
|
}
|
|
else {
|
|
stored.amount = Math.min(getMaxGas(), getStored()+amount.amount);
|
|
}
|
|
}
|
|
|
|
return toFill;
|
|
}
|
|
|
|
/**
|
|
* If this GasTank can receive the specified type of gas. Will return false if this tank does not need anymore gas.
|
|
* @param gas - gas to check
|
|
* @return if this GasTank can accept the defined gas
|
|
*/
|
|
public boolean canReceive(Gas gas)
|
|
{
|
|
if(getNeeded() == 0 || stored != null && (gas != null && gas != stored.getGas()))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* If this GasTank can be drawn of the specified type of gas. Will return false if this tank does not contain any gas.
|
|
* @param gas - gas to check
|
|
* @return if this GasTank can be drawn of the defined gas
|
|
*/
|
|
public boolean canDraw(Gas gas)
|
|
{
|
|
if(stored == null || (gas != null && gas != stored.getGas()))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Gets the amount of gas needed by this GasTank.
|
|
* @return
|
|
*/
|
|
public int getNeeded()
|
|
{
|
|
return getMaxGas()-getStored();
|
|
}
|
|
|
|
/**
|
|
* Gets the maximum amount of gas this tank can hold.
|
|
* @return - max gas
|
|
*/
|
|
public int getMaxGas()
|
|
{
|
|
return maxGas;
|
|
}
|
|
|
|
/**
|
|
* Gets the GasStack held by this GasTank.
|
|
* @return - GasStakc held by this tank
|
|
*/
|
|
public GasStack getGas()
|
|
{
|
|
return stored;
|
|
}
|
|
|
|
/**
|
|
* Gets the amount of gas stored by this GasTank.
|
|
* @return amount of gas stored
|
|
*/
|
|
public int getStored()
|
|
{
|
|
return stored != null ? stored.amount : 0;
|
|
}
|
|
|
|
/**
|
|
* Writes this tank to a defined tag compound.
|
|
* @param nbtTags - tag compound to write to
|
|
* @return tag compound with this tank's data
|
|
*/
|
|
public NBTTagCompound write(NBTTagCompound nbtTags)
|
|
{
|
|
if(stored != null)
|
|
{
|
|
nbtTags.setCompoundTag("stored", stored.write(new NBTTagCompound()));
|
|
}
|
|
|
|
nbtTags.setInteger("maxGas", maxGas);
|
|
|
|
return nbtTags;
|
|
}
|
|
|
|
/**
|
|
* Reads this tank's data from a defined tag compound.
|
|
* @param nbtTags - tag compound to read from
|
|
*/
|
|
public void read(NBTTagCompound nbtTags)
|
|
{
|
|
if(nbtTags.hasKey("stored"))
|
|
{
|
|
stored = GasStack.readFromNBT(nbtTags.getCompoundTag("stored"));
|
|
}
|
|
|
|
maxGas = nbtTags.getInteger("maxGas");
|
|
}
|
|
|
|
/**
|
|
* Returns the tank stored in the defined tag compound, or null if it doesn't exist.
|
|
* @param nbtTags - tag compound to read from
|
|
* @return tank stored in the tag compound
|
|
*/
|
|
public static GasTank readFromNBT(NBTTagCompound nbtTags)
|
|
{
|
|
if(nbtTags == null || nbtTags.hasNoTags())
|
|
{
|
|
return null;
|
|
}
|
|
|
|
GasTank tank = new GasTank();
|
|
tank.read(nbtTags);
|
|
|
|
return tank;
|
|
}
|
|
}
|