Как хандлить наведение мышки на слот

Версия Minecraft
1.7.10
1,159
38
544
Собственно, сабж. Обычно я делал это через GuiContainer#renderToolTip(), но это как-то костльно.

Вот как хандлить это:
ezgif.com-gif-maker.gif
 
1,159
38
544
1,057
50
234
Java:
private boolean isMouseOverSlot(Slot p_146981_1_, int p_146981_2_, int p_146981_3_)
    {
        return this.func_146978_c(p_146981_1_.xDisplayPosition, p_146981_1_.yDisplayPosition, 16, 16, p_146981_2_, p_146981_3_);
    }

    protected boolean func_146978_c(int p_146978_1_, int p_146978_2_, int p_146978_3_, int p_146978_4_, int p_146978_5_, int p_146978_6_)
    {
        int k1 = this.guiLeft;
        int l1 = this.guiTop;
        p_146978_5_ -= k1;
        p_146978_6_ -= l1;
        return p_146978_5_ >= p_146978_1_ - 1 && p_146978_5_ < p_146978_1_ + p_146978_3_ + 1 && p_146978_6_ >= p_146978_2_ - 1 && p_146978_6_ < p_146978_2_ + p_146978_4_ + 1;
    }

Мб это....
 
1,159
38
544
То что мне нужно! Только вот проблема возникла

1) isMouseOverSlot() - приватный метод, но это решается копипастом

2) Мне нужно сделать такую штуку - получить слот, на который наведен курсор, вытащить из него инвентарь, к которому он принадлежит и определить его тип. Для достижения этой цели, я решил переопределить метод handleMouseInput(), т.к. по названию мне показалось, что код для решения моей задачи нужно делать там.


Java:
@Override
    public void handleMouseInput() {


        MainContainer container = (MainContainer) player.getEntityPlayer().openContainer;

        for (int i = 0; i < inventorySlots.inventorySlots.size(); i++) {
            Object inventorySlot = inventorySlots.inventorySlots.get(i);
            //System.out.println(inventorySlot.getClass() + " ||| " + inventorySlot.toString() + " size-" + container.inventorySlots.size());
            //System.out.println(((Slot) inventorySlot).inventory.getInventoryName() + " ||| " + inventorySlot.toString() + " size-" + inventorySlots.inventorySlots.size());
            //inventorySlots.

            // ЭТО НИКОГДА НЕ СЛУЧИТСЯ
            if (i == 9) {
                Object o = new Object();
            }

            try {
                SkillSlot slot = (SkillSlot) inventorySlot;
                System.out.println("Получилось " + i);
            } catch (Exception e) {
                System.out.println("- "  + i);
            }

            if (isMouseOverSlot((Slot) inventorySlot, Mouse.getEventX(), Mouse.getEventY())) {

                //this.player.tabHostInventory.setTab(((Slot) inventorySlot).getStack().getItem().getUnlocalizedName());

            }

            ItemStack itemStack = ((Slot) inventorySlot).getStack();
            if (itemStack == null) {
                break; //return;
            }
            Item item = itemStack.getItem();

            if (item != null && !item.getUnlocalizedName().equals(currentStat) && !(item instanceof SkillItem)) {
                PacketShowSkillsByStat packet = new PacketShowSkillsByStat(itemStack.getItem().getUnlocalizedName());
                CommonProxy.INSTANCE.sendToServer(packet);
                currentStat = itemStack.getItem().getUnlocalizedName();
            }
        }

        super.handleMouseInput();
    }

Здесь я пробегаюсь по всем слотам в контейнере и замечаю то, что if (i == 0) никогда не сработает, т.к метод тупо выходит сам, когда это ему надо. Вывел это по отладчику. Почему такое происходит? Вот отладочный вывод, демонстрирующий проблему:
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:29] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:30] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
[04:03:31] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 0
[04:03:31] [Client thread/INFO] [STDOUT]: [rsstats.client.gui.MainMenuGUI:handleMouseInput:236]: - 1
 
1,159
38
544
Все работает, это я виноват - коротнуло в голове и перепутал break с countinue. Чот стыдно теперь.
 
1,159
38
544
7,099
324
1,510
Этот метод вызывается каждый кадр
Scala:
override def drawScreen(x: Int, y: Int, partialTick: Float): Unit = {

Проверку пересечения с прямоугольником легко нагуглить или вывести самому
 
Последнее редактирование:
Этот метод вызывается каждый тик
Scala:
override def drawScreen(x: Int, y: Int, scale: Float): Unit = {
Если мне не изменяет память - последний параметр это partialTicks, и метод этот вызывается каждый кадр.
 
Сверху