Дроп предмета

Версия Minecraft
1.10.2
Такая проблема, я не знаю как сделать так, что бы из какого нибудь mc блока мог дропатся определённый предмет. К примеру: я хочу, что бы из листьев когда их ломаешь рукой или чем не будь дропалась палка.
Кто поможет буду очень благодарен!
 
Решение
Код:
	@EventHandler
	public void init(FMLInitializationEvent event) {
		MinecraftForge.EVENT_BUS.register(new EventsForge());
	}
Код:
public class EventsForge {

	@SubscribeEvent
	public void dropStick(BlockEvent.HarvestDropsEvent event) {
		if (event.getState().getBlock() instanceof BlockLeaves) {
			event.getDrops().add(new ItemStack(Items.STICK));
		}
	}

}
Как-то так.
7,099
324
1,510
Метод getDrops, какие аргументы и тип в 1.10 - не знаю, смотри класс Block
 
Чёт у меня не что не получается

Код:
package com.dcv_hacker.planetcraft.dropitem;

import net.minecraft.block.BlockOldLeaf;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;

public class drop_stick extends BlockOldLeaf {

 public static Item getDrops() 
 { 
 return Items.STICK;
 }

}
 
7,099
324
1,510
Найди в классе Block метод getDrops, скопируй его и измени, как нужно
 
там 2 метода

1
Код:
public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, IBlockState state, float chance, int fortune)
    {
        if (!worldIn.isRemote && !worldIn.restoringBlockSnapshots) // do not drop items while restoring blockstates, prevents item dupe
        {
            java.util.List<ItemStack> items = getDrops(worldIn, pos, state, fortune);
            chance = net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, worldIn, pos, state, fortune, chance, false, harvesters.get());

            for (ItemStack item : items)
            {
                if (worldIn.rand.nextFloat() <= chance)
                {
                    spawnAsEntity(worldIn, pos, item);
                }
            }
        }
    }
2
Код:
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
    {
        List<ItemStack> ret = new java.util.ArrayList<ItemStack>();

        Random rand = world instanceof World ? ((World)world).rand : RANDOM;

        int count = quantityDropped(state, fortune, rand);
        for(int i = 0; i < count; i++)
        {
            Item item = this.getItemDropped(state, rand, fortune);
            if (item != null)
            {
                ret.add(new ItemStack(item, 1, this.damageDropped(state)));
            }
        }
        return ret;
    }

Так какой юзать?
 

Icosider

Kotliner
Администратор
3,603
99
664
@hohserg, взял парнишку запутал...
ТС, вот что тебе нужно
Код:
   public Item getItemDropped(final IBlockState state, final Random rand, final int fortune)
    {
        return Item.getItemFromBlock(Blocks.STONE);//для блока
       //или
       return Items.ROTTEN_FLESH;//для предмета
    }
 
7,099
324
1,510
У первого же другое имя, да и он ничего не возвращает. Тебе нужен второй.
WildHeart, getDrops более функционален, поэтому я его и предложил
 
Чёт не работает

Код:
package com.dcv_hacker.planetcraft.dropitem;

import java.util.Random;

import net.minecraft.block.BlockOldLeaf;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;

public class drop_stick extends BlockOldLeaf {

 public Item getItemDropped(final IBlockState state, final Random rand, final int fortune)
   {
       return Items.STICK;
   }

}


Палка падать не хочет
 

Icosider

Kotliner
Администратор
3,603
99
664
DCV_Hacker написал(а):
Чёт не работает

Код:
package com.dcv_hacker.planetcraft.dropitem;

import java.util.Random;

import net.minecraft.block.BlockOldLeaf;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;

public class drop_stick extends BlockOldLeaf {

 public Item getItemDropped(final IBlockState state, final Random rand, final int fortune)
   {
       return Items.STICK;
   }

}

Зачем ты создал класс для дропа? Тебе дали эвент, используй его и не городи бред. Тот метод, что я дал и те что скидывал @hohserg они нужны внутри твоего блока, либо в эвенте. Тебе нужно заюзать эвент и прописать для конкретного блока(-ов) нужный дроп.
 

Icosider

Kotliner
Администратор
3,603
99
664
:facepalm: Иди в раздел учебник и читай мою тему. Прочитай статью про события. Далее берёшь эвент который скинул @timaxa007, используешь его. Внутри метода прописываешь блок, если блок сломался то дропаешь предмет. Profit!
 
Мне кажется мне нужно ещё яву подучить
А то сильно туплю и не знаю что надо писать в условие

Код:
package com.dcv_hacker.planetcraft.EventsHandler;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.FOVUpdateEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;

public class EventsHandler
 {
   final Minecraft mc = Minecraft.getMinecraft();

   @SubscribeEvent
   public void 
   {
    
    if() 
    {

    }
   
 }
}
 

timaxa007

Модератор
5,831
409
672
Код:
	@EventHandler
	public void init(FMLInitializationEvent event) {
		MinecraftForge.EVENT_BUS.register(new EventsForge());
	}
Код:
public class EventsForge {

	@SubscribeEvent
	public void dropStick(BlockEvent.HarvestDropsEvent event) {
		if (event.getState().getBlock() instanceof BlockLeaves) {
			event.getDrops().add(new ItemStack(Items.STICK));
		}
	}

}
Как-то так.
 
Сверху