ModTweaker/src/api/java/WayofTime/alchemicalWizardry/api/alchemy/energy/ReagentContainer.java
2015-01-11 21:59:45 +02:00

154 lines
3.3 KiB
Java

package WayofTime.alchemicalWizardry.api.alchemy.energy;
import net.minecraft.nbt.NBTTagCompound;
public class ReagentContainer implements IReagentContainer
{
protected ReagentStack reagentStack;
protected int capacity;
public ReagentContainer(int capacity)
{
this(null, capacity);
}
public ReagentContainer(ReagentStack stack, int capacity)
{
this.reagentStack = stack;
this.capacity = capacity;
}
public ReagentContainer(Reagent reagent, int amount, int capacity)
{
this(new ReagentStack(reagent, amount), capacity);
}
public static ReagentContainer readFromNBT(NBTTagCompound nbt)
{
ReagentStack reagent = ReagentStack.loadReagentStackFromNBT(nbt);
int capacity = nbt.getInteger("capacity");
if (reagent != null)
{
return new ReagentContainer(reagent, capacity);
} else
{
return new ReagentContainer(null, capacity);
}
}
public NBTTagCompound writeToNBT(NBTTagCompound nbt)
{
if (reagentStack != null)
{
reagentStack.writeToNBT(nbt);
}
nbt.setInteger("capacity", capacity);
return nbt;
}
@Override
public ReagentStack getReagent()
{
return reagentStack;
}
@Override
public int getReagentStackAmount()
{
if (reagentStack == null)
{
return 0;
}
return reagentStack.amount;
}
@Override
public int getCapacity()
{
return capacity;
}
@Override
public int fill(ReagentStack resource, boolean doFill)
{
if (resource == null)
{
return 0;
}
if (!doFill)
{
if (reagentStack == null)
{
return Math.min(capacity, resource.amount);
}
if (!reagentStack.isReagentEqual(resource))
{
return 0;
}
return Math.min(capacity - reagentStack.amount, resource.amount);
}
if (reagentStack == null)
{
reagentStack = new ReagentStack(resource, Math.min(capacity, resource.amount));
return reagentStack.amount;
}
if (!reagentStack.isReagentEqual(resource))
{
return 0;
}
int filled = capacity - reagentStack.amount;
if (resource.amount < filled)
{
reagentStack.amount += resource.amount;
filled = resource.amount;
} else
{
reagentStack.amount = capacity;
}
return filled;
}
@Override
public ReagentStack drain(int maxDrain, boolean doDrain)
{
if (reagentStack == null)
{
return null;
}
int drained = maxDrain;
if (reagentStack.amount < drained)
{
drained = reagentStack.amount;
}
ReagentStack stack = new ReagentStack(reagentStack, drained);
if (doDrain)
{
reagentStack.amount -= drained;
if (reagentStack.amount <= 0)
{
reagentStack = null;
}
}
return stack;
}
@Override
public ReagentContainerInfo getInfo()
{
return new ReagentContainerInfo(this);
}
}