предметы в контейнере прыгают в ближайший слот если он доступен.

Версия Minecraft
1.7.10
API
Forge
Делал контейнер. Складываю в 4 слота в нём 4 предмета из инвентаря с шифтом - всё ок.

А вот в другую сторону уже сложнее предметы перепрыгивают в ближайший доступный, если его нет, в доступный с минимальным ID.

Проблема: если в контейнере есть хоть один свободный слот, то предметы начинают чередоваться в нём, а не кидаться в pi

Java:
@Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slot_i) {
        ItemStack is = null;
        Slot slot = (Slot)inventorySlots.get(slot_i);

        if (slot != null && slot.getHasStack()) {
            ItemStack is1 = slot.getStack();
            is = is1.copy();

            if (is1.getItem() instanceof ItemHeartAmulet) return null;
            if (!mergeItemStack(is1, 0, inv.getSizeInventory(), false))
                return null;
            if (is1.stackSize == 0) slot.putStack((ItemStack)null);
            else slot.onSlotChanged();
        }
        return is;
    }
 
Решение
Предлагаю такой вариант, он вроде как корректней. Писал в блокноте, поэтому где-то мог переменную не так назвать, но должно работать. Размер контейнера только добавь
Java:
    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slot_i) {
        ItemStack is = null;
        Slot slot = (Slot)inventorySlots.get(slot_i);

        if (slot != null && slot.getHasStack()) {
            ItemStack is1 = slot.getStack();
            is = is1.copy();

            if (is1.getItem() instanceof ItemHeartAmulet)
                return null;
            
            /** Оригинал **/
            //if (!mergeItemStack(is1, 0, inv.getSizeInventory(), false))
            //    return null;
            /** Замена (начало) **/...

VeniVidiVici

Санта Барбарис
327
15
198
Предлагаю такой вариант, он вроде как корректней. Писал в блокноте, поэтому где-то мог переменную не так назвать, но должно работать. Размер контейнера только добавь
Java:
    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slot_i) {
        ItemStack is = null;
        Slot slot = (Slot)inventorySlots.get(slot_i);

        if (slot != null && slot.getHasStack()) {
            ItemStack is1 = slot.getStack();
            is = is1.copy();

            if (is1.getItem() instanceof ItemHeartAmulet)
                return null;
            
            /** Оригинал **/
            //if (!mergeItemStack(is1, 0, inv.getSizeInventory(), false))
            //    return null;
            /** Замена (начало) **/
            if (slot_i < /*Размер контейнера*/)
            {
                if (!this.mergeItemStack(is1, /*Размер контейнера*/, inventorySlots.size(), true))
                    return null;
            }
            else
            {
                if (!this.mergeItemStack(is1, 0, /*Размер контейнера*/, false))
                    return null;
            }
            /** Замена (конец) **/
            
            /** Оригинал **/
            //if (is1.stackSize == 0)
            //    slot.putStack((ItemStack)null);
            //else
            //    slot.onSlotChanged();
            /** Замена (начало) **/
            if (is1.stackSize <= 0)
                slot.putStack(null);
            else
                slot.onSlotChanged();
            /** Замена (конец) **/
            
            /** Добавка и компот **/
            slot.onPickupFromSlot(player, is1)
        }
        return is;
    }
 
Сверху