Объединение ItemStacks, которые хранятся в ArrayList

Версия Minecraft
1.7.10
API
Forge
Код который я написал почему-то не работает (он просто вылетает с ошибкой.) NullPointerException:

Java:
@Override
public void updateTick(World world, int x, int y, int z, Random random){
    CrucibleTileEntity tille = (CrucibleTileEntity)world.getTileEntity(x, y, z);
    List<EntityItem> items = world.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(x+0D, y+1D, z+0D, x+1D, y+2D, z+1D));
    ItemStack item=null;

    if(items.size() > 0){
        item = items.get(items.size()-1).getEntityItem();
        if(CrucibleRecipeHandler.alloweds.contains(item.getItem())){
            int Counter = 0;
            for(ItemStack i : inventory){
                Counter++;
                if(i.isItemEqual(item))
                    if(i.isItemEqual(inventory.get(Counter - 1))){
                        inventory.add(new ItemStack(i.getItem(),i.stackSize+inventory.get(Counter - 1).stackSize));
                        inventory.remove(Counter - 1);
                    break;
                    }
            }
            Counter = 0;
            inventory.add(item);
            items.get(items.size()-1).setDead();
            item = null;
        }
P.S Это только для целей личного тестирования.
 
1,074
72
372
Перед тем как работать с любым Entity из мира, обязательно проверяй у него свойство isDead (должно быть всегда false), иначе получишь дюп "Dead Entity".
isItemEqual() Проверяет только ID/damage предмета. NBT не сравнивается, при создании нового предмета также теряется.
Что мешает работать с инвентарём через цикл for i?

Выделите в коде строку с ошибкой. Гадалок здесь нет.
 
Немного изменил код:

Java:
         for(ItemStack i : inventory){
                Counter++;
                if(i.isItemEqual(item))
                    if(inventory.get(Counter)!=null)
                    if(i.isItemEqual(inventory.get(Counter-1))){
                        inventory.add(new ItemStack(i.getItem(),i.stackSize+inventory.get(Counter-1).stackSize));
                    break;
                    }
            }
            if(inventory.get(Counter - 1)!=null)
            inventory.remove(Counter - 1);
            Counter = 0;

            inventory.add(item);
            items.get(items.size() -1 ).setDead();
            item = null;
        }
но все еще ничего не работает продолжаю получать сбой. if(inventory.get(Counter)!=null)
 
Последнее редактирование:
if(inventory.get(Counter)!=null)
Данная строка вылетает с NPE? Это очень странно. Единственное, что в этой строке может быть нулевым, это инвентарь. И если инвентарь равен нулю, тогда цикл for рухнет.
 
Твой инвентарь ArrayList когда-то бывает пуст по какой-либо причине?

Если это так, то в этой строке произойдет сбой, поскольку ты проверяешь позицию индекса Counter-1, которая будет равна -1, если счетчик не увеличивается. Теперь счетчик увеличивается только в расширенном цикле for, который не будет выполняться, если в инвентарном списке ArrayList ничего нет.

*Скажем так: код почти полностью сломан.
 
1,074
72
372
В чем может быть причина?
Код вызывается на стороне клиента и на стороне сервера (одиночная игра - тоже сервер). Проверяй world.isRemote для определения стороны, на которой вызывается код.
 
Сверху