RE:NODE

Руководства10 мин чтения

Карты и моды из Workshop на сервере Unturned

Как добавить карты и моды из мастерской Steam на сервер Unturned: WorkshopDownloadConfig.json, имена карт, пакеты ассетов, конфликты ID, выключение при обновлениях и ошибки входа.

0 прочтений

Контент из мастерской сервер Unturned берёт из одного файла: WorkshopDownloadConfig.json в папке экземпляра сервера. Впишите числовые ID карты и её пакетов ассетов в File_IDs, укажите в Map в Commands.dat внутреннее имя карты и перезапустите сервер. Сервер скачивает все элементы при загрузке, а когда игрок заходит, отправляет ему тот же список, и клиент сам скачивает его из Steam - никому не нужно подписываться вручную. Почти любая проблема с мастерской на сервере Unturned - одна из четырёх: не хватает зависимости, неверное имя карты, два мода используют одни и те же ID или элемент мастерской обновился, пока сервер работал.

В этом руководстве разобраны сам файл и каждое его поле, карты и имя, по которому они загружаются, контентные моды, зависимости, что происходит при обновлении элемента и какие ошибки видят игроки на практике. Об остальном сервере - Commands.dat, портах и токене входа - читайте в статье установка сервера Unturned.

Как контент мастерской попадает на сервер и к игрокам#

Элементы мастерской для Unturned хранятся в Steam под ID приложения игры 304930. Выделенному серверу не нужен ничей аккаунт Steam, чтобы их получить: он читает список ID при загрузке, скачивает всё недостающее или устаревшее и загружает ассеты.

чтение при стартеэлементы и потомкисписок нужных элементовте же элементыWorkshopDownloadConfigFile_IDsSteam Workshopapp 304930Сервер Unturnedкачает при загрузкеВходящий игрок
Один список ID кормит и сервер, и каждого игрока

Когда игрок подключается, сервер сообщает ему, какие элементы у него запущены. Клиент сравнивает это с тем, что у него есть, скачивает недостающее из Steam и заходит. Именно поэтому первый вход игрока на сервер с большим количеством модов может занять время.

Из-за этого рукопожатия правильное место для контента мастерской - список ID, а не файлы, скопированные в папки вручную. Контента, скопированного на сервер вручную, нет в списке, поэтому клиентам никогда не скажут его скачать, и они попадут в мир, полный вещей, которые не могут загрузить.

WorkshopDownloadConfig.json поле за полем#

Файл лежит в Servers/<ServerID>/WorkshopDownloadConfig.json и создаётся при первом запуске сервера. Перед правкой остановите сервер. Типичный файл:

Servers/MyServer/WorkshopDownloadConfig.json
{    "File_IDs": [        1234567890,        1234567891,        2345678901    ],    "Ignore_Children_File_IDs": [],    "Query_Cache_Max_Age_Seconds": 600,    "Max_Query_Retries": 2,    "Use_Cached_Downloads": true,    "Should_Monitor_Updates": true,    "Shutdown_Update_Detected_Timer": 600,    "Shutdown_Update_Detected_Message": "Workshop file update detected, shutdown in: {0}"}
ПолеЧто делает
File_IDsЭлементы мастерской, которые нужно скачать и загрузить. Числа через запятую
Ignore_Children_File_IDsЭлементы, которые нужно пропустить, даже если что-то из File_IDs указывает их как обязательные
Query_Cache_Max_Age_SecondsСколько сервер доверяет последней проверке данных об элементах
Max_Query_RetriesПовторы, если Steam не отвечает
Use_Cached_DownloadsИспользовать уже скачанные элементы, если они актуальны
Should_Monitor_UpdatesСледить за обновлениями мастерской во время работы
Shutdown_Update_Detected_TimerСекунд предупреждения перед выключением из-за обновления
Shutdown_Update_Detected_MessageПредупреждение для игроков; {0} заменяется оставшимся временем

Поля и их значения по умолчанию менялись на протяжении нескольких обновлений, поэтому считайте файл, который сгенерировал ваш сервер, эталоном для своей сборки. Трогать вы будете File_IDs и поля обновлений.

ID элемента мастерской - это число в конце адреса его страницы в Steam, после ?id=. Это число, а не имя, и в JSON оно пишется без кавычек. Пропущенная запятая между ID или лишняя запятая после последнего делают файл некорректным; тогда сервер либо игнорирует его, либо не запускается, и консоль скажет, что именно. О правке файла читайте в статье SFTP и файловый менеджер, а редактор в браузере с подсветкой синтаксиса помогает заметить лишнюю запятую до перезапуска.

Карты: ID и имя#

Карте из мастерской нужны две вещи: её ID в File_IDs и её имя в Commands.dat.

Servers/MyServer/Server/Commands.dat
Map Example Island

Имя - это внутреннее имя карты, то есть имя папки карты внутри элемента мастерской, и оно не обязательно совпадает с заголовком на странице в мастерской. Большинство авторов карт указывают точное имя на странице. Если нет, загляните в скачанный элемент после того, как сервер его получит: имя папки карты и есть нужное значение.

Если сервер не находит указанную карту, он не падает. Он загружает PEI, маленькую карту по умолчанию, и запускается как обычно. У сервера, который после добавления карты продолжает запускаться на PEI, одна из трёх проблем: имя не совпадает в точности, элемент мастерской не скачался (проверьте загрузку в консоли при старте) или карту добавили в File_IDs, но сервер не перезапустили.

Официальные карты - среди них PEI, Washington, Russia и Yukon - поставляются с игрой, и запись в мастерской им не нужна. Curated-карты, то есть карты сообщества, которые продвигаются внутри игры, размещены в мастерской. Свежие сборки сервера умеют находить curated-карту по имени, но надёжный способ гарантировать, что она есть у сервера, - добавить её ID в File_IDs.

Одновременно работает только одна карта. Смена Map даёт другой мир со своим сохранением; сохранение старой карты остаётся на диске под своим именем, так что, переключившись обратно, вы к нему вернётесь.

Пакеты ассетов и зависимости#

Многие большие карты - это не один элемент мастерской. Они состоят из элемента с картой и одного или нескольких пакетов ассетов: зданий, декораций, машин и предметов, которые использует карта, опубликованных отдельно, чтобы их можно было обновлять или использовать в разных картах.

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

С этим справляются два механизма.

Обязательные элементы. Элемент мастерской может указать другие элементы, которые ему нужны. Скачивая его, сервер подтягивает и этих потомков. Поэтому многие карты работают, когда в списке указан только ID самой карты.

`Ignore_Children_File_IDs`. Иногда обязательный потомок вам не нужен - устаревший пакет или пакет, который вы заменяете другой версией. Если указать его здесь, он будет пропущен.

Не все авторы правильно указывают обязательные элементы. Прочитайте на странице карты в мастерской, что ещё нужно поставить вместе с ней, добавьте эти ID явно и проверьте консоль при загрузке, чтобы убедиться, что всё скачалось. Указать ID, который и так подтянулся бы как потомок, не вредно.

Коллекции мастерской - удобный способ для игроков подписаться на набор элементов, но ведёт ли себя ID коллекции на сервере как список ID, менялось от сборки к сборке. Перечислять элементы по одному предсказуемо, и так сразу видно, что запущено на сервере.

Контентные моды: предметы, машины и проблема ID#

Контентные моды - новое оружие, машины, одежда, постройки - добавляются ровно как карты: ID мастерской в File_IDs, перезапуск. Сервер загружает их ассеты вместе с ассетами самой игры.

Давняя беда модов Unturned - ID. У каждого предмета, машины и объекта в игре есть числовой ID внутри своей категории, и старые моды выбирали номера сами. Два мода, которые оба определяют предмет 30000, конфликтуют, и побеждает один из них - так что игрок спавнит, покупает или находит что-то, что оказывается из другого мода. Новые ассеты несут ещё и GUID, уникальный по определению, но много популярного контента до сих пор зависит от числовых ID, а таблицы спавна, магазины и плагины часто ссылаются на предметы по номеру.

Защита состоит в основном во внимательности:

  • Читайте лог сервера при загрузке. Конфликты ассетов сообщаются во время загрузки ассетов. Чистый лог с вашим списком модов стоит проверять после каждого добавления.
  • Добавляйте по одному моду. Перезапуск, проверка лога, проверка в игре, затем следующий.
  • Выбирайте поддерживаемые моды. Активный автор решает конфликты, о которых ему сообщают; заброшенный - нет.
  • Сверяйте конфиги плагинов с ID. Плагины китов, магазинов и лута ссылаются на ID предметов. Когда вы добавляете или удаляете мод, ID в конфигах плагина могут начать указывать на что-то другое или в никуда.

Моды, от которых зависит карта, - особый случай: их удаление ломает карту. Моды, от которых ничего не зависит, удалить можно, но всё, что игроки получили из этого мода, исчезнет - из инвентарей, хранилищ и машин. Удаление - это решение, о котором объявляют, а не быстрое исправление.

Обновления во время работы сервера#

Авторы обновляют свои элементы мастерской, когда захотят. Опасность в разрыве: сервер работает со старой версией, игрок заходит, Steam даёт ему новую, и стороны расходятся. В зависимости от того, что изменилось, игрока кикает с ошибкой несовпадения или он заходит и потом видит ошибки.

Встроенный ответ - Should_Monitor_Updates. Когда эта настройка включена, сервер следит за своими элементами и, когда один из них обновляется, предупреждает игроков сообщением Shutdown_Update_Detected_Message и выключается через Shutdown_Update_Detected_Timer секунд. При следующем запуске он скачивает обновление, и сервер с игроками снова совпадают.

Это работает, только если что-то снова запустит сервер. Проверьте, как ваш хостер обрабатывает корректный выход: в одних конфигурациях сервер сразу поднимается, в других ждёт, пока его запустят. Если ждёт, сервер, который выключился из-за обновления мода в 4 утра, будет лежать, пока кто-нибудь не заметит. Альтернативы - оставить слежение включённым и убедиться, что сервер перезапускается, или выключить его и подтягивать обновления ночным перезапуском в час, когда никто не играет.

В RE:NODE вкладка Schedules может выполнять такой ночной порядок в виде упорядоченных задач: команда say с предупреждением игрокам, задержка, save, перезапуск, затем резервная копия. Перезапуск заново читает WorkshopDownloadConfig.json и по пути скачивает обновлённые элементы. Как выбрать час, описано в статье расписания перезапусков, которые помогают.

Размер сервера и время загрузки#

Контент мастерской стоит серверу памяти и диска, а игрокам - времени на загрузку.

КонтентВлияние на памятьДиск
Официальная карта без модовБазовый уровень, сервер около 2 GBУстановка в пару GB
Curated-картаОт небольшого до умеренногоСотни MB
Большая карта сообщества с пакетами ассетовОт умеренного до большогоДо нескольких GB
Большая карта плюс много контентных модовБольшоеНесколько GB

Самый большой отдельный фактор - обычно карта, потому что на большой карте гораздо больше объектов, чем на официальной. Контентные моды складываются, когда их много. Полная таблица размеров по числу игроков есть в руководстве по установке.

Загрузки бьют по игрокам сильнее, чем по серверу. Сервер с несколькими гигабайтами контента мастерской означает долгий первый вход для каждого нового игрока и полную перезагрузку всего, что обновилось. Держите в списке только то, что сервер действительно использует, и укажите размер загрузки в описании сервера, чтобы новые игроки знали, что нужно подождать. Как устроены загрузки в разных играх, включая элементы, которые скрывают из мастерской, описано в статье моды из Steam Workshop на выделенных серверах.

Решение проблем#

Сервер всегда загружает PEI. Имя в Map не совпадает с внутренним именем карты, карта не скачалась или сервер не перезапустили после изменения.

Игроки видят красный текст ошибок и пропавшие здания. Не хватает пакета ассетов. Найдите на странице карты в мастерской, что ей нужно, и добавьте эти ID.

Игроков кикает при входе из-за несовпадения мастерской или ассетов. Элемент обновился, а сервер не перезапущен. Перезапустите его; включите Should_Monitor_Updates или запланируйте ночные перезапуски.

Сервер игнорирует WorkshopDownloadConfig.json. JSON некорректен - обычно пропущена или лишняя запятая - или файл правили при работающем сервере, и при выключении он был перезаписан.

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

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

Кит или магазин плагина выдаёт не те предметы. После добавления или удаления мода поменялись ID предметов. Обновите конфиг плагина.

FAQ#

Нужно ли игрокам подписываться на мои карты из мастерской?

Нет. Сервер отправляет свой список элементов при входе, и клиент сам скачивает всё из Steam. Игрокам нужно лишь дождаться загрузки при первом входе.

Где найти внутреннее имя карты?

На странице карты в мастерской - большинство авторов его указывают. Если нет, посмотрите имя папки внутри скачанного элемента мастерской на сервере. Именно это имя папки пишется после Map в Commands.dat.

Можно ли добавлять моды без перезапуска?

Нет. WorkshopDownloadConfig.json читается при загрузке. Добавьте ID, затем перезапустите сервер, лучше в тихий час.

Почему моя карта загружается без зданий?

Она зависит от пакета ассетов, которого нет у сервера или игрока. Добавьте в File_IDs всё, что требует страница карты, перезапустите сервер и проверьте лог загрузки.

Можно ли вписать в файл ID коллекции из мастерской?

Надёжный способ - перечислять ID отдельных элементов. Поведение коллекций на сервере менялось от сборки к сборке, а явный список делает понятным, что у вас запущено.

Что будет с предметами игроков, если я удалю мод?

Всё, что пришло из этого мода, исчезнет из инвентарей, хранилищ и машин. Объявляйте об удалении и храните резервную копию, сделанную до изменения, на случай если придётся его откатить.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000