Краш игры при наведении предметом на слот

Версия Minecraft
1.5.2
Всем доброго.

Решил добавить аналог рюкзаков - предмет с инвентарем. Написал простенькие инвентарь, контейнер и гуи, чтобы проверить. При ПКМ предметом интерфейс открывается, мышка без предметов бегает по слотам нормально. Стоит навести курсор на слот, когда выбран предмет, и происходит падение игры. Все коды вместе с логом привел ниже. Нужна помощь.

Спасибо.


Инвентарь:
Код:
public class InventoryBag implements IInventory{

 public int invSize = 72;
 public ItemStack[] inventory = new ItemStack[invSize];
 
 @Override
 public int getSizeInventory() 
 {
 return this.invSize;
 }

 @Override
 public ItemStack getStackInSlot(int slot) 
 {
 return this.inventory[slot];
 }

 @Override
 public ItemStack decrStackSize(int i, int j) 
 {
 return EmUtils.inventory.decrStackSize(i, j, this.inventory);
 }

 @Override
 public ItemStack getStackInSlotOnClosing(int i) 
 {
 return this.inventory[i];
 }

 @Override
 public void setInventorySlotContents(int i, ItemStack itemstack) 
 {
 this.inventory[i] = itemstack;
 }

 @Override
 public String getInvName() 
 {
 return EmUtils.chat.translateToLocal("inventory.bag.name");
 }

 @Override
 public boolean isInvNameLocalized() 
 {
 return true;
 }

 @Override
 public int getInventoryStackLimit() 
 {
 return 64;
 }

 @Override
 public void onInventoryChanged() 
 {
 
 }

 @Override
 public boolean isUseableByPlayer(EntityPlayer entityplayer) 
 {
 return true;
 }

 @Override
 public void openChest() {}

 @Override
 public void closeChest() {}

 @Override
 public boolean isStackValidForSlot(int i, ItemStack itemstack) 
 {
 return true;
 }

}

Метод "[font=Monaco, Consolas, Courier, monospace]EmUtils.inventory.decrStackSize(i, j, this.inventory);"[/font]
Код:
public static ItemStack decrStackSize(int par1, int par2, ItemStack[] inv)
    {
        if (inv[par1] != null)
        {
            ItemStack itemstack;

            if (inv[par1].stackSize <= par2)
            {
                itemstack = inv[par1];
                inv[par1] = null;
                return itemstack;
            }
            else
            {
                itemstack = inv[par1].splitStack(par2);

                if (inv[par1].stackSize == 0)
                {
                    inv[par1] = null;
                }

                return itemstack;
            }
        }
        else
        {
            return null;
        }
    }


Контейнер:
Код:
package ru.Wayfarer.MagicMod.container;

import ru.Wayfarer.MagicMod.inventory.InventoryBag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.tileentity.TileEntityFurnace;

public class ContainerBag extends Container{

 public InventoryBag inventory = new InventoryBag();
 
 public ContainerBag(EntityPlayer player)
 {
 
 int yOffset = - 90; // Смещение слотов сумки по вертикали
 int slotId = 0; // Используется для нумерации слотов сумки
 
 // Добавляем 4 ряда слотов по 9 шт в каждом из нашей сумки
 for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(inventory, slotId, 8 + j * 18, 84 + i * 18 + yOffset));
                slotId ++;
            }
            
        }
 
 // Стандартный инвентарь игрока
 for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }

        for (int i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(player.inventory, i, 8 + i * 18, 142));
        }
 
 }
 
 
 
 @Override
 public boolean canInteractWith(EntityPlayer entityplayer) {
 // TODO Auto-generated method stub
 return false;
 }
 
 public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slotId)
    {
        return null;
    }

}

Гуи:
Код:
public class GuiBag extends GuiContainer{

 public GuiBag(EntityPlayer player) 
 {
 super(new ContainerBag(player));
 }

 @Override
 protected void drawGuiContainerBackgroundLayer(float f, int i, int j) 
 {
 
 }

}


Краш-лог:
Код:
2017-02-12 00:57:40 [INFO] [STDERR] net.minecraft.util.ReportedException: Ticking memory connection
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:60)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:109)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:677)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:573)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:127)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:470)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
2017-02-12 00:57:40 [INFO] [STDERR] Caused by: java.lang.IndexOutOfBoundsException: Index: 56, Size: 45
2017-02-12 00:57:40 [INFO] [STDERR] at java.util.ArrayList.rangeCheck(ArrayList.java:635)
2017-02-12 00:57:40 [INFO] [STDERR] at java.util.ArrayList.get(ArrayList.java:411)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.inventory.Container.slotClick(Container.java:302)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.NetServerHandler.handleWindowClick(NetServerHandler.java:897)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.packet.Packet102WindowClick.processPacket(Packet102WindowClick.java:46)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.MemoryConnection.processReadPackets(MemoryConnection.java:89)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.NetServerHandler.networkTick(NetServerHandler.java:134)
2017-02-12 00:57:40 [INFO] [STDERR] at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:53)
2017-02-12 00:57:40 [INFO] [STDERR] ... 6 more
2017-02-12 00:57:40 [SEVERE] [Minecraft-Server] Encountered an unexpected exception ReportedException
net.minecraft.util.ReportedException: Ticking memory connection
 at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:60)
 at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:109)
 at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:677)
 at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:573)
 at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:127)
 at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:470)
 at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)
Caused by: java.lang.IndexOutOfBoundsException: Index: 56, Size: 45
 at java.util.ArrayList.rangeCheck(ArrayList.java:635)
 at java.util.ArrayList.get(ArrayList.java:411)
 at net.minecraft.inventory.Container.slotClick(Container.java:302)
 at net.minecraft.network.NetServerHandler.handleWindowClick(NetServerHandler.java:897)
 at net.minecraft.network.packet.Packet102WindowClick.processPacket(Packet102WindowClick.java:46)
 at net.minecraft.network.MemoryConnection.processReadPackets(MemoryConnection.java:89)
 at net.minecraft.network.NetServerHandler.networkTick(NetServerHandler.java:134)
 at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:53)
 ... 6 more
2017-02-12 00:57:40 [SEVERE] [Minecraft-Server] This crash report has been saved to: M:\Игры\Minecraft\1.5.2\.Моды и текстуры\forge-1.5.2-7.8.1.737-src2\forge\mcp\jars\.\crash-reports\crash-2017-02-12_00.57.40-server.txt
2017-02-12 00:57:40 [INFO] [Minecraft-Server] Stopping server
2017-02-12 00:57:40 [INFO] [Minecraft-Server] Saving players
2017-02-12 00:57:40 [INFO] [Minecraft-Server] Saving worlds
2017-02-12 00:57:40 [INFO] [Minecraft-Server] Saving chunks for level 'Новый мир'/Overworld
2017-02-12 00:57:41 [INFO] [Minecraft-Server] Saving chunks for level 'Новый мир'/Nether
2017-02-12 00:57:41 [INFO] [Minecraft-Server] Saving chunks for level 'Новый мир'/The End
2017-02-12 00:57:43 [INFO] [ForgeModLoader] Unloading dimension 0
2017-02-12 00:57:43 [INFO] [ForgeModLoader] Unloading dimension -1
2017-02-12 00:57:43 [INFO] [ForgeModLoader] Unloading dimension 1
2017-02-12 00:57:43 [INFO] [ForgeModLoader] The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded.
 

timaxa007

Модератор
5,831
409
672
Wayfarer написал(а):
И тебе того-же.

Wayfarer написал(а):
Код:
Caused by: java.lang.IndexOutOfBoundsException:
Типа пытаешь достать не существующий слот или типа того. Обычно в таких случаях бывает, когда не правельно открывается контейнер с гуи, если конечно на серверной стороне контейнер открывается нужный.


Wayfarer написал(а):
Код:
 // Добавляем 4 ряда слотов по 9 шт в каждом из нашей сумки
 for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(inventory, slotId, 8 + j * 18, 84 + i * 18 + yOffset));
                slotId ++;
            }
            
        }
3 ряда, а не 4 у тебя в коде.
 
3 ряда, а не 4 у тебя в коде.

Увидел, проглядел, спасибо.


timaxa007 написал(а):
Wayfarer написал(а):
И тебе того-же.

Wayfarer написал(а):
Код:
Caused by: java.lang.IndexOutOfBoundsException:
Типа пытаешь достать не существующий слот или типа того. Обычно в таких случаях бывает, когда не правельно открывается контейнер с гуи, если конечно на серверной стороне контейнер открывается нужный.


Wayfarer написал(а):
Код:
 // Добавляем 4 ряда слотов по 9 шт в каждом из нашей сумки
 for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(inventory, slotId, 8 + j * 18, 84 + i * 18 + yOffset));
                slotId ++;
            }
            
        }
3 ряда, а не 4 у тебя в коде.



Покопал контейнеры, там метод addSlotToContainer закидывает в два разных ArrayList'а:
в один - стаки из слотов, в другой - сами слоты.

Так вот, судя по консоли, размер этих эррей листов заметно меньше, нежели должен быть.


Решено. Открывать гуи контейнер нужно с серверной стороны(т.е. перед открытием проверять !world.isRemote)
 
Сверху