Метадата

Версия Minecraft
1.12.2
API
Forge

sk9zist :l

Исправился
981
18
157
Добро. Попытался сделать поворот своего блока относительно взгляда игрока, но, оказалось не просто. Не хотел писать на форум, но, самому у меня получилось только сделать частицы выпадения при ломании блока с текстурой самого моего блока (раньше они были белыми, тоесть текстуру вообще не находило. Но потом в json более менее разобрался и сделал)

Также была прочитана данная информация с нескольких тем:
(ссылки на темы расположены в обратном порядке)
Если в одной из них всё же есть решение моей проблемы - пните.

Перепробовал много вариантов:

игрался с методом onBlockPlacedBy:
класс блока:
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
{
    int angle = MathHelper.floor(placer.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
    int change = EnumFacing.getHorizontal(angle).getOpposite().getIndex();
    worldIn.setBlockState(pos, getStateFromMeta(change), 3);
}
V2:
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
{
    EnumFacing facing = EnumFacing.fromAngle(placer.getRotationYawHead());
    worldIn.scheduleUpdate(pos, state.getBlock(), 40);
    worldIn.setBlockState(pos, state.withProperty(FACING, facing));
}
V3:
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
{
    worldIn.setBlockState(pos, this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2);
}

метод getStateFromMeta:
V1:
@Override
public IBlockState getStateFromMeta(int meta)
{
    EnumFacing enumfacing = EnumFacing.getHorizontal(meta % 4);
    return this.getDefaultState().withProperty(FACING, enumfacing);
}
V2:
@Override
public IBlockState getStateFromMeta(int meta)
{
    EnumFacing enumfacing = EnumFacing.getFront(meta);
    if (enumfacing.getAxis() == EnumFacing.Axis.Y) {
        enumfacing = EnumFacing.NORTH;
    }
}

метод createBlockState:
V1:
@Override
protected BlockStateContainer createBlockState()
{
    return new BlockStateContainer(this, new IProperty[] {FACING});
}
V2:
@Override
protected BlockStateContainer createBlockState()
{
    return new BlockStateContainer(this, FACING);
}

метод getMetaFromState:
Java:
@Override
public int getMetaFromState(final IBlockState state)
{
    //return state.getValue(FACING).getHorizontalIndex();
    return state.getValue(FACING).getIndex();
}

Также были трудности с переменной FACING, но я нашёл вроде как сделать, вот он: (чуть не забыл)
класс блока:
//public static final PropertyDirection FACING = BlockHorizontal.FACING;
public static final PropertyDirection FACING = PropertyDirection.create("facing");

В итоге всех экспериментов было так, что с одного направления блок был с текстурой, в остальных направлениях - без текстуры. Может ещё удавалось сделать чтобы два парралельных направления взгляда оба работали (отображали текстуру, но нельзя было проверить работоспособность, так как поворота как такового особо небыло) но, честно говоря не помню.
В данный момент при установке блоке в любом направлении на нём нет текстуры, только частицы с его текстурой при ломании.

Как решить, собсно, данную головоломку?
 
Последнее редактирование:
Решение
Не правильно. Там другой синтаксис. Посмотри тут: Model
Должно быть че-то такое
Пример из факела:
"variants": {
        "facing=east": { "model": "block/wall_torch" },
        "facing=south": { "model": "block/wall_torch", "y": 90 },
        "facing=west": { "model": "block/wall_torch", "y": 180 },
        "facing=north": { "model": "block/wall_torch", "y": 270 }
    }
}

sk9zist :l

Исправился
981
18
157
Ей богу! Заработало! Блок при разных направлениях ставиться с разным поворотом!

А что насчёт решения:
Сначала я сделал всё как написано в той статье, что ты дал и всё поправил, вышло примерно так:
JSON:
{
  "variants": {
    "normal": [{}],
    "inventory": [{}],
    "facing": {
        "east": {},
        "south": { "model": "блок", "y": 90 },
        "north": { "model": "блок", "y": 270 },
        "west": { "model": "блок", "y": 180 }
    }
  }
}
- Не сработало. Потом у меня произошел взрыв мозга и я придумал вот это:
JSON:
{
  }
  "variants": {
    "normal": [{}],
    "inventory": [{}],
    "facing": {
        "east": {},
        "south": {
          "model": "блок",
          "transform": {
            "rotation": [ { "x": 0 }, { "y": 90 }, { "z": 0 } ],
            "scale": 1.0
          }
        },
        "north": {
          "model": "блок",
          "transform": {
            "rotation": [ { "x": 0 }, { "y": 270 }, { "z": 0 } ],
            "scale": 1.0
          }
        },
        "west": {
          "model": "блок",
          "transform": {
            "rotation": [ { "x": 0 }, { "y": 180 }, { "z": 0 } ],
            "scale": 1.0
          }
        }
    }
  }
}
Да, выглядит как какой-то хитрожопистый костыль, но я столько времени пытался это всё сделать, что мне всёравно. Главное работает!)

Форматирование (BB-код):
Осталось только отредактировать код (сделать нормальную функцию определения взгляда), потому что сейчас блок ставиться в разных фейсингах так как функция из поршня неправильная и мне лень с ней возится.
Через пару минут выдам лучший ответ @hohserg. Спасибо, правда)
 
Последнее редактирование:
7,099
324
1,510
Чо_O это за дичь?
А вот так не работает?
Java:
{
    "variants": {
        "facing=east": { "model": "блок" },
        "facing=south": { "model": "блок", "y": 90 },
        "facing=west": { "model": "блок", "y": 180 },
        "facing=north": { "model": "блок", "y": 270 }
    }
}
 

sk9zist :l

Исправился
981
18
157
А вот так не работает?
Нет.

По поводу решения ещё могу сказать:
Во первых:
Java:
public static final PropertyDirection FACING = BlockHorizontal.FACING;
и
Java:
public static final PropertyDirection FACING = PropertyDirection.create("facing");
- по сути одно и тоже. Т.к класс BlockHorizontal содержит переменную FACING, которая соответствует второму варианту, т.е. PropertyDirection.create("facing") - тоже самое.
Но в BlockHorizontal FACING создаёться только для четырех сторон света кроме down и up. По сути как раз оно мне и надо
По поводу методов:
Java:
getHorizontalIndex();
- возвращает только один из индексов четырех сторон света. (их четыре)
Java:
getIndex();
- возвращает один из шести индексов всех сторон (верх, низ, север, юг, запад, восток)

Во вторых:
Не используйте getOpposite(), если вам не нужно делать down и up вместе с north, west, south и east!
Java:
getOpposite();
неправильно возвращает стороны света. Возможно, дело в том, что этот метод возвращает также DOWN и UP (определяет). Но незнаю что именно.
Так что замените это:
Java:
EnumFacing.getHorizontal(angle).getOpposite();
на:
Java:
EnumFacing.getHorizontal(angle);

Это если кто-то будет решать похожую проблему, как у меня.
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Всё, сделал. Работает прекрасно!:)

Вообщем, спасибо @hohserg огромнейшее! Как всегда лучший!)
 
5,018
47
783
Боже ну ты и накуролесил.
getOpposite нормально работает. Он возвращает противоположную сторону света, вроде это очевидно из названия)
 
Сверху