Архитектура и три слоя контента
Как устроен моддинг в Metron: философия стабильного тикрейта, три слоя (Datapack, Resourcepack, Lua) и хот-релоад по F3+T.
Архитектура и три слоя контента
Metron создан с одной главной инженерной целью: стабильные 20 TPS на сервере и мгновенный отзыв клиента, даже когда в игре установлены десятки модов.
В обычных воксельных играх моды часто внедряются прямо в горячий цикл физики и рендеринга на Java/C#, из-за чего со временем игра начинает страдать от микрофризов и просадок тикрейта. В Metron применён кардинально иной подход: строгая изоляция и чёткое разделение ответственности.
Три слоя мода
Любой контент в Metron чётко раскладывается по трём изолированным слоям:
+-------------------------------------------------------------------------+
| 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
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). Чтобы скрипт мода не мог повесить сервер или уронить клиент, действуют строгие правила:
- Безопасная стандартная библиотека (
StdLib::ALL_SAFE):- Доступны:
string,table,math,coroutine, базовые функции. - Запрещены: доступ к файловой системе (
io), запуск процессов (os.execute), небезопасный дебаг.
- Доступны:
- Лимит времени выполнения (Tick Budget = 500 мкс):
- Каждый вызов хука или команды ограничен таймером инструкций
SCRIPT_BUDGET_US = 500. - Если скрипт уходит в бесконечный цикл
while true doили считает слишком тяжёлую операцию, движок принудительно прерывает его с ошибкойScriptError::Timeout, не давая просесть игровому тику.
- Каждый вызов хука или команды ограничен таймером инструкций
- Изоляция от критических путей:
- Движок Metron никогда не вызывает Lua из горячих конвейеров построения мешей (greedy meshing), трассировки лучей освещения или интегратора физики вокселей.
Hot-Reload: разработка без перезапуска
Вам не нужно перезапускать клиент игры каждый раз, когда вы изменили текстуру, подправили скрипт или изменили прочность блока.
+-------------------------------------------------------------+
| ГОРЯЧАЯ ПЕРЕЗАГРУЗКА (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 запускается, он ищет моды и ресурсы в рабочем каталоге:
metron/
├── datapacks/ <-- Сюда устанавливаются датапаки и моды
│ ├── base/ <-- Ванильный контент Metron
│ └── my_awesome_mod/ <-- Ваш мод
├── resourcepacks/ <-- Текстуры, 3D-модели, звуки, GUI
│ ├── base/ <-- Базовые текстуры игры
│ └── faithful_hd/ <-- Пользовательский пак
└── shaderpacks/ <-- Шейдерные эффекты (WGSL)
В следующей главе мы создадим ваш первый рабочий мод с нуля за 5 минут!