package storagecraft.tile; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; import storagecraft.storage.IStorage; import storagecraft.storage.IStorageProvider; import storagecraft.storage.StorageItem; public class TileController extends TileBase implements IEnergyReceiver, INetworkTile { private List items = new ArrayList(); private List storages = new ArrayList(); private List machines = new ArrayList(); private List visitedCables = new ArrayList(); private EnergyStorage energy = new EnergyStorage(32000); private int energyUsage; private boolean destroyed = false; @Override public void updateEntity() { super.updateEntity(); if (destroyed) { return; } if (!worldObj.isRemote) { if (ticks % 40 == 0) { if (!isActive()) { disconnectAll(); } else { visitedCables.clear(); List newMachines = new ArrayList(); for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { TileEntity tile = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); if (tile instanceof TileCable) { ((TileCable) tile).addMachines(visitedCables, newMachines, this); } } for (TileMachine machine : machines) { if (!newMachines.contains(machine)) { machine.onDisconnected(); } } for (TileMachine machine : newMachines) { if (!machines.contains(machine)) { machine.onConnected(this); } } machines = newMachines; storages.clear(); for (TileMachine machine : machines) { if (machine instanceof IStorageProvider) { ((IStorageProvider) machine).addStorages(storages); } } syncItems(); } energyUsage = 10; for (TileMachine machine : machines) { energyUsage += machine.getEnergyUsage(); } } energy.extractEnergy(energyUsage, false); } else { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } } public void onDestroyed() { disconnectAll(); destroyed = true; } private void disconnectAll() { for (TileMachine machine : machines) { machine.onDisconnected(); } machines.clear(); } public List getMachines() { return machines; } public List getItems() { return items; } private void syncItems() { items.clear(); for (IStorage storage : storages) { storage.addItems(items); } combineItems(); } private void combineItems() { List markedIndexes = new ArrayList(); for (int i = 0; i < items.size(); ++i) { if (markedIndexes.contains(i)) { continue; } StorageItem item = items.get(i); for (int j = i + 1; j < items.size(); ++j) { if (markedIndexes.contains(j)) { continue; } StorageItem other = items.get(j); if (item.getMeta().equals(other.getMeta())) { item.setQuantity(item.getQuantity() + other.getQuantity()); markedIndexes.add(j); } } } List markedItems = new ArrayList(); for (int i : markedIndexes) { markedItems.add(items.get(i)); } items.removeAll(markedItems); } public boolean push(ItemStack stack) { IStorage foundStorage = null; for (IStorage storage : storages) { if (storage.canPush(stack)) { foundStorage = storage; break; } } if (foundStorage == null) { return false; } foundStorage.push(stack); syncItems(); return true; } public ItemStack take(ItemStack stack) { int needed = stack.stackSize; int took = 0; for (IStorage storage : storages) { took += storage.take(stack); if (took == needed) { break; } } syncItems(); ItemStack newStack = stack.copy(); newStack.stackSize = took; return newStack; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); energy.readFromNBT(nbt); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); energy.writeToNBT(nbt); } @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { return energy.receiveEnergy(maxReceive, simulate); } @Override public int getEnergyStored(ForgeDirection from) { return energy.getEnergyStored(); } @Override public int getMaxEnergyStored(ForgeDirection from) { return energy.getMaxEnergyStored(); } public int getEnergyUsage() { return energyUsage; } @Override public boolean canConnectEnergy(ForgeDirection from) { return true; } public boolean isActive() { return energy.getEnergyStored() >= getEnergyUsage(); } @Override public void fromBytes(ByteBuf buf) { energy.setEnergyStored(buf.readInt()); energyUsage = buf.readInt(); items.clear(); int size = buf.readInt(); for (int i = 0; i < size; ++i) { Item type = Item.getItemById(buf.readInt()); int quantity = buf.readInt(); int damage = buf.readInt(); NBTTagCompound tag = buf.readBoolean() ? ByteBufUtils.readTag(buf) : null; items.add(new StorageItem(type, quantity, damage, tag)); } } @Override public void toBytes(ByteBuf buf) { buf.writeInt(energy.getEnergyStored()); buf.writeInt(energyUsage); buf.writeInt(items.size()); for (StorageItem item : items) { buf.writeInt(Item.getIdFromItem(item.getMeta().getType())); buf.writeInt(item.getQuantity()); buf.writeInt(item.getMeta().getDamage()); buf.writeBoolean(item.getMeta().getTag() != null); if (item.getMeta().getTag() != null) { ByteBufUtils.writeTag(buf, item.getMeta().getTag()); } } } }