Метадата

Версия 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 }
    }
}
7,099
324
1,510
Все правильно понимаешь.
Но нужно также понимать, что тебе как мододелу нужно добиться правильного рендера своего блока во всех стейтах.
Независимо от того, как эти стеты получены в мире: командой или пкм итемблоком.
Т.к. команда работает безотказно(в отличие от итемблока, потому что итемблок еще предстоит закодить правильно), то ее и следует юзать для решения задачи визуального вида блока во всех стейтах.

А уже потом решать задачу установки блока через итемблок
 

sk9zist :l

Исправился
981
18
157
Просто в defaults делаю y= какое-то значение
тип если по такому принципу задаёться в facing=north,vest { y=120 }
и как не странно всё нормально вращаеться во все стороны света если вручную задавать
 
7,099
324
1,510
и как не странно всё нормально вращаеться во все стороны света если вручную задавать
Т.е. если сетнуть варианты блока через команду, то они выглядят правильно? Ок, с этим разобрались
 

sk9zist :l

Исправился
981
18
157
7,099
324
1,510

sk9zist :l

Исправился
981
18
157
Просто в defaults делаю y= какое-то значение
по принципу как в задаёться facing=north,vest { y=120 }


Надо добиться, чтобы через команду работали все стороны
там через команду работает также (ставиться) как и просто если ставить
 

sk9zist :l

Исправился
981
18
157
всех стейтах одновременно должен работать рендер
Кажись я понял. Когда я первый раз делал, у меня со всех сторон отображался блок, но он не поворачивался на меня, а просто отображался. Тоесть часть кода вообще никак не работала. Потом я кучу раз менял код, и теперь это уже не так
 

sk9zist :l

Исправился
981
18
157
2020-12-07_16.40.54.png2020-12-07_16.41.14.png2020-12-07_16.41.28.png2020-12-07_16.41.55.png

Я сделал. Рендер блока теперь отображаеться во всех фейсингах. (только не поворачиваеться, это да)
сделал вот таким путём:
JSON:
"variants": {
    "facing": {
        "north": {},
        "south": {},
        "east": {},
        "west": {}
    }
  }
вместо
JSON:
"variants": {
    "facing": {
        "north": {},
        "south": {"y": 180},
        "east": {"y": 90},
        "west": {"y": 270}
    }
  }
Ок, с этим разобрались. Что дальше?
 
Последнее редактирование:
7,099
324
1,510
Теперь делай onBlockPlace
 

sk9zist :l

Исправился
981
18
157
Функцию, принимающую вектор взгляда и возвращающую направление блока напиши сам или скопипасть из поршня.
Самому написать можно, да, это просто. Но вот дело в том, что функции то в поршне нет:
Java:
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
    {
        worldIn.setBlockState(pos, state.withProperty(FACING, EnumFacing.getDirectionFromEntityLiving(pos, placer)), 2);

        if (!worldIn.isRemote)
        {
            this.checkForMove(worldIn, pos, state);
        }
    }
Это довольно-таки странно.

А та, что есть - некорректно определяет.
Т.к. я сделал (переопределил) метод onBlockPlacedBy и тому подобные. Руководствуясь частично исходниками поршня, и вот что вышло:
2020-12-07_18.26.58.png
Мало того что не отображаеться текстура, так ещё и направление неправильное...
 
Последнее редактирование:
7,099
324
1,510
Отображение текстуры - совершенно ортогональная задача. Ее нужно было решать на предыдущем шаге, когда сетнул командой все варианты блока. Проблема там заключается скорее всего в json блокстейте.

Но вот дело в том, что функции то в поршне нет:
Вообще-то есть:
EnumFacing.getDirectionFromEntityLiving


А та, что есть - некорректно определяет.
Отдебажь эту функцию, проверь, что она правильно возвращает сторону света в зависимости от взгляда игрока. Например, в обработчике тик-эвента принть в консоль результат выполнения функции и смотри че получается. Если работает правильно - все ок. Если нет - напиши свою функции.
установка блока с флагом 2. Не знаю чо это за магический флаг. Попробуй после установки блока перезайти в мир, может, этот флаг не вынуждает отправку актуального стейта на клиент
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Вообще-то есть:
Ага. Понял уже.
установка блока с флагом 2. Не знаю чо это за магический флаг.
Да вот я тоже. Про это и говорю, странно...

Проблема там заключается скорее всего в json блокстейте.
Я тоже давно подозревал это, но что там можно ещё менять?
 
7,099
324
1,510

sk9zist :l

Исправился
981
18
157
Неа, ты просто вот это уже второй раз пишешь:
Напрямую ты не просил как я помню.
Хотя этот файл я уже скидывал: (это как было, раньше, а сейчас там пустые положения)
Java:
"variants": {
    "facing": {
        "north": {},
        "south": {"y": 180},
        "east": {"y": 90},
        "west": {"y": 270}
    }
  }
 
7,099
324
1,510
Не правильно. Там другой синтаксис. Посмотри тут: 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
Полезно, щас почитаю, спасибо.

Не правильно. Там другой синтаксис.
"model": "block/wall_torch"
Чёрт, я ведь так пробовал делать. Только тогда у меня был, видимо неправильный код и поэтому не работало. Сейчас попробую так.
У меня такой файл, если прям нужно точный чтоб:
Java:
{
  }
  "variants": {
    "facing": {
        "north": {},
        "south": {},
        "east": {},
        "west": {}
    }
  }
}
Эксперементальная версия:
JSON:
{
  "defaults": {
    "custom": { "flip-v": true },
    "model": "block/testblock"
  },
  "variants": {
    "facing": {
        "north": {},
        "south": {},
        "east": {},
        "west": {}
    }
  }
}

А вот как в поршне (я оттуда и копипастил):
полный файл из соурсов:
{
    "variants": {
        "extended=false,facing=down": { "model": "piston_normal", "x": 90 },
        "extended=false,facing=up": { "model": "piston_normal", "x": 270 },
        "extended=false,facing=north": { "model": "piston_normal" },
        "extended=false,facing=south": { "model": "piston_normal", "y": 180 },
        "extended=false,facing=west": { "model": "piston_normal", "y": 270 },
        "extended=false,facing=east": { "model": "piston_normal", "y": 90 },
        "extended=true,facing=down": { "model": "piston_extended_normal", "x": 90 },
        "extended=true,facing=up": { "model": "piston_extended_normal", "x": 270 },
        "extended=true,facing=north": { "model": "piston_extended_normal" },
        "extended=true,facing=south": { "model": "piston_extended_normal", "y": 180 },
        "extended=true,facing=west": { "model": "piston_extended_normal", "y": 270 },
        "extended=true,facing=east": { "model": "piston_extended_normal", "y": 90 }
    }
}
 
7,099
324
1,510
В поршне правильно. А у тебя - неправильно оформленный forge_marker
 

sk9zist :l

Исправился
981
18
157
Извиняюсь за лишний вопрос, но что за forge_marker?

"facing=south": { "model": "block/wall_torch", "y": 90 },
Стоп. south - это 90 градусов?? Ау меня 180. Походу у меня и это неправильно настроено.
у тебя - неправильно
а как тогда? Ты про вторую версию? Это я эксперементировал пока что вчера
 
7,099
324
1,510
У факела правильно, посмотри и сделай аналогично
Стоп. south - это 90 градусов?? Ау меня 180. Походу у меня и это неправильно настроено.
Можно попробовать и так и так и проверить, какой эффект дает
 
Сверху