@Override
  public void setInventorySlotContents(int slot, ItemStack itemStack) {

    if (slot < 5) {
      inventory[slot] = itemStack;
      if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) {
        itemStack.stackSize = getInventoryStackLimit();
      }

      if (slot == 0) {
        if (itemStack != null && isProgrammableAndValidForDrone(this, itemStack)) {
          progWidgets = TileEntityProgrammer.getProgWidgets(itemStack);
          if (!worldObj.isRemote) getAIManager().setWidgets(progWidgets);
        } else {
          progWidgets.clear();
          targetX = xCoord + 0.5;
          targetY = yCoord + 0.6;
          targetZ = zCoord + 0.5;
          boolean updateNeighbours = false;
          for (int i = 0; i < redstoneLevels.length; i++) {
            if (redstoneLevels[i] > 0) {
              redstoneLevels[i] = 0;
              updateNeighbours = true;
            }
          }
          if (updateNeighbours) updateNeighbours();
        }
        getAIManager();
      }
    } else {
      getFakePlayer().inventory.setInventorySlotContents(slot - 5, itemStack);
    }
  }
 public static boolean isProgrammableAndValidForDrone(IDroneBase drone, ItemStack programmable) {
   if (programmable != null
       && programmable.getItem() instanceof IProgrammable
       && ((IProgrammable) programmable.getItem()).canProgram(programmable)
       && ((IProgrammable) programmable.getItem()).usesPieces(programmable)) {
     List<IProgWidget> widgets = TileEntityProgrammer.getProgWidgets(programmable);
     for (IProgWidget widget : widgets) {
       if (!drone.isProgramApplicable(widget)) return false;
     }
     return true;
   }
   return false;
 }