Предмет не перемещается

Пытался создать инвентарь по гайду Создание кастомного инвентаря игрока
В целом всё работает, но есть проблема. При попытке взять предмет в инвентаре (на ЛКМ) он просто возвращается обратно в слот и всё. При этом через шифт предметы нормально двигаются между слотами.
 
CustomInventory:
public class CustomInventory implements IInventory {

    //Константа которая представляет кол-во добавленных кастомных слотов. У нас их будет 8
    public static final int INV_SIZE = 8;

    /*Список в котором хранятся предметы. Если мы кладем предмет в слот в кастомном инвентаре, он добавляется в этот список. Размер списка должен
    быть таким же, как и кол-во кастомных слотов, т.е. 8*/
    private NonNullList<ItemStack>inventory = NonNullList.<ItemStack>withSize(INV_SIZE, ItemStack.EMPTY);

    //Конструктор
    public CustomInventory() {}

    /**
     * Имя инвентаря. Можно потом использовать в GUI
     */
    @Override
    public String getName() {
        return "Inventory";
    }

    /**
     * Имеет ли инвентарь свое кастомное имя. Да, имеет.
     */
    @Override
    public boolean hasCustomName() {
        return true;
    }

    @Override
    public ITextComponent getDisplayName() {
         return (ITextComponent)(this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName(), new Object[0]));
    }

    /**
     * Возвращает размер инвентаря
     */
    @Override
    public int getSizeInventory() {
        return inventory.size();
    }

    /**
     * Возвращает ItemStack что лежит по указанному индексу
     */
    @Override
    public ItemStack getStackInSlot(int index) {
        return index >= 0 && index < this.inventory.size() ? (ItemStack)this.inventory.get(index) : ItemStack.EMPTY;
    }

    /**
     * Возвращает список с хранящимися в инвентаре предметами
     * @return Список с хранящимися в инвентаре предметами
     */
    public NonNullList<ItemStack> getStacks(){
        return this.inventory;
    }

    /**
     * Удаляет определенное количество элементов из слота инвентаря и возвращает их в виде нового списка.
     */
    @Override
    public ItemStack decrStackSize(int index, int count) {
        ItemStack itemstack = ItemStackHelper.getAndSplit(this.inventory, index, count);
        if (!itemstack.isEmpty()) {
            this.markDirty();
        }
        return itemstack;
    }

    /**
     * Удаляет стак из указанного слота и возвращает его.
     */
    @Override
    public ItemStack removeStackFromSlot(int index) {
         if (!this.inventory.get(index).isEmpty()) {
                ItemStack itemstack = this.inventory.get(index);
                this.inventory.set(index, ItemStack.EMPTY);
                return itemstack;
         }else {
                return ItemStack.EMPTY;
         }
    }

    /**
     * Добавляет стак в указанный слот
     */
    @Override
    public void setInventorySlotContents(int index, ItemStack stack) {
        this.inventory.set(index, stack);
        if (!stack.isEmpty() && stack.getCount() > this.getInventoryStackLimit()) {
            stack.setCount(this.getInventoryStackLimit());
        }
        this.markDirty();
    }

    /**
     * Возвращает true если весь инвентарь пустой. Если не пустой - возвращает false
     */
    @Override
    public boolean isEmpty() {
        for (ItemStack itemstack : this.inventory) {
            if (!itemstack.isEmpty()) {
                    return false;
             }
        }
        return true;
    }

    /**
     * Возвращает максимальный размер стака в слоте
     */
    @Override
    public int getInventoryStackLimit() {
        return 64;
    }

    /**
     * Для тайл энтити. Нам он не надо
     */
    @Override
    public void markDirty() { }

    /**
     * Может ли игрок ипользовать этот инвентарь
     */
    @Override
    public boolean isUsableByPlayer(EntityPlayer player) {
        return true;
    }

    @Override
    public void openInventory(EntityPlayer player) {}

    @Override
    public void closeInventory(EntityPlayer player) {}

    /**
     * Может ли автоматика класть предметы в слоты с указанным индексом
     */
    @Override
    public boolean isItemValidForSlot(int index, ItemStack stack) {
        return true;
    }

    //Эти три метода ниже пока не нужны
    @Override
    public int getField(int id) {
        return 0;
    }

    @Override
    public void setField(int id, int value) {}

    @Override
    public int getFieldCount() {
        return 0;
    }

    /**
     * Очистка инвентаря
     */
    @Override
    public void clear() {
        this.inventory.clear();
    }

    /**
     * Этот метод будет вызываться при сохранении инфы в НБТ КАПы, чтобы, например при перезаходе предметы не пропали из инвентаря
     * @param compound
     */
    public void writeToNBT(NBTTagCompound compound) {
         ItemStackHelper.saveAllItems(compound, this.inventory);
    }

    /**
     * Этот метод будет вызываться при чтении инфы из НБТ КАПы. Достаем из НБТ КАПы стаки и заполняем инвентарь
     * @param compound
     */
    public void readFromNBT(NBTTagCompound compound) {
        this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
        ItemStackHelper.loadAllItems(compound, this.inventory);
    }

    /**
     * Копируем стаки из другого инвентаря в этот. Используется в PlayerEvent.Clone Event, да бы сохранить содержимое инвентаря, например когда игрок проходит через портал в Энд
     * @param inv
     */
    public void copy(CustomInventory inv) {
        for (int i = 0; i < inv.getSizeInventory(); ++i) {
            ItemStack stack = inv.getStackInSlot(i);
            inventory.set(i, (stack.isEmpty() ? ItemStack.EMPTY : stack.copy()));
        }
    }
}

ContainerCustomInv:
public class ContainerCustomInv  extends Container {

    //Немного кода из ванилы
    private static final EntityEquipmentSlot[] VALID_EQUIPMENT_SLOTS = new EntityEquipmentSlot[] {EntityEquipmentSlot.HEAD, EntityEquipmentSlot.CHEST, EntityEquipmentSlot.LEGS, EntityEquipmentSlot.FEET};
    private final EntityPlayer thePlayer;

    /**
     * Конструктор
     * @param playerInventory Инвентарь игрока
     * @param cInventory Кастомный инвентарь
     * @param player Игрок
     */
    public ContainerCustomInv(InventoryPlayer playerInventory, CustomInventory cInventory, EntityPlayer player) {

        this.thePlayer = player;
        //Добавляем 8 кастомных слотов. Аргументы: игрок, инвентарь к которому они относятся, индекс слота, х координата, у координата
        this.addSlotToContainer(new StandartSlot(player, cInventory, 0, 87, 8));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 1, 87, 26));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 2, 87, 44));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 3, 87, 62));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 4, 109, 8));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 5, 109, 26));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 6, 109, 44));
        this.addSlotToContainer(new StandartSlot(player, cInventory, 7, 109, 62));

        //Все что ниже можно взять из net.minecraft.inventory.ContainerPlayer;
        //Добавляем ванильные слоты для брони
        for (int k = 0; k < 4; ++k){
            final EntityEquipmentSlot entityequipmentslot = VALID_EQUIPMENT_SLOTS[k];
            this.addSlotToContainer(new Slot(playerInventory, 36 + (3 - k), 8, 8 + k * 18){

                public int getSlotStackLimit(){
                    return 1;
                }

                public boolean isItemValid(ItemStack stack){
                    return stack.getItem().isValidArmor(stack, entityequipmentslot, thePlayer);
                }

                public boolean canTakeStack(EntityPlayer playerIn){
                    ItemStack itemstack = this.getStack();
                    return !itemstack.isEmpty() && !playerIn.isCreative() && EnchantmentHelper.hasBindingCurse(itemstack) ? false : super.canTakeStack(playerIn);
                }
                @Nullable
                @SideOnly(Side.CLIENT)
                public String getSlotTexture(){
                    return ItemArmor.EMPTY_SLOT_NAMES[entityequipmentslot.getIndex()];
                }
            });
        }

        //Добавляем 27 ванильных слотов инвентаря игрока
        for (int l = 0; l < 3; ++l) {
            for (int j1 = 0; j1 < 9; ++j1) {
                this.addSlotToContainer(new Slot(playerInventory, j1 + (l + 1) * 9, 8 + j1 * 18, 84 + l * 18));
            }
        }

        //А так же добавляем 9 ванильных слотов в хотбар
        for (int i1 = 0; i1 < 9; ++i1) {
            this.addSlotToContainer(new Slot(playerInventory, i1, 8 + i1 * 18, 142));
        }
    }

    /**
     * Этот метод срабатывает когда игрок зажимает Шифт и кликает на слот с целью переместить предмет.
     * Здесь мы должны задать откуда и куда будут перемещаться предметы из слота по которому кликнули
     * @param index Индекс слота, на который кликнул игрок
     */
    @Nullable
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {

        ItemStack itemstack = ItemStack.EMPTY;
        Slot slot = (Slot)this.inventorySlots.get(index);
        //Если слот существует и он не пуст
        if (slot != null && slot.getHasStack()){
            //Достаем стак из слота
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();
            //Взаимодействие
            //Если индекс слота меньше 12, т.е. игрок уликнул на кастомный слот или слот брони
            if (index < 12){
                //Пытаемся переместить стак в ПЕРВЫЙ свободный слот в хотбаре или инвентаре, т.е. между 12 и 47 слотом
                if (!this.mergeItemStack(itemstack1, 12, 48, true)) {
                    return ItemStack.EMPTY;
                }
                slot.onSlotChange(itemstack1, itemstack);
            }

            //Здесь наоборот. Если игрок кликнул на слот в инвентаре или хотбаре
            else if (index > 11){
                //Если это броня, то ее надо переместить в первый подходящий для нее слот между 8 и 11 индексом
                if(itemstack1.getItem() instanceof ItemArmor){
                    //тут один момент. Почему передаем 12 а не 11? Потому что не включительно. Т.е. между 8 и 12 слотом не включительно
                    if (!this.mergeItemStack(itemstack1, 8, 12, false)){
                        return ItemStack.EMPTY;
                    }
                }else
                    //Если это не броня и мы в инвентаре но не в хотбаре(т.е. между 12 и 38 слотом), то помещаем предмет в хотбар, т.е. между 39 и 47 слотом
                    if (index >= 12 && index < 39){
                        if (!this.mergeItemStack(itemstack1, 39, 48, false)){
                            return ItemStack.EMPTY;
                        }
                }else
                    //Если мы в хотбаре(т.е. между 39 и 47 слотом) то пытаемся переместить предмет в инвентарь(т.е. между в ПЕРВЫМ свободным слотом в инвентаре, т.е. между 12 и 38 слотом)
                    if (index >= 39 && index < 48 && !this.mergeItemStack(itemstack1, 12, 39, false)){
                        return ItemStack.EMPTY;
                    }
            }
            //Остальные простые проверки
            if (itemstack1.getCount() == 0){
                slot.putStack(ItemStack.EMPTY);
            }
            else{
                slot.onSlotChanged();
            }
            if (itemstack1.getCount() == itemstack.getCount()){
                return ItemStack.EMPTY;
            }
            slot.onTake(playerIn, itemstack1);
        }
        return itemstack;
    }

    /**
     * Может ли игрок взаимодействовать с инвентарем?
     */
    @Override
    public boolean canInteractWith(EntityPlayer playerIn) {
        return true;
    }

}
 
Также если предметы находятся не в хотбаре, при нажатии по ним они сразу же перемещаются в хотбар и всё. Кстати, всегда в одном и том же порядке. Если выкидывать предметы через Q, они просто исчезают и всё.
 
Сверху