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

Миры и сохранения

Меняется. Следите: #78, #169, #316, #388

Эта страница для администратора, который хочет запустить сервер mcrs на каком-то мире. Сервер читает мир Java Edition той же версии игры и сохраняет игроков. Чанки он пока не сохраняет, поэтому любая правка блоков пропадает, когда сервер останавливается.

ОбластьСостояниеРаботаетНе готово
Сохранения и AnvilЧастичноЧитает существующий мир Java Edition. Игроки сохраняются при чистом выключении сервера.Измененные чанки на диск не пишутся. Мир другой версии данных не загружается, датафиксеров нет. В работе#78В работе#169

Чтобы открыть мир Java, передайте папку мира

Заголовок раздела «Чтобы открыть мир Java, передайте папку мира»

Передайте серверу папку первым аргументом. Как собрать и запустить сервер, показано в разделе Quick start в README.

Окно терминала
cargo run --release -- "<path to a world folder>"

Папка должна существовать, иначе сервер напечатает “not a world folder” и завершится. Когда папка указана, сервер берет сид и список измерений из настроек генерации мира в сохранении, а сид из MCRS_WORLD_SEED и пресет из MCRS_WORLD_PRESET их не переопределяют. Чанки сервер читает из файлов регионов сохранения, Java Edition хранит их в формате Anvil.

В каждом чанке и в каждом файле игрока записан DataVersion, номер версии игры, которая этот файл сохранила. Сервер принимает файл, только если этот номер совпадает с версией игры в этой сборке. Сейчас это 26.4-snapshot-7 с версией мира 5127, она указана в version.json. Файл любой другой версии сервер отклоняет с ошибкой, в которой названы найденная и ожидаемая версии. Чанк без DataVersion он тоже отклоняет.

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

Если запустить сервер без аргумента, он сгенерирует мир из пресета. На диск из этого мира ничего не попадает. Файлов игроков у него тоже нет, потому что путь к файлу игрока сервер строит от папки мира. Мир задают три настройки, и сервер читает их один раз при старте. Полный список настроек лежит в server_settings.rs.

Переменная Значение По умолчанию
MCRS_WORLD_SEED Сид, знаковое или беззнаковое 64-битное число 0
MCRS_WORLD_PRESET normal или minecraft:normal, flat normal
MCRS_DEFAULT_GAMEMODE Режим игры нового игрока creative

Генерация мира совпадает с ванилью в parity-тестах на эталонных сидах. Что покрывают эти тесты, рассказывает страница Parity.

Данные Состояние
Файлы игроков Сохраняются. Сервер записывает каждого игрока в players/data/<uuid>.dat в папке мира при отключении, а автосохранение пишет их каждые 6000 тиков, с тем же интервалом, что и в ванили
Чистая остановка с игроками Работает#624. По первому SIGINT или SIGTERM сервер отключает всех игроков с ванильной причиной остановки, сохраняет их и выходит. Второй сигнал завершает работу сразу
Чанки и правки блоков Не сохраняются. Сервер читает чанки, но никогда их не пишет, см. В работе#78
Чистая остановка с чанками Не сделана. Ожидание записи чанков - это В работе#169
level.dat, часы мира, погода, игровые правила Читаются, но пока не записываются. Их запись перечислена в В работе#78

Файл игрока, который не удалось разобрать, сервер бережет. Игрок заходит с пустым состоянием, и сервер никогда не сохраняет его поверх старого файла. Инвентарь из файла игрока тоже не теряется. Сервер хранит его как непрозрачные данные и записывает обратно без изменений, потому что код инвентаря удален и переписывается по спецификации.2

Чистую остановку проверяет короткий тест.

Запрос на остановку записывает файл игрока
let player_file = player_dat_path(&world, offline_player_uuid("mcrs_test"));
assert!(!player_file.exists(), "saved before the shutdown");
requested.store(true, Ordering::Relaxed);
exited
.recv_timeout(Duration::from_secs(30))
.expect("the server exits by itself after the request");
server_thread.join().unwrap();
assert!(player_file.exists(), "{} is missing", player_file.display());

tests/it/shutdown.rs:74-83

Датапаки загружаются один раз, при старте

Заголовок раздела «Датапаки загружаются один раз, при старте»

При старте сервер загружает в реестры ванильный датапак и ваши локальные паки. Ванильный пак берется из jar игры, а локальный пак - это каталог внутри mcrs/datapacks/ в корне ассетов сборки.

Пак можно проверить, не запуская сервер. Пример check_pack из крейта mcrs_minecraft_game_registries загружает ваш пак поверх ванильного, печатает все диагностики и завершается с ошибкой, если они есть.

Окно терминала
cargo run -p mcrs_minecraft_game_registries --example check_pack -- "<data pack directory>"

В каталоге должны быть pack.mcmeta и data/, то же написано в строке usage инструмента.

Перезагрузить пак на работающем сервере нельзя, поэтому после изменения пака сервер нужно перезапустить. /reload и включение паков на лету запланированы.4 По плану перезагрузка заменяет данные на границе тика и отклоняет изменения, от которых зависит сохраненный мир, например высоту типа измерения.

Источника о том, как сервер обращается с папкой datapacks внутри папки мира, пока нет, поэтому страница ничего об этом не утверждает.

  1. Не планируется#388 Решение читать сохранения только с целевой версией данных, без датафиксеров. ↩ ↩2

  2. В работе#521 Отслеживает спецификацию и плагин инвентаря игрока. ↩

  3. В работе#78 Отслеживает запись измененных чанков обратно в файлы регионов. ↩

  4. В работе#316 Планирует перезагрузку датапаков на работающем сервере. ↩

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

Проверено: 26.4-snapshot-7, 51d45c26a, 2026-11-09

Переведено с версии 51d45c26a

Следить: #78, #169, #316, #388