boolean successful = false;
int i = !r ? start : length - 1;
int iterOrder = !r ? 1 : -1;
Slot slot;
ItemStack existingStack;
if (stack.isStackable()) {
while (stack.stackSize > 0 && (!r && i < length || r && i >= start)) {
slot = slots.get(i);
existingStack = slot.getStack();
if (slot.isItemValid(stack) && existingStack != null && existingStack.getItem().equals(stack.getItem())
&& (!stack.getHasSubtypes() || stack.getItemDamage() == existingStack.getItemDamage())
&& ItemStack.areItemStackTagsEqual(stack, existingStack)) {
int existingSize = existingStack.stackSize + stack.stackSize;
int maxStack = Math.min(stack.getMaxStackSize(), slot.getSlotStackLimit());
if (existingSize <= maxStack) {
stack.stackSize = 0;
existingStack.stackSize = existingSize;
slot.onSlotChanged();
successful = true;
} else if (existingStack.stackSize < maxStack) {
stack.stackSize -= maxStack - existingStack.stackSize;
existingStack.stackSize = maxStack;
slot.onSlotChanged();
successful = true;
}
}
i += iterOrder;
}
}
if (stack.stackSize > 0) {
i = !r ? start : length - 1;
while (stack.stackSize > 0 && (!r && i < length || r && i >= start)) {
slot = slots.get(i);
existingStack = slot.getStack();
if (slot.isItemValid(stack) && existingStack == null) {
int maxStack = limit ? Math.min(stack.getMaxStackSize(), slot.getSlotStackLimit()) : slot.getSlotStackLimit();
existingStack = stack.splitStack(Math.min(stack.stackSize, maxStack));
slot.putStack(existingStack);
slot.onSlotChanged();
successful = true;
}
i += iterOrder;
}