Как получить блок с определенной метадатой?

Версия Minecraft
1.12.2
Добрый день, у меня возникла проблема: я никак не могу понять, как получить Block с учетом метадаты.
Задача такова: у нас есть два типа дерева - дуб и береза, нужно получить блок березы у которого, в данном случае, метадата равна 1.
 
1,038
57
229
Ссылка на wiki Minecraft - Древесина
d77a8c73ec.jpg

Потому что ты вызываешь метод, который пашет без метадаты.
Нужно так:
Java:
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, metadata);
Java:
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, 2);
Java:
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, 6);
Java:
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, 10);
Java:
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, 14);
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Blocks.LOG.getDefaultState().withProperty(BlockLog.VARIANT, BlockLog.EnumType.BIRCH);
То есть юзай проперти, если нужно получить IBlockState для установки в мир, например. Так правильно и читабельно.
 
5,018
47
783
5,018
47
783
При генерации блока в мире нужно заменять только блоки Дуба, а другие не трогать, вот.

Да, это работает, но как можно это конвертировать в блок?
Если я вызываю Block.getBlockFromItem(new ItemStack(Blocks.LOG, 1, 0).getItem()), то при getItem() он возвращает имя tile.log
Я ж тебе так же все написал как Agravaine, именно то что тебе надо. Ты что даже не попробовал что ли?
Тебе не нужно никакой предмет, никакая конвертация. Просто получаешь LOG и ее енумтайп - березу. Если надо конкретно мету получить березовую то в конце еще допиши getMetadata()
Почему ты не читаешь что я написал?
 
Я ж тебе так же все написал как Agravaine, именно то что тебе надо. Ты что даже не попробовал что ли?
Тебе не нужно никакой предмет, никакая конвертация. Просто получаешь LOG и ее енумтайп - березу. Если надо конкретно мету получить березовую то в конце еще допиши getMetadata()
Почему ты не читаешь что я написал?
Боже, я сказал, мне надо получить БЛОК.
Если я использую Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH).getBlock(), то мне все также возвращается tile.log при .getUnlocalizedName().
Мне не нужно получать НОМЕР МЕТЫ, мне надо получить блок Берёзы, не Дерево, а блок Берёзы.
А если я буду каждый блок в чанке проверять на соответствие берёзе, то получится дикая нагрузка...
 
Дабы было более понятное представление о текущем коде я выложу ту часть, в которой надо это все реализовать, может это поможет:
Java:
    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,
                         IChunkProvider chunkProvider) {
        switch(world.provider.getDimension()) {
            case 0:
                TheAnts.logger.log(Level.WARN, Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH).getBlock().getUnlocalizedName());
                runGenerator(BlockRegistry.BlockTaintedLog.getDefaultState(), 3, 9600, 50, 250, BlockMatcher.forBlock(Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH).getBlock()), world, random, chunkX, chunkZ);
                break;
            default:
                break;
        }
    }
 

tox1cozZ

aka Agravaine
8,455
598
2,892
А если я буду каждый блок в чанке проверять на соответствие берёзе, то получится дикая нагрузка...
А иначе ты как собрался заменять блок?
И вообще, такие действия нужно делать когда чанк еще сырой(PopulateChunkEvent.Populate) и он не установил все блоки в мир, тогда нагрузки почти будет.
 
Так, я решил чутка погуглить про Блокстейты и Predicate и по итогу получил примерно такой вариант Predicates.equalTo(Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH)), он вроде работает.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Чел, ты вообще слушаешь что я говорю? Ладно для березы, ее вроде не много в чанке. Но если ты вдруг захочешь менять землю или камень, то будет дикий лагодром. Лучше сразу юзай тот метод, который я написал в посте выше.
 
5,018
47
783
Боже, я сказал, мне надо получить БЛОК.
Ты че тупишь. Я тебе сказал что надо получать стейт блока. Ты не зная кода споришь тут. Это ОДНО И ТОЖЕ
Blocks.STONE и Blocks.STONE.getDefaultState() это одно и тоже(условно). Только во втором случае ты еще получаешь доступ к стейтам. Я больше не буду писать в эту тему, ты не читаешь абсолютно что тебе пишут и пытаешься какое то говно своими руками сделать.
Вообще перейдя на 1.12.2 стоит стараться забыть что такое блок и юзать блокстейты
блок Берёзы, не Дерево, а блок Берёзы.
Его НЕ СУЩЕСТВУЕТ. Это субтайп блока LOG
Так, я решил чутка погуглить про Блокстейты и Predicate и по итогу получил примерно такой вариант Predicates.equalTo(Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH)), он вроде работает.
Ровно тоже самое что я написал тебе вчера....
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,455
598
2,892
ты не читаешь абсолютно что тебе пишут и пытаешься какое то говно своими руками сделать
Ох, помню темку с генерацией своего мира в которой @DdoosS пытался тебе объяснить и даже готовый код давал, а ты все равно уперся и делал какашку :D
 
5,018
47
783
Ох, помню темку с генерацией своего мира в которой @DdoosS пытался тебе объяснить и даже готовый код давал, а ты все равно уперся и делал какашку
И я ее сделал. Просто потом решил сделать иначе)
 
Сверху