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

Сообщения
10
Лучшие ответы
0
Реакции
3
Версия Minecraft
1.12.2
Написал я вот такую вот штуку, которая ворует у деревенских жителей хлеб (и прочую еду) и кладёт в твой эндерсундук, и, в принципе, оно всё, вроде, верно работает, но ведёт себя неправильно на этапе спавна частиц. Вообще, в этом коде, по моей задумке, ещё в строке "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. Крашей нет, всё хорошо

Заранее спасибо :)
 
Сообщения
851
Лучшие ответы
13
Реакции
78
мистер вам будка,
Неверно b.getStackInSlot(i).isEmpty()
Да жеваный крот это еще что !b.getStackInSlot(i).getItem().equals(Items.AIR)
Верно b.getStackInSlot(i) == null Если пусто в слоте

Возможно я чего-то не понимаю на своих динозаврах, но для меня это взрыв жопы.
 
Сообщения
10
Лучшие ответы
0
Реакции
3
А, я там просто несколько разных способов перебрал и на момент копирования было то, что было последний
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,440
Лучшие ответы
370
Реакции
1,699
Это нужно все проверять только на серверной стороне, то есть !world.isRemote. А пакетом уже слать спавн частиц, хотя возможно и без пакетов запашет, хз.
 
Сообщения
10
Лучшие ответы
0
Реакции
3
Ну я вот вчера и сегодня тестил - что-то без пакетов не запахало, и идей нет, как без пакетов это сделать. Понял, спасибо большое. Наверное, оставлю пока так, а пакеты потом раскурю
 
Сверху