На сервере 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 подписывают в описании каждую настройку:
## 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 найдите блокировку во всей папке конфигов сервера и убедитесь, что она включена везде.
$ 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 на серверах.
Правка синхронизируемых настроек: на сервере, затем перезагрузка#
Чистый способ изменить синхронизируемую настройку - отредактировать файл сервера. Вступит ли правка в силу сразу, зависит от мода.
- Моды, следящие за своим файлом. Многие моды с ServerSync, включая большинство собранных на распространённом шаблоне, следят за своим
.cfgи перечитывают его при сохранении. Отредактируйте файл сервера, сохраните, и новое значение применится на сервере и вскоре будет отправлено подключённым клиентам. Там, где мод выводит строку о перезагрузке, ищите её в консоли сервера. - Моды, читающие конфиг при запуске. Другие читают конфигурацию один раз. Отредактируйте файл при остановленном сервере, затем запустите его.
Если вы не знаете, какой у вас случай, всегда работает способ с остановленным сервером:
- Корректно остановите сервер и дождитесь сохранения мира.
- Отредактируйте файл в
BepInEx/config. Храните копию своих правок вне сервера. - Запустите сервер и найдите строку
Loadingэтого мода. - Подключитесь и убедитесь в игре, что значение применилось.
Правки в файле клиента никогда не исправляют проблему сервера. Пока клиент подключён, он использует значения сервера; после отключения ServerSync обычно возвращает клиенту его собственные значения. Некоторые игроки считают, что файл на их ПК должен отражать сервер, и недоумевают, когда это не так. Ничего не сломано: файл - это их локальное значение по умолчанию, а не запись того, что сервер принудительно применяет.
На RE:NODE папка BepInEx/config сервера открыта в файловом менеджере панели с подсветкой синтаксиса, поэтому цикл "правка - сохранение - перезагрузка" обходится без скачивания, а консоль в реальном времени показывает вывод перезагрузки или перезапуска.
Не только .cfg: YAML и другие синхронизируемые файлы#
Ряд крупных модов хранит основную конфигурацию в отдельных файлах, часто YAML: пользовательские таблицы спавна, списки рецептов, описания предметов. ServerSync умеет синхронизировать и их как пользовательские синхронизируемые значения, и моды, которые этим пользуются, отправляют каждому клиенту при подключении всё содержимое файла.
Что это означает на практике:
- Важна копия сервера, так же как и для
.cfg. Клиенты получают её при подключении. - Большие файлы замедляют вход. Клиент должен получить каждый синхронизируемый файл, прежде чем полностью зайти, так что очень большой набор YAML в нескольких модах добавляет времени к подключению. Если после добавления мода игроки дольше сидят на экране загрузки, это вероятная причина; другие причины разбирает статья застрял на подключении и загрузке.
- Синтаксическая ошибка останавливает синхронизацию для этого мода или заставляет его вернуться к значениям по умолчанию, в зависимости от мода. YAML капризен к отступам; достаточно табуляции там, где ожидались пробелы. Проверяйте лог сервера сразу после правки.
Читайте документацию каждого такого мода, чтобы узнать, где лежат файлы и следит ли он за их изменениями. Пути не стандартизированы.
Проверка версий идёт по тому же соединению#
Рукопожатие, отправляющее конфигурацию, заодно сравнивает версии. Отсюда берётся большинство жалоб "выкидывает при подключении" на серверах с модами.
ServerSync позволяет каждому моду объявить свою текущую версию, минимальную версию, которую он примет от другой стороны, и обязана ли другая сторона вообще иметь этот мод. Если версия клиента ниже минимальной или нужный мод отсутствует, соединение отклоняется, а сообщение об отключении называет мод и обе версии. Каждый мод проверяет себя сам, поэтому игроку с тремя устаревшими модами могут сообщать о них по одному.
Jotunn делает ту же работу централизованно. Каждый мод объявляет уровень сетевой совместимости (например, мод должен быть у всех) и строгость версии (major, minor или patch), а Jotunn сравнивает весь список при подключении и показывает окно с несоответствиями.
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.
Влияют ли игроки с кроссплея на синхронизацию конфигов?
Консольные игроки не могут устанавливать моды, поэтому вообще не смогут зайти на сервер, где моды обязательны на клиентах. На сервере только с серверными модами синхронизация их не касается, потому что на их стороне нечего синхронизировать.


