package mekanism.common.content.boiler;
import java.util.List;
import mekanism.api.Coord4D;
import mekanism.api.util.StackUtils;
import mekanism.common.Mekanism;
import mekanism.common.MekanismBlocks;
import mekanism.common.content.boiler.SynchronizedBoilerData.ValveData;
import mekanism.common.multiblock.MultiblockCache;
import mekanism.common.multiblock.MultiblockManager;
import mekanism.common.multiblock.UpdateProtocol;
import mekanism.common.tile.TileEntityBoiler;
import mekanism.common.tile.TileEntityBoilerValve;
import net.minecraft.item.ItemStack;
public class BoilerUpdateProtocol extends UpdateProtocol<SynchronizedBoilerData>
{
public static final int WATER_PER_TANK = 16000;
public static final int STEAM_PER_TANK = 160000;
public BoilerUpdateProtocol(TileEntityBoiler tileEntity)
{
super(tileEntity);
}
@Override
protected boolean isValidFrame(int x, int y, int z)
{
return pointer.getWorldObj().getBlock(x, y, z) == MekanismBlocks.BasicBlock2 && pointer.getWorldObj().getBlockMetadata(x, y, z) == 1;
}
@Override
protected BoilerCache getNewCache()
{
return new BoilerCache();
}
@Override
protected SynchronizedBoilerData getNewStructure()
{
return new SynchronizedBoilerData();
}
@Override
protected MultiblockManager<SynchronizedBoilerData> getManager()
{
return Mekanism.boilerManager;
}
@Override
protected void mergeCaches(List<ItemStack> rejectedItems, MultiblockCache<SynchronizedBoilerData> cache, MultiblockCache<SynchronizedBoilerData> merge)
{
if(((BoilerCache)cache).water == null)
{
((BoilerCache)cache).water = ((BoilerCache)merge).water;
}
else if(((BoilerCache)merge).water != null && ((BoilerCache)cache).water.isFluidEqual(((BoilerCache)merge).water))
{
((BoilerCache)cache).water.amount += ((BoilerCache)merge).water.amount;
}
if(((BoilerCache)cache).steam == null)
{
((BoilerCache)cache).steam = ((BoilerCache)merge).steam;
}
else if(((BoilerCache)merge).steam != null && ((BoilerCache)cache).steam.isFluidEqual(((BoilerCache)merge).steam))
{
((BoilerCache)cache).steam.amount += ((BoilerCache)merge).steam.amount;
}
List<ItemStack> rejects = StackUtils.getMergeRejects(((BoilerCache)cache).inventory, ((BoilerCache)merge).inventory);
if(!rejects.isEmpty())
{
rejectedItems.addAll(rejects);
}
StackUtils.merge(((BoilerCache)cache).inventory, ((BoilerCache)merge).inventory);
}
@Override
protected void onFormed()
{
if((structureFound).waterStored != null)
{
(structureFound).waterStored.amount = Math.min((structureFound).waterStored.amount, structureFound.volume*WATER_PER_TANK);
}
if((structureFound).steamStored != null)
{
(structureFound).steamStored.amount = Math.min((structureFound).waterStored.amount, structureFound.volume*STEAM_PER_TANK);
}
}
@Override
protected void onStructureCreated(SynchronizedBoilerData structure, int origX, int origY, int origZ, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
{
for(Coord4D obj : structure.locations)
{
if(obj.getTileEntity(pointer.getWorldObj()) instanceof TileEntityBoilerValve)
{
ValveData data = new ValveData();
data.location = obj;
data.side = getSide(obj, origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax);
structure.valves.add(data);
}
}
}
}