Блоки (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 граней

RON
textures: Some(BlockTextures(
    all: Some("textures/blocks/stone.png"),
)),

Вариант 2: Раздельные грани (как у дёрна или кактуса)

RON
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-код, чтобы добавить новый блок.

  1. При запуске или нажатии F3+T движок сканирует все .ron файлы во всех датапаках.
  2. Базовые ванильные блоки Metron занимают зарезервированные слоты 0..255 (air=0, stone=1, grass=2, torch=20, chest=21 и т.д.).
  3. Новые блоки из модов автоматически получают динамические числовые ID начиная с 256 (u16).
  4. Движок сам создаёт для блока запись в BlockPropsTable, настраивает хитбоксы коллизий, скорость копания и связывает текстуры с шейдером.
  5. Автоматически создаётся виртуальный предмет для инвентаря — блок сразу можно брать в руки, ставить и передавать через /give.

Звуки копания и шагов

Вам не нужно вручную прописывать звуковые файлы для каждого блока. Движок Metron использует интеллектуальную эвристику по ID блока:

  • Если ID содержит ore, stone, brick или cobble → выбирается звуковая группа stone.
  • Если содержит wood, log, plankwood.
  • Если содержит grass, dirt, soilgrass / dirt.
  • Если содержит glass, iceglass.

Если вы хотите принудительно задать нестандартный звук, просто укажите поле sound:

RON
sound: Some("cloth"), // Звучит как шерсть или ткань

Примеры готовых блоков

1. Неоновый светящийся кристалл

Прозрачный воксель, излучающий максимум света, ломающийся мгновенно рукой:

RON
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):

RON
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")):

RON
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"),
)

В следующей главе мы разберем, как создавать предметы, оружие и инструменты со шкалой прочности!