Проблема со слотами - клик по ним выбрасывает предмет.

Версия Minecraft
1.7.10
1,159
38
544
Здравствуйте. Никак не мог пофиксить баг - некоторые слоты инвентаря ведут себя странно - клик по ним выбрасывает предмет вместо того чтобы дать возможность пользователю перенести его в другой слот.

Вот так это выглядит. Обрабите внимание что я совершаю обычный клик безкаких-либо зажатых клавиш.

Я думал, что проблема в слоте или инвентаре, но я использую ванильные слоты и стандартный инвентарь пользователя без IEEP. Возможно дело в контейнере, но я никак не могу понять что именно пошло не так.

Вот мой контейнер (добавляю слоты в addSlots() ):
Java:
package rsstats.inventory.container;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import rsstats.inventory.SkillsInventory;
import rsstats.inventory.StatsInventory;
import rsstats.inventory.WearableInventory;
import rsstats.inventory.slots.StatSlot;
import rsstats.items.SkillItem;
import rsstats.items.StatItem;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author rares
 */
public class MainContainer extends Container {
    private final EntityPlayer player;
    private final InventoryPlayer inventoryPlayer;
    private final StatsInventory statsInventory;
    private final WearableInventory wearableInventory;

    private final SkillsInventory skillsInventory;

    public MainContainer(EntityPlayer player, InventoryPlayer inventoryPlayer, StatsInventory statsInventory, SkillsInventory skillsInventory, WearableInventory wearableInventory) {
        this.player = player;
        this.inventoryPlayer = inventoryPlayer;
        this.statsInventory = statsInventory;
        this.skillsInventory = skillsInventory;
        this.wearableInventory = wearableInventory;
        addSlots();
    }


    public MainContainer() {
        this.player = null;
        this.inventoryPlayer = null;
        this.statsInventory = null;
        this.skillsInventory = null;
        this.wearableInventory = null;
    }

    private void addSlots() {
        /*if (inventoryPlayer != null)
            for (int y = 0; y < 3; ++y) {
                for (int x = 0; x < 9; ++x) {
                    this.addSlotToContainer(new Slot(inventoryPlayer, x + y * 9 + 9, 8 + x * 18, 84 + y * 18));
                }
            }*/

        // Расставляем слоты на панели руки
        for (int i = 0; i < 9; i++) {
            this.addSlotToContainer(new Slot(inventoryPlayer, i, (i*18 -84) +8, 166));
        }

        // Расставляем слоты на панели статов
        for (int i = 0, slotIndex = 0; i < statsInventory.getSizeInventory(); ++i, slotIndex++) {
            this.addSlotToContainer(new StatSlot(statsInventory, i, (i*18 +86) +8, /*-24*/-14));
            //this.addSlotToContainer(new StatSlot(statsInventory, slotIndex, i*9, 0));
        }

        // Расставляем слоты на панели скиллов
        for (int y = 0; y < 3; ++y) {
            for (int x = 0; x < 9; ++x) {
                this.addSlotToContainer(new Slot(skillsInventory, x + y * 9 /*+ 9*/, (x*18 +86) +8, (y * 18) + 4));
            }
        }

        // Расставляем слоты на панели носимых вещей
        for (int y = 0; y < 5; ++y) {
            for (int x = 0; x < 4; ++x) {
                this.addSlotToContainer(new Slot(wearableInventory, x + y * 4 /*+ 9*/, (x*18 -30) +8, (y * 18) - 14));
            }
        }
    }


    /**
     * This should always return true, since custom inventory can be accessed from anywhere
     * @param player TODO
     * @return TODO
     */
    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return true;
    }

    /**
    * Called when a entityPlayer shift-clicks on a slot. You must override this or you will crash when someone does that.
    * Basically the same as every other container I make, since I define the same constant indices for all of them
     * @param player TODO
     * @param par2 TODO
     * @return TODO
    */
    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int par2) {
        ItemStack itemstack = null;
        Slot slot = (Slot) this.inventorySlots.get(par2);
        return itemstack;
    }

    @Override
    public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer playerIn) {

        Slot slot;
        try {
            slot = getSlot(slotId);
        } catch(Exception e) {
            return super.slotClick(slotId, clickedButton, mode, playerIn);
            //return null; // костыль
        }
        Item itemInSlot;
        if (slot.getStack() != null && slot.getStack().getItem() != null) {
            itemInSlot = slot.getStack().getItem();
        } else {
            return super.slotClick(slotId, clickedButton, mode, playerIn);
            //return null;
        }

        List subitems = new ArrayList();
        itemInSlot.getSubItems(itemInSlot, CreativeTabs.tabMaterials, subitems);
        if (clickedButton == 1) {
            int damage = itemInSlot.getDamage(slot.getStack());
            itemInSlot.setDamage(slot.getStack(), damage < subitems.size()-1 ? damage+1 : subitems.size()-1);
            return null;
        }
        if (clickedButton == 2) {
            int damage = itemInSlot.getDamage(slot.getStack());
            itemInSlot.setDamage(slot.getStack(), damage > 0 ? damage-1 : 0);
            return null;
        }

        if ((slot.inventory == statsInventory || slot.inventory == skillsInventory) && (itemInSlot instanceof SkillItem || itemInSlot instanceof StatItem)) {
            ItemStack itemStack = getSlot(slotId).getStack();

            // Защита от дублирующихся сообщений в чате
            if (!playerIn.worldObj.isRemote) {
                ( (StatItem) itemStack.getItem() ).roll(itemStack, playerIn);
            }
            return null;
        }
        return super.slotClick(slotId, clickedButton, mode, playerIn);
    }

    public SkillsInventory getSkillsInventory() {
        return skillsInventory;
    }

    /*public void setSkillsFor(String parentStatName) {
        skillsInventory.clearInventory();

        if ("item.StrengthStatItem".equals(parentStatName)) {
            skillsInventory.setInventorySlotContents(0, new ItemStack(GameRegistry.findItem(RSStats.MODID, "ClimbingSkillItem"), 1, 2));
        } else if ("item.AgilityStatItem".equals(parentStatName)) {
            skillsInventory.setInventorySlotContents(0, new ItemStack(GameRegistry.findItem(RSStats.MODID, "EquitationSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(1, new ItemStack(GameRegistry.findItem(RSStats.MODID, "LockpickingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(2, new ItemStack(GameRegistry.findItem(RSStats.MODID, "DrivingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(3, new ItemStack(GameRegistry.findItem(RSStats.MODID, "FightingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(4, new ItemStack(GameRegistry.findItem(RSStats.MODID, "DisguiseSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(5, new ItemStack(GameRegistry.findItem(RSStats.MODID, "ThrowingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(6, new ItemStack(GameRegistry.findItem(RSStats.MODID, "PilotingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(7, new ItemStack(GameRegistry.findItem(RSStats.MODID, "SwimmingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(8, new ItemStack(GameRegistry.findItem(RSStats.MODID, "ShootingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(9, new ItemStack(GameRegistry.findItem(RSStats.MODID, "ShippingSkillItem"), 1, 2));
        } else if ("item.IntelligenceStatItem".equals(parentStatName)) {
            skillsInventory.setInventorySlotContents(0, new ItemStack(GameRegistry.findItem(RSStats.MODID, "GamblingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(1, new ItemStack(GameRegistry.findItem(RSStats.MODID, "PerceptionSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(2, new ItemStack(GameRegistry.findItem(RSStats.MODID, "SurvivalSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(3, new ItemStack(GameRegistry.findItem(RSStats.MODID, "TrackingSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(4, new ItemStack(GameRegistry.findItem(RSStats.MODID, "MedicineSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(5, new ItemStack(GameRegistry.findItem(RSStats.MODID, "ProvocationSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(6, new ItemStack(GameRegistry.findItem(RSStats.MODID, "InvestigationSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(7, new ItemStack(GameRegistry.findItem(RSStats.MODID, "RepearSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(8, new ItemStack(GameRegistry.findItem(RSStats.MODID, "StreetFlairSkillItem"), 1, 2));
        } else if ("item.EnduranceStatItem".equals(parentStatName)) {

        } else if ("item.CharacterStatItem".equals(parentStatName)) {
            skillsInventory.setInventorySlotContents(0, new ItemStack(GameRegistry.findItem(RSStats.MODID, "IntimidationSkillItem"), 1, 2));
            skillsInventory.setInventorySlotContents(1, new ItemStack(GameRegistry.findItem(RSStats.MODID, "DiplomacySkillItem"), 1, 2));
        }
    }*/
}

Заранее спасибо! Советы и замечания по коду приветствуются!
 
1,111
47
420
Все довольно просто, стандартный майновский контейнер выбрасывает предмет на землю если координата слота отрицательная или выходит за рамки gui. Сложно сказать баг это или фича, но тебе в своем контейнере придется переопределить onSlotClick или типа того.
 
1,159
38
544
Все довольно просто, стандартный майновский контейнер выбрасывает предмет на землю если координата слота отрицательная или выходит за рамки gui. Сложно сказать баг это или фича, но тебе в своем контейнере придется переопределить onSlotClick или типа того.
Проверил, ведет себя в точности как вы описали. Но я не хочу оказываться от стандатного поведения слота с отрицательными координатами, и в то же время не хочу уродовать код копипастом из super.slotClock(). Как мне можно сохранить стандартное поведение слота и при этом не уродовать мой slotClick()?
 
1,111
47
420
Нет. Это не баг и не фича. Это норма.
Размер твоего гуи контейнера слишком маленький. Подгони его под картинку.
Было дело я с этим не фигово так долбался и что то там у меня не получалось и я все же переопределил, но я это я.
 
Сверху