package advancedsystemsmanager.compatibility.rf; import advancedsystemsmanager.api.network.IPacketBlock; import advancedsystemsmanager.network.ASMPacket; import advancedsystemsmanager.tileentities.TileEntityCluster; import advancedsystemsmanager.tileentities.TileEntityElementBase; import cofh.api.energy.IEnergyProvider; import cofh.api.energy.IEnergyReceiver; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityRFNode extends TileEntityElementBase implements IEnergyProvider, IEnergyReceiver, IPacketBlock { private static final int SIDES = 6; public static int MAX_BUFFER = 96000; private static final String STORED = "Stored"; private static final String SIDES_TAG = "Sides"; private short sides = 0xFFF; private int stored; @Override public void updateEntity() { super.updateEntity(); if (!worldObj.isRemote) { for (int i = 0; i < SIDES; i++) { ForgeDirection dir = ForgeDirection.getOrientation(i); TileEntity te = getTileEntity(dir); if (te != null && !(te instanceof TileEntityRFNode || te instanceof TileEntityCluster)) { if (isInput(i) && te instanceof IEnergyProvider) { int amount = ((IEnergyProvider) te).extractEnergy(dir.getOpposite(), MAX_BUFFER - stored, false); this.receiveEnergy(dir, amount, false); } if (isOutput(i) && te instanceof IEnergyReceiver) { int amount = ((IEnergyReceiver) te).receiveEnergy(dir.getOpposite(), stored, false); this.extractEnergy(dir, amount, false); } } } } } private TileEntity getTileEntity(ForgeDirection dir) { return worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); } public void cycleSide(int side) { side *= 2; int cur = sides >> side & 3; cur += 3; cur %= 4; sides &= ~(3 << side); sides |= cur << side; markForRenderUpdate(); } public int getIconIndex(int side) { return (sides >> side * 2) & 3; } @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { if (isInput(from.ordinal())) { int toReceive = Math.min(maxReceive, MAX_BUFFER - stored); if (!simulate) stored += toReceive; return toReceive; } return 0; } @Override public void writeToTileNBT(NBTTagCompound tagCompound) { tagCompound.setInteger(STORED, stored); tagCompound.setShort(SIDES_TAG, sides); } @Override public void readFromTileNBT(NBTTagCompound tagCompound) { stored = tagCompound.getInteger(STORED); sides = tagCompound.getShort(SIDES_TAG); } @Override public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { if (isOutput(from.ordinal())) { int toExtract = Math.min(maxExtract, stored); if (!simulate) stored -= toExtract; return toExtract; } return 0; } @Override public int getEnergyStored(ForgeDirection from) { return stored; } @Override public int getMaxEnergyStored(ForgeDirection from) { return MAX_BUFFER; } @Override public boolean canConnectEnergy(ForgeDirection from) { return (sides & (3 << from.ordinal() * 2)) != 0; } public boolean isInput(int side) { return (sides & (2 << side * 2)) != 0; } public boolean isOutput(int side) { return (sides & (1 << side * 2)) != 0; } @Override public void writeClientSyncData(ASMPacket packet) { super.writeClientSyncData(packet); packet.writeShort(sides); } @Override public void readClientSyncData(ASMPacket packet) { super.readClientSyncData(packet); sides = packet.readShort(); } }