2013-09-29 19:38:20 -07:00
|
|
|
package tconstruct.library.component;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2013-10-09 22:21:19 -07:00
|
|
|
import java.util.List;
|
2013-09-29 19:38:20 -07:00
|
|
|
|
2013-10-01 19:44:04 -07:00
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
|
import net.minecraft.nbt.NBTTagList;
|
2013-09-29 19:38:20 -07:00
|
|
|
import net.minecraftforge.fluids.FluidStack;
|
|
|
|
|
import net.minecraftforge.fluids.FluidTankInfo;
|
|
|
|
|
import net.minecraftforge.fluids.IFluidTank;
|
2013-10-09 22:21:19 -07:00
|
|
|
import tconstruct.library.crafting.Smeltery;
|
2013-09-29 19:38:20 -07:00
|
|
|
|
|
|
|
|
public class MultiFluidTank extends LogicComponent implements IFluidTank
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
public ArrayList<FluidStack> fluidlist = new ArrayList<FluidStack>();
|
|
|
|
|
protected int maxLiquid;
|
|
|
|
|
protected int currentLiquid;
|
|
|
|
|
|
|
|
|
|
public MultiFluidTank()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public MultiFluidTank(int max)
|
|
|
|
|
{
|
|
|
|
|
maxLiquid = max;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setCapacity (int i)
|
|
|
|
|
{
|
|
|
|
|
maxLiquid = i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getCapacity ()
|
|
|
|
|
{
|
|
|
|
|
return maxLiquid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getFluidAmount ()
|
|
|
|
|
{
|
|
|
|
|
return currentLiquid;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-29 19:38:20 -07:00
|
|
|
@Override
|
|
|
|
|
public FluidStack drain (int maxDrain, boolean doDrain)
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
if (fluidlist.size() == 0)
|
2013-09-29 19:38:20 -07:00
|
|
|
return null;
|
|
|
|
|
|
2013-10-01 19:44:04 -07:00
|
|
|
FluidStack liquid = fluidlist.get(0);
|
2013-09-29 19:38:20 -07:00
|
|
|
if (liquid != null)
|
|
|
|
|
{
|
|
|
|
|
if (liquid.amount - maxDrain <= 0)
|
|
|
|
|
{
|
|
|
|
|
FluidStack liq = liquid.copy();
|
|
|
|
|
if (doDrain)
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
fluidlist.remove(liquid);
|
2013-09-29 19:38:20 -07:00
|
|
|
currentLiquid = 0;
|
|
|
|
|
}
|
|
|
|
|
return liq;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (doDrain)
|
|
|
|
|
{
|
|
|
|
|
liquid.amount -= maxDrain;
|
|
|
|
|
currentLiquid -= maxDrain;
|
|
|
|
|
}
|
|
|
|
|
return new FluidStack(liquid.fluidID, maxDrain, liquid.tag);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return new FluidStack(0, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int fill (FluidStack resource, boolean doFill)
|
|
|
|
|
{
|
|
|
|
|
if (resource != null && currentLiquid < maxLiquid)
|
|
|
|
|
{
|
|
|
|
|
if (resource.amount + currentLiquid > maxLiquid)
|
|
|
|
|
resource.amount = maxLiquid - currentLiquid;
|
|
|
|
|
int amount = resource.amount;
|
|
|
|
|
|
|
|
|
|
if (doFill)
|
|
|
|
|
{
|
|
|
|
|
if (addFluidToTank(resource, false))
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
ArrayList alloys = Smeltery.mixMetals(fluidlist);
|
2013-09-29 19:38:20 -07:00
|
|
|
for (int al = 0; al < alloys.size(); al++)
|
|
|
|
|
{
|
|
|
|
|
FluidStack liquid = (FluidStack) alloys.get(al);
|
|
|
|
|
addFluidToTank(liquid, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return amount;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-01 19:44:04 -07:00
|
|
|
public boolean addFluidToTank (FluidStack liquid, boolean first)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
if (fluidlist.size() == 0)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
fluidlist.add(liquid.copy());
|
2013-09-29 19:38:20 -07:00
|
|
|
currentLiquid += liquid.amount;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (liquid.amount + currentLiquid > maxLiquid)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
currentLiquid += liquid.amount;
|
|
|
|
|
boolean added = false;
|
2013-10-01 19:44:04 -07:00
|
|
|
for (int i = 0; i < fluidlist.size(); i++)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
FluidStack l = fluidlist.get(i);
|
2013-09-29 19:38:20 -07:00
|
|
|
if (l.isFluidEqual(liquid))
|
|
|
|
|
{
|
|
|
|
|
l.amount += liquid.amount;
|
|
|
|
|
added = true;
|
|
|
|
|
}
|
|
|
|
|
if (l.amount <= 0)
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
fluidlist.remove(l);
|
2013-09-29 19:38:20 -07:00
|
|
|
i--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!added)
|
|
|
|
|
{
|
|
|
|
|
if (first)
|
2013-10-01 19:44:04 -07:00
|
|
|
fluidlist.add(0, liquid.copy());
|
2013-09-29 19:38:20 -07:00
|
|
|
else
|
2013-10-01 19:44:04 -07:00
|
|
|
fluidlist.add(liquid.copy());
|
2013-09-29 19:38:20 -07:00
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public FluidStack getFluid ()
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
if (fluidlist.size() == 0)
|
2013-09-29 19:38:20 -07:00
|
|
|
return null;
|
2013-10-01 19:44:04 -07:00
|
|
|
return fluidlist.get(0);
|
2013-09-29 19:38:20 -07:00
|
|
|
}
|
2013-10-10 00:55:50 -07:00
|
|
|
|
|
|
|
|
public List<FluidStack> getAllFluids ()
|
2013-10-09 22:21:19 -07:00
|
|
|
{
|
|
|
|
|
return fluidlist;
|
|
|
|
|
}
|
2013-09-29 19:38:20 -07:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public FluidTankInfo getInfo ()
|
|
|
|
|
{
|
|
|
|
|
return new FluidTankInfo(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public FluidTankInfo[] getMultiTankInfo ()
|
|
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
FluidTankInfo[] info = new FluidTankInfo[fluidlist.size() + 1];
|
|
|
|
|
for (int i = 0; i < fluidlist.size(); i++)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
FluidStack fluid = fluidlist.get(i);
|
2013-09-29 19:38:20 -07:00
|
|
|
info[i] = new FluidTankInfo(fluid.copy(), fluid.amount);
|
|
|
|
|
}
|
2013-10-01 19:44:04 -07:00
|
|
|
info[fluidlist.size()] = new FluidTankInfo(null, maxLiquid - currentLiquid);
|
2013-09-29 19:38:20 -07:00
|
|
|
return info;
|
|
|
|
|
}
|
2013-10-10 00:55:50 -07:00
|
|
|
|
2013-10-07 20:49:55 -07:00
|
|
|
/* Sync liquids */
|
2013-09-29 19:38:20 -07:00
|
|
|
|
|
|
|
|
@Override
|
2013-10-07 20:49:55 -07:00
|
|
|
public void readNetworkNBT (NBTTagCompound tags)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
NBTTagList liquidTag = tags.getTagList("Liquids");
|
|
|
|
|
fluidlist.clear();
|
|
|
|
|
|
|
|
|
|
for (int iter = 0; iter < liquidTag.tagCount(); iter++)
|
|
|
|
|
{
|
|
|
|
|
NBTTagCompound nbt = (NBTTagCompound) liquidTag.tagAt(iter);
|
|
|
|
|
FluidStack fluid = FluidStack.loadFluidStackFromNBT(nbt);
|
2013-10-10 00:55:50 -07:00
|
|
|
if (fluid != null)
|
|
|
|
|
fluidlist.add(fluid);
|
2013-10-01 19:44:04 -07:00
|
|
|
}
|
2013-09-29 19:38:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2013-10-07 20:49:55 -07:00
|
|
|
public void writeNetworkNBT (NBTTagCompound tags)
|
2013-09-29 19:38:20 -07:00
|
|
|
{
|
2013-10-01 19:44:04 -07:00
|
|
|
NBTTagList taglist = new NBTTagList();
|
|
|
|
|
for (FluidStack liquid : fluidlist)
|
|
|
|
|
{
|
|
|
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
|
|
|
liquid.writeToNBT(nbt);
|
|
|
|
|
taglist.appendTag(nbt);
|
|
|
|
|
}
|
2013-09-29 19:38:20 -07:00
|
|
|
|
2013-10-01 19:44:04 -07:00
|
|
|
tags.setTag("Liquids", taglist);
|
|
|
|
|
}
|
2013-09-29 19:38:20 -07:00
|
|
|
}
|