@Override
  public void updateEntity() {

    if (parts.size() == 0 && !worldObj.isRemote) {
      worldObj.setBlock(xCoord, yCoord, zCoord, Blocks.air);
      worldObj.setTileEntity(xCoord, yCoord, zCoord, null);
      return;
    }

    List<BPPart> removed = new ArrayList<BPPart>();
    for (BPPart p : parts) {
      p.setWorld(worldObj);
      p.setX(xCoord);
      p.setY(yCoord);
      p.setZ(zCoord);
      if (p instanceof BPPartFace) if (!((BPPartFace) p).canStay()) removed.add(p);
    }
    for (BPPart p : removed) removePart(p);
    removed.clear();

    for (BPPart p : parts) p.update();

    if (ticks == 5 || ticks % 200 == 0) {
      shouldReRender = true;
    }
    ticks++;
  }
  public void onEntityCollision(Entity entity) {

    for (BPPart p : parts) {
      p.setWorld(worldObj);
      p.setX(xCoord);
      p.setY(yCoord);
      p.setZ(zCoord);
      p.onEntityCollision(entity); // FIXME BLUEPOWER Check if entity is actually colliding
    }
  }
  public void onNeighborUpdate() {

    for (BPPart p : parts) {
      p.setWorld(worldObj);
      p.setX(xCoord);
      p.setY(yCoord);
      p.setZ(zCoord);
      p.onNeighborUpdate();
    }

    shouldReRender = true;
  }
  public boolean canConnectRedstone(ForgeDirection side) {

    for (BPPart p : parts) {
      p.setWorld(worldObj);
      p.setX(xCoord);
      p.setY(yCoord);
      p.setZ(zCoord);
      if (p instanceof IBPRedstonePart) {
        ForgeDirection s = side;
        if (p instanceof IBPFacePart)
          s = s.getRotation(ForgeDirection.getOrientation(((IBPFacePart) p).getFace()));
        if (((IBPRedstonePart) p).canConnect(s)) return true;
      }
    }

    return false;
  }