public void startScan(boolean start) {
    if (!worldObj.isRemote) {
      if (!start) {
        scanning.setValue(false);
        notifyBlockUpdate();
        return;
      }

      int r = radius.getValue();
      // Only on server
      int y1 = yCoord - r;
      if (y1 < 0) {
        y1 = 0;
      }
      c1.setCoordinate(new Coordinate(xCoord - r, y1, zCoord - r));
      int y2 = yCoord + r;
      if (y2 >= worldObj.getHeight()) {
        y2 = worldObj.getHeight() - 1;
      }
      c2.setCoordinate(new Coordinate(xCoord + r, y2, zCoord + r));

      scanning.setValue(true);
      cur.setCoordinate(c1.getCoordinate());

      inventories.clear();
      notifyBlockUpdate();
    }
  }
 // Advance the 'cur' index to the next block. Return false when done.
 // When done 'scanning' will be set to false as well.
 private boolean advanceCurrent() {
   Coordinate c = cur.getCoordinate();
   int cx = c.getX();
   int cy = c.getY();
   int cz = c.getZ();
   cx++;
   Coordinate lo = c1.getCoordinate();
   Coordinate up = c2.getCoordinate();
   if (cx > up.getX()) {
     cx = lo.getX();
     cy++;
     if (cy > up.getY()) {
       cy = lo.getY();
       cz++;
       if (cz > up.getZ()) {
         scanning.setValue(false);
         notifyBlockUpdate();
         return false;
       }
     }
   }
   cur.setCoordinate(new Coordinate(cx, cy, cz));
   notifyBlockUpdate();
   return true;
 }
 @Override
 public void readFromNBT(NBTTagCompound tagCompound) {
   super.readFromNBT(tagCompound);
   scanning.setValue(tagCompound.getBoolean("scanning"));
   c1.readFromNBT(tagCompound, "c1");
   c2.readFromNBT(tagCompound, "c2");
   cur.readFromNBT(tagCompound, "cur");
   inventories.readFromNBT(tagCompound, "inv");
 }
 @Override
 public void readRestorableFromNBT(NBTTagCompound tagCompound) {
   super.readRestorableFromNBT(tagCompound);
   radius.setValue(tagCompound.getInteger("radius"));
 }
 public void setRadius(int v) {
   radius.setValue(v);
   notifyBlockUpdate();
 }