package mekanism.common.content.matrix;
import java.util.List;
import mekanism.api.Coord4D;
import mekanism.api.util.StackUtils;
import mekanism.common.Mekanism;
import mekanism.common.MekanismBlocks;
import mekanism.common.multiblock.MultiblockCache;
import mekanism.common.multiblock.MultiblockManager;
import mekanism.common.multiblock.UpdateProtocol;
import mekanism.common.tile.TileEntityInductionCasing;
import mekanism.common.tile.TileEntityInductionCell;
import mekanism.common.tile.TileEntityInductionProvider;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
public class MatrixUpdateProtocol extends UpdateProtocol<SynchronizedMatrixData>
{
public MatrixUpdateProtocol(TileEntityInductionCasing tileEntity)
{
super(tileEntity);
}
@Override
protected boolean isValidFrame(int x, int y, int z)
{
IBlockState state = pointer.getWorld().getBlockState(new BlockPos(x, y, z));
return state.getBlock() == MekanismBlocks.BasicBlock2 && state.getBlock().getMetaFromState(state) == 1;
}
@Override
public boolean isValidInnerNode(int x, int y, int z)
{
TileEntity tile = new Coord4D(x, y, z, pointer.getWorld().provider.getDimension()).getTileEntity(pointer.getWorld());
if(tile != null && (tile instanceof TileEntityInductionCell || tile instanceof TileEntityInductionProvider))
{
return true;
}
return isAir(x, y, z);
}
@Override
protected MatrixCache getNewCache()
{
return new MatrixCache();
}
@Override
protected SynchronizedMatrixData getNewStructure()
{
return new SynchronizedMatrixData();
}
@Override
protected MultiblockManager<SynchronizedMatrixData> getManager()
{
return Mekanism.matrixManager;
}
@Override
protected void mergeCaches(List<ItemStack> rejectedItems, MultiblockCache<SynchronizedMatrixData> cache, MultiblockCache<SynchronizedMatrixData> merge)
{
List<ItemStack> rejects = StackUtils.getMergeRejects(((MatrixCache)cache).inventory, ((MatrixCache)merge).inventory);
if(!rejects.isEmpty())
{
rejectedItems.addAll(rejects);
}
StackUtils.merge(((MatrixCache)cache).inventory, ((MatrixCache)merge).inventory);
}
@Override
protected boolean canForm(SynchronizedMatrixData structure)
{
for(Coord4D coord : innerNodes)
{
TileEntity tile = coord.getTileEntity(pointer.getWorld());
if(tile instanceof TileEntityInductionCell)
{
structure.cells.add(coord);
structure.storageCap += ((TileEntityInductionCell)tile).tier.maxEnergy;
}
else if(tile instanceof TileEntityInductionProvider)
{
structure.providers.add(coord);
structure.transferCap += ((TileEntityInductionProvider)tile).tier.output;
}
}
return true;
}
}