Не работает свой дроп с блока.

Версия Minecraft
1.12.2
23
1
Здравствуйте.
Я пока начинающий в этом деле, но немного соображаю. Я решил добавить в свой мод особую угольную руду, естественно со сразу дропающимся углем. Слизнул код у LG (Maxik001), но он не работает. Сделал через базовый класс Максика001 с небольшими изменениями. Вот его класс. Вот код моего базового класса:


Java:
package ru.darknd.redcraft.basic.Block;

import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import ru.darknd.redcraft.RedCraft;

import java.util.List;
import java.util.Random;

public class BlockWithDropItemBase extends Block {
    public Item drop;
    public int valueDrops;
    public int meta;

    public BlockWithDropItemBase(String name, final Material material, float hardness, float resistance, String harvToolType, int harvLevel, SoundType soundType, Item drop, int valueDrops, int meta) {
        super(material);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(RedCraft.redCraftTab);
        this.setHardness(hardness);
        this.setResistance(resistance);
        this.setHarvestLevel(harvToolType, harvLevel);
        this.setSoundType(soundType);
        setItemDrop();
        this.drop = drop;
        this.meta = meta;
        this.valueDrops = valueDrops;
    }

    public void setItemDrop() {
        if (drop == null) {
            this.drop = drop.getItemFromBlock(Blocks.AIR);
        }
    }

    @Override
    public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
        Random rand = new Random();
        java.util.List<ItemStack> ret = super.getDrops(world, pos, state, fortune);
        ret.add(new ItemStack(drop, valueDrops + rand.nextInt(4), meta));
        return ret;
    }

    @Override
    public Item getItemDropped(IBlockState state, Random rand, int fortune) {
        return Item.getItemFromBlock(Blocks.AIR);

    }

    @Override
    public int damageDropped(IBlockState state) {
        return 0;
    }

}

Как видно, я не стал наследовать этот класс от BlockBase, а сразу запилил конструктор оттуда и ввинтил остальной код. (Также я пробовал и экстендом от BlockBase, но результат тот же) Вот регистрация блока:

Код:
package ru.darknd.redcraft;

import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import ru.darknd.redcraft.basic.Block.BlockBase;
import ru.darknd.redcraft.basic.Block.BlockWithDropItemBase;
import ru.darknd.redcraft.blocks.BlockCounter;
import ru.darknd.redcraft.items.dense_coal_itemblock;


public class BlocksRegister {

    // Тут разные блоки

    public static Block dense_coal_ore = new BlockWithDropItemBase("dense_coal_ore", Material.ROCK, 2.1F, 17.0F, "pickaxe", 4, SoundType.STONE, ItemsRegister.dense_coal, 1, 0);

    public static void register(){

     //И тут
        setRegister(dense_coal_ore);
    }

    @SideOnly(Side.CLIENT)
    public static void registerRender(){

      //И тут тоже
        setRender(dense_coal_ore);
    }
    private static void setRegister(Block block){
        ForgeRegistries.BLOCKS.register(block);
        ForgeRegistries.ITEMS.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
    }
    @SideOnly(Side.CLIENT)
    private static void setRender(Block block){
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));
    }
    private static void setRegisterItemBlock(Block block, ItemBlock item){
        ForgeRegistries.BLOCKS.register(block);
        ForgeRegistries.ITEMS.register(item);

    }
    private static void setRenderItemBlock(Block block, ItemBlock item){
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));

    }
}

Просто из блока ничего не дропается. Если нужен еще код, то пишите
 
Последнее редактирование:
1,057
50
234
Костыли какие-то

Java:
//что дропаем
@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune)
{
    return Items.coal;
}
//с какой метой дропаем
@Override
public int damageDropped(IBlockState state)
{
    return 0;
}
//сколько дропаем
@Override
public int quantityDropped(IBlockState state, int fortune, Random random)
{
    return 1 + random.nextInt(fortune);
}
 
917
22
332
Разве с маленькой?

@DarkND Вместо всего этого, связанного с дропом должно хватить одного метода:
Java:
    @Override
    public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
        drops.clear();
        ItemStack stack = new ItemStack(drop, valueDrops + RANDOM.nextInt(4), meta);
        if (!stack.isEmpty()) drops.add(stack); 
    }
 
917
22
332
Попробуй подменить код класса на этот...
Java:
public class BlockWithDropItemBase extends Block {
    public Item drop;
    public int valueDrops;
    public int meta;

    public BlockWithDropItemBase(String name, final Material material, float hardness, float resistance, String harvToolType, int harvLevel, SoundType soundType, Item drop, int valueDrops, int meta) {
        super(material);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(RedCraft.redCraftTab);
        this.setHardness(hardness);
        this.setResistance(resistance);
        this.setHarvestLevel(harvToolType, harvLevel);
        this.setSoundType(soundType);
        this.drop = drop;
        this.meta = meta;
        this.valueDrops = valueDrops;
    }
 
    
    @Override
    public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
        drops.clear();
        ItemStack stack = new ItemStack(drop, valueDrops + RANDOM.nextInt(4), meta);
        if (!stack.isEmpty()) drops.add(stack); 
    }

}
 
23
1
Вот

Java:
package ru.darknd.redcraft;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.*;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import ru.darknd.redcraft.basic.ArmorBase;
import ru.darknd.redcraft.basic.Food.FoodBase;
import ru.darknd.redcraft.basic.ItemBase;
import ru.darknd.redcraft.basic.Tools.*;
import ru.darknd.redcraft.items.dense_coal;
import ru.darknd.redcraft.items.rod;

public class ItemsRegister {

    //Разные вещи
    public static Item dense_coal = new dense_coal("dense_coal");

    public static EnumRarity rarity_basic = EnumHelper.addRarity("rarity_basic", TextFormatting.YELLOW, "It's basic resource.");


    public static void register() {
        //Разные вещи
        setRegister(dense_coal);
    }

    @SideOnly(Side.CLIENT)
    public static void registerRender() {
        //Разные вещи
        setRender(dense_coal);
    }


    private static void setRegister(Item item) {
        ForgeRegistries.ITEMS.register(item);
    }

    @SideOnly(Side.CLIENT)
    private static void setRender(Item item) {
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory"));
    }

}
 
2,932
44
598
Я сделал это вот так (Ну как я... Это дроп из Таумкрафта который написал Азанор а я его вставил для своих руд...)
Java:
public class BaseOre extends Block {
    
     public BaseOre(Material material) {

        super(Material.ROCK);

        this.setResistance(15.0F);
        this.setHardness(3.0F);

    }
    
}
Java:
public class BaseOreDrop extends BaseOre {

     private String oreName;
    
      public BaseOreDrop(Material material, String oreName, String NameLocalized, String NameRegistry, String ToolClass, int ToolLevel) {
          
        super(Material.ROCK);
        
        this.oreName = oreName;
        this.setUnlocalizedName(NameLocalized);
        this.setRegistryName(NameRegistry);
        this.setHarvestLevel(ToolClass, ToolLevel);
        this.setCreativeTab(Mist.mistTab);
        
      }
      
      public void initOreDict()
      {
            
          OreDictionary.registerOre(oreName, this);
            
      }
      
      //Vanilla thaumcraft methods by Azanor
      public Item getItemDropped(IBlockState state, Random rand, int fortune)
      {
          
        return state.getBlock() == RegisterBlocks.ore_amber ? ItemsTC.amber : state.getBlock() == RegisterBlocks.ore_quartz ? Items.QUARTZ : Item.getItemFromBlock(state.getBlock());
      
      }
      
      public int quantityDropped(Random random)
      {
          
        return this == RegisterBlocks.ore_amber ? 1 + random.nextInt(2) : 1;
        
      }
      
      public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
      {
          
        List<ItemStack> drops = super.getDrops(world, pos, state, fortune);
        if ((this == RegisterBlocks.ore_amber) && (drops != null))
        {
          Random rand = (world instanceof World) ? ((World)world).rand : RANDOM;
          for (int a = 0; a < drops.size(); a++)
          {
            ItemStack is = (ItemStack)drops.get(a);
            if ((is != null) && (!is.isEmpty()) && (is.getItem() == ItemsTC.amber) && (rand.nextFloat() < 0.066D)) {
              drops.set(a, new ItemStack(ItemsTC.curio, 1, 1));
            }
          }
        }
        
        return drops;
        
      }
      
      public int getExpDrop(IBlockState state, IBlockAccess world, BlockPos pos, int fortune)
      {
          
        Random rand = (world instanceof World) ? ((World)world).rand : new Random();
        if (getItemDropped(state, rand, fortune) != Item.getItemFromBlock(this))
        {
          int j = 0;
          if ((this == RegisterBlocks.ore_amber) || (this == RegisterBlocks.ore_quartz)) {
            j = MathHelper.getInt(rand, 1, 4);
          }
          return j;
        }
        return 0;
      }
      
      public int quantityDroppedWithBonus(int fortune, Random random)
      {
        if ((fortune > 0) && (Item.getItemFromBlock(this) != getItemDropped((IBlockState)getBlockState().getValidStates().iterator().next(), random, fortune)))
        {
          int j = random.nextInt(fortune + 2) - 1;
          if (j < 0) {
            j = 0;
          }
          return quantityDropped(random) * (j + 1);
        }
        return quantityDropped(random);
      }
    }
Java:
public class RegisterBlocks {
    
    public static Block ore_amber = new BaseOreDrop(Material.ROCK, "oreAmber", "ore_amber", "ore_amber", "pickaxe", 1);
    public static Block ore_quartz = new BaseOreDrop(Material.ROCK, "oreQuartz", "ore_quartz", "ore_quartz", "pickaxe", 0);
    public static Block ore_cinnabar = new BaseOreDrop(Material.ROCK, "oreCinnabar", "ore_cinnabar", "ore_cinnabar", "pickaxe", 2);
    
    public static void register()
    {
        
        setRegister(ore_amber);
        setRegister(ore_quartz);
        setRegister(ore_cinnabar);
        
    }

    @SideOnly(Side.CLIENT)
    public static void registerRender()
    {
        
        setRender(ore_amber);
        setRender(ore_quartz);
        setRender(ore_cinnabar);
        
    }

    private static void setRegister(Block block)
    {
        
        ForgeRegistries.BLOCKS.register(block);
        ForgeRegistries.ITEMS.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
        
    }

    @SideOnly(Side.CLIENT)
    private static void setRender(Block block)
    {

        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));
  
    }
}
 
Сверху