Перейти к содержимому

Слои и крейты

Меняется. Следите: #180, #321, #287

mcrs - репозиторий из 122 крейтов, разложенных по семи слоям. Каждый слой должен зависеть только от слоев ниже, поэтому вы берете нужные слои и не платите за то, что выше. Прокси хватит двух нижних слоев, а полному серверу нужны первые пять.1

# Слой Что в нем
1 Протокол id, позиции, NBT, текст, ключи; трейты кодеков; фрейминг, сжатие, шифрование; пакеты handshake, status, login и configuration
2 Сеть конечный автомат соединения, вход с обеих сторон, аутентификация, проксирование, фреймы, которые кодируются один раз на рассылку
3 Игровые данные и правила реестры, собранные из датапака, блоки, предметы, сущности, чанки, сохранения Anvil и их пакеты; ядра без Bevy для освещения, генерации мира и симуляции блоков
4 Движок плагины Bevy для миров, измерений, источников чанков, игроков, событий и команд, а также драйверы ядер; ванильного поведения по умолчанию нет
5 Ваниль что делают блоки, предметы и мобы, генерация мира и освещение в виде отключаемых плагинов
6 Рендеринг построение мешей и пайплайны над данными слоя 3; без сети, клиента и сервера
7 Приложения бинарник сервера, клиент и инструменты

Каждый крейт называется mcrs_minecraft_<name> и лежит в crates/. У крейтов ядра движка свой префикс: mcrs_engine_cell, mcrs_engine_link, mcrs_engine_muxer и mcrs_engine_store. Все крейты с их слоями перечислены на карте крейтов.

Ниже слоя 4 Bevy подключается необязательной фичей, а ниже слоя 2 необязателен и tokio, потому что с tokio работает только сетевой слой. Несколько крейтов сегодня нарушают направление слоев. В README сказано, что крейты протокола и сети все еще обращаются к игровым данным, и проект намерен это исправить.1

Ядра хранят правила, драйверы их запускают

Заголовок раздела «Ядра хранят правила, драйверы их запускают»

Слой 3 обходится без Bevy, потому что правила игры и код, который их планирует, разнесены по разным частям.

Ядро (kernel) - обычный Rust, которому принадлежат правила одной области: обновления блоков, освещение, генерация мира или движение сущностей. Bevy и tokio оно не использует. Один шаг ядра - это вызов функции. На вход идут состояние и представление мира, на выходе получаются записи и сообщения в буферах, которыми владеет вызывающий код. Одинаковые входные данные дают одинаковый результат.

Драйвер запускает ядро. В слое 4 драйвер - плагин Bevy, который читает мир, вызывает ядро и записывает результат обратно. Планировщиком между системами остается Bevy, и своего планировщика между ними mcrs не добавляет. Это решение записано в разделе 13 заметки о шардировании. Без Bevy драйвер превращается в обычный цикл, поэтому бот, инструмент для карт или тест могут использовать ядро напрямую.

Если вы пришли из Paper, представьте ядро как логику ванильной системы, из которой убрали объект сервера, так что ее можно вызвать откуда угодно. Драйвер - та часть, которая знает о тиках.

Проект обещает “Minecraft как набор крейтов”. Вот насколько это выполняется на 2026-11-10.

100 пакетов собираются без Bevy, и проверка в xtask/src/checks.rs падает, если крейт ниже слоя 4 требует Bevy. 9 пакетов собираются еще и без std, под цель wasm32v1-none, а 11 собираются для браузера, под цель wasm32-unknown-unknown.

На crates.io крейты не опубликованы. Мешают две вещи: часть крейтов встраивает файлы из-за пределов своей папки, а API протокола и сети возвращают ошибки anyhow.2 Зависимость через git работает, и этот способ описан на странице Использование крейтов в своем проекте.

Примеров библиотечного использования пока нет, так что готового прокси, бота, лобби или рендерера карт, с которого можно начать, вы не найдете. Первые три запланированных примера - hello_server, lobby и arena.3

Публичный API слоев 1-4 нестабилен. Каждый pub-элемент там станет обязательством перед пользователями, поэтому сначала API проходит ревью.

Дальше: Как тик работает параллельно.

  1. В работе#180 Направление: mcrs как библиотека, от прокси до полного сервера. ↩ ↩2 ↩3

  2. Решения нет#321 Отслеживает работу, после которой крейты протокола, сети и игровых данных можно публиковать. ↩

  3. В работе#287 Планирует примеры минимального сервера, лобби и арены. ↩

Источники и проверка

Проверено: 26.4-snapshot-7, 3540f457b, 2026-11-10

Переведено с версии 3540f457b

Следить: #180, #321, #287