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.item.ItemStack; import net.minecraft.tileentity.TileEntity; public class MatrixUpdateProtocol extends UpdateProtocol<SynchronizedMatrixData> { public MatrixUpdateProtocol(TileEntityInductionCasing 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 public boolean isValidInnerNode(int x, int y, int z) { TileEntity tile = pointer.getWorldObj().getTileEntity(x, y, z); 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 void onFormed() { for(Coord4D coord : innerNodes) { TileEntity tile = coord.getTileEntity(pointer.getWorldObj()); if(tile instanceof TileEntityInductionCell) { structureFound.cells.add(coord); structureFound.storageCap += ((TileEntityInductionCell)tile).tier.maxEnergy; } else if(tile instanceof TileEntityInductionProvider) { structureFound.providers.add(coord); structureFound.outputCap += ((TileEntityInductionProvider)tile).tier.output; } } } }