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

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

Up: Хотя один костыль в голову приходит, но хотелось бы сделать нормально.
2018-07-03_14.16.55.png
 
Последнее редактирование:
5,018
47
783
Так ты ничего так и не сказал, что такое мета :)
Буду рад, @MinecraftForge если расскажешь
 
1530640029604.png
Сохранять булеаны можно так.
Просто добавляем единичку к числу, или если булеан == false то ничего не добавляем.
Дальше смещаем число на 1 бит влево.
Итак, сначала число будет иметь такой вид(в бинарном виде, с моим примером значений, см картинку):
000
После первого прибавления единицы(boolean b1 = true):
001
После первого сдвига:
010
После второго прибавления нуля(boolean b2 = false):
010
После второго сдвига:
100
После третьего прибавления единицы(boolean b3 = true):
101
Все, мы самым оптимальным образом запаковали 3 булеана.
Я выделил тот бит, который изменятся в зависимости от булеанов.

Теперь распаковка(немного не оптимальная))
1530640429390.png
Алгоритм распаковки:
числовая переменная i = 1
Смещаем число(без присвоения) на кол-во булеанов - i байта влево, если получившееся значение равно 1 - сетаем значение i'ому булеану на true. Если i < кол-во булеанов и i'ый булеан равен true, уменьшаем число на 1 << кол-во булеанов-i. Таким образом убирая из числа бит со значением i'ого булеана. Увеличиваем i на 1. Повторять эти действия всегда когда i < кол-во булеанов.​

Итак, сначала число будет иметь такой вид(в бинарном виде, с моим примером значений, см результат выше):
101 (boolean resultb1 становится равен true)
После первого уменьшения:
01 (boolean resultb2 становится равен false)
После второго уменьшения:
1 (boolean resultb2 становится равен true)
Я выделил тот бит, который программа выше проверяет в текущий момент.
 
Java:
@Override
public int getMetaFromState(IBlockState state){
    return state.getValue(FACING).original();
}

@Override
public IBlockState getStateFromMeta(int meta){
    return this.getDefaultState().withProperty(FACING, EnumFacing.values[meta]);
}
В твоем случае ты можно обойтись без побитовых операторов)
 
5,018
47
783
Java:
@Override
public int getMetaFromState(IBlockState state){
    return state.getValue(FACING).original();
}

@Override
public IBlockState getStateFromMeta(int meta){
    return this.getDefaultState().withProperty(FACING, EnumFacing.values[meta]);
}
В твоем случае ты можно обойтись без побитовых операторов)
Эта штука кстати не то что не работает, а аж крашит.
 
5,018
47
783
Вообщем, вот такой код, как я понял, мне нужен:
Но он не работат. По прежнему из блокстейта возвращается только Юг и фалсе. Дефолт - север, фалсе.

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

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

            return i;
    }

    @Override
    public IBlockState getStateFromMeta(int meta)
    {
         return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta & 3)).withProperty(isAngle, Boolean.valueOf((meta & 4) > 0));
    }
 
Java:
@Override
public int getMetaFromState(IBlockState state){
    int i = state.getValue(FACING).getHorizontalIndex();
    i <<= 1;
    if(state.getValue(isAngle).booleanValue()){
        i+=1;
    }
    return i;
}
Java:
@Override
public IBlockState getStateFromMeta(int meta) {
    EnumFacing enumfacing = EnumFacig.getHorizontal(meta >> 1);
    boolean b1 = meta - (enumfacing.getHorizontalIndex() << 1) == 1;
    return this.getDefaultState().withProperty(BlockHorizontal.FACING, enumfacing).withProperty(isAngle, b1);
}
Не проверял, но должно работать.
 
5,018
47
783
System.out.println(Integer.toBinaryString((int)meta));Дает такое. В любом фейсинге:
[22:05:56] [main/INFO] [STDOUT]: [ru.lg.SovietMod.Blocks.Wallpaper:getStateFromMeta:62]: 100

System.out.println(Integer.toBinaryString((int)meta >> 1)); Дает такое:
[22:06:48] [main/INFO] [STDOUT]: [ru.lg.SovietMod.Blocks.Wallpaper:getStateFromMeta:62]: 10

Логична:)
Хотя вроде нет, должно быть 010...
 
3,005
192
592
Код:
public IBlockState getStateFromMeta(int meta)
{
    EnumFacing enumfacing;

    switch (meta & 7)
    {
        case 0:
            enumfacing = EnumFacing.DOWN;
            break;
        case 1:
            enumfacing = EnumFacing.EAST;
            break;
        case 2:
            enumfacing = EnumFacing.WEST;
            break;
        case 3:
            enumfacing = EnumFacing.SOUTH;
            break;
        case 4:
            enumfacing = EnumFacing.NORTH;
            break;
        case 5:
        default:
            enumfacing = EnumFacing.UP;
    }

    return this.getDefaultState().withProperty(FACING, enumfacing).withProperty(POWERED, Boolean.valueOf((meta & 8) > 0));
}

public int getMetaFromState(IBlockState state)
{
    int i;

    switch ((EnumFacing)state.getValue(FACING))
    {
        case EAST:
            i = 1;
            break;
        case WEST:
            i = 2;
            break;
        case SOUTH:
            i = 3;
            break;
        case NORTH:
            i = 4;
            break;
        case UP:
        default:
            i = 5;
            break;
        case DOWN:
            i = 0;
    }

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

    return i;
}
1.12.2 net.minecraft.block.BlockButton
 
5,018
47
783
Сверху