private void recalculatePredictedState() {
   for (AbstractMoveItemRequest request : pendingMoves.values()) {
     if (request instanceof MoveItemRequest) {
       MoveItemRequest r = (MoveItemRequest) request;
       InventoryUtils.moveItem(
           r.getInstigator(),
           r.getFromInventory(),
           r.getFromSlot(),
           r.getToInventory(),
           r.getToSlot());
     } else if (request instanceof MoveItemAmountRequest) {
       MoveItemAmountRequest r = (MoveItemAmountRequest) request;
       InventoryUtils.moveItemAmount(
           r.getInstigator(),
           r.getFromInventory(),
           r.getFromSlot(),
           r.getToInventory(),
           r.getToSlot(),
           r.getAmount());
     } else if (request instanceof MoveItemToSlotsRequest) {
       MoveItemToSlotsRequest r = (MoveItemToSlotsRequest) request;
       InventoryUtils.moveItemToSlots(
           r.getInstigator(),
           r.getFromInventory(),
           r.getFromSlot(),
           r.getToInventory(),
           r.getToSlots());
     }
   }
 }
  @Override
  public boolean switchItem(
      EntityRef fromInventory,
      EntityRef instigator,
      int slotFrom,
      EntityRef toInventory,
      int slotTo) {
    if (!InventoryUtils.moveItem(instigator, fromInventory, slotFrom, toInventory, slotTo)) {
      return false;
    }

    MoveItemRequest request =
        new MoveItemRequest(instigator, fromInventory, slotFrom, toInventory, slotTo, changeId++);
    pendingMoves.put(request.getChangeId(), request);
    localPlayer.getClientEntity().send(request);

    return true;
  }
 @Override
 public int getNumSlots(EntityRef inventoryEntity) {
   return InventoryUtils.getSlotCount(inventoryEntity);
 }
 @Override
 public int findSlotWithItem(EntityRef inventoryEntity, EntityRef item) {
   return InventoryUtils.getSlotWithItem(inventoryEntity, item);
 }
 @Override
 public EntityRef getItemInSlot(EntityRef inventoryEntity, int slot) {
   return InventoryUtils.getItemAt(inventoryEntity, slot);
 }
 @Override
 public int getStackSize(EntityRef item) {
   return InventoryUtils.getStackCount(item);
 }
 @Override
 public boolean canStackTogether(EntityRef itemA, EntityRef itemB) {
   return InventoryUtils.canStackInto(itemA, itemB);
 }
  @Override
  public boolean moveItemToSlots(
      EntityRef instigator,
      EntityRef fromInventory,
      int slotFrom,
      EntityRef toInventory,
      List<Integer> toSlots) {
    if (!InventoryUtils.moveItemToSlots(
        instigator, fromInventory, slotFrom, toInventory, toSlots)) {
      return false;
    }

    MoveItemToSlotsRequest request =
        new MoveItemToSlotsRequest(
            instigator, fromInventory, slotFrom, toInventory, toSlots, changeId++);
    pendingMoves.put(request.getChangeId(), request);
    localPlayer.getClientEntity().send(request);

    return true;
  }