@Override
  public ItemStack transferStackInSlot(EntityPlayer player, int slotNumber) {
    ItemStack stack = null;
    Slot slot = (Slot) inventorySlots.get(slotNumber);

    if ((slot != null) && (slot.getHasStack())) {
      ItemStack stack1 = slot.getStack();
      stack = stack1.copy();
      EntityEquipmentSlot desiredSlot = EntityLiving.getSlotForItemStack(stack);

      if (slotNumber == 0) // CraftingResult
      {
        if (!mergeItemStack(stack1, 13, 49, true)) return ItemStack.field_190927_a;

        slot.onSlotChange(stack1, stack);
      } else if ((slotNumber >= 1) && (slotNumber < 5)) // CraftingGrid
      {
        if (!mergeItemStack(stack1, 13, 49, false)) return ItemStack.field_190927_a;
      } else if ((slotNumber >= 5) && (slotNumber < 13)) // NormalArmor & CosmeticArmor
      {
        if (!mergeItemStack(stack1, 13, 49, false)) return ItemStack.field_190927_a;
      } else if (desiredSlot.getSlotType() == EntityEquipmentSlot.Type.ARMOR
          && !inventorySlots
              .get(8 - desiredSlot.getIndex())
              .getHasStack()) // ItemArmor - check NormalArmor slots
      {
        int j = 8 - desiredSlot.getIndex();

        if (!mergeItemStack(stack1, j, j + 1, false)) return ItemStack.field_190927_a;
      } else if (desiredSlot.getSlotType() == EntityEquipmentSlot.Type.ARMOR
          && !inventorySlots
              .get(12 - desiredSlot.getIndex())
              .getHasStack()) // ItemArmor - check CosmeticArmor slots
      {
        int j = 12 - desiredSlot.getIndex();

        if (!mergeItemStack(stack1, j, j + 1, false)) return ItemStack.field_190927_a;
      } else if ((slotNumber >= 13) && (slotNumber < 40)) // PlayerInventory
      {
        if (!mergeItemStack(stack1, 40, 49, false)) return ItemStack.field_190927_a;
      } else if ((slotNumber >= 40) && (slotNumber < 49)) // PlayerHotBar
      {
        if (!mergeItemStack(stack1, 13, 40, false)) return ItemStack.field_190927_a;
      } else if (!mergeItemStack(stack1, 13, 49, false)) {
        return ItemStack.field_190927_a;
      }

      if (stack1.func_190916_E() == 0) slot.putStack(ItemStack.field_190927_a);
      else slot.onSlotChanged();

      if (stack1.func_190916_E() == stack.func_190916_E()) return ItemStack.field_190927_a;

      slot.func_190901_a(player, stack1);

      if (slotNumber == 0) player.dropItem(stack1, false);
    }

    return stack;
  }