Бонусный урок. Стена

Привет. Это последний урок из вариативных блоков для блока, так как по больше мере они все однообразны и по сути одинаковы. Добавляем блок от соответствующего класса (ступени — StairsBlock, плита — SlabBlock, стена — WallBlock), указываем его свойства, добавляем соответствующий предмет, а после этого добавляем соответствующие модели, текстуры и blockstate.

Как говорят, немного кода, json там что-то, охапка дров и блок готов.

Ладно, погнали.

Список уроков
Бонусный. Добавляем плиты (slab)

Java часть

Как я и упоминал, стена — это WallBlock. Так как это дочерний класс для Block, то, как и родителю, ему нужно указать свойства блока. Так что с регистрацией ничего нового, кроме имени класса.

setup(new WallBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(3.0F, 3.0F)), "sun_bricks_wall")

Добавляем статическую переменную для нашего блока, регистрируем соответствующий ItemBlock (если вдруг чего забыли как, то вот ссылка на урок).

На этом все.

JSON часть

Тут интереснее. По большей мере, именно из-за ресурсов я и решил делать этот урок. Если помните урок про ступени, то там мы прописали три разные модели (обычные, угловая с одной четвертой ступени, угловая с тремя четвертыми ступени (надеюсь, поняли :D)). То тут у нас тоже будет три модели, но вы же знаете сколько вариантов стен? Столбик, если одна, без столбика, если находиться внутри забора, угловая, если стоит в уголке, а если в центре. А если между двумя блоками, то будет комбинация первого и второго. Короче, моделей выходит куда больше, это понятно. Но весь секрет раскрывает файл blockstate для стены.

blockstates\sun_bricks_wall.json

{
  "multipart": [
    {   "when": { "up": "true" },
      "apply": { "model": "tutorial_mod_gs:block/sun_bricks_wall_post" }
    },
    {   "when": { "north": "true" },
      "apply": { "model": "tutorial_mod_gs:block/sun_bricks_wall_side", "uvlock": true }
    },
    {   "when": { "east": "true" },
      "apply": { "model": "tutorial_mod_gs:block/sun_bricks_wall_side", "y": 90, "uvlock": true }
    },
    {   "when": { "south": "true" },
      "apply": { "model": "tutorial_mod_gs:block/sun_bricks_wall_side", "y": 180, "uvlock": true }
    },
    {   "when": { "west": "true" },
      "apply": { "model": "tutorial_mod_gs:block/sun_bricks_wall_side", "y": 270, "uvlock": true }
    }
  ]
}

В файле состояний есть всего две модели. Post — тот самый столбик, а side — сам забор. Секрет этой модели в том, что в отличие от предыдущих примеров — она создаётся по ходу дела. Если есть то, к чему можно присоединиться на востоке — добавляем стенку, если условие для столбика выполнено — добавляем столбик, если блок окружён блоками — добавляем все 4 стенки, но с разными углами поворота. Классно, правда?

И да. Я говорил, что модели три. И это так. Просто третья модель нужна для отображения забора в инвентаре. Понятное дело, что условие с двумя соседними блоками в ячейке инвентаря невыполнимо, поэтому разрабы сделали отдельную модель для красивого изображения блока в руках, сумке и т.д.

Ладно, от теории к практике.

models\block\sun_bricks_wall_inventory.json

{
  "parent": "block/wall_inventory",
  "textures": {
    "wall": "tutorial_mod_gs:block/sun_bricks"
  }
}

models\block\sun_bricks_wall_post.json

{
  "parent": "block/template_wall_post",
  "textures": {
    "wall": "tutorial_mod_gs:block/sun_bricks"
  }
}

models\block\sun_bricks_wall_side.json

{
  "parent": "block/template_wall_side",
  "textures": {
    "wall": "tutorial_mod_gs:block/sun_bricks"
  }
}

Скоро сделаю урок про свои модельки для блоков, возможно даже изменим стену, в том числе, но пока оставим стандартную.

Не забываем добавить модель предмета.

models\item\sun_bricks_wall.json

{
  "parent": "tutorial_mod_gs:block/sun_bricks_wall_inventory"
}

Указана та самая «специальная» модель.

И если проходили уроки с плитами и ступеньками, то знаете, что уже можно запускать.

В этот раз тоже можно, но нас ждёт сюрприз.

Сюрприз и теги

Нууу…почти?

Это сюрприз. Не самый лучший, согласен. Но не смертельно. Как видите, наши блоки друг с другом не особо дружат, как и ванильные с нашими. Зато в обратную сторону это почему-то работает и солнечная стена так хочет объединения с каменным соседом. Почему же так? В игре есть система тегов, и стены соединяются только с другими стенами (из этого тега) и целыми частями блоков (задняя часть ступени, к примеру). И все стены в игре записаны в этом теге. Все, кроме нашей. Так давайте исправим это!

Реализованы теги с помощью очередных json файликов в папке tags. И мы могли бы создать такую папку у себя, добавить все, что нужно, но тогда ничего не выйдет. Ведь это будет аналогичный тег внутри мода, а не игры. И в этот раз нам нужно переопределить или дополнить существующий ресурс игры.

Открываем папку data (там мы храним рецепты и дроп), добавляем рядом с папкой ID мода папку minecraft.

Я не уверен почему дата изменения одинаковая, но главное: не сделайте ошибок в именах!

Уже в minecraft создаём папку tags, а в ней папку blocks, а уже в ней файлик walls.json.

Результат и путь к нему

В walls.json пишем следующее:

{
  "replace": false,
  "values": [
    "tutorial_mod_gs:sun_bricks_wall"
  ]
}

Replace: false. Если укажете true, то замените все, что было в файле изначально, а значит все станы кроме вашей перестанут быть стенами. Но нам это не нужно. Оставляем false и в массиве values пишем свой блок в формате modID:имя_блока. Если блок не один — разделяем все запятыми. Повторный запуск.

Ничего не изменилось?

Спокойно, просто блоки я поставил до того, как стена стала полноценной стеной. Нужно вызвать обновление соседних блоков. Ломаем любой и ставим блок еще раз. Бум.

Идеально!

На этом сегодня все, а завтра я перепишу статью о стекле. Будет интересно!

Наш трон. Версия со стеной.

Добавить комментарий