package matteroverdrive.tile.pipes; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import matteroverdrive.tile.MOTileEntity; import matteroverdrive.util.math.MOMathHelper; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; public abstract class TileEntityPipe<T extends TileEntity> extends MOTileEntity { private boolean needsUpdate = true; private int connections = 0; @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { connections = pkt.func_148857_g().getInteger("Connections"); worldObj.markBlockRangeForRenderUpdate(xCoord,yCoord,zCoord,xCoord,yCoord,zCoord); } @Override public Packet getDescriptionPacket() { NBTTagCompound tagCompound = new NBTTagCompound(); tagCompound.setInteger("Connections",connections); return new S35PacketUpdateTileEntity(xCoord,yCoord,zCoord,0,tagCompound); } @Override public void updateEntity() { if(needsUpdate) { updateSides(true); needsUpdate = false; } } public void updateSides(boolean notify) { int connections = 0; for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { TileEntity t = this.worldObj.getTileEntity(direction.offsetX + this.xCoord,direction.offsetY + this.yCoord,direction.offsetZ + this.zCoord); if(canConnectTo(t,direction)) { connections |= direction.flag; } } this.setConnections(connections,notify); } public int getConnectionsMask() { return connections; } public void setConnections(int connections,boolean notify) { this.connections = connections; worldObj.markBlockForUpdate(xCoord,yCoord,zCoord); } public abstract boolean canConnectTo(TileEntity entity,ForgeDirection direction); public void queueUpdate() { needsUpdate = true; } public boolean isConnectableSide(ForgeDirection dir) { return MOMathHelper.getBoolean(connections,dir.ordinal()); } @SideOnly(Side.CLIENT) public AxisAlignedBB getRenderBoundingBox() { return AxisAlignedBB.getBoundingBox(xCoord,yCoord,zCoord,xCoord+1,yCoord+1,zCoord+1); } @Override public void onNeighborBlockChange() { queueUpdate(); } }