@Override
  public void writeToNBT(NBTTagCompound nbtTags) {
    super.writeToNBT(nbtTags);

    nbtTags.setInteger("facing", facing);
    nbtTags.setBoolean("redstone", redstone);

    for (ITileComponent component : components) {
      component.write(nbtTags);
    }
  }
  @Override
  public ArrayList getNetworkedData(ArrayList data) {
    data.add(facing);
    data.add(redstone);

    for (ITileComponent component : components) {
      component.write(data);
    }

    return data;
  }
  @Override
  public void readFromNBT(NBTTagCompound nbtTags) {
    super.readFromNBT(nbtTags);

    facing = nbtTags.getInteger("facing");
    redstone = nbtTags.getBoolean("redstone");

    for (ITileComponent component : components) {
      component.read(nbtTags);
    }
  }
  @Override
  public void handlePacketData(ByteBuf dataStream) {
    facing = dataStream.readInt();
    redstone = dataStream.readBoolean();

    if (clientFacing != facing) {
      MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord);
      worldObj.notifyBlocksOfNeighborChange(
          xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));
      clientFacing = facing;
    }

    for (ITileComponent component : components) {
      component.read(dataStream);
    }
  }
  @Override
  public void updateEntity() {
    if (!worldObj.isRemote && general.destroyDisabledBlocks) {
      MachineType type = MachineType.get(getBlockType(), getBlockMetadata());

      if (type != null && !type.isEnabled()) {
        Mekanism.logger.info(
            "[Mekanism] Destroying machine of type '"
                + type.name
                + "' at coords "
                + Coord4D.get(this)
                + " as according to config.");
        worldObj.setBlockToAir(xCoord, yCoord, zCoord);
        return;
      }
    }

    for (ITileComponent component : components) {
      component.tick();
    }

    onUpdate();

    if (!worldObj.isRemote) {
      openedThisTick.clear();

      if (doAutoSync && playersUsing.size() > 0) {
        for (EntityPlayer player : playersUsing) {
          Mekanism.packetHandler.sendTo(
              new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())),
              (EntityPlayerMP) player);
        }
      }
    }

    ticker++;
    redstoneLastTick = redstone;
  }