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

Версия 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
116
4
Вот, допустим, такой код:
Java:
@SubscribeEvent //RemoveSandDrops
    public void eventSand(BlockEvent.HarvestDropsEvent eventSand) {
        if (eventSand.block == Blocks.sand) {
            for (int i = 0; i < eventSand.drops.size(); ++i) {
                ItemStack block = eventSand.drops.get(i);
                if (eventSand.drops != null && eventSand.drops.size() != 0) {
                    for (int x = eventSand.drops.size() - 1; x >= 0; x--) {
                        eventSand.drops.remove(x); --i;}}}}}
  
    @SubscribeEvent //AddSandDrops
    public void eventSandReturn(HarvestDropsEvent eventSandReturn){
        if (eventSandReturn.block == Blocks.sand) {
            if(Math.random() < 0.05D)
                eventSandReturn.drops.add(new ItemStack(ForFirstDays.Shell));
                eventSandReturn.drops.add(new ItemStack(Blocks.sand));
            for (int s = 0; s < eventSandReturn.drops.size(); ++s) {
            ItemStack item = eventSandReturn.drops.get(s);
            if (item.getItem() == ForFirstDays.Shell)
                eventSandReturn.drops.remove(new ItemStack (Blocks.sand)); --s;}}}


Под крашем я подразумеваю то, что в мире комманды не вводятся, плоки ставишь, а звука нет, а как нажимаю кнопку - выйти в главное меню, зависает с надписью "Shutting dow itnernal server..."
1554204683383.png

[14:37:28] [main/INFO]: Setting user: Player484
[14:37:39] [Client thread/INFO]: LWJGL Version: 2.9.1
[14:38:53] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:ForFirstDays
[14:39:03] [Sound Library Loader/INFO]: Sound engine started
[14:39:14] [Client thread/INFO]: Created: 16x16 textures/blocks-atlas
[14:39:15] [Client thread/INFO]: Created: 16x16 textures/items-atlas
[14:39:17] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:ForFirstDays
[14:39:19] [Client thread/INFO]: Created: 512x256 textures/blocks-atlas
[14:39:30] [Client thread/INFO]: Created: 1024x1024 textures/items-atlas
[14:39:32] [Sound Library Loader/INFO]: Sound engine started
[14:39:37] [Client thread/ERROR]: ########## GL ERROR ##########
[14:39:37] [Client thread/ERROR]: @ Post startup
[14:39:37] [Client thread/ERROR]: 1286: Invalid framebuffer operation
[14:39:42] [Server thread/INFO]: Starting integrated minecraft server version 1.7.10
[14:39:42] [Server thread/INFO]: Generating keypair
[14:39:45] [Server thread/INFO]: Preparing start region for level 0
[14:39:45] [Server thread/INFO]: Changing view distance to 2, from 10
[14:39:51] [Server thread/WARN]: Can't keep up! Did the system time change, or is the server overloaded? Running 2081ms behind, skipping 41 tick(s)
[14:39:51] [Server thread/INFO]: Player484[local:E:23a84f0c] logged in with entity id 0 at (825.5224983905109, 1.0, 400.94239387856607)
[14:39:52] [Server thread/INFO]: Player484 joined the game
[14:39:54] [Server thread/INFO]: Saving and pausing game...
[14:39:55] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld
[14:39:57] [Server thread/INFO]: Saving chunks for level 'New World'/Nether
[14:39:57] [Server thread/INFO]: Saving chunks for level 'New World'/The End
[14:40:24] [Client thread/INFO]: Warning: Clientside chunk ticking took 120 ms
 
Последнее редактирование:
1,329
104
225
[14:39:51] [Server thread/WARN]: Can't keep up! Did the system time change, or is the server overloaded? Running 2081ms behind, skipping 41 tick(s)
С сервером неполадки. Скорее всего он тупо не может проинициализировать твой код, т. е. ты где-то закосячил с удалением лута, т.к. он пытается убрать всё что есть в песке. А там цикл в цикле, что крайне тупо. По крайней мере такое я не встречал.
 
116
4
Что тут еще можно убрать?
Java:
@SubscribeEvent //AddSandDrops
    public void eventSandReturn(HarvestDropsEvent eventSandReturn){
        if (eventSandReturn.block == Blocks.sand) {
            if(Math.random() < 0.05D)
                eventSandReturn.drops.add(new ItemStack(ForFirstDays.Shell));
                eventSandReturn.drops.add(new ItemStack(Blocks.sand));
            for (int s = 0; s < eventSandReturn.drops.size();) {
            ItemStack item = eventSandReturn.drops.get(s);
            if (item.getItem() == ForFirstDays.Shell)
                eventSandReturn.drops.remove(new ItemStack (Blocks.sand));}}}
 
Последнее редактирование:

Eifel

Модератор
1,623
78
608
Хоть убейте не понимаю что ты делаешь, что с этим кодом происходит, а что говорит оратор выше(@SuperCatMaster ), так вообще подавно. Начем с того что твой краш - это не краш.
Зачем тебе два ивента, зачем ты добавляешь свой дроп и блок песка, а потом пытаешься проверить есть ли там твой дроп и пытаешься удалить блок песка?
А еще это так не работает:
Java:
if(Math.random() < 0.05D)
      //по условию выполниться только эта строчка кода, но не следующая
      eventSandReturn.drops.add(new ItemStack(ForFirstDays.Shell));
      eventSandReturn.drops.add(new ItemStack(Blocks.sand));
По идее должно быть примерно так:
Код:
@SubscribeEvent
public void onBlockDrops(HarvestDropsEvent e){
     //если наш блок - блок песка
     if (e.block == Blocks.sand) {
         //если прокнул шнас, добавляем свой дроп и удаляем дроп блока песка
         if(проверка на шанс){
             добавляем свой дроп
             тут же удаляем блок песка из дропа, например
             for (int s = 0; s < e.drops.size(); s++) {
                 ItemStack item = e.drops.get(s);
                 проверяем что в стаке item есть блок песка и делаем e.drops.remove(s);
             }
         }
         //иначе оставняем все как есть
     }
}
 
116
4
Вот так?
Java:
@SubscribeEvent
    public void onBlockDrops(HarvestDropsEvent e){
         if (e.block == Blocks.sand) {
             if(Math.random() < 0.05D){
                 e.drops.add(new ItemStack(ForFirstDays.Shell));
                 e.drops.remove(new ItemStack (Blocks.sand));
                 for (int s = 0; s < e.drops.size(); s++) {
                     ItemStack item = e.drops.get(s);
                     if (item.getItem() == Blocks.sand) { //вот тут ошибку, конечно, выдает, как исправить? getItemFromBlock не работает
                         e.drops.remove(s) --s;};
             if (item == null) return;
                     }
                 }
             }
         }}
    }
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
116
4
Что тут поменять надо?
Java:
@SubscribeEvent
    public void onBlockDrops(HarvestDropsEvent e){
         if (e.block == Blocks.sand) {
             if(Math.random() < 0.05D) {
                 e.drops.add(new ItemStack(ForFirstDays.Shell));
                 e.drops.remove(new ItemStack (Blocks.sand));
                 for (int s = 0; s < e.drops.size(); s++) {
                     ItemStack item = e.drops.get(s);
                     if (item.getItemFromBlock() == Blocks.sand); {
                         e.drops.remove(s); --s;}
                     if (item == null) return;}}}}
 
116
4
удалить дроп песка полностью, а потом добавить? Я так делал, если ты про это. Только мне надо, чтобы песок дропался, когда ракушка не дропалась, чтобы всегда был дроп ракушка/песок, чтобы двайного не было
 
7,099
324
1,509
Привет 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
 
Последнее редактирование:
116
4
Спасибо огромное, HohSerg!
Спасибо, Timaxa!
Спасибо, всем, кто пытался помочь!

Мне Timaxa писал про очищение дропа, видимо, намекал на clear, а я не знал о его существовании... Делал через drops.remove...
Спасибо, HohSerg, что пведал о его существовании!
 
Сверху