Метадата

Версия 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
че-то вроде state.withProperty(FACING, <your facing>)
пытался. И вот так:
Java:
int angle = MathHelper.floor(placer.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int change = EnumFacing.getHorizontal(angle).getOpposite().getIndex();
worldIn.setBlockState(pos, this.getDefaultState().withProperty(FACING, change), 3);
и так (первым попробовал):
Java:
int angle = MathHelper.floor(placer.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int change = EnumFacing.getHorizontal(angle).getOpposite().getIndex();
worldIn.setBlockState(pos, state.withProperty(FACING, change), 3);
но везде ошибки
 
7,099
324
1,510
Проперти FACING хранит значение типа EnumFacing, а не int. Зачем ты ему пихаешь индекс фасинга? 🤦‍♂️ Надо сам фасинг пихать
 

sk9zist :l

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

sk9zist :l

Исправился
981
18
157
Не работает:
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;
    EnumFacing change = EnumFacing.getHorizontal(angle).getOpposite();
    worldIn.setBlockState(pos, state.withProperty(FACING, change), 3);
}
Осталось тоже что и было
только частицы с его текстурой при ломании
 

sk9zist :l

Исправился
981
18
157
Ничего не понимаю. Тут какая-то магия вне хогвартса: Теперь при установке блока когда ставишь с north стороны - у него текстура при ломании есть. Когда ставишь с других сторон - нет. Но если по одному разу поставить блок по каждой из сторон -то текстура появиться при установке с любой стороны.

Вы думаете, я псих?
 
124
1
8
Попробуй это, у меня работает:

Java:
    public static final PropertyDirection FACING = BlockHorizontal.FACING;

    public DefaultBlock(String name, Material materialIn) {
        super(materialIn);
        this.setUnlocalizedName(name);
        this.setRegistryName(name);
        this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
       
        BlocksRegister.blocks.add(this);
    }
   
    @Override
    public boolean isOpaqueCube(IBlockState blockState) {
        return false;
    }

    @Override
    public boolean isFullCube(IBlockState state) {
        return false;
    }
    public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        EnumFacing enumfacing = placer.getHorizontalFacing().rotateY();

        try
        {
            return super.getStateForPlacement(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(FACING, enumfacing);
        }
        catch (IllegalArgumentException var11)
        {

            return super.getStateForPlacement(worldIn, pos, facing, hitX, hitY, hitZ, 0, placer).withProperty(FACING, enumfacing);
        }
    }
   
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta & 3));
    }
   
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        i = i | ((EnumFacing)state.getValue(FACING)).getHorizontalIndex();
        return i;
    }

    public IBlockState withRotation(IBlockState state, Rotation rot)
    {
        return state.getBlock() != this ? state : state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING)));
    }

    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {FACING});
    }
Java:
{
  "forge_marker": 1,
  "defaults": {
    "custom": { "flip-v": true },
    "model": "modid:model.obj"
  },
  "variants": {
    "normal": [{}],
    "facing": {
            "north": {},
            "south": {"y": 180},
            "east": {"y": 90},
            "west": {"y": 270}
        },
    "inventory": [
      {
        "transform": {
          "thirdperson_lefthand": {
            "rotation": [ { "x": -90 }, { "y": 0 }, { "z": 0 } ],
            "translation": [ 0, -0.1, 0.1 ],
            "scale": 1.00
          },
          "thirdperson_righthand": {
            "rotation": [ { "x": -90 }, { "y": 0 }, { "z": 0 } ],
            "translation": [ 0, -0.1, 0.1 ],
            "scale": 1.00
          },
          "gui": {
            "rotation": [ { "x": 0 }, { "y": 0 }, { "z": 0 } ],
            "translation": [ 0, 0, 0 ],
            "scale": 1.00
          },
          "firstperson_righthand": {
            "rotation": [ { "x": -90 }, { "y": 0 }, { "z": 0 } ],
            "translation": [ 0, 0, 0 ],
            "scale": 0.40
          },
          "firstperson_lefthand": {
            "rotation": [ { "x": -90 }, { "y": 0 }, { "z": 0 } ],
            "translation": [ 0, 0, 0 ],
            "scale": 0.50
          },
          "ground": {
            "rotation": [ { "x": -90 }, { "y": 0 }, { "z": 0 } ],
            "scale": 0.50
          }
        }
      }
    ]
  }
}
 
5,018
47
783
Вообще говоря если тебе поворотный блок надо, то гораздо проще отталкиваться от сторон света.
 

sk9zist :l

Исправился
981
18
157
А ты не переопределяешь метод onBlockPlacedBy? Или у тебя его нет?

Удалил свой класс блока, сделал новый и вставил туда твой код (конечно не весь, я оставил то, где идёт название моего блока и тд)
Но ничего не получилось :( Разве что всё вернулось как было сначала, и если ставить блок с west стороны, то он виден. Но ставиться он далеко не отталкиваясь от взгляда игрока..
screenshot.122.jpg

И кстати. С твоим кодом у меня нет ошибок с json (json тоже твой), тоесть у меня он без переменных facing=up и facing=down не работает. А с твоим кодом - по поводу этого ошибок нет

то гораздо проще отталкиваться от сторон света.
Я вроде так и делаю, а если нет, то как?

Даже Maxik пришёл...
 
124
1
8
А ты не переопределяешь метод onBlockPlacedBy? Или у тебя его нет?
Я тебе скинул весь класс.

Но ничего не получилось :( Разве что всё вернулось как было сначала, и если ставить блок с west стороны, то он виден.
Т.е. если ставить блок с другой стороны, то он не виден тип? С моделью точно все нормально, если убрать метадату?
 

sk9zist :l

Исправился
981
18
157
я тебе скинул весь класс.
ну, а в extends у тебя что тогда? BlockDirectional или Block? тип само начало класса ты не скинул, где идёт названия и экстендс

если ставить блок с другой стороны, то он не виден тип?
Только частицы при ломании. С твоим кодом.

Ладно, всё равно спасибо.
 
5,018
47
783
А ты не переопределяешь метод onBlockPlacedBy? Или у тебя его нет?

Удалил свой класс блока, сделал новый и вставил туда твой код (конечно не весь, я оставил то, где идёт название моего блока и тд)
Но ничего не получилось :( Разве что всё вернулось как было сначала, и если ставить блок с west стороны, то он виден. Но ставиться он далеко не отталкиваясь от взгляда игрока..
Посмотреть вложение 10545

И кстати. С твоим кодом у меня нет ошибок с json (json тоже твой), тоесть у меня он без переменных facing=up и facing=down не работает. А с твоим кодом - по поводу этого ошибок нет


Я вроде так и делаю, а если нет, то как?

Даже Maxik пришёл...
Я давным-давно делал ресурс с BasicLib. Там собрано множество разных классов и в том числе такой, какой тебе нужен. Просто расширяешься\создаешь объект и радуешься жизни.
Нужный тебе - BasicBlockSide
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Тоже самое но уже с другой стороны, вроде бы south
kisspng-emoji-thought-discord-smile-sticker-5b0b496d38ce01.6435473115274663492327.png
Просто расширяешься\создаешь объект и радуешься жизни
Java:
public class TestBlock extends BasicBlockSide
{
    public TestBlock() {
        super(Material.ROCK, "testblock", 0.0F, 0.0F, SoundType.CLOTH, CreativeTabs.SEARCH);
    }
}
Специально удалил все остальные методы, которые были у меня в классе блока. Ктому же isFullCube и isOpaqueCube уже переопределены в твоём классе BasicBlockSide и возвращают тоже значение false.

Извините, если что...
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Подними.

Я понимаю, что прошло только 20 часов 30 минут 24 секунды с моего последнего сообщения, но поднимаю...
 
7,099
324
1,510
А твоя модель точно умеет отображать все стейты?
Нажми F3, где-то справа будет строчка с блокстейтом, на который смотришь.
Попробуй при помощи команд установить свой блок с разными вращениями. Например, для ванильных ступенек подойдет такая: /setblock ~ ~ ~ minecraft:quartz_stairs facing=east
При помощи F3 убедись, что команда устанавливает правильный стейт.
Убедись, что модель правильно отображается для всех вариантов стейтов.
 

sk9zist :l

Исправился
981
18
157
А твоя модель точно умеет отображать все стейты?
Да.
Нажми F3, где-то справа будет строчка с блокстейтом, на который смотришь.
Да, я этим и определяю поворот. Например ответ #28

опробуй при помощи команд установить свой блок с разными вращениями. Например, для ванильных ступенек подойдет такая: /setblock ~ ~ ~ minecraft:quartz_stairs facing=east
Сделал таким образом: делаю
/setblock ~ ~ ~ dp:testblock facing=north
Убедись, что модель правильно отображается для всех вариантов стейтов.
как я уже говорил со всех сторон кроме одной пусто, нет текстуры. Текстура всё нормальная, если не делать поворот...
Теперь конкретно могу сказать: Только со стороны NORTH на блоке появляеться текстура. Остальные стороны всё также

etblock ~ ~ ~ minecraft:quartz_stairs facing=east
При помощи F3 убедись, что команда устанавливает правильный стейт.
А как убедиться то?
Установил командой facing=north, проверил в F3 не передвигая куда либо свой взгляд - там тоже пишет north, значит всё правильно? Другие стороны проверить не могу так как банально не отображаеться
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
Скинь ее текущую версию
Какую версию?
Когда я верчу блок в blokstate.json то он нормально поворачиваеться, когда добавляю код на поворот со сторонами света north там south,west и с кодом то он не работает
 
7,099
324
1,510
верчу блок в blokstate.json
Это как?

Тыж понимаешь, что для начала нужно добиться, чтобы блок во всех стейтах выглядел соответствующе, независимо от того, каким образом были усиановлены стейты?
 

sk9zist :l

Исправился
981
18
157
Тыж понимаешь, что для начала нужно добиться, чтобы блок во всех стейтах выглядел соответствующе, независимо от того, каким образом были усиановлены стейты?
Стейты это всего-лишь отдельная переменная в джсоне блока, в ней задаються градусы в x (или y) и он принимает такое положение. Сам стейт устанавливаеться в коде, чтобы потом джсон задал поворот. Или я что-то не так понимаю?

Ладно, пойду подробно изучать код блоков диревьев и печки..
 
Последнее редактирование:
Сверху