Forge Моддинг 1.20.1 — Лекция 8: BlockBehaviour.Properties: 33 параметра блока
Приветствую, друзья!
Предыдущая лекция
Цель лекции
Разобрать все 33 параметра класса BlockBehaviour.Properties, чтобы вы могли создавать блоки с уникальной механикой и поведением, используя все возможности Forge 1.20.1.
Лекция охватывает огромное количество методов, вся лекция является теоретической, так что к ней вы можете возвращаться даже спустя долгое время.
В качестве подопытного блока возьму pinkylite_crystal_block из 5 лекции
1. Введение
• Зачем нужен BlockBehaviour.Properties?
• Связь между свойствами блока, его визуалом и игровой логикой
• Пример минимальной настройки:
Где есть звук разрушения и создание прочности блока. В данном случае блок разрушается рукой и соответственно падает сам блок.
2. Разбор 33 параметров
Мы разберем все параметры, в том числе устаревшие. Ниже приведены все доступные методы класса BlockBehaviour.Properties с примерами и пояснениями. Параметры разделены на категории для удобства. Методы применяются после метода .of()
Основные свойства
1. strength(float destroyTime, float explosionResistance).
Устанавливает время разрушения (destroyTime) и устойчивость к взрывам (explosionResistance).
Пример для Обсидиана: .strength(50.0F, 1200.0F)
Пример для Бедрока: .strength(-1.0F, 3600000.0F)
-1.0F - означает блок неразрушаем.
2. destroyTime(float time)
Альтернатива strength() ТОЛЬКО для времени разрушения. Например если вы не хотите указывать explosionResistance. Почти что никогда не используется.
3. explosionResistance(float resistance)
Устойчивость к взрывам (отдельно от времени разрушения). Почти что никогда не используется.
4. sound(SoundType type).
Звуки при взаимодействии с блоком. Перейдите в класс SoundType для просмотра всех звуков.
5. lightLevel(ToIntFunction<BlockState> light)
Уровень светимости (0–15). Запись осуществляется так: (lit) -> уровень.
Физика и движение
6. friction(float friction)
Обеспечивает скольжение по блоку
Примеры: 0.98f — лёд, 0.4f — слизь. Стандартное значение: 0.6F
7. speedFactor(float factor)
Замедление/ускорение скорости игрока при нахождении на этом блоке
Примеры: 0.4f - песок душ и блок мёда. Стандартное значение: 1.0F
8. jumpFactor(float factor)
Модификатор высоты прыжка. Может быть как выше, так и ниже.
Пример: 0.5f - блок мёда. Стандартное значение: 1.0F
9. dynamicShape()
Динамические хитбоксы (для анимированных блоков).
Примеры: Движущийся поршень, бамбук, строительные леса, порошковый снег, острый сталактит, шалкер (буквально все примеры).
Сам никогда не использовал за год разработки, но вот есть такой метод.
10. pushReaction(PushReaction reaction)
Поведение при толкании поршнем.
• Обычное стандартное значение - это PushReaction.NORMAL - это значит, что блок просто двинется после использования поршня.
• PushReaction.DESTROY - блок разрушится после использования поршня.
• PushReaction.BLOCK - поршень не заработает и не сможет ни разрушить, ни сдвинуть блок.
• PushReaction.PUSH_ONLY - довольно необычное использование поршня, это значит, что блок толкнётся лишь единожды, даже если использовать липкий поршень. Т.е. блок не прилипнет к липкому поршню. Всю подобную логику имеет глазурованная терракота.
11. noCollission()
Отключает коллизии (игрок проходит сквозь блок). Просто блок существует, он осязаемый, его можно разрушить, но ты проходишь сквозь него.
Визуальные настройки
12. mapColor(Function<BlockState, MapColor>)
Цвет блока на карте.
Можно использовать два вида класса цветов.
• DyeColor - относится просто к обычным стандартным цветам.
• MapColor - относится к цветам всех добавленных блоков в майнкрафте, к примеру MapColor.DIAMOND.
Пример DyeColor.PINK на карте:
13. noOcclusion()
Отключает затенение соседних блоков.
Пример: стекло и листва.
14. emissiveRendering(StatePredicate predicate)
Свечение текстуры (даже без света).
Этот метод управляет визуальным свечением текстуры блока, даже если он не излучает свет (lightLevel). Это чисто клиентский эффект, который не влияет на освещение игрового мира.Примеры использования:
Магические кристаллы, светящиеся в темноте.
Блоки с активной «подсветкой» (например, активированные редстоуном).
Отличие от lightLevel.
lightLevel:
• Влияние на мир: Освещает область вокруг блока.
• Значение: 0–15 (уровень света).
• Пример: Светильник, лава.
emissiveRendering:
• Влияние на мир: Только визуальный эффект (текстура «светится»).
• Значение: true/false (включить/выключить свечение текстуры).
• Пример: Неоновые знаки, энергетические ядра.
Пример в игре (только два блока майнкрафта реализуют этот метод - это магма и скалк сенсор при активации шумом, слева наш блок):
Обычно этот метод комбинируют с lightLevel и какими нибудь условиями.
В моём случае блок тёмный, потому что:
Emissive-эффект работает только если в текстуре блока есть альфа-канал (прозрачность). В файле текстуры альфа-канал определяет зоны свечения.
15. spawnParticlesOnBreak(boolean enabled)
Отключает частицы при разрушении.
Только два блока в майнкрафте реализуют этот метод - структурная пустота и барьер.
16. offsetType(OffsetType type)
Очень полезный метод, если вы хотите разнообразия при создании растении и цветов. Он создаёт смещение блока. Без .noCollission() не работает. Существует три вида OffsetType:
1. BlockBehaviour.OffsetType.XZ - Смещение по XZ координате
1. BlockBehaviour.OffsetType.XZ - Смещение по XZ координате
2. BlockBehaviour.OffsetType.XYZ - Смещение по XYZ координате
3. BlockBehaviour.OffsetType.NONE - Отсутствие смещения
Как это выглядит, при реализации на блоке с использованием OffsetType.XZ:
17. instrument(NoteBlockInstrument instrument)
Звук нотного блока при размещении этого блока снизу.
Всего есть 32 звука, все посмотреть можно через NoteBlockInstrument
Логика и взаимодействия
18. requiresCorrectToolForDrops()
Разбирали на прошлой лекции - блок можно добыть только подходящим инструментом. Подходящий инструмент опредяляется тегами.
19. randomTicks()
Блок получает случайные тики (для анимаций). Это обычно относится к тем объектам, что изменяют свою текстуру с течением времени - растения, саженцы, жидкости, растущий аметист, сталактиты, лозы.
20. ignitedByLava()
Блок загорается от лавы. Получает способность сгорать подобно дереву.
21. isValidSpawn(StateArgumentPredicate<EntityType> predicate)
Условия спауна мобов на блоке.
В коде выше для примера я сделал так, что на кристальном блоке могут спавниться ТОЛЬКО криперы.
Если же вы хотите более абстрактно регулировать этот процесс, то вот запись:
• true - могут спавнятся все.
• false - никто не может спавнится.
К false относятся следующие блоки - люки, стекло, бедрок, барьер, цветок хоруса, строительные леса.
К true: песок душ, резная тыква, светильник Джека, лампа редстоуна, грязь.
22. isRedstoneConductor(StatePredicate predicate)
Метод определяет, проводит ли блок редстоун-сигнал (как твердые блоки, например, камень или дерево). Если блок не проводит сигнал, редстоун-пыль, факелы и компараторы не будут передавать сигнал через него. Это полезно для создания прозрачных или нестандартных блоков (например, стекла, воздуха, порталов).
Значение false на примере морского фонаря:
Значение true на примере грязи:
23. isSuffocating(StatePredicate predicate)
Блокирует дыхание (как твердые блоки). Конкретно в моём примере false - значит, что при попадании игрока в этот блок, он не задохнётся. Такие же параметры обычно имеют лианы (из ада), листва, стекло.
24. isViewBlocking(StatePredicate predicate)
Определяет, блокирует ли блок обзор игрока (например, как тыква или сплошная стена). Если возвращает true, игрок не может видеть сквозь блок, даже если он прозрачный.
Кастомный блок с частичной прозрачностью:
.isViewBlocking((state, world, pos) -> false) // Разрешает видеть сквозь блок
.noOcclusion()
Полезно для стекла, воды или порталов.
Нюансы:
Метод влияет на визуальный рендеринг, но не на коллизии.
Для блоков с noOcclusion() часто требуется isViewBlocking = false.
25. hasPostProcess(StatePredicate predicate)
Добавляет постобработку (например, туман, размытие) при взгляде на блок. Используется для создания эффектов вроде Nether Portal.
Пример: .hasPostProcess((state, world, pos) -> true) // Включает постобработку
Эффекты:
• Туман вокруг блока.
• Искажение света (как у кристаллов Энда).
Применение:
• Магические порталы.
• Блоки с аурой (например, радиоактивные).
Дроп и лутаблицы
26. dropsLike(Block block)
Устаревший метод. Наследует дроп другого блока.
Аналог - lootFrom
27. lootFrom(Supplier<? extends Block> supplier)
Современный аналог dropsLike.
Игнорирует созданную ранее лут таблицу через json и копирует лут таблицу алмазной руды.
Как это работает в игре:
28. noLootTable()
Блок не дропает предметы при разрушении.
Пример: жидкости, бедрок, головки поршней, порталы, барьер, свет, воздух
Специфичные параметры
29. replaceable()
Помечает блок как заменяемый (как трава или снег). Его можно заменить другим блоком без разрушения.
30. air()
Делает блок воздухом (невидимым, без коллизий). Используется для технических целей.
31. requiredFeatures(FeatureFlag... flags)
Ограничивает доступность блока экспериментальными фичами. Если фичи отключены, блок не появится в игре.
Данный метод почти никогда не используется при разработке модов, но он существует. В данном примере блок будет виден, если игрок включит экспериментальную фичу - мешки в обновлении 1.20.1
Устаревшие параметры
32. liquid()
Проблема: Помечал блок как жидкость (устарело в 1.17+).
Сейчас жидкости создаются через регистрацию и более сложным способом.
33. forceSolidOff()
Проблема: Отключал принудительную твердость блока (устарело).
Используйте BlockBehaviour.Properties.of().forceSolidOn() для явного управления.
Данный метод в основном используется при создании табличек.
Заключение
На этом всё. Лекция теоретическая, поэтому кода не будет.
Если будет необходимость более подробного разъяснения, то напишите в комментариях и лекция будет дополнена
Следующая лекция
майнкрафт моды
на forge
версия 1.20.1
лекции/гайды