Получить блок слева от блока.

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте, вопрос, назрел два часа назад, я уже всю голову изломал, как сделать бы это. Даже костылей в голову не приходит. В общем, в чем суть. Есть некоторый блок. Он ставиться с поворотом в сторону игрока, как печка. Мне нужно слева от него - не в какую то сторону света, а конкретно от этого блока получить тот блок, который там стоит...
Если кратко: при клике по стороне, которая отмечена красным, я должен получить блок, который отмечен зеленым и блок, по стороне которого кликнули.

Up: Хотя один костыль в голову приходит, но хотелось бы сделать нормально.
2018-07-03_14.16.55.png
 
Последнее редактирование:
5,018
47
783
И еще почему то постоянно при перезаходе сбрасывается блокстейт, до противоположного дефолтному
Вот код, забыл, кстати

Java:
    @Override
    public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
    {
        world.scheduleBlockUpdate(pos, this,1, 0);

        EnumFacing facing = EnumFacing.fromAngle(placer.getRotationYawHead());
        
        EnumFacing facingstate = state.getValue(FACING);
        if(facingstate == EnumFacing.SOUTH) {
            if(world.getBlockState(new BlockPos(pos.getX() + 1, pos.getY(), pos.getZ() + 1)).getBlock().isFullBlock(state)) {
                world.setBlockState(pos, state.withProperty(isAngle, true).withProperty(FACING, facing));
            }
            else world.setBlockState(pos, state.withProperty(isAngle, false).withProperty(FACING, facing));
            
        }
        
        //    world.setBlockState(pos, state.withProperty(isAngle, true).withProperty(FACING, facing));
        
    
}
 
Последнее редактирование:

Icosider

Kotliner
Администратор
3,603
99
664
Сбрасывается потому что ты неправильно сделал запись и чтение блокстейта из меты. По поводу проверки блока: можешь взять свой блок и от его позиции циклом пройтись по кругу на один блок.
 
5,018
47
783
неправильно сделал запись и чтение блокстейта из меты.
А что тут не так? Раньше то работал это код... Твой кстати.

Java:
public class Wallpaper extends BasicBlockWithCustomModel {
    public static final PropertyBool isAngle = PropertyBool.create("isangle");
    public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
    private static AxisAlignedBB[] SIDE_AABB = new AxisAlignedBB[] {
            new AxisAlignedBB(0D, 0D, 1D, 1D, 1D, 0.99D),
            new AxisAlignedBB(0D, 0D, 0.01D, 1D, 1D, 0D),
            new AxisAlignedBB(0.01D, 0D, 1D, 0D, 1D, 0D),
            new AxisAlignedBB(1D, 0D, 0D, 0.99D, 1D, 1D)
    };
    public Wallpaper(Material materialIn, String name, float hardness, float resistanse, SoundType soundtype) {
        super(materialIn, name, hardness, resistanse, soundtype);
        this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(isAngle, false));
    }

    @Override
    public IBlockState withRotation(IBlockState state, Rotation rot)
    {
        return state.withProperty(FACING, rot.rotate(state.getValue(FACING)));
    }



    @Override
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        i = i | state.getValue(FACING).getHorizontalIndex();
        return i;
    }

    @Override
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta));
    }
    @Override
    public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
    {
        return state.withRotation(mirrorIn.toRotation(state.getValue(FACING)));
    }
    @Override
    public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
    {
        world.scheduleBlockUpdate(pos, this,1, 0);

        EnumFacing facing = EnumFacing.fromAngle(placer.getRotationYawHead());

        float facingstate = state.getValue(FACING).getHorizontalIndex();
        System.out.println(facingstate);
        System.out.println(facing);

        world.setBlockState(pos, state.withProperty(isAngle, false).withProperty(FACING, facing));

    }

    //    world.setBlockState(pos, state.withProperty(isAngle, true).withProperty(FACING, facing));

    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
        switch (state.getValue(FACING))
        {
        case SOUTH:
            return this.SIDE_AABB[0];
        case NORTH:
        default:
            return this.SIDE_AABB[1];
        case WEST:
            return this.SIDE_AABB[2];
        case EAST:
            return this.SIDE_AABB[3];
        }
    }
    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {FACING,isAngle});
    }
}
 
Последнее редактирование:
5,018
47
783
так это же простая boolean, она вроде на игровой блок никак не влияет, в отличии от дирекшена...

По поводу второго: как циклом по кругу вокруг блока проходить?:)
 
5,018
47
783
Кстати, только что путем опытного получения выяснилось что state.getValue(FACING) всегда возвращает юг. Блин. Че не так то?)) Вообще не в курсе, что с метой не так.
 

Icosider

Kotliner
Администратор
3,603
99
664
так это же простая boolean, она вроде на игровой блок никак не влияет, в отличии от дирекшена...
Аха, у меня на бочках было условие(Boolean) есть кран = true else false и именно из-за этого у меня все повороты съезжали и блоки переворачивались. По поводу прохождения, ну тип на подобие такого.
Java:
val pos = BlockPos(5, 0, 5)//примерно
var block: Block
for (x in pos.x - 1 until pos.x + 1)
{
    for (z in pos.z - 1 until pos.z + 1)
    {
        block = world.getBlock(МутаблеПос(x, 0, z))
    }
}
Не знаю будет ли работать, но в принципе по аналогии.
 
5,018
47
783
ща попробуем.
Я все равно ничего не понял, по поводу меты. Гайдик бы((
А лучше просто сразу рассказать как эта булеан влияет и как ее в мету записывать.
 

Icosider

Kotliner
Администратор
3,603
99
664
Про побитовые операторы почитай. У тебя в стейтах угол и фейсинг, но при этом ты записываешь только фейсинг. Соответственно твоя мета едет. Тебе нужно с помощью побитовых операторов уложить в 16.
 
5,018
47
783
да нету там угла... это название такое. Если есть блок на коре слева, то он тоже моделькой закрывается, нету - не закрывается...
Почитаю про операторы. Но тут мне это вряд ли поможет, тут какая то глупость наверное простейшая.
 
5,018
47
783
Почитал. Я так понял, |= тоже самое что += только для битов. Как мета то устроена? что там за числа? Как мне их преобразовывать?
 

Icosider

Kotliner
Администратор
3,603
99
664
Так к примеру ты можешь использовать побитовые сдвиги, вправо = деление, влево = умножение(примерно). И тем самым ты можешь сделать из 8 >> 2 = 2 и наоборот 2 << 2 = 8. Обычно такой подход используется для микрооптимизации, особо прироста не будет(хотя когда как), вот и с getMetaFromState такая же история.
 
5,018
47
783
Это полезно, понял.
Но я так и не понял, что же такое мета и как она работает?)
 

Icosider

Kotliner
Администратор
3,603
99
664
Крч,
Java:
@Override
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta & 3)).withProperty(BARREL, Boolean.valueOf((meta & 8) > 0)).withProperty(SPIGOT, Boolean.valueOf((meta & 4) > 0));
    }

    @Override
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        i |= state.getValue(FACING).getHorizontalIndex();

        if(state.getValue(BARREL).booleanValue())
        {
            i |= 8;
        }

        if(state.getValue(SPIGOT).booleanValue())
        {
            i |= 4;
        }

        return i;
    }
Вот как было у меня.
 
Сверху