Блок с метой. Модель

Версия Minecraft
1.9
5,018
47
783
Добрый вечер всем! Начал немножно что то писать на 1.9. Сделал свой первый блок. Но я просто не люблю, я сразу по харду со старого мода начал писать. Блок с метадатой, все окей, в мир ставится нормально. 
Для блока модель есть, вроде все норм. Но вот для его подтипов модель не работает.
И еще кстати, все мои блоки имеют одинаковую метадату.
А да и еще. Как связать ItemBlock блока с ним самим в регистрации? В 1.7.10 было так
Код:
		GameRegistry.registerBlock(BlockMetadata, BlockMetadataItem.class,"BlockMetadata");
вот код
Код:
public class MushroomBlock extends BlockBush implements IGrowable{
  public static float f = 0.2F;
 protected static  AxisAlignedBB MushroomBlock = new AxisAlignedBB(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);

 public static final String[] blocksMeta = new String[]{"underBirchMush","underOakMush","underOsinMush"};
 public MushroomBlock(final Material materialIn, final String name){
 //Это материал, его мы будет прописывать при регистрации
 super(materialIn);
 setRegistryName(name);
 setUnlocalizedName(name);
 this.setHardness(2F);
 this.setResistance(1F);
 
 this.setHarvestLevel("pickaxe", 1);
 
 this.setStepSound(SoundType.SAND);
 setLightLevel(0.0F);
 setCreativeTab(CreativeTabs.tabBlock);
 }


   public void getSubBlocks(Item item, CreativeTabs tabs, List<ItemStack> subItems)
   {
       /**
        * 1 - наш предмет
        * 2 - количество
        * 3 - метадата, начинается с 0
        */
   for (int i = 0; i < this.blocksMeta.length; i++)
 {
   subItems.add(new ItemStack(item, 1, i));
 }
   }
 /*
 * Данный метод отвечает за BoundigBox, т.е. это некая "ограничительная рамка", эта рамка позволяет нам
 * взаимодействовать каким угодно образом с блоком.
 */
 @Override
 public AxisAlignedBB getBoundingBox(final IBlockState state, final IBlockAccess source, final BlockPos pos)
 {
 return MushroomBlock;
 }
 /*
 * Прозрачность нашего блока, если true то блок будет пропускать сквозь себя свет.
 */
 @Override
 public boolean isOpaqueCube(final IBlockState state)
 {
 return false;
 }
   /*
   * Тип рендера блока, так как мы с вами обладатели 1.8+ версии mc, мы можем использовать json модели
   * для нашего блока, чтобы всё было хорошо укажим рендер блока как модель.
   */
   @Override
   public EnumBlockRenderType getRenderType(final IBlockState state)
   {
       return EnumBlockRenderType.MODEL;
   }

   /*
    * Полный блок, данный метод отвечает за то, где будет заканчиваться блок. Если стоит true то блок будет
    * заполнен полностью и вы не сможете залезть на эту модель. Смотрите скриншоты сравнения ниже!
    */
    @Override
    public boolean isFullCube(final IBlockState state)
    {
        return true;
    }

    /*
    * Чтобы наш блок-модель не давал эффект XRAY, я советую создавать данный метод всегда. В если же у вас обычный
    * блок(не модель), то данный метод можно не прописывать.
    * */
    @Override
    public boolean canPlaceBlockAt(final World worldIn, final BlockPos pos)
    {
        return super.canPlaceBlockAt(worldIn, pos) && worldIn.getBlockState(pos.down()).isFullyOpaque();
    }


 @Override
 public boolean canGrow(World worldIn, BlockPos pos, IBlockState state,
 boolean isClient) {
 // TODO Auto-generated method stub
 return false;
 }


 @Override
 public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos,
 IBlockState state) {
 // TODO Auto-generated method stub
 return false;
 }


 @Override
 public void grow(World worldIn, Random rand, BlockPos pos,
 IBlockState state) {
 // TODO Auto-generated method stub
 
 }
 
 @Override
 public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity te, ItemStack stack) {
 if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() == Items.stick)
 
 super.harvestBlock(world, player, pos, state, te, stack);
 }
 public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {

 ArrayList<ItemStack> ret = new  ArrayList<ItemStack>();
 
 ret.add(new ItemStack(BlocksRegistry.mushroom, 1, metadata));
  if (world.rand.nextInt(10) == 0){
 // ret.add(new ItemStack(MyItems.mushroomSpores, 1, 9));

  }
 return ret;
 }
 
 }
 
5,018
47
783
Не совсем понял. Еще раз. 
Вот класс блока
Код:
public class MushroomBlock extends BlockBush implements IGrowable{
  public static float f = 0.2F;
 protected static  AxisAlignedBB MushroomBlock = new AxisAlignedBB(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);

 public static final String[] blocksMeta = new String[]{"underBirchMush","underOakMush","underOsinMush"};
 public MushroomBlock(final Material materialIn, final String name){
 //Это материал, его мы будет прописывать при регистрации
 super(materialIn);
 setRegistryName(name);
 setUnlocalizedName(name);
 this.setHardness(2F);
 this.setResistance(1F);
 
 this.setHarvestLevel("pickaxe", 1);
 
 this.setStepSound(SoundType.SAND);
 setLightLevel(0.0F);
 setCreativeTab(CreativeTabs.tabBlock);
 }


   public void getSubBlocks(Item item, CreativeTabs tabs, List<ItemStack> subItems)
   {
       /**
        * 1 - наш предмет
        * 2 - количество
        * 3 - метадата, начинается с 0
        */
   for (int i = 0; i < this.blocksMeta.length; i++)
 {
   subItems.add(new ItemStack(item, 1, i));
 }
   }
 /*
 * Данный метод отвечает за BoundigBox, т.е. это некая "ограничительная рамка", эта рамка позволяет нам
 * взаимодействовать каким угодно образом с блоком.
 */
 @Override
 public AxisAlignedBB getBoundingBox(final IBlockState state, final IBlockAccess source, final BlockPos pos)
 {
 return MushroomBlock;
 }
 /*
 * Прозрачность нашего блока, если true то блок будет пропускать сквозь себя свет.
 */
 @Override
 public boolean isOpaqueCube(final IBlockState state)
 {
 return false;
 }
   /*
   * Тип рендера блока, так как мы с вами обладатели 1.8+ версии mc, мы можем использовать json модели
   * для нашего блока, чтобы всё было хорошо укажим рендер блока как модель.
   */
   @Override
   public EnumBlockRenderType getRenderType(final IBlockState state)
   {
       return EnumBlockRenderType.MODEL;
   }

   /*
    * Полный блок, данный метод отвечает за то, где будет заканчиваться блок. Если стоит true то блок будет
    * заполнен полностью и вы не сможете залезть на эту модель. Смотрите скриншоты сравнения ниже!
    */
    @Override
    public boolean isFullCube(final IBlockState state)
    {
        return true;
    }

    /*
    * Чтобы наш блок-модель не давал эффект XRAY, я советую создавать данный метод всегда. В если же у вас обычный
    * блок(не модель), то данный метод можно не прописывать.
    * */
    @Override
    public boolean canPlaceBlockAt(final World worldIn, final BlockPos pos)
    {
        return super.canPlaceBlockAt(worldIn, pos) && worldIn.getBlockState(pos.down()).isFullyOpaque();
    }


 @Override
 public boolean canGrow(World worldIn, BlockPos pos, IBlockState state,
 boolean isClient) {
 // TODO Auto-generated method stub
 return false;
 }


 @Override
 public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos,
 IBlockState state) {
 // TODO Auto-generated method stub
 return false;
 }


 @Override
 public void grow(World worldIn, Random rand, BlockPos pos,
 IBlockState state) {
 // TODO Auto-generated method stub
 
 }
 
 @Override
 public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity te, ItemStack stack) {
 if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() == Items.stick)
 
 super.harvestBlock(world, player, pos, state, te, stack);
 }
 public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {

 ArrayList<ItemStack> ret = new  ArrayList<ItemStack>();
 
 ret.add(new ItemStack(BlocksRegistry.mushroom, 1, metadata));
  if (world.rand.nextInt(10) == 0){
 // ret.add(new ItemStack(MyItems.mushroomSpores, 1, 9));

  }
 return ret;
 }
 
 }
И вот класс ItemБлока
Код:
public class MushroomItemsBlock extends ItemMultiTexture{

 public MushroomItemsBlock(Block block) {
 super(block, block, new String[]{"underBirchMush","underOakMush","underOsinMush"});
 this.setHasSubtypes(true);
 }
 @Override
 public String getUnlocalizedName(ItemStack itemstack){
 String name = "";
 switch(itemstack.getItemDamage()){
 case 0:
 name = "underBirchMush";
 break;
 case 1:
 name = "underOakMush";
 break;
 case 2:
 name = "underOsinMush";
 break;
 default:
 name = "noname";
 }
 return "" + name;
 }
 public int getMetadata(int meta){
 return meta;
 }
}
Вот регистрация
Код:
 public static Block mushroom = new MushroomBlock(Material.clay, "mushroom");

 public static void register(){
  registerBlock(mushroom);
 }
 
 @SideOnly(Side.CLIENT)
 public static void registerRender(){
 Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(mushroom), 0,
 new ModelResourceLocation(mushroom.getRegistryName(), "inventory"));
 }
 public static void registerBlock(final Block block){
 GameRegistry.register(block);
 GameRegistry.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));

 }
Что неверно?
 

Icosider

Kotliner
Администратор
3,600
99
663
У тебя:
Код:
GameRegistry.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
Тебе надо ItemBlock заменить на свой класс предметблока, вот как надо примерно, но это лично мой кастомный класс.
Код:
public class ItemFarmlandBlock extends ItemMultiTexture
{
    public ItemFarmlandBlock(Block block, String[] textures)
    {
        super(block, block, textures);
        this.setMaxDamage(0);
        this.setHasSubtypes(true);
    }

    @Override
    public String getUnlocalizedName(ItemStack stack)
    {
        return super.getUnlocalizedName() + "." + HarvestType.byMetadata(stack.getMetadata()).getName();
    }
}
И при этом у тебя исправится blockstates мета, так как ItemBlock содержит мету равную 0.
 

Вложения

  • 1.png
    1.png
    167.7 KB · Просмотры: 26
  • 2.png
    2.png
    168.8 KB · Просмотры: 22
  • 3.png
    3.png
    197.6 KB · Просмотры: 19
  • 4.png
    4.png
    162.1 KB · Просмотры: 16
5,018
47
783
отлично, мета заработала. Теперь модель? Для подтипов она не подгружается.
 
7,099
324
1,509
WildHeart написал(а):
Для моделий блоков с метой нужно юзать вместо ItemBlock это ItemMultiTexture. Первые два параметра это блок, третий это string массив, по порядку пишешь типы текстур.
 

Icosider

Kotliner
Администратор
3,600
99
663
Maxik001 написал(а):
отлично, мета заработала. Теперь модель? Для подтипов она не подгружается.

Код:
@SideOnly(Side.CLIENT)
    private static void setRender(final Block block)
    {
        for(MyEnumType type : MyEnumType.values())
        {
            Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), type.getMeta(), new ModelResourceLocation(block.getRegistryName() + "_" + type.getName(), "inventory"));
        }
    }
 
3,005
192
592
Maxik001 написал(а):
Код:
@SideOnly(Side.CLIENT)
 public static void registerRender(){
 Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(mushroom), 0,
 new ModelResourceLocation(mushroom.getRegistryName(), "inventory"));
 }

", 0," - разве это не мета?
 
5,018
47
783
Погоди, я с енумами не работал никогда. Это ведь перечисление? То есть мне просто сделать вот так
Код:
public enum EnumMetaBlocks {
	underBirchMush,
	underOakMush,
	underOsinMush
}
А как должен выглядеть метод getMeta и getName?
 

Icosider

Kotliner
Администратор
3,600
99
663
Код:
public enum HarvestType implements IStringSerializable
{
    BEAN(0, "bean", 1, 1.5F),
    BLUEBERRY(1, "blueberry", 1, 1.5F),
    CORN(2, "corn", 1, 1.5F),
    CUCUMBER(3, "cucumber", 1, 1.5F),
    GRAPE(4, "grape", 1, 1.5F),
    HOPS(5, "hops", 1, 1.5F),
    PEAS(6, "peas", 1, 1.5F),
    PEPPERS(7, "peppers", 1, 1.5F),
    RYE(8, "rye", 1, 1.5F),
    STARFRUIT(9, "starfruit", 1, 1.5F),
    SUNFLOWER(10, "sunflower", 1, 1.5F),
    TOMATO(11, "tomato", 1, 1.5F),
    WHEAT(12, "wheat", 1, 1.5F);

    private static final HarvestType[] META_LOOKUP = new HarvestType[values().length];
    private int meta, amount;
    private float saturation;
    private String name;

    HarvestType(int meta, String name, int amount, float saturation)
    {
        this.meta = meta;
        this.name = name;
        this.amount = amount;
        this.saturation = saturation;
    }

    public int getMeta()
    {
        return this.meta;
    }

    public int getAmount()
    {
        return this.amount;
    }

    public float getSaturation()
    {
        return this.saturation;
    }

    public String getName()
    {
        return this.name;
    }

    public static HarvestType byMetadata(int meta)
    {
        if (meta < 0 || meta >= META_LOOKUP.length) meta = 0;
        return META_LOOKUP[meta];
    }

    static
    {
        for(HarvestType seedsDoubleType : values())
        {
            META_LOOKUP[seedsDoubleType.getMeta()] = seedsDoubleType;
        }
    }
}
 
5,018
47
783
Еще он как то странно себя ведет, когда его выкидываешь. Он полностью уходит в блок, потом вылезает
 
Сверху