Итемы в Screen остаются после закрытия

Версия Minecraft
1.20.2
API
Forge
1,634
149
353
Здравствуйте дорогие форумчане!
Столкнулся с странной, на мой взгляд, проблемой.
После закрытия Screen, итемы, которые получаются по BlockEntity (который получается по BlockPos со стороны клиента), остаются при повторном открытии. И это при том, что на я обновляю блок.
Мне кажется, что причина ошибки где-то неглубоко и я просто долблюсь в глаза, но решил всё же спросить здесь.

UPD. Небольшое пояснение: по Shift+ПКМ предметы из ступы извлекаются. Как можете заметить, их там нет, и потому ничего не извлекается. Однако в Screen всё отрисовывается.

Пакет, отправляемы при закрытии скрина:
//... проверка и поиск рецепта, бла-бла-бла
for(int slot = 0; slot <= tile.handler.getSlots(); slot++)
                tile.handler.getStackInSlot(slot).shrink(1);
level.setBlockAndUpdate(pos, Blocks.MORTAR.get().defaultBlockState()); //Здесь level - ServerLevel, мб из-за этого?
Метод рендера предметов:
void renderItems(GuiGraphics gui) {
        if(gui == null || tile == null) return; //заработай пж
        List<ItemStack> items = new ArrayList<>();
        for(int i = 0; i < tile.handler.getSlots(); i++)
            items.add(new ItemStack(tile.handler.getStackInSlot(i).getItem(), 1));
        if(!items.isEmpty()) {
            int i = -(items.size() / 2);
            for (ItemStack stack : items) {
                gui.renderFakeItem(stack, (width) / 2 - 84, height / 2 + 18 * i++);
            }
        }
    }
 
Решение
Итак, я действительно долбился в глаза.
Несмотря на то, что в ItemHandler я меняю стак, сам ItemHandler об этом не знает, а потому пакеты об обновлении не отправляет.
Исправить можно легко, на мой взгляд несколько костыльно, конечно:
Класс пакета, метод обработки принятого пакета:
//Пакет, проверка рцепта, бла-бла-бла
for(int slot = 0; slot < tile.handler.getSlots(); slot++) {
                ItemStack stack = tile.handler.getStackInSlot(slot);
                stack.shrink(1);
                tile.handler.setStackInSlot(slot, stack);
            }
Если у кого-то найдётся более красивое решение - буду рад узнать о нём.
Итак, я действительно долбился в глаза.
Несмотря на то, что в ItemHandler я меняю стак, сам ItemHandler об этом не знает, а потому пакеты об обновлении не отправляет.
Исправить можно легко, на мой взгляд несколько костыльно, конечно:
Класс пакета, метод обработки принятого пакета:
//Пакет, проверка рцепта, бла-бла-бла
for(int slot = 0; slot < tile.handler.getSlots(); slot++) {
                ItemStack stack = tile.handler.getStackInSlot(slot);
                stack.shrink(1);
                tile.handler.setStackInSlot(slot, stack);
            }
Если у кого-то найдётся более красивое решение - буду рад узнать о нём.
 
Назад
Сверху