Архитектура и три слоя контента

Как устроен моддинг в Metron: философия стабильного тикрейта, три слоя (Datapack, Resourcepack, Lua) и хот-релоад по F3+T.

Архитектура и три слоя контента

Metron создан с одной главной инженерной целью: стабильные 20 TPS на сервере и мгновенный отзыв клиента, даже когда в игре установлены десятки модов.

В обычных воксельных играх моды часто внедряются прямо в горячий цикл физики и рендеринга на Java/C#, из-за чего со временем игра начинает страдать от микрофризов и просадок тикрейта. В Metron применён кардинально иной подход: строгая изоляция и чёткое разделение ответственности.


Три слоя мода

Любой контент в Metron чётко раскладывается по трём изолированным слоям:

TEXT
+-------------------------------------------------------------------------+
|                              METRON ENGINE                              |
+--------------------+---------------------+------------------------------+
|   1. ДАННЫЕ        |   2. ВИЗУАЛ         |   3. ПОВЕДЕНИЕ               |
|   (Datapack / RON) |   (Resourcepack)    |   (Lua Sandbox / mlua)       |
|                    |                     |                              |
|   • Блоки          |   • Текстуры PNG    |   • События (break, place)   |
|   • Предметы       |   • 3D glTF/JSON    |   • Чат-команды (/heal)      |
|   • Рецепты        |   • CTM / Оверлеи   |   • Логика инвентаря         |
|   • Структуры      |   • Звуки и GUI     |   • Бюджет 500 мкс / вызов   |
+--------------------+---------------------+------------------------------+
Слой Где хранится Формат За что отвечает
Datapack datapacks/<pack>/ .ron (Rusty Object Notation) Статические декларативные данные: свойства блоков, прочность предметов, рецепты верстака и печи, структуры мира.
Resource pack resourcepacks/<pack>/ PNG, JSON, .gltf / .glb, OGG Визуальный и аудио слой: текстуры блоков в атласе, 3D-модели (включая glTF из Blender), бесшовные CTM-текстуры, скины окон интерфейса (GUI) и звуки.
Lua Scripting datapacks/<pack>/scripts/ .lua (Lua 5.4 via mlua) Динамика и логика: реакция на установку/ломание блоков, кастомные чат-команды, выдача наград в инвентарь.
Примечание

Золотое правило моддера Metron:
Данные — в RON, визуал — в Resource pack, логика — в Lua.
Никогда не пытайтесь зашивать геймплейную логику в файлы описания блоков, и никогда не делайте «тяжёлые» вычисления в скриптах.


Почему RON, а не JSON или YAML?

Для описания данных Metron использует формат RON (Rusty Object Notation).

RON идеально ложится на строгие типы Rust, читается легче JSON, поддерживает комментарии (// и /* */), кортежи, перечисления и именованные структуры:

RON
// Пример описания блока в RON
BlockDef(
    id: "my_mod:ruby_block",
    name: "Рубиновый блок",
    solid: true,
    hardness: 3.0,
    light_emission: 5,
    textures: Some(BlockTextures(
        all: Some("textures/blocks/ruby_block.png"),
    )),
)

Никаких лишних кавычек на ключах, строгая валидация при загрузке и мгновенный парсинг.


Песочница Lua и защита 20 TPS

Скриптовый движок Metron работает на базе mlua 0.12 (Lua 5.4). Чтобы скрипт мода не мог повесить сервер или уронить клиент, действуют строгие правила:

  1. Безопасная стандартная библиотека (StdLib::ALL_SAFE):
    • Доступны: string, table, math, coroutine, базовые функции.
    • Запрещены: доступ к файловой системе (io), запуск процессов (os.execute), небезопасный дебаг.
  2. Лимит времени выполнения (Tick Budget = 500 мкс):
    • Каждый вызов хука или команды ограничен таймером инструкций SCRIPT_BUDGET_US = 500.
    • Если скрипт уходит в бесконечный цикл while true do или считает слишком тяжёлую операцию, движок принудительно прерывает его с ошибкой ScriptError::Timeout, не давая просесть игровому тику.
  3. Изоляция от критических путей:
    • Движок Metron никогда не вызывает Lua из горячих конвейеров построения мешей (greedy meshing), трассировки лучей освещения или интегратора физики вокселей.

Hot-Reload: разработка без перезапуска

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

TEXT
       +-------------------------------------------------------------+
       |               ГОРЯЧАЯ ПЕРЕЗАГРУЗКА (HOT-RELOAD)            |
       +------------------------------+------------------------------+
       |   F3 + T (в клиенте)         |   /reload (в консоли/чате)   |
       |                              |                              |
       |   • Блоки и предметы         |   • Блоки и предметы         |
       |   • Рецепты крафта           |   • Рецепты на сервере       |
       |   • Модели glTF / JSON       |   • Проверка манифестов      |
       |   • Воксельный атлас         |                              |
       |   • Скрипты Lua              |                              |
       +------------------------------+------------------------------+

1. Сочетание клавиш F3 + T (Клиент)

Как и в Minecraft, комбинация F3+T перезагружает все ресурсы на клиенте:

  • Пересобирает атлас текстур и CTM-соединения
  • Заново парсит JSON и glTF модели блоков
  • Перезагружает определения BlockDef, ItemDef, recipes/*.ron
  • Перезагружает и заново связывает все скрипты datapacks/*/scripts/*.lua

2. Чат-команда /reload (Сервер)

Серверная команда перечитывает данные датапаков (блоки, предметы, рецепты) без дисконнекта подключённых игроков.

3. Меню настроек (Resource Packs -> Apply)

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


Структура рабочего каталога

Когда Metron запускается, он ищет моды и ресурсы в рабочем каталоге:

TEXT
metron/
├── datapacks/               <-- Сюда устанавливаются датапаки и моды
│   ├── base/                <-- Ванильный контент Metron
│   └── my_awesome_mod/      <-- Ваш мод
├── resourcepacks/           <-- Текстуры, 3D-модели, звуки, GUI
│   ├── base/                <-- Базовые текстуры игры
│   └── faithful_hd/         <-- Пользовательский пак
└── shaderpacks/             <-- Шейдерные эффекты (WGSL)

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