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

Версия 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;
 }
 
 }
 

Icosider

Kotliner
Администратор
3,601
99
664
Maxik001 написал(а):
Еще он как то странно себя ведет, когда его выкидываешь. Он полностью уходит в блок, потом вылезает

Модель сделай, и через редактор настрой floor и будет тебе счастье. А ещё он наверное у тебя в руке больше чем голова игрока...
 
5,018
47
783
Я знаю, это весьма старая тема, но апнуть ее надо, чтобы не создавать новую. В общем, я сделал блок с метой, у себя, все вроде окей, модельки есть туда сюда.
2018-07-15_16.48.50.png
Но решительно отказываются работать модели для для итемов. Я делал как обычно - парентом от модели блока. Почему не работает? Это ж с блокстейтом не связано никак...

Моя проблема весьма похожа на его проблему но так как @BlesseNtumble отличается особой лаконичностью в сообщениях, то соотвественно, то для меня та тема практически бесполезна. Поэтому вопрос таки открыт.

JSON:
{
    "parent": "realism:block/cobble_granite"
}
И на всякий код регистрации и итемблока

Java:
public class ItemBlockCobblestones extends ItemBlock{

    public ItemBlockCobblestones(Block block) {
        super(block);
        this.setHasSubtypes(true);
    }

    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items)
    {

            this.block.getSubBlocks(CreativeTabs.BUILDING_BLOCKS, items);
     
    }
    public int getMetadata(int meta){
        return meta;
    }
}
и регистрация

Java:
    private static void registerRenderCobbleBlock(final Block block)
    {
        for(BlockCobblestones.EnumType type : BlockCobblestones.EnumType.values())
        {
            Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), type.getMetadata(), new ModelResourceLocation(block.getRegistryName() + "_" + type.getName(), "inventory"));
        }
    }
 
Последнее редактирование:
5,018
47
783
К слову, если делать через ItemMultiTexture, то ничего, кроме имен не получается годного.

Java:
public class ItemBlockCobblestones extends ItemMultiTexture{

    public ItemBlockCobblestones(Block block) {
        super(block, block, new String[] {"cobble_andesite","cobble_diorite","cobble_granite"} );
        this.setHasSubtypes(true);
    }
    @Override
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items)
    {
        if (this.isInCreativeTab(tab))
        {
            this.block.getSubBlocks(tab, items);
        }
    }
    @Override
    public String getUnlocalizedName(ItemStack stack)
    {
        return super.getUnlocalizedName() + "." + EnumType.byMetadata(stack.getMetadata()).getName();
    }
}
 
5,018
47
783
Потому что надо через событие регистрации модели это делать-_- Уже пройденный вариант, который даже на forge forum'e предлагают.
Нашел только вот эту тему, но так и ничего не понял, кроме того, что надо использовать ModelLoader.setCustomModelResourceLocation[/I] какой то. И каким боком тут ModelBakeEvent ?:unsure:
___

Поискав еще нашел, что у меня все правильно... только не работает, все равно, в инвентаре не видно.
Java:
    @SideOnly(Side.CLIENT)
    private static void registerRenderCobbleBlock(final Block block)
    {
       
        for(BlockCobblestones.EnumType type : BlockCobblestones.EnumType.values())
        {
            Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), type.getMetadata(), new ModelResourceLocation(block.getRegistryName() + "_" + type.getName(), "inventory"));
        }
    }
 
5,018
47
783
Нету(
Зарегал по форджевской шине. Прокси Клиент. После блоков, в ините, так как блоки там регаются.
Java:
public class RegMetaBlocks {
    @SubscribeEvent
    public void registerMB(ModelBakeEvent e) {
        for(BlockCobblestones.EnumType type : BlockCobblestones.EnumType.values())
        {
            Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(RegBlocks.cobblestones), type.getMetadata(), new ModelResourceLocation(RegBlocks.cobblestones.getRegistryName() + "_" + type.getName(), "inventory"));
        }
    }
}
1531755928806.png
 
5,018
47
783
Почему нельзя пользоваться обычным OGL? Зачем мутить всю эту дичь?
Хочется. Мне не составило бы труда добавить эти три блока по одному,но надо когда то разобраться, вдруг пригодиться
 
5,018
47
783
Java:
[18:44:31] [main/ERROR] [FML]: Exception loading model for variant realism:cobblestones#inventory for item "realism:cobblestones", normal location exception:
net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model realism:item/cobblestones with loader VanillaLoader.INSTANCE, skipping
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:153) ~[ModelLoaderRegistry.class:?]
    at net.minecraftforge.client.model.ModelLoader.loadItemModels(ModelLoader.java:314) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.loadVariantItemModels(ModelBakery.java:175) ~[ModelBakery.class:?]
    at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:164) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
    at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:121) [SimpleReloadableResourceManager.class:?]
    at net.minecraft.client.Minecraft.init(Minecraft.java:559) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:421) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: java.io.FileNotFoundException: realism:models/item/cobblestones.json
    at net.minecraft.client.resources.FallbackResourceManager.getResource(FallbackResourceManager.java:69) ~[FallbackResourceManager.class:?]
    at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:65) ~[SimpleReloadableResourceManager.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.loadModel(ModelBakery.java:334) ~[ModelBakery.class:?]
    at net.minecraftforge.client.model.ModelLoader.access$1600(ModelLoader.java:130) ~[ModelLoader.class:?]
    at net.minecraftforge.client.model.ModelLoader$VanillaLoader.loadModel(ModelLoader.java:880) ~[ModelLoader$VanillaLoader.class:?]
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:149) ~[ModelLoaderRegistry.class:?]
    ... 20 more
[18:44:31] [main/ERROR] [FML]: Exception loading model for variant realism:cobblestones#inventory for item "realism:cobblestones", blockstate location exception:
net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model realism:cobblestones#inventory with loader VariantLoader.INSTANCE, skipping
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:153) ~[ModelLoaderRegistry.class:?]
    at net.minecraftforge.client.model.ModelLoader.loadItemModels(ModelLoader.java:322) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.loadVariantItemModels(ModelBakery.java:175) ~[ModelBakery.class:?]
    at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:164) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
    at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:121) [SimpleReloadableResourceManager.class:?]
    at net.minecraft.client.Minecraft.init(Minecraft.java:559) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:421) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: net.minecraft.client.renderer.block.model.ModelBlockDefinition$MissingVariantException
    at net.minecraft.client.renderer.block.model.ModelBlockDefinition.getVariant(ModelBlockDefinition.java:83) ~[ModelBlockDefinition.class:?]
    at net.minecraftforge.client.model.ModelLoader$VariantLoader.loadModel(ModelLoader.java:1189) ~[ModelLoader$VariantLoader.class:?]
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:149) ~[ModelLoaderRegistry.class:?]
    ... 20 more
 
5,018
47
783
А где регистрируешь событие? В pre или init?
Я написал же выше. В ините клиентпрокси. Потому что блоки в ините регаются, а там где рендер я уже вызываю блок
 

Icosider

Kotliner
Администратор
3,601
99
664
Просто кто-то не умеет?) А вообще могу частично согласиться, хотя это всё равно что использовать obj, fbx и т.п. форматы) Просто .json и больше возможностей нежели как раньше)
 

Icosider

Kotliner
Администратор
3,601
99
664
А и убери то, что у тебя через Minecraft.getMinecraft и замени на ModelLoader.setCustomModelResourceLocation
Я написал же выше. В ините клиентпрокси. Потому что блоки в ините регаются, а там где рендер я уже вызываю блок
В преИните должно быть.
 
5,018
47
783
Сверху