[1.15.2] Добавляем свой блок

Привет всем! С предметами немного разобрались, так что пора переходить к более фундаментальным вещам кубического мира. И понятное дело, что речь пойдёт о блоках!

Список уроков

Будет полезно до:

Немного о блоках

Всё, что окружает нас в игровом мире – блоки (ну, есть еще сущности и мобы, но сам мир состоит в основном из блоков). Даже там, где блоков вроде как нет – они есть. Всякие пещеры и шахты тоже заполнены особым блоком — воздухом.

В гайде по предметам я довольно много времени уделил классификации (хоть и довольно свободной). С блоками можно сделать так же, но обилие параметров у блоков сделает такую схему достаточно путанной, а потому я просто назову лишь некоторые важные отличительные способности блоков.

Для начала есть блоки прозрачные и не. К примеру, стекло и камень. В зависимости от этого параметра блок может не давать тень, пропускать свет и т.д.

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

Так же блоки могут быть источниками света. Максимальные значения яркости ограничены, так что создать второе солнце не выйдет, но какой-либо свой факел или фонарь – никаких проблем.

Есть так же редстоун блоки, проходимые, с гравитацией, жидкие, растения, порталы, те что имеют возможность взаимодействия без видимого интерфейса и те, что имеют UI. И это не всё!

Короче, блоков много, и они могут иметь множество параметров и особенностей.

Для начала создадим обычный блок. Потом пару блоков с разными моделями и фишками. Создадим и свои модели для блоков, обязательно. Стекло, источник света, блок с анимацией. Без вариантов будут и блоки с интерфейсом, растения и мебель.

Ну что, погнали?

JAVA-часть

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

Регистрируем блоки аналогично предметам. Для этого создаём отдельную папку block, а в ней ModBlocks.java.

DeferredRegister мы уже встречали, но в этот раз создаём его для блоков. И добавляем сам STONE_STICK_BLOCK. Как предмет Item, был объектом класса Item, так и блок — класса Block.

Блоки так же имеют свойства. Материал – определяет множество параметров блока. Вообще идея материалов отличная, но с реализацией что-то не то и они не всегда работают так, как должна бы. Именно потому нам нужно будет самостоятельно указывать некоторые вещи, которые уже прописаны в материале. Так же, насколько я знаю, свои материалы создавать проблематично в связи сокрытием некоторых ключевых переменных. Об этом напишу подробнее в другой раз. hardnessAndResistance – прочность и взрывоустойчивость. harvestTool – правильный (или эффективный) инструмент для добычи.

Теперь нужно дополнить конструктор мода, чтобы блоки тоже регистрировало:

Класс. Теперь ресурсы!

Ресурсы для блока

Как и для предметов, нам нужно добавить текстуру и модель блоку. Кроме этого, еще нужно создать blockstates файл, в котором будут прописаны возможные состояния блока (и соответствующие состояниям модели). Хорошим примером будут ступени. Поворот модели, как и их угловые версии – всё там.

Открываем папку ресурсов! Сразу создадим папку blockstates, она нам будет нужна. В итоге должно быть что-то такое:

Если у вас каких-то нет, то это странно. Видимо вы что-то важное пропустили. Так же в папки models и textures нам нужно добавить по папке block

И теперь внимательно. Для полноценного блока нужно: локализация (папка lang), модель, текстура и файл состояний.

Начнём в таком же порядке.

Перевод, модель, текстура и состояния блока

С локализацией всё просто. Для русского добавляем в файл ru_ru.json такую строку:

Модель так же не должна вызвать сложностей. В папке моделей для блоков создадим stone_stick_block.json:

Родителем тут указана модель куба с одинаковыми сторонами, а потому и текстура всего одна all.

И вот модель в папке. Учтите, что имя файла модели должно в точности совпадать с именем, которое мы укажем в файле blockstates для этого блока. Вообще система такая. Есть файл blockstates, который должен быть в формате ТОЧНОЕ_ИМЯ_БЛОКА.json, там мы указываем одну или несколько возможных моделей (имена не принципиальны, но есть общие правила), а уже в моделях указываем текстуры. Таким образом разные блоки могут использовать одинаковые модели или текстуры. Очень удобно!

Текстура. Для блоков текстуры добавляем в соответствующую папку block.

(хоть и похоже на чёрную черноту, но там есть узор как у золота)

Путь должен совпадать

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

И в завершение – самый важный blockstates файл. В одноименной папке создаём файл stone_stick_block.json.

Так как у нас не ступени и не что-либо интерактивное, то состояние всего одно:

Если всё сделано верно, то можно запускать и тестировать. Блока пока не будет ни в одном списке, зато можно создать его при помощи команды.

Знаете такую?

Предмет для блока

В классификации предметов был отдельный вид: предметы-блоки. Именно эти ребята представляют в нашем инвентаре…собственно блоки. Пришла пора и нам сделать свой. К обычной палке добавим такой предмет.

При создании предмета для блока мы передаём в виде параметра сам блок. Так же тут уже можно указать предмету и вкладку творческого.

Но теперь блок с текстурой и моделью, а предмет без. Потому-то нужно добавить модель и для него. Текстуру добавлять не нужно, и вот почему:

В этот раз родительской темой стаёт модель блока stone_stick_block, а это значит, что предмет тоже уже готов и можно запускать!

Предмет появился. Вообще я думал создать вторую вкладку, отдельную для блоков, но забыл :D. Позже исправлюсь, а сейчас и таааак сойдёт.
Всё работает!

На этом всё, исходный код смотрите тут: Ссылка на исходники.

3 thoughts on “[1.15.2] Добавляем свой блок

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