RE:NODE

ServerSync в Valheim: как конфиги модов попадают к клиентам

Автор Команда RE:NODE
12 мин чтения


На сервере Valheim с модами настройка, помеченная как синхронизируемая, принадлежит серверу. Когда игрок подключается, мод отправляет ему значения сервера для этих настроек, и клиент использует их до конца сессии, что бы ни говорил его собственный файл конфигурации. Почти всю эту работу делают две библиотеки: ServerSync, которую многие моды компилируют прямо в свой .dll, и Jotunn, синхронизирующий настройки, которые его моды помечают как доступные только администратору. Обе обычно поставляются с блокировкой. При Lock Configuration = On менять синхронизируемые значения могут только файл сервера и игроки из списка администраторов; при выключенной блокировке поведение зависит от мода, и игроки могут менять то, что им менять не следует. Если запомнить одно правило: синхронизируемые настройки правят на сервере, а не на клиенте, и по файлу клиента нельзя судить о том, что сервер реально принудительно применяет.

Зачем модам Valheim вообще нужна синхронизация конфигов#

Мультиплеер Valheim не строится на авторитете сервера. Сервер хранит мир и передаёт состояние, но каждую зону симулирует клиент игрока, которому она принадлежит. Поэтому мод, меняющий правило (размер стопок, переносимый вес, время роста культур, здоровье врагов), работает на каждой машине, и каждая машина читает собственный файл конфигурации.

Без синхронизации всё идёт наперекосяк предсказуемым образом. Владелец сервера задаёт переносимый вес 600, у одного игрока в файле остаётся стандартные 300, и они расходятся. В зависимости от мода игрок либо видит старое правило, либо видит новое непоследовательно, либо рассинхронизирует мир для всех, кто стоит в принадлежащей ему зоне. Хуже того, игрок может поднять значение в своём файле и получить преимущество, с которым сервер не соглашался.

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

Две системы: ServerSync и Jotunn#

Большинство модов, синхронизирующих конфигурацию, используют одну из этих двух, и на одном сервере вы встретите обе.

ServerSyncСинхронизация конфигов Jotunn
Что этоНебольшая библиотека от blaxxun, встроенная в каждый модЧасть библиотеки для моддинга Jotunn
Как устанавливаетсяОтдельно никак; живёт внутри .dll модаJotunn устанавливается как отдельный плагин
Какие настройки синхронизируютсяТе, которые мод зарегистрировал в ServerSyncТе, которые мод пометил как доступные только администратору
БлокировкаОбычно настройка Lock Configuration у каждого модаНастройки только для администратора всегда управляются сервером
Проверка версийУ каждого мода: текущая и минимальная версияПроверка сетевой совместимости Jotunn
Типичные модыМногие моды Smoothbrain, Azumatt и blaxxunКонтентные моды на основе Jotunn

Поскольку ServerSync встроен, он никогда не появляется отдельной строкой в логе BepInEx, и обновлять отдельно нечего. Каждый мод несёт ту копию, с которой был собран. Поэтому проблемы синхронизации с ServerSync всегда касаются конкретного мода: плохая синхронизация одного мода ничего не говорит о других.

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

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

Как читать синхронизируемый конфиг#

При первом запуске мод создаёт свой файл в BepInEx/config, названный по GUID плагина. Моды на распространённом шаблоне ServerSync подписывают в описании каждую настройку:

BepInEx/config/com.example.examplemod.cfg
## Settings file was created by plugin ExampleMod v1.2.3## Plugin GUID: com.example.examplemod[1 - General]## If on, the configuration is locked and can be changed by server admins only. [Synced with Server]# Setting type: Toggle# Default value: On# Acceptable values: Off, OnLock Configuration = On[2 - Limits]## Maximum carry weight. [Synced with Server]# Setting type: Single# Default value: 300Max Carry Weight = 600## Show the weight bar on the HUD. [Not Synced with Server]# Setting type: Toggle# Default value: On# Acceptable values: Off, OnShow Weight Bar = On

Пометки [Synced with Server] и [Not Synced with Server] - это соглашение, а не то, что добавляет BepInEx, поэтому они есть не у каждого мода. Когда их нет, единственный ориентир - страница мода или его собственное описание каждой настройки. Моды на Jotunn могут вообще не подписывать настройки в файле; во внутриигровом редакторе записи только для администратора - те, которые не-администратор изменить не может.

Файл - обычный INI, как и любой конфиг BepInEx, и правила те же: мод перезаписывает его при запуске, неизвестные ключи отбрасываются, а значение не в той секции игнорируется. Формат файла в целом описан в статье моды Valheim с BepInEx на сервере.

Что делает Lock Configuration#

Lock Configuration - переключатель, определяющий, будут ли синхронизируемые настройки применяться принудительно или только предлагаться. Он сам синхронизируется, поэтому учитывается значение сервера.

  • On (обычно по умолчанию). Значения сервера для каждой синхронизируемой настройки применяются к каждому клиенту при подключении и остаются в силе. Не-администратор не может менять их во время сессии ни в файле, ни во внутриигровом редакторе. Игроки из списка администраторов сервера могут менять их в игре, и изменение уходит на сервер.
  • Off. Сервер по-прежнему отправляет свои значения, но игрокам разрешено локально менять синхронизируемые настройки. Что именно это значит, зависит от мода: одни применяют собственное значение клиента только для этого игрока, у других изменение на любом клиенте распространяется на всех. Не оставляйте блокировку выключенной на сервере, которому вы не доверяете полностью, и не оставляйте её выключенной случайно после тестов.

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

bash
$ grep -H "^Lock Configuration" BepInEx/config/*.cfgBepInEx/config/com.example.examplemod.cfg:Lock Configuration = OnBepInEx/config/com.example.othermod.cfg:Lock Configuration = Off

Любое Off в этом списке должно быть решением, а не случайностью.

Кто считается администратором#

Права администратора для синхронизации конфигов берутся из собственного файла Valheim adminlist.txt в каталоге сохранений сервера - того же, что управляет кикбаном. Ни у ServerSync, ни у Jotunn собственного списка нет. Из этого следуют два важных вывода.

Во-первых, формат ID должен быть правильным. На сервере только для Steam строка - это SteamID64 игрока; на сервере с кроссплеем это форма с префиксом платформы, например Steam_76561198012345678. Игрок, записанный в неверном формате, не является администратором и для синхронизации конфигов, что проявляется как неактивные настройки во внутриигровом редакторе. Все форматы приведены в статье три списка: adminlist, bannedlist и permittedlist, а надёжный способ узнать ID - взять его из строки подключения в логе сервера.

Во-вторых, статус администратора позволяет игроку менять синхронизируемые значения сервера прямо в игре через внутриигровой редактор конфигурации. Новое значение отправляется на сервер, применяется там, записывается в файл конфигурации сервера и рассылается всем подключённым. Это удобно для балансировки во время сессии и опасно по той же самой причине. Держите список администраторов коротким. Сам редактор описан в статье ConfigurationManager на серверах.

Правка синхронизируемых настроек: на сервере, затем перезагрузка#

Чистый способ изменить синхронизируемую настройку - отредактировать файл сервера. Вступит ли правка в силу сразу, зависит от мода.

  1. Моды, следящие за своим файлом. Многие моды с ServerSync, включая большинство собранных на распространённом шаблоне, следят за своим .cfg и перечитывают его при сохранении. Отредактируйте файл сервера, сохраните, и новое значение применится на сервере и вскоре будет отправлено подключённым клиентам. Там, где мод выводит строку о перезагрузке, ищите её в консоли сервера.
  2. Моды, читающие конфиг при запуске. Другие читают конфигурацию один раз. Отредактируйте файл при остановленном сервере, затем запустите его.

Если вы не знаете, какой у вас случай, всегда работает способ с остановленным сервером:

  1. Корректно остановите сервер и дождитесь сохранения мира.
  2. Отредактируйте файл в BepInEx/config. Храните копию своих правок вне сервера.
  3. Запустите сервер и найдите строку Loading этого мода.
  4. Подключитесь и убедитесь в игре, что значение применилось.

Правки в файле клиента никогда не исправляют проблему сервера. Пока клиент подключён, он использует значения сервера; после отключения ServerSync обычно возвращает клиенту его собственные значения. Некоторые игроки считают, что файл на их ПК должен отражать сервер, и недоумевают, когда это не так. Ничего не сломано: файл - это их локальное значение по умолчанию, а не запись того, что сервер принудительно применяет.

На RE:NODE папка BepInEx/config сервера открыта в файловом менеджере панели с подсветкой синтаксиса, поэтому цикл "правка - сохранение - перезагрузка" обходится без скачивания, а консоль в реальном времени показывает вывод перезагрузки или перезапуска.

Не только .cfg: YAML и другие синхронизируемые файлы#

Ряд крупных модов хранит основную конфигурацию в отдельных файлах, часто YAML: пользовательские таблицы спавна, списки рецептов, описания предметов. ServerSync умеет синхронизировать и их как пользовательские синхронизируемые значения, и моды, которые этим пользуются, отправляют каждому клиенту при подключении всё содержимое файла.

Что это означает на практике:

  • Важна копия сервера, так же как и для .cfg. Клиенты получают её при подключении.
  • Большие файлы замедляют вход. Клиент должен получить каждый синхронизируемый файл, прежде чем полностью зайти, так что очень большой набор YAML в нескольких модах добавляет времени к подключению. Если после добавления мода игроки дольше сидят на экране загрузки, это вероятная причина; другие причины разбирает статья застрял на подключении и загрузке.
  • Синтаксическая ошибка останавливает синхронизацию для этого мода или заставляет его вернуться к значениям по умолчанию, в зависимости от мода. YAML капризен к отступам; достаточно табуляции там, где ожидались пробелы. Проверяйте лог сервера сразу после правки.

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

Проверка версий идёт по тому же соединению#

Рукопожатие, отправляющее конфигурацию, заодно сравнивает версии. Отсюда берётся большинство жалоб "выкидывает при подключении" на серверах с модами.

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

Jotunn делает ту же работу централизованно. Каждый мод объявляет уровень сетевой совместимости (например, мод должен быть у всех) и строгость версии (major, minor или patch), а Jotunn сравнивает весь список при подключении и показывает окно с несоответствиями.

code
DisconnectedExampleMod: Server has version 1.2.3, you have 1.2.1.Minimum required version is 1.2.3.

Формулировка выше иллюстративная; каждый мод и каждая версия ServerSync выражается немного по-своему, но содержание всегда одно: имя мода и две версии. Решение - привести наборы в соответствие, а не ослаблять проверку. Процедуру точного сравнения списков клиента и сервера описывает статья выкидывает из-за несовпадения версий модов.

Типичные сбои синхронизации и их решения#

СимптомОбычная причинаРешение
Настройка игрока возвращается при входеТак и задумано: настройка синхронизируетсяИзмените её на сервере
Администратор не может изменить синхронизируемую настройку в игреНет в adminlist.txt или неверный формат IDДобавьте правильный ID; список перечитывается на лету
Правка файла сервера не действуетМод читает конфиг только при запускеОстановите, отредактируйте, запустите
Правка пропала после перезапускаОтредактирован файл работающего сервера, который мод затем перезаписалРедактируйте при остановленном сервере или используйте мод, следящий за файлом
Игроки могут менять значения балансаНа сервере Lock Configuration = OffВключите её в файле этого мода на сервере
Долгая загрузка при входеБольшие синхронизируемые YAML или много синхронизируемых модовСократите файлы или смиритесь с более медленным входом
У одного игрока другие правилаМода нет у этого клиента, и он не помечен как обязательныйПриведите наборы модов в соответствие

Два сбоя заслуживают большего, чем строка в таблице.

Настройка, которая вообще не синхронизируется. Если мод не помечает настройку баланса как синхронизируемую, сервер не может её принудительно применять. Решает собственный файл каждого игрока. Единственные способы исправить это: распространять ту же конфигурацию вместе с набором модов (сборка с папкой config или экспортированный профиль) либо выбрать мод, который её синхронизирует. Не предполагайте, что настройка синхронизируется, только потому что соседние в том же файле синхронизируются.

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

FAQ#

Нужно ли устанавливать ServerSync отдельно?

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

Почему в файле конфигурации одно значение, а игра использует другое?

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

Видят ли игроки синхронизируемые значения сервера?

Да, во внутриигровом редакторе конфигурации при подключении: синхронизируемые настройки там показывают текущие значения сервера. Менять их игроки не могут, если блокировка не выключена и они не входят в список администраторов.

Влияет ли Lock Configuration на настройки, которые не синхронизируются?

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

Надёжен ли синхронизация конфигов как защита от читов?

Она принудительно применяет значения, которые мод решил синхронизировать, и тем самым останавливает случайные правки настроек баланса. Это не защита от игрока, который модифицирует сам мод или использует другие средства. Рассматривайте её как способ сохранять единообразие у добросовестных игроков, а для всего остального делайте backup.

Влияют ли игроки с кроссплея на синхронизацию конфигов?

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