Отменить дроп блока

Версия Minecraft
1.7.10
116
4
Всем привет!
Добавил дроп к блоку песка, хочу, чтобы если падает добавленный дроп, то не падал сам песок, как с гравием - только кремень/гравий
Как отменить просто определенный дроп с блока?
Так не получается:
Java:
@SubscribeEvent //Тут может надо вообще @Override? Только когда я это пишу, выдает ошибку, его по идее в класс самого предмета надо, да?
    public void eventGravel(BlockEvent.HarvestDropsEvent eventGravel) {
        if (eventGravel.block == Blocks.gravel) {
           
            eventGravel.drops.remove(new ItemStack(Items.flint));
           
        }
       
    }

И как сделать, чтобы блок не дропал сам себя, если из него дропнулось что-то другое(как гравий с кремнем)? Что надо добавить, чтобы отменялся эвент, только тогда, когда дропнулся добавленный предмет?
 
Решение
Привет ConcurrentModificationException.
Итератор для кого?
eventGravel.drops.stream().filter(item->item.getItem() == Items.flint).collect(toList())

Я хочу дроп, подобный дропу блока гравия, там лмбо кремень падает, либо сам блок, не бывает, чтобы оба выпали с 1 блока
Удаляешь полностью дроп с блока
Вместо него с какой-то вероятностью добавляешь блок, с обратной вероятностью другой предмет
Java:
dropList.clear();
if(Math.random()>=0.7)
    dropList.add(new ItemStack(<block>))//0.7 вероятность
else
    dropList.add(new ItemStack(<item>))//0.3

timaxa007

Модератор
5,831
409
672
remove(new ItemStack(Items.flint));
Таким образом объект не удалишь.
Нужно типа циклом проверяешь, если в этом ItemStackItem является Items.flint.
Java:
for (int i = 0; i < eventGravel.drops.size(); ++i) {
ItemStack item = eventGravel.drops.get(i);
if (item != null && item.getItem() ==  Items.flint) {
eventGravel.drops.remove(i);
--i;
}
}
или как-то так.
 
116
4
Спасибо, а как отменить дроп, как у гравия и кремня, то есть: Если выпал кремень, то гравий не падает.
Я добавил дроп ракушки к песку, как сделать, чтобы падал либо песок, либо ракушка?

Вот что я написал, но не работает, про события прочитаю, как сделаю дроп с песка песок/ракушка, вот код:

Java:
@SubscribeEvent //SandDropsShells
    public void eventShell(HarvestDropsEvent eventShell){

        if (eventShell.block == Blocks.sand) {
            if(Math.random() < 0.05D)
                eventShell.drops.add(new ItemStack(ForFirstDays.Shell));
            for (int index = 0; index < eventShell.drops.size(); ++index) {
            ItemStack item = eventShell.drops.get(index);
            if (item.getItem() == ForFirstDays.Shell)
                eventShell.drops.remove(new ItemStack (Blocks.sand));
                --index;
            }
        }

    }
 
917
22
332
Не знаю что можно достать из метода, но может вот так:
Java:
    @SubscribeEvent
    public void eventShell(HarvestDropsEvent eventShell){

        if (eventShell.block == Blocks.sand) {
            if(Math.random() < 0.05D)
                eventShell.drops.add(new ItemStack(ForFirstDays.Shell));
                eventShell.drops.remove(new ItemStack (Blocks.sand));
            }
        }
    }
К тому же... Разве у эвента нет своего рандома? Лучше наверно random.nextInt(100) <= 5 чем Math.random() < 0.05D
 
917
22
332
Ну nextInt генерирует случайное число в заданном диапазоне в данном случае из 100, а тот который используешь ты - от 0.0 до 1.0, а там диапазон всё же больше, числа с плавающей точкой выходят.
Просто в твоём случае не вижу в этом острой необходимости.
 
Сверху