Блоки (BlockDef): воксели от А до Я
Полная анатомия BlockDef: прочность, светоизлучение, звуки шагов, уровни инструментов, дропы и динамическая регистрация ID.
Блоки (BlockDef): воксели от А до Я
Блоки в Metron определяются декларативно в файлах datapacks/<pack>/blocks/<name>.ron.
Каждый блок компилируется движком в структуру BlockDef, регистрируется в глобальной таблице BlockPropsTable и участвует в высокоскоростном конвейере отрисовки (Greedy Meshing) и распространения света.
Полная схема полей BlockDef
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
id |
string |
(обязательно) | Уникальный строковый ID в формате modid:block_name. |
name |
string |
"" (будет показан id) |
Человекочитаемое имя для интерфейса, тултипов и логов. |
textures |
Option<BlockTextures> |
None |
Пути к текстурам граней куба в атласе. |
solid |
bool |
true |
Есть ли у блока физическая коллизия и перекрывает ли он соседние грани при мешинге. |
translucent |
bool |
false |
Прозрачность/полупрозрачность (стекло, вода, листва). Пропускает сквозь себя свет. |
hardness |
f32 |
1.0 |
Прочность блока. Определяет базовое время ломания рукой и инструментами. |
light_emission |
u8 |
0 |
Уровень излучаемого блоком света от 0 (нет) до 15 (максимальная яркость). |
sound |
Option<string> |
(автоматически) | Группа звуков шагов и копания (stone, wood, grass, cloth, glass, metal). |
preferred_tool |
Option<string> |
None |
Класс инструмента, дающий бонус к скорости: pickaxe, axe, shovel, hoe, shears, sword. |
requires_tool |
bool |
false |
Если true, блок выпадет только при использовании подходящего инструмента нужного уровня. |
harvest_level |
u8 |
0 |
Минимальный уровень инструмента для выпадения дропа: 0 (дерево/золото), 1 (камень), 2 (железо), 3 (алмаз). |
drop |
Option<string> |
Some("self") |
Что выпадает: "self" (сам блок), "none" (ничего), "silk_touch" (только шёлковым касанием). |
Настройка текстур граней (BlockTextures)
Блок может иметь как одинаковую текстуру со всех сторон, так и разные текстуры для верхней, нижней и боковых граней:
Вариант 1: Одинаковая текстура на все 6 граней
textures: Some(BlockTextures(
all: Some("textures/blocks/stone.png"),
)),
Вариант 2: Раздельные грани (как у дёрна или кактуса)
textures: Some(BlockTextures(
top: Some("textures/blocks/grass_top.png"),
bottom: Some("textures/blocks/dirt.png"),
side: Some("textures/blocks/grass_side.png"),
)),
Путь к текстуре может быть относительным к ресурспаку (textures/blocks/...) или использовать пути Minecraft (assets/minecraft/textures/block/...). Движок нормализует имя файла (stem) и связывает его со слотом в воксельном атласе.
Динамическая регистрация блоков (ID ≥ 256)
Вам не нужно компилировать движок или трогать Rust-код, чтобы добавить новый блок.
- При запуске или нажатии F3+T движок сканирует все
.ronфайлы во всех датапаках. - Базовые ванильные блоки Metron занимают зарезервированные слоты
0..255(air=0,stone=1,grass=2,torch=20,chest=21и т.д.). - Новые блоки из модов автоматически получают динамические числовые ID начиная с 256 (
u16). - Движок сам создаёт для блока запись в
BlockPropsTable, настраивает хитбоксы коллизий, скорость копания и связывает текстуры с шейдером. - Автоматически создаётся виртуальный предмет для инвентаря — блок сразу можно брать в руки, ставить и передавать через
/give.
Звуки копания и шагов
Вам не нужно вручную прописывать звуковые файлы для каждого блока. Движок Metron использует интеллектуальную эвристику по ID блока:
- Если ID содержит
ore,stone,brickилиcobble→ выбирается звуковая группаstone. - Если содержит
wood,log,plank→wood. - Если содержит
grass,dirt,soil→grass/dirt. - Если содержит
glass,ice→glass.
Если вы хотите принудительно задать нестандартный звук, просто укажите поле sound:
sound: Some("cloth"), // Звучит как шерсть или ткань
Примеры готовых блоков
1. Неоновый светящийся кристалл
Прозрачный воксель, излучающий максимум света, ломающийся мгновенно рукой:
BlockDef(
id: "space_craft:neon_crystal",
name: "Неоновый кристалл",
textures: Some(BlockTextures(
all: Some("textures/blocks/sea_lantern.png"),
)),
solid: true,
translucent: true,
hardness: 0.3,
light_emission: 15,
sound: Some("glass"),
drop: Some("self"),
)
2. Закалённый обсидиан
Очень прочный блок, для добычи которого требуется исключительно алмазная кирка (harvest_level: 3):
BlockDef(
id: "super_hard:hardened_obsidian",
name: "Закалённый обсидиан",
textures: Some(BlockTextures(
all: Some("textures/blocks/obsidian.png"),
)),
solid: true,
translucent: false,
hardness: 50.0,
preferred_tool: Some("pickaxe"),
requires_tool: true,
harvest_level: 3,
sound: Some("stone"),
)
3. Декоративное стекло
Хрупкий блок, который при ломании рукой или обычной киркой разбивается без дропа (drop: Some("silk_touch")):
BlockDef(
id: "cozy_home:tinted_glass",
name: "Тонированное стекло",
textures: Some(BlockTextures(
all: Some("textures/blocks/tinted_glass.png"),
)),
solid: true,
translucent: true,
hardness: 0.3,
sound: Some("glass"),
drop: Some("silk_touch"),
)
В следующей главе мы разберем, как создавать предметы, оружие и инструменты со шкалой прочности!