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

Версия Minecraft
1.9
5,149
49
899
Добрый вечер всем! Начал немножно что то писать на 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;
 }
 
 }
 
Maxik001 написал(а):
Еще он как то странно себя ведет, когда его выкидываешь. Он полностью уходит в блок, потом вылезает

Модель сделай, и через редактор настрой floor и будет тебе счастье. А ещё он наверное у тебя в руке больше чем голова игрока...
 
А-а. Какой жи сложный и непонятный 1.9 ((
 
Я знаю, это весьма старая тема, но апнуть ее надо, чтобы не создавать новую. В общем, я сделал блок с метой, у себя, все вроде окей, модельки есть туда сюда.
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"));
        }
    }
 
Последнее редактирование:
К слову, если делать через 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();
    }
}
 
Потому что надо через событие регистрации модели это делать-_- Уже пройденный вариант, который даже на 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"));
        }
    }
 
Нету(
Зарегал по форджевской шине. Прокси Клиент. После блоков, в ините, так как блоки там регаются.
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
 
Почему нельзя пользоваться обычным OGL? Зачем мутить всю эту дичь?
Хочется. Мне не составило бы труда добавить эти три блока по одному,но надо когда то разобраться, вдруг пригодиться
 
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
 
А где регистрируешь событие? В pre или init?
Я написал же выше. В ините клиентпрокси. Потому что блоки в ините регаются, а там где рендер я уже вызываю блок
 
Просто кто-то не умеет?) А вообще могу частично согласиться, хотя это всё равно что использовать obj, fbx и т.п. форматы) Просто .json и больше возможностей нежели как раньше)
 
А и убери то, что у тебя через Minecraft.getMinecraft и замени на ModelLoader.setCustomModelResourceLocation
Я написал же выше. В ините клиентпрокси. Потому что блоки в ините регаются, а там где рендер я уже вызываю блок
В преИните должно быть.
 
Назад
Сверху