Метадата

Версия 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
Забыл.. Я просто проблему именно с загрузкой текстур уже решил, там оказалось что нужны также "down" и "up" в фейсингах джсона чтобы работало. В ином случае - крашилось с ошибкой.

Вот полный файл в blockstates:
blockstates/testblock.json:
{
  "variants": {
    "normal": [{ "model": "dp:testblock" }],
    "inventory": [{ "model": "dp:testblock" }],
    "facing": {
        "down": {"model": "dp:testblock", "x": 0},
        "up": {"model": "dp:testblock", "x": 0},
        "north": {"y": 0},
        "east": {"y": 90},
        "west": {"y": 270},
        "south": {"y": 180}
    }
  }
}
(у меня такое ощущение, кстати что на конце лишняя скобка, незнаю из-за этого или нет)

Модели пока нету, пока только (обычный блок с одинаковой текстурой по всем его сторонам, чтобы проще было, всё равно тестовый)
 

WantaSanchez

Опоздун
633
17
150
Да не, вроде норм.

Регистрируешь setDefaultBlockstate или как там его и в методе установки блока меняй ориентацию блокстейта относительно взгляда игрока. Для подсказок кода смотри в код блока ванильной печки.
 

sk9zist :l

Исправился
981
18
157
Регистрируешь setDefaultBlockstate или как там его
Java:
@Override
protected BlockStateContainer createBlockState()
{
    return new BlockStateContainer(this, new IProperty[] { FACING});
}
?
Я сделал уже, но не работает. Примеры кода в шапке можешь посмотреть

код блока ванильной печки
Да.. Не раз проходили. Это всё время советуют, но никому это обычно так и не помогло.
 

WantaSanchez

Опоздун
633
17
150
Я сделал уже, но не работает.
Не не не, там вроде вне конструктора добавляешь пустой блокстейт, и ENUM_FACING, а в самом конструкторе что-то типа setDefaultBlockstate(BLOCKSTATE); После в методе установки блока делаешь свитч, в котором чекаешь направление взгляда устанавливаешь ENUM_FACING.

Сорри, дал бы больше инфы, но я это делал давно и уже подзабыл. Тем более я перешёл на Fabric и потихоньку забываю код для Forge. Точно помню, что таким методом всё получилось в плане того, что при установке блока его модель также поворачивалась относительно взгляда игрока.
 

sk9zist :l

Исправился
981
18
157
там вроде вне конструктора добавляешь пустой блокстейт, и ENUM_FACING, а в самом конструкторе что-то типа setDefaultBlockstate(BLOCKSTATE); После в методе установки блока делаешь свитч, в котором чекаешь направление взгляда устанавливаешь ENUM_FACING.
Вот ещё один кусок кода, не мой, но это для теста было, я вроде писал об этом в шапке но вот:
Java:
@Override
public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state)
{
    if (!worldIn.isRemote)
    {
        IBlockState north = worldIn.getBlockState(pos.north());
        IBlockState south = worldIn.getBlockState(pos.south());
        IBlockState west = worldIn.getBlockState(pos.west());
        IBlockState east = worldIn.getBlockState(pos.east());
        EnumFacing face = (EnumFacing)state.getValue(FACING);

        if (face == EnumFacing.NORTH && north.isFullBlock() && !south.isFullBlock()) face = EnumFacing.SOUTH;
        else if (face == EnumFacing.SOUTH && south.isFullBlock() && !north.isFullBlock()) face = EnumFacing.NORTH;
        else if (face == EnumFacing.WEST && west.isFullBlock() && !east.isFullBlock()) face = EnumFacing.EAST;
        else if (face == EnumFacing.EAST && east.isFullBlock() && !west.isFullBlock()) face = EnumFacing.WEST;
        worldIn.setBlockState(pos, state.withProperty(FACING, face), 2);
    }
}*/
это то? только это не через свитч, а какие-то костыли

его модель также поворачивалась относительно взгляда игрока.
У меня пока вообще не видно блока.
 
Последнее редактирование:
7,099
324
1,510
Нет, это для факела, чтобы автоматически коннектился к первой подходящей стороне
 

sk9zist :l

Исправился
981
18
157
7,099
324
1,510
Если установка твоего блока зависит от взгляда существа, установившего его(игрока чаще всего), т.е. как у поршня, то переопредели в своем блоке метод onBlockPlacedBy. Там в аргументах есть EntityLivingBase placer, кто установил блок, из него можно получить направление взгляда. И в аргументах есть мир и позиция в мире, что позволяет обновить в блокстейте проперти направления блока.
Функцию, принимающую вектор взгляда и возвращающую направление блока напиши сам или скопипасть из поршня.
Если твой блок можно устанавливать только в четыре стороны света, то покатит округление rotationYaw до 90 градусов(можно посмотреть во всяких лестницах, сундуках)

Если установка твоего блока зависит от того, на какую сторону другого блока была нажата пкм, то переопредели у своего итем-блока onItemUse, там в аргументах есть достаточные данные. Будет полезно посмотреть дефолтную реализацию этого метода.
 

sk9zist :l

Исправился
981
18
157
посмотреть дефолтную реализацию этого метода.
Какие только я реализации не посмотрел. И в исходниках майна в том числе, там самые простые.

переопредели в своем блоке метод onBlockPlacedBy. Там в аргументах есть EntityLivingBase placer
Спасибо, но уже установлено
игрался с методом onBlockPlacedBy:
Java:
@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);
}

Однако, спасибо за консультацию. Теперь я точно знаю, что надо там писать. Щас буду эксперементировать
 
Последнее редактирование:
7,099
324
1,510
Да, примерно такое там и надо писать. Вот только getStateFromMeta - этот метод никогда не надо вызывать, его нужно просто определить в своем классе.
Пара методов getStateFromMeta и getMetaFromState просто кодируют-декодируют проперти блокстейта в 4 бита. Нигде больше эти 4 бита метадаты трогать не надо. Трогать надо блокстейт с пропертями. Его и осмысливать проще. Например, добавь println для EnumFacing.getHorizontal(angle).getOpposite(), чтобы проверить, правильную ли сторону дает твоя формула
 

sk9zist :l

Исправился
981
18
157
7,099
324
1,510
Определить? Не совсем понял как.
В твоем блоке, если у него есть проперти, должны быть три обязательных метода createBlockState, getStateFromMeta и getMetaFromState. Они у тебя вроде уже определены. Эти методы должны быть, но самому их вызывать не надо. Они нужны игре, чтобы уметь сохранять твои проперти при сохранении мира.

Кстати, в твоем случае их можно было бы реализовать проще. getMetaFromState может просто возвращать ordinal() значения проперти стороны. А getStateFromMeta может получить значения этой проперти так: EnumFacing.values()[meta]. Чем проще код - тем меньше шанс ошибиться в нем
 

sk9zist :l

Исправился
981
18
157
Они нужны игре, чтобы уметь сохранять твои проперти при сохранении мира.
Это я знаю.
Эти методы должны быть, но самому их вызывать не надо
А вот тут не понял. Тоесть, то что я их оверрайжу (переопределяю), Так? Или их убрать нужно
 

sk9zist :l

Исправился
981
18
157
добавь println для EnumFacung .. Ок
Sass:
block.TestBlock:onBlockPlacedBy:87]: north
block.TestBlock:onBlockPlacedBy:87]: north
block.TestBlock:onBlockPlacedBy:87]: east
block.TestBlock:onBlockPlacedBy:87]: east
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: south
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: west
block.TestBlock:onBlockPlacedBy:87]: north
block.TestBlock:onBlockPlacedBy:87]: north
block.TestBlock:onBlockPlacedBy:87]: north
block.TestBlock:onBlockPlacedBy:87]: north
 

sk9zist :l

Исправился
981
18
157

sk9zist :l

Исправился
981
18
157
Только теперь я совсем запутался, что тогда писать в onBlockPlaced?
ВОт:
Java:
@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();
    worldIn.setBlockState(pos, /*что тут писать? */, 3);
}
пробовал разное вписывать, но везде красное подчеркивание..
 
Последнее редактирование:
7,099
324
1,510
Сверху