/** merges provided ItemStack with the first avaliable one in the container/player inventory */ protected boolean mergeItemStack(ItemStack par1ItemStack, int par2, int par3, boolean par4) { boolean var5 = false; int var6 = par2; if (par4) { var6 = par3 - 1; } Slot var7; ItemStack var8; if (par1ItemStack.isStackable()) { while (par1ItemStack.stackSize > 0 && (!par4 && var6 < par3 || par4 && var6 >= par2)) { var7 = (Slot) this.inventorySlots.get(var6); var8 = var7.getStack(); if (var8 != null && var8.itemID == par1ItemStack.itemID && (!par1ItemStack.getHasSubtypes() || par1ItemStack.getItemDamage() == var8.getItemDamage()) && ItemStack.func_77970_a(par1ItemStack, var8)) { int var9 = var8.stackSize + par1ItemStack.stackSize; if (var9 <= par1ItemStack.getMaxStackSize()) { par1ItemStack.stackSize = 0; var8.stackSize = var9; var7.onSlotChanged(); var5 = true; } else if (var8.stackSize < par1ItemStack.getMaxStackSize()) { par1ItemStack.stackSize -= par1ItemStack.getMaxStackSize() - var8.stackSize; var8.stackSize = par1ItemStack.getMaxStackSize(); var7.onSlotChanged(); var5 = true; } } if (par4) { --var6; } else { ++var6; } } } if (par1ItemStack.stackSize > 0) { if (par4) { var6 = par3 - 1; } else { var6 = par2; } while (!par4 && var6 < par3 || par4 && var6 >= par2) { var7 = (Slot) this.inventorySlots.get(var6); var8 = var7.getStack(); if (var8 == null) { var7.putStack(par1ItemStack.copy()); var7.onSlotChanged(); par1ItemStack.stackSize = 0; var5 = true; break; } if (par4) { --var6; } else { ++var6; } } } return var5; }