Forge Моддинг 1.20.1 — Лекция 5: Создание блока
Приветствую, друзья!
Предыдущая лекция:
Цель лекции
Сегодня мы перейдём к одному из самых визуально впечатляющих этапов разработки мода — созданию собственных блоков в Minecraft 1.20.1 с использованием Forge. В этой лекции вы научитесь:
• Создавать блок с названием и текстурой.
• Настраивать их базовые свойства.
• Корректно регистрировать их в игре.
Мы начнём с организации кода, чтобы ваш мод оставался чистым и структурированным. Как вы помните из лекций о предметах, регистрация объектов — ключевой этап. Сегодня мы сделаем то же самое, но для блоков!
1. Класс регистрации блоков
Первым шагом создадим класс, который будет хранить все ваши блоки. Если ранее вы уже работали с RItems (или аналогичным классом для предметов), то принцип будет знаком.
1.1. Создайте класс {АббревитураМода}Blocks
• Разместите его в пакете registry.
• Замените {АббревитураМода} на префикс вашего мода (например, RBlocks для мода Rinova).
1.2. Создание отложенной регистрации для блоков
Внутри класса объявите DeferredRegister<Block>, аналогично тому, как это делалось для предметов и назовите BLOCKS:
Добавьте метод register()
Заранее будем теперь это делать.
Этот метод будет вызван в главном классе мода для фиксации всех блоков:
Не забудьте вызвать register() в главном классе
В вашем основном классе в конструкторе класса:
2. Регистрация первого блока!
Здесь есть важный нюанс: блоки в Forge требуют двойной регистрации — сначала как сам блок, а затем как BlockItem (чтобы он появился в инвентаре игрока). Это может быть неочевидно для новичков, поэтому давайте разберёмся, как это сделать эффективно.
Почему блоки регистрируют дважды?
Представьте, что блок в Minecraft — это «объект в мире» (например, камень на земле), а BlockItem — это «предмет в инвентаре», который позволяет вам поставить этот блок. Игра требует, чтобы оба этих объекта были зарегистрированы отдельно.
Шаг 1: Создаём сам блок
Начнём с базовых свойств. Чтобы новичкам было проще, используем копирование свойств стандартных блоков (например, камня или алмазного блока). Это надёжнее, чем настраивать всё с нуля. Но позже мы рассмотрим задание собственных параметров
Что здесь происходит?
BlockBehaviour.Properties.copy(Blocks.STONE) — копируем свойства блока «Камень»:
• Звук при разрушении,
• Сопротивление взрывам,
• Требуемый инструмент для добычи.
Шаг 2: Создаём BlockItem
Теперь сделаем так, чтобы блок можно было держать в руках и ставить в мире.
PINKYLITE_CRYSTAL_BLOCK.get() — получаем сам блок из класса регистрации.
new Item.Properties() — настройки предмета (т.е. никаких)
Шаг 3: Упрощаем регистрацию (создаём методы-помощники)
То, что описано выше, это регистрация блока и предмета, но мы можем поступить проще. Чтобы не повторять код для каждого блока, добавим в класс два метода (перед этим стерев предыдущий код):
Шаг 4: Используем методы-помощники
Благодаря этим двум методам, наша регистрация блока будет проще, мы с помощью одного метода registerBlock (и вложенного метода registerBlockItem внутри него) регистрируем наш новый блок, в моем случае я создал блок PINKYLITE_CRYSTAL_BLOCK, указав айди и параметры:
Что изменилось?
Всё делается в одну строку — блок и его предмет создаются автоматически.
3. Базовые свойства блока
Теперь, когда мы разобрались с регистрацией, давайте настроим уникальные параметры вашего блока. Вместо копирования свойств через .copy(), мы будем задавать их с нуля, используя метод .of(). Это даст полный контроль над поведением блока в мире.
3.1 Начало работы
Замените .copy(Blocks.STONE) на .of():
Этот метод создаёт «чистые» свойства, которые вы можете настроить самостоятельно.
3.2 Основные настройки
Материал (Material)
Определяет базовое поведение блока (например, звук, скорость копания, прозрачность).
Пример:
• .mapColor - цвет на карте (взял розовый цвет)
• .sound - звуки (в данном случае берется как у аметиста)
• .requiresCorrectToolForDrops() - для дропа ресурсов требуется корректный инструмент
.strength Разберем ниже:
Прочность и устойчивость
• .strength(destroyTime, explosionResistance)
- destroyTime — время разрушения без инструмента (условные единицы).
- explosionResistance — устойчивость к взрывам (чем выше, тем прочнее).
Примеры:
• Хрупкий блок (как стекло):
.strength(0.5f, 0.5f)
• Обычный блок (камень):
.strength(1.5f, 6f)
.strength(1.5f, 6f)
• Прочный блок (Обсидиан):
.strength(50f, 1200f)
Как искать параметры?
Если вы пользуетесь Intellij IDEA, то при первом написании класса, вам выдаст список доступных переменных (параметров)
Комбинация своих и копированных параметров
Помимо копирования и написания своих параметров, можно так же скопировать параметры блока (через .copy), а после снова через точку уже указывать собственные параметры
Светимость
Помимо остальных параметров, можно так же задавать светимость блоков. Определяет, светится ли блок и как сильно.
Значение от 0 (не светится) до 15 (максимальная яркость).
Музыкальность блока (при взаимодействии с нотным блоком)
4. Создание JSON-файлов
Чтобы ваш блок отображался в игре корректно, нужно добавить JSON-файлы, которые определяют его модель, текстуры и поведение. Minecraft использует эти файлы для визуализации блока и взаимодействия с ним. Разберём каждый из них. Всего придется создать 3 файла и 1 текстуру.
4.1 Структура папок
Создайте три папки "blockstates" (rinova/), "block" (rinova/models/) и "block" (rinova/textures/) в директории resources вашего проекта:
4.2 Blockstates — состояния блока
Необходимо создать файл формата json с айди вашего блока, в моём случае это pinkylite_crystal_block.json
Файл в blockstates/ваш_block.json определяет, какие модели использовать в зависимости от состояний блока (например, включён/выключен, поворот, угол, направление, свет).
Пример для простого блока (без состояний):
• rinova — ID вашего мода.
• pinkylite_crystal_block — имя модели (должно совпадать с именем файла в models/block).
4.3 Model — модель блока
Файл в models/block/ваш_block.json описывает форму и текстуры блока.
Пример для стандартного куба (как камень):
• cube_all — модель, где все стороны блока одинаковы.
• rinova:block/pinkylite_crystal_block - путь к текстуре блока
4.4 Item Model — модель предмета (BlockItem)
Файл в models/item/ваш_block.json определяет, как блок выглядит в инвентаре.
В данном случае parent - Наследует модель блока
4.5 Текстура
Поместите файл текстуры в textures/block/ваш_block_texture.png.
Размер: 16x16, 32x32 или 64x64 пикселей (рекомендуется 16x16 для стиля Minecraft).
Формат: PNG с прозрачностью, если нужно.
4.6 Локализация (название блока)
Добавьте перевод в файл en_us.json и ru_ru.json:
Ключ для перевода начинается с block.(айди мода).(айди блока).
5. Добавление в креативную вкладку
Если вы добавляли предметы единично, то передаёте блоки так же, как и предметы:
Если же вы использовали страшную запись:
RItems.ITEMS.getEntries().forEach(item -> output.accept(item.get()));
То ничего делать и добавлять не нужно:
RItems.ITEMS.getEntries().forEach(item -> output.accept(item.get()));
То ничего делать и добавлять не нужно:
Комментарии просто как справка написан
5. Тестирование
Теперь запускаем игру как обычно через runClient
В креативной вкладке должен отображаться блок с текстурой:
Как выглядит и звучит блок в мире:
В следующем посте будет написана лекция как ломать созданные блоки и как настраивать уровень добычи (дерево, камень, железо и т.д.) и способ добычи (кирка, топор, лопата и т.д.)!
Весь написанный код:
Следующая лекция:
майнкрафт моды
на forge
версия 1.20.1
лекции/гайды