Результат проверки "<itemstack>.isEmpty()" отличается от ожидаемого

Версия Minecraft
1.12.2
12
4
Написал я вот такую вот штуку, которая ворует у деревенских жителей хлеб (и прочую еду) и кладёт в твой эндерсундук, и, в принципе, оно всё, вроде, верно работает, но ведёт себя неправильно на этапе спавна частиц. Вообще, в этом коде, по моей задумке, ещё в строке "if(sizeB==0)" надо дописать второе условие " || b.isEmpty()", но тогда оно ВО ВСЕХ случаях проваливается в это условие, т.е. инвентарь всегда считается пустым.

Что я хотел от этого кода:
0) Непосредственно тырить
1) Спаунить частицы злого жителя, если ты пытаешься украсть из пустого кармана
2) Спаунить частицы дыма, если не всё удалось украсть (твой эндерсундук забился)
3) Спаунить фиолетовые частицы, если всё успешно

Что оно делает (устанавливаем соответствие):
0) Работает
1) Пришлось отключить, потому что оно считает пустым любой инвентарь
2) Не работает, потому что оно считает пустым любой itemstack
3) Работает, но уходит в этот случай всегда (или никогда, если "1" не отключить)

Почему я валю всё на itemstack.isEmpty()? В коде проверки на пустоту инвентаря оно просто проверяет все itemstackи инвентаря на пустоту (к пункту (1)), проверка на пустоту itemstackа для пункта (2) всегда даёт истину.

Расшифровки переменных:
a - сундук края игрока
b - инвентарь жителя
c - стак-остаток при переносе

Java:
@Override
    public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer playerIn, EntityLivingBase target, EnumHand hand) {
        if(target instanceof EntityVillager){
            boolean success=true;
            InventoryEnderChest a = playerIn.getInventoryEnderChest();
            InventoryBasic b = ((EntityVillager) target).getVillagerInventory();
            int sizeB = b.getSizeInventory();
            if(sizeB==0) {    //Пункт 1
                playerIn.getEntityWorld().spawnParticle(
                        EnumParticleTypes.VILLAGER_ANGRY,
                        target.posX,
                        target.posY+target.height,
                        target.posZ,
                        0,
                        0.25,
                        0
                );
                success=false;
            }
            for(int i=0;i<sizeB;i++){
                if(b.getStackInSlot(i).isEmpty()) continue;
                ItemStack c = a.addItem(b.getStackInSlot(i).copy());  //Пункт 0
                b.setInventorySlotContents(i,c);
                if(!b.getStackInSlot(i).getItem().equals(Items.AIR)) {  //Пункт 2
                    ParticleSpawner.cloud(
                            EnumParticleTypes.SMOKE_NORMAL,
                            playerIn.getEntityWorld(),
                            40,
                            playerIn.posX,
                            playerIn.posY+playerIn.getEyeHeight(),
                            playerIn.posZ,
                            0.5,0.25,0.5,
                            playerIn.posX-target.posX,
                            playerIn.posY-target.posY + 0.7*playerIn.getEyeHeight()-0.4*((EntityVillager)target).height,
                            playerIn.posZ-target.posZ,
                            -2
                    );
                    success=false;
                }
            }
            if(success){   //Пункт 3
                ParticleSpawner.cloud(
                        EnumParticleTypes.PORTAL,
                        playerIn.getEntityWorld(),
                        40,
                        playerIn.posX,
                        playerIn.posY+playerIn.getEyeHeight(),
                        playerIn.posZ,
                        0.5,0.25,0.5,
                        playerIn.posX-target.posX,
                        playerIn.posY-target.posY + 0.7*playerIn.getEyeHeight()-0.4*((EntityVillager)target).height,
                        playerIn.posZ-target.posZ,
                        -2
                );
            }
            return true;
        } else return super.itemInteractionForEntity(stack, playerIn, target, hand);
    }

В коде используется метод+класс ParticleSpawner.cloud(...) - это просто моё расширение метода спауна частиц. Я докрутил там цикл, и оно спаунит много частиц разом. В нём, вроде всё нормально (частицы портала ведь спаунятся)

Соответственно, кого я подозреваю? Я подозреваю разделение "клиент-сервер", эффект состояния гонки и всякое такое. Ну и свои кривые ручонки, конечно же
Ну и собственно что я хочу спросить:
0) Мои подозрения верны?
1) Как тогда передавать данные с сервера на клиент?
2) А кроме пакетов никак нельзя? У меня всего одна маленькая палочка-воровалочка, к которой я хочу прикрутить частицы, мне не особо хочется ради неё изучать тему пакетов (хотя, согласен, всё равно когда-нибудь придётся).

P.S. И да, я знаю, что мне ещё надо игрока на ==null проверять.
P.P.S. Крашей нет, всё хорошо

Заранее спасибо :)
 

jopi

Попрошайка
1,421
30
260
мистер вам будка,
Неверно b.getStackInSlot(i).isEmpty()
Да жеваный крот это еще что !b.getStackInSlot(i).getItem().equals(Items.AIR)
Верно b.getStackInSlot(i) == null Если пусто в слоте

Возможно я чего-то не понимаю на своих динозаврах, но для меня это взрыв жопы.
 
Сверху