Метадата

Версия Minecraft
1.12.2
API
Forge

sk9zist :l

Исправился
981
18
158
Добро. Попытался сделать поворот своего блока относительно взгляда игрока, но, оказалось не просто. Не хотел писать на форум, но, самому у меня получилось только сделать частицы выпадения при ломании блока с текстурой самого моего блока (раньше они были белыми, тоесть текстуру вообще не находило. Но потом в 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 }
    }
}
Все правильно понимаешь.
Но нужно также понимать, что тебе как мододелу нужно добиться правильного рендера своего блока во всех стейтах.
Независимо от того, как эти стеты получены в мире: командой или пкм итемблоком.
Т.к. команда работает безотказно(в отличие от итемблока, потому что итемблок еще предстоит закодить правильно), то ее и следует юзать для решения задачи визуального вида блока во всех стейтах.

А уже потом решать задачу установки блока через итемблок
 
Просто в defaults делаю y= какое-то значение
тип если по такому принципу задаёться в facing=north,vest { y=120 }
и как не странно всё нормально вращаеться во все стороны света если вручную задавать
 
и как не странно всё нормально вращаеться во все стороны света если вручную задавать
Т.е. если сетнуть варианты блока через команду, то они выглядят правильно? Ок, с этим разобрались
 
Просто в defaults делаю y= какое-то значение
по принципу как в задаёться facing=north,vest { y=120 }


Надо добиться, чтобы через команду работали все стороны
там через команду работает также (ставиться) как и просто если ставить
 
всех стейтах одновременно должен работать рендер
Кажись я понял. Когда я первый раз делал, у меня со всех сторон отображался блок, но он не поворачивался на меня, а просто отображался. Тоесть часть кода вообще никак не работала. Потом я кучу раз менял код, и теперь это уже не так
 
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}
    }
  }
Ок, с этим разобрались. Что дальше?
 
Последнее редактирование:
Теперь делай onBlockPlace
 
Функцию, принимающую вектор взгляда и возвращающую направление блока напиши сам или скопипасть из поршня.
Самому написать можно, да, это просто. Но вот дело в том, что функции то в поршне нет:
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
Мало того что не отображаеться текстура, так ещё и направление неправильное...
 
Последнее редактирование:
Отображение текстуры - совершенно ортогональная задача. Ее нужно было решать на предыдущем шаге, когда сетнул командой все варианты блока. Проблема там заключается скорее всего в json блокстейте.

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


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

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

Не правильно. Там другой синтаксис.
"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 }
    }
}
 
В поршне правильно. А у тебя - неправильно оформленный forge_marker
 
Извиняюсь за лишний вопрос, но что за forge_marker?

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