Удаление предмета в мире

Версия Minecraft
1.11+
93
1
1
я при помощи setDead() удаляю предмет в мире, но он удаляет сразу стак, если кинуть стак, как это исправить?
 
Последнее редактирование:
93
1
1
for (EntityItem i : worldIn.getEntitiesWithinAABB(EntityItem.class, new AxisAlignedBB(pos).expand(2.5D, 2.6D, 2.5D))) { if (apple == null && i.getEntityItem().getItem() == Items.APPLE) apple = i; else if (diamond == null && i.getEntityItem().getItem() == Items.DIAMOND) diamond = i; if (apple != null && diamond != null) break; }
роблема этого кода в том, что если я кину яблоко жмакну на блок, а после кину алмаз и жмакну на блок, то условие выполнится, и в итоге потратится только алмаз
 

timaxa007

Модератор
5,831
409
672
На новой версии 1.12.2 я не могу проверить этот код, так как не знаю как теперь регистрировать блоки и т.п. (И знать не хочу.)
На 1.7.10 у меня работает как надо: и по одной, и по несколько пар.
 

timaxa007

Модератор
5,831
409
672
могу полностью регистрацию кинуть, то есть весь свой код
У тебя на 1.11+, а у меня 1.12+.
а можешь кинуть как ты сделал на 1.7.10?
Примерно так-же:
Java:
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        if (world.isRemote) return true;

        EntityItem
        apple = null,
        diamond = null;

        for (int xp =-2; xp <= 2; xp++) {
            if (xp == 0) {
                for (int zp =-2; zp <= 2; zp++) {
                    if (zp == 0) continue;
                    if (world.getBlock(x, y, z + zp) != net.minecraft.init.Blocks.diamond_block) return true;
                }
            } else {
                if (world.getBlock(x + xp, y, z) != net.minecraft.init.Blocks.diamond_block) return true;
            }
        }

        for (Object o : world.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 1D, z + 1D).expand(2D, 2D, 2D))) {
            EntityItem i = (EntityItem)o;
            if (apple == null && i.getEntityItem().getItem() == Items.apple) apple = i;
            else if (diamond == null && i.getEntityItem().getItem() == Items.diamond) diamond = i;
            if (apple != null && diamond != null) break;
        }

        if (apple != null && diamond != null) {

            ItemStack is = apple.getEntityItem();
            --is.stackSize;
            if (is.stackSize <= 0) apple.setDead(); else apple.setEntityItemStack(is);

            is = diamond.getEntityItem();
            --is.stackSize;
            if (is.stackSize <= 0) diamond.setDead(); else diamond.setEntityItemStack(is);

            world.setWorldTime(0L);

        }
        return true;
    }
 
93
1
1
смотри вот код твой:
Java:
 public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
         EntityItem apple = null,
          diamond = null;
            for (EntityItem i : worldIn.getEntitiesWithinAABB(EntityItem.class, getEntityBoundingBox().expand(2.5D, 2.6D, 2.5D).offset(new BlockPos(pos.getX(), pos.getY(), pos.getZ())))) {
                if (apple == null && i.getEntityItem().getItem() == Items.APPLE) apple = i;
                else if (diamond == null && i.getEntityItem().getItem() == Items.DIAMOND) diamond = i;
                if (apple != null && diamond != null) break;
            }

        if (apple != null && diamond != null) {

            ItemStack is = apple.getEntityItem();
            is.shrink(1);
            if (is.getCount() <= 0) apple.setDead(); else apple.setEntityItemStack(is);

            is = diamond.getEntityItem();
            is.shrink(1);
            if (is.getCount() <= 0) diamond.setDead(); else diamond.setEntityItemStack(is);

            worldIn.setWorldTime(0);

        }
        return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ);
    }
та же проблема, кидаю одну пару предметов, всё плохо время меняется на пол секунды и возвращается обратно,кидаю 4 пары всё работает.
 
93
1
1
@timaxa007
Может есть какой нибудь делай? типа проверить наличие первого предмета, потом второго, через некоторое время, просто у меня идейка появилась, я кое что придумал.. задел так сказать на будущее, понимаю не та тема вопроса, но может ты знаешь?
 

timaxa007

Модератор
5,831
409
672
Немного не понял
А тут не чего понимать. Моё предположение, типа есть несколько видов. Ну, типа одно из них:
Создаёшь переменную: объекта EntityItem вне метода, который будет null и переменная int, которая будет 0.
Где проверяешь, что лежит в мире, по условие если первый предмет лежит в мире, то переменная которая вне метода пример значение этого лежачего предмета и int определённому значению (типа 60).
Затем в каком-нибудь update проверяешь переменную int на то что она больше 0, то эта переменная будет уменьшаться. Когда переменная int уменьшиться до 0 или меньше 0, то идёт проверка на то, что переменная вне метода не равна null, то выполнялось проверка на второй лежачий предмет. Если есть два нужных предмета, то что-то ещё выполняется и т.д. ...
 

timaxa007

Модератор
5,831
409
672
Эм... Именно чтобы само отсчитывало, вряд-ли. Есть только класс, который предназначит для CoolDown'а предмета в руке.
Типа задержка после броска эндер жемчужины.
Сохраняет переменную Item и время когда задержка пройдёт.
 

timaxa007

Модератор
5,831
409
672
Типа всё зависит какой update ты выберешь. Обычно выбирают тот который при норме 20 раз в секунду срабатывает. Тогда тебе нужно будет в секундах значения, в int даешь [секунда * 20], а update от int отнимаешь единицу, ну как-то так.
 
93
1
1
@timaxa007
смотри версия 1.10.2 вот код, со сменой времени всё замечательно и я понял прикол:
EntityItem apple = null, diamond = null; for (EntityItem i :worldIn.getEntitiesWithinAABB(EntityItem.class, getEntityBoundingBox().expand(2.5D, 2.6D, 2.5D).offset(new BlockPos(pos.getX(), pos.getY(), pos.getZ())))) { if (apple == null && i.getEntityItem().getItem() == Items.APPLE) apple = i; else if (diamond == null && i.getEntityItem().getItem() == Items.DIAMOND) diamond = i; if (apple != null && diamond != null) break; } if (apple != null && diamond != null) { apple.getEntityItem().stackSize -= 1; if (apple.getEntityItem().stackSize <= 0) { apple.setDead(); }else { apple.setEntityItemStack(apple.getEntityItem()); } diamond.getEntityItem().stackSize -= 1; if (diamond.getEntityItem().stackSize <= 0) { diamond.setDead(); }else { diamond.setEntityItemStack(diamond.getEntityItem()); } worldIn.setWorldTime(0); }
прикол в том что там где убавляется еденичка, она равняется 4 предметам, то есть если убавлять на 2, то получается пропадает 8 предметов, и вот вопрос что с этим делать та
 
Сверху