Получение вещей из контейнера тайл энтити

Версия Minecraft
1.12.2
API
Forge
183
8
16
Есть координаты. Надо проверить является ли блок тайл энтити, узнать кол-во слотов в нём, и затем отправить в консоль (System.out.println) все вещи. То есть как здесь: ссылка, но чтобы для этого не надо было открывать GUI тайла
 
Решение
В итоге сделал как то так:
Java:
if (tileEntity != null) {
            IItemHandler inventory = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction);
            if (inventory != null) {
                int size = (inventory).getSlots(); // вот здесь не уверен, так как на это заменил getSizeInventory, вследствии его отсутствия у IItemHandler
                for (int i = 0; i < size; i++) {
                    ItemStack item = (inventory).getStackInSlot(i);
                    if (!stack.isEmpty()) {
                        System.out.println(item);
                    }
                }
            }
        }
1,560
86
204
(Дополнение к ответу)
Java:
TileEntity te = world.getTileEntity(x, y, z);

if (te instanceof IInventory) {
    int size = ((IInventory)te).getInventorySize();
    for (int i = 0; i < size; i++) {
        ItemStack stack = ((IInventory)te).getStackInSlot(i); // может быть другое название метода, забыл :)
        if (!stack.isEmpty()) {
            System.out.println(stack);
        }
    }
}
 

sk9zist :l

Исправился
981
18
157
Дополнение к ответу)
Эх, ты опередил меня..
Но всё же вот моя версия: (так как вы оба забыли что ТС на 1.12.2 работает и метод getTileEntity принимает BlockPos)
Java:
// x, y, z - позиции твоего блока
int x = 1;
int y = 17;
int z = 3;
    
BlockPos pos = new BlockPos(x, y, z);
TileEntity te = world.getTileEntity(pos);

if(te == null)
{
    // если на этих координатах нету Tile Entity
} else {
    if (te instanceof IInventory) {
        int size = ((IInventory)te).getSizeInventory();
        for (int i = 0; i <= size; i++) {
            ItemStack stack = ((IInventory)te).getStackInSlot(i);
            if (!stack.isEmpty()) {
                System.out.println(stack);
            }
        }
    }
}
А ещё, ты не запилил саму проверку на то, что в мире есть тайл энтити на этих координатах. Тоесть, если тебе, конечно, надо выводить что-либо если тайл не найден.

ТС: И чтобы не писать потом отдельное сообщение, не забудь обозначить лучший ответ
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
Зачем думать головой если придут и напишут готовый код. А потом "а чего это выпрашивают код, нахалы такие".


а ещё, ты в цикле указал <, тоесть последний элемент массива не будет учтён. надо писать <=
и не запилил саму проверку на то, что в мире есть тайл энтити на этих координатах
Господи, не позорься пожалуйста...
instanceof сам проверяет на нулл, проверка не нужна. С <= у тебя вылетит ArrayIndecOutOfBoundsException, ибы индекс массива начинается с нуля.
Базовые вещи. Не раз уже замечаю что пишешь ересь и язык не знаешь. Пора уже отправлять на месяц зубрить.
 

sk9zist :l

Исправился
981
18
157
а вот getInventorySize выдаёт
Такого метода нет, разве у тебя в IDE не подчеркивается?

P.S. Всё потому что эти двое решили подсказать под 1.7.10, я дал тебе код на 1.12.2

instanceof сам проверяет на нулл, проверка не нужна.
Ага. Но я думал, возможно тс нужно что-то делать, если блок на определенных кордах равен нулл, я специально комментарий оставил, чтобы что-то делать.. (эм, честно говоря это уже твои придирки)
 
Последнее редактирование:
7,099
324
1,509
Не стоит забывать ,что IInventory для тайла - устаревшая методика и правильно делать блоки с инвентарями надо через капабилити.
Поэтому чекать инвентарь тайла надо как-то так:
Java:
IItemHandler inventory = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, <side>)
С разных сторон блока могут быть разные инвентари
 
7,099
324
1,509
183
8
16
В итоге сделал как то так:
Java:
if (tileEntity != null) {
            IItemHandler inventory = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction);
            if (inventory != null) {
                int size = (inventory).getSlots(); // вот здесь не уверен, так как на это заменил getSizeInventory, вследствии его отсутствия у IItemHandler
                for (int i = 0; i < size; i++) {
                    ItemStack item = (inventory).getStackInSlot(i);
                    if (!stack.isEmpty()) {
                        System.out.println(item);
                    }
                }
            }
        }
 
Сверху