package WayofTime.alchemicalWizardry.api.alchemy.energy; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; public class TileSegmentedReagentHandler extends TileEntity implements ISegmentedReagentHandler { protected ReagentContainer[] tanks; protected Map attunedTankMap; public TileSegmentedReagentHandler() { this(1); } public TileSegmentedReagentHandler(int numberOfTanks) { this(numberOfTanks, 1000); } public TileSegmentedReagentHandler(int numberOfTanks, int tankSize) { super(); this.attunedTankMap = new HashMap(); this.tanks = new ReagentContainer[numberOfTanks]; for(int i=0; i entry : this.attunedTankMap.entrySet()) { NBTTagCompound savedTag = new NBTTagCompound(); savedTag.setString("reagent", ReagentRegistry.getKeyForReagent(entry.getKey())); savedTag.setInteger("amount", entry.getValue()); attunedTagList.appendTag(savedTag); } tag.setTag("attunedTankMap", attunedTagList); } /* ISegmentedReagentHandler */ @Override public int fill(ForgeDirection from, ReagentStack resource, boolean doFill) { int totalFill = 0; boolean useTankLimit = !this.attunedTankMap.isEmpty(); if(resource != null) { int totalTanksFillable = useTankLimit ? this.getTanksTunedToReagent(resource.reagent) : this.tanks.length; int tanksFilled = 0; int maxFill = resource.amount; for(int i=this.tanks.length-1; i>=0; i--) { ReagentStack remainingStack = resource.copy(); remainingStack.amount = maxFill - totalFill; boolean doesReagentMatch = tanks[i].getReagent() == null ? false : tanks[i].getReagent().isReagentEqual(remainingStack); if(doesReagentMatch) { totalFill += tanks[i].fill(remainingStack, doFill); tanksFilled++; }else { continue; } if(totalFill >= maxFill || tanksFilled >= totalTanksFillable) { return totalFill; } } if(tanksFilled >= totalTanksFillable) { return totalFill; } for(int i=this.tanks.length-1; i>=0; i--) { ReagentStack remainingStack = resource.copy(); remainingStack.amount = maxFill - totalFill; boolean isTankEmpty = tanks[i].getReagent() == null; if(isTankEmpty) { totalFill += tanks[i].fill(remainingStack, doFill); tanksFilled++; }else { continue; } if(totalFill >= maxFill || tanksFilled >= totalTanksFillable) { return totalFill; } } } return totalFill; } @Override public ReagentStack drain(ForgeDirection from, ReagentStack resource, boolean doDrain) { if(resource == null) { return null; } int maxDrain = resource.amount; Reagent reagent = resource.reagent; int drained = 0; for(int i=0; i= maxDrain) { break; } if(resource.isReagentEqual(tanks[i].getReagent())) { ReagentStack drainStack = tanks[i].drain(maxDrain-drained, doDrain); if(drainStack != null) { drained += drainStack.amount; } } } return new ReagentStack(reagent, drained); } /* Only returns the amount from the first available tank */ @Override public ReagentStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { for(int i=0; i getAttunedTankMap() { return this.attunedTankMap; } public boolean areTanksEmpty() { for(int i=0; i