Как можно сделать так, чтобы ставилось сразу два блока друг на друга?

Версия Minecraft
1.12.2
101
3
Привет, народ!
Подскажите, пожалуйста, реально ли реализовать следующую механику установки блока.
Имеем две модели блока (нижнюю и верхнюю). Как можно сделать так, чтобы при установки нижнего блока поверх него ставился автоматом верхний блок?
 
5,018
47
783
Быстрей и удобней сделать сразу одну модель на два блока а там сверху фантомный ставить. С дверьми это прямо облегчает задачу в миллион раз например
 
7,099
324
1,509
@ipv2007 это можно сделать через кастомный ItemBlock
 
101
3
Есть те которые делают это бесплатно, это называется альтруизм.
Мы же с тобой не на сайте фрилансеров, верно? Я что-то не увидел, чтобы на этом форуме было написано, что он платный или помощь только за деньги.
Если бы ты кинул кусок кода, который не понимаешь - тебе бы объяснили.
Ок, вот код и я не могу понять некоторые моменты. Укажу свое понимание после "//"
Java:
public class BlockGasPump extends BlockRotatedObject //тут все понятно
{
    public static final PropertyBool TOP = PropertyBool.create("top"); //тут мы, как бы, забиваем верх модели - верно?

    public BlockGasPump() // понятно все
    {
        super(Material.ANVIL, "gas_pump"); //понятно
        this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(TOP, false)); //не понимаю
        this.setHardness(1.0F); //понятно
    }
//расплывчато понял о чем речь ниже? Понятно, что в самом низу о рендеринге код, а вот выше рендеринга?
    @Override
    public boolean canPlaceBlockAt(World worldIn, BlockPos pos)
    {
        return worldIn.isAirBlock(pos) && worldIn.isAirBlock(pos.up());
    }

    @Override
    public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
    {
        worldIn.setBlockState(pos.up(), state.withProperty(TOP, true));
    }

    @Override
    public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player)
    {
        if(state.getValue(TOP))
        {
            if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump)
            {
                worldIn.setBlockToAir(pos.down());
            }
        }
        else
        {
            if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump)
            {
                worldIn.setBlockToAir(pos.up());
            }
        }
    }

    @Override
    public int getMetaFromState(IBlockState state)
    {
        return state.getValue(FACING).getHorizontalIndex() + (state.getValue(TOP) ? 4 : 0);
    }

    @Override
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta % 4)).withProperty(TOP, meta / 4 > 0);
    }

    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, FACING, TOP);
    }

    @Override
    public BlockRenderLayer getBlockLayer()
    {
        return BlockRenderLayer.CUTOUT;
    }
}
Я этот код пробовал применить к себе. В принципе работает установка блока поверх другого блока, точнее модели json, но есть ошибки:
1. Модели не имеют формы. Ставится обычный блок без текстур.
2. Поставленные модели не срубаются вместе.

Особенно вот этот момент не понятен:
Java:
@Override
    public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player)
    {
        if(state.getValue(TOP))
        {
            if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump)
            {
                worldIn.setBlockToAir(pos.down());
            }
        }
        else
        {
            if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump)
            {
                worldIn.setBlockToAir(pos.up());
            }
        }
    }
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Вот, совсем другое дело.
BlockState - это удобная обертка метадаты. Надеюсь ты знаешь что такое метадата? Каждый блок в мире может хранить метаданные(число от 0 до 15).
public static final PropertyBool TOP = PropertyBool.create("top"); //тут мы, как бы, забиваем верх модели - верно?
Тут мы создаем параметр для нашего BlockState. В данном случае - параметр типа булев, который говорит верхний это блок или нет.
@Override public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return worldIn.isAirBlock(pos) && worldIn.isAirBlock(pos.up()); }
Метод, как можно понять по названию, возвращает тру если блок можно установить. В методе мы проверяешь, что позиция в мире куда мы хотим поставить блок - пустая(воздух), а так же выше на один блок тоже воздух.
@Override public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { if(state.getValue(TOP)) { if(worldIn.getBlockState(pos.down()).getBlock() instanceof BlockGasPump) { worldIn.setBlockToAir(pos.down()); } } else { if(worldIn.getBlockState(pos.up()).getBlock() instanceof BlockGasPump) { worldIn.setBlockToAir(pos.up()); } } }
Метод вызывается при ломании блока. Там есть проверка, что если блок верхний - значит ломаем нижний. Если же игрок сломал нижний - ломаем верхний.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Я этот код пробовал применить к себе. В принципе работает установка блока поверх другого блока, точнее модели json, но есть ошибки:
1. Модели не имеют формы. Ставится обычный блок без текстур.
2. Поставленные модели не срубаются вместе.
Я на новых версиях не кодил почти, по-этому с жсонами очень мало знаком. Попробуй заглянуть в жсон цветка и глянуть как там это выглядит все, может какие-то параметры есть.
 
Сверху