Jotunn - это не мод, который ставят ради него самого. Это библиотека ("the Valheim Library"), на которой построены другие моды, и на большинстве серверов с модами она оказывается потому, что контентный мод указал её как зависимость. Владелец сервера замечает три её действия: она регистрирует новые предметы, элементы построек и существ, которые добавляют эти моды; при подключении игрока она сравнивает версии модов на сервере и клиенте и отключает его, если они не совпадают; и она передаёт значения конфигурации, доступные только админам, с сервера на каждый клиент. Когда игрока выкидывает с модового сервера окном со списком модов и версий, кикает его очень часто именно Jotunn, и делает это намеренно. В статье объясняется, что происходит, как это читать и как не допустить, чтобы несовпадением стал сам Jotunn.
О том, как BepInEx вообще загружает моды, рассказано в статье моды для сервера Valheim через BepInEx. Эта статья продолжает её.
Что Jotunn делает для модов#
У Valheim нет официального API для модов. Без библиотеки каждому контентному моду пришлось бы самому выяснять, как в нужный момент вставить новый предмет в базу объектов игры, как показать рецепт на нужном станке, как добавить переводы и как зарегистрировать сетевые сообщения. Jotunn делает эту работу один раз, а моды обращаются к нему.
Он организован в менеджеры, каждый из которых отвечает за один вид задач:
| Менеджер | За что отвечает |
|---|---|
ItemManager | Новые предметы, рецепты, статусные эффекты, превращения предметов |
PieceManager | Строительные элементы и категории молота, в которых они лежат |
PrefabManager | Клонирование и регистрация префабов, основа большей части контента |
CreatureManager | Новые существа и их добыча |
ZoneManager | Пользовательские локации и растительность при генерации мира |
LocalizationManager | Строки перевода для всех языков |
SynchronizationManager | Синхронизация конфигов и проверки админов между сервером и клиентами |
NetworkManager | Пользовательские RPC, собственные сетевые сообщения мода |
CommandManager | Консольные команды, которые добавляет мод |
Владельцу сервера большая часть этого не видна, за одним полезным исключением: Jotunn ввёл "mock"-ссылки, когда мод обращается к ванильному ресурсу по условному имени с префиксом JVLmock_, которое во время работы заменяется настоящим объектом. Если после обновления игры ресурсы мода не находятся, вы можете увидеть этот префикс в строках ошибок журнала, и он указывает на мод, который нужно обновить, а не на вашу установку.
Jotunn опубликован на Thunderstore как ValheimModding-Jotunn, документация находится по адресу valheim-modding.github.io/Jotunn. Он зависит от BepInExPack Valheim и от HookGenPatcher (ValheimModding-HookGenPatcher), который при первом запуске генерирует для игры сборки MMHOOK. Менеджер модов устанавливает оба автоматически. Вручную .dll Jotunn кладётся в BepInEx/plugins, а HookGenPatcher - в BepInEx/patchers: если положить HookGenPatcher не в ту папку, получатся ошибки, похожие на поломку самого Jotunn.
Где нужно устанавливать Jotunn#
Jotunn должен быть на каждой машине, где работает зависящий от него мод. На практике это значит сервер и все клиенты, потому что контентные моды, главные пользователи Jotunn, сами нужны с обеих сторон.
Мод только для сервера, который случайно использует Jotunn, требует его только на сервере. Клиентский мод, использующий его, например некоторые моды интерфейса, требует его только на клиентах. Зависимость следует за модом. Типичный сюрприз - группа считает, что у неё "только серверные моды", пока кто-нибудь не добавит один контентный мод, вместе с которым приходит Jotunn, и сервер перестаёт быть доступным без того же мода у каждого клиента.
Поэтому моды на Jotunn закрывают вход игрокам Xbox и Game Pass: те не могут ничего устанавливать, а проверка Jotunn отклонит их, если мод объявляет, что он нужен всем. Что может и чего не может запускать смешанная группа, описано в статье кроссплей Valheim и игроки Xbox.
Проверка версий и почему она кикает игроков#
Когда клиент подключается к серверу, Jotunn с каждой стороны строит список загруженных модов, объявивших уровень сетевой совместимости, вместе с их версиями, и эти два списка сравниваются. Если они расходятся так, как мод счёл важным, клиент отключается и видит окно со списком проблем.
Каждый мод объявляет своё требование в коде атрибутом. Важны две части: у кого должен быть мод и насколько строго должны совпадать версии.
| Уровень совместимости | Значение |
|---|---|
NotEnforced | Не проверяется вообще |
VersionCheckOnly | Сравнивается, только если мод есть у обеих сторон |
EveryoneMustHaveMod | Мод должен быть и на сервере, и на клиенте |
ClientMustHaveMod | Мод должен быть у клиентов; серверу не обязательно |
ServerMustHaveMod | Мод должен быть на сервере; клиентам не обязательно |
| Строгость версий | Несовпадение - это |
|---|---|
None | Никогда не проблема |
Major | Другое первое число (1.x и 2.x) |
Minor | Другое первое или второе число (1.4 и 1.5) |
Patch | Любое отличие вообще (1.4.2 и 1.4.3) |
Так, контентный мод, объявивший EveryoneMustHaveMod со строгостью Minor, позволяет игроку с версией 1.4.2 зайти на сервер с 1.4.3, но отклонит 1.5.0. Мод со строгостью Patch отклонит любое отличие. Мод, который ничего не объявил, вообще не участвует в сравнении Jotunn, а это не значит, что несовпадение безопасно, лишь что Jotunn вам об этом не скажет.
В окне, которое видит игрок, перечислен каждый проблемный мод и что именно не так: нет на клиенте, нет на сервере, либо есть на обеих сторонах в несовместимых версиях, причём показаны обе версии. Это окно - самое полезное во всём процессе, потому что оно называет мод. Просите у игрока скриншот, а не описание.
Решение всегда одно: добиться совпадения списков. Не пытайтесь ослабить проверку. Авторы объявили строгость потому, что несовпавшая версия сломает предметы, рецепты или мир гораздо сильнее, чем отказ в подключении. Пошаговый разбор сообщения и выравнивания наборов есть в статье кик из-за несовпадения версий модов.
Когда несовпадением становится сам Jotunn#
Неприятный случай - когда все контентные моды совпадают, а Jotunn нет. Игрок обновил всё в менеджере модов, и у него теперь более новый Jotunn, чем на сервере. Кикнет ли его одно только это, зависит от задействованных версий Jotunn и различалось между релизами, но даже если не кикнет, контентный мод, написанный под поведение более нового Jotunn, может работать неправильно с более старым с другой стороны.
Безопасное правило простое: считайте Jotunn частью списка модов и держите его на одной версии на сервере и клиентах. Когда группа делится профилем через менеджер модов, Jotunn лежит в профиле, как любой другой пакет, а как держать этот профиль закреплённым, показано в статье r2modman для групп Valheim.
Чтобы увидеть, что на самом деле запущено у каждой стороны, прочитайте журнал BepInEx. Каждый плагин при запуске указывается с версией:
# On the server, from the server root$ grep -o 'Loading \[[^]]*\]' BepInEx/LogOutput.logLoading [Jotunn 2.x.x]Loading [SomeContentMod 1.4.3]На клиенте тот же файл лежит в папке BepInEx профиля после одного запуска с модами. Сравните два списка построчно.
Синхронизация конфигов и настройки только для админов#
Jotunn даёт модам способ сделать часть значений конфигурации приоритетными с сервера. Мод помечает настройку как доступную только админам, и тогда SynchronizationManager Jotunn делает три вещи:
- При подключении клиента он отправляет ему серверные значения этих настроек, и клиент использует их в сессии вместо своих.
- Пока клиент подключён, не-админ не может их менять; в игровом редакторе конфигов значения показаны заблокированными.
- Клиент-админ может менять их в игре, и изменение отправляется на сервер, сохраняется там и рассылается всем остальным подключённым игрокам.
Статус админа берётся из adminlist.txt сервера, того же файла, что и в ванили для кика и бана; форматы идентификаторов описаны в статье три файла списков. Если админ не может изменить синхронизируемую настройку в игре, первым делом проверьте, есть ли его ID в этом файле в той форме, которую ожидает сервер.
Внутриигровой редактор, которым пользуется большинство, - BepInEx Configuration Manager, по умолчанию он открывается клавишей F1. Это клиентский мод, не часть Jotunn, но синхронизация Jotunn с ним связана. Без него админы по-прежнему могут править файл сервера в BepInEx/config и перезапускать.
Два следствия, которые стоит знать:
- Правка синхронизируемого значения в файле конфигурации клиента на сервере ничего не даёт. При подключении оно перезаписывается. Игроки иногда жалуются, что мод "игнорирует" их изменение; вот почему.
- Файл конфигурации сервера - это источник истины. Делайте его бэкап вместе с миром, а при переносе сервера берите с собой
BepInEx/config, иначе все синхронизируемые настройки вернутся к значениям мода по умолчанию.
Не каждый мод использует синхронизацию Jotunn. У некоторых своя собственная, чаще всего библиотека ServerSync: она работает похоже, но отдельно, обычно с настройкой Lock Configuration в конфигурации самого мода. Какую из них использует мод, сказано на его странице или в комментариях конфигурации.
Как держать Jotunn актуальным#
Jotunn поддерживается сообществом моддеров Valheim и обычно входит в число первых пакетов, обновляемых после патча игры, потому что от него зависит множество модов. Порядок действий в день патча:
- Не обновляйте сервер, как только вышел патч. Остановите его, сделайте бэкап мира и всей папки
BepInEx. - Дождитесь BepInExPack Valheim (если патч менял Unity), затем HookGenPatcher и Jotunn, затем контентных модов. Контентные моды часто закрепляют минимальную версию Jotunn в зависимостях, так что первыми обновить их всё равно нельзя.
- Обновите сервер и его моды вместе, запустите его и прочитайте журнал: нет ли исключений и завершилась ли генерация хуков.
- Делитесь новым профилем модов с группой только после того, как подтвердили, что сервер работает.
Jotunn старается сохранять обратную совместимость в рамках основной версии, поэтому мод, написанный под более старый Jotunn, обычно работает и с более новым. Смена основной версии может это нарушить, и авторы отмечают это в списках изменений. Общий порядок действий, если описанная выше последовательность не спасла, изложен в статье что делать, когда обновление мода всё ломает.
На RE:NODE слоты бэкапов входят в каждый тариф Valheim, поэтому перед любыми действиями создайте бэкап по требованию, с работающими Jotunn и набором модов, и если обновление пойдёт не так, восстановление - одна кнопка. Бэкап можно также заблокировать, чтобы плановые бэкапы не вытеснили его, пока вы ещё тестируете.
Диагностика Jotunn#
`Could not load [SomeMod] because it requires [com.jotunn.jotunn]`. Jotunn отсутствует или не загрузился. Установите его и проверьте, что HookGenPatcher лежит в patchers, а не в plugins.
Jotunn загружается, но после патча игры выдаёт исключение при запуске. Jotunn ещё не обновлён под эту версию игры, либо сгенерированные HookGenPatcher сборки устарели. Обновите оба; если пока невозможно, запускайтесь без зависимых модов, пока не получится.
При подключении игрок получает окно со списком модов. Это проверка версий. Прочитайте названия и версии в окне и приведите его профиль в соответствие с сервером.
Изменения админа в синхронизируемой настройке не сохраняются. Сервер не признаёт игрока админом, либо настройка не из тех, что мод помечает только для админов. Сначала проверьте adminlist.txt.
Запуск занимает несколько минут. Первый запуск после установки или обновления HookGenPatcher либо после патча игры пересоздаёт сборки хуков. Последующие запуски быстрее. Если медленно каждый раз, посчитайте моды, а не вините Jotunn.
FAQ#
Нужно ли игрокам устанавливать Jotunn?
Если от него зависит какой-либо нужный им мод, да. Менеджер модов ставит его автоматически как зависимость. Отдельно он нужен игрокам только если мод на сервере объявляет, что он нужен всем, и этот мод использует Jotunn.
Можно ли отключить проверку версий в Jotunn?
Не из файла конфигурации, и вам это не нужно. Каждый мод объявляет своё требование в коде. Проверка существует, чтобы предметы, рецепты и объекты мира не расходились между машинами.
Jotunn и JotunnLib - это одно и то же?
JotunnLib - прежнее название. Нынешние пакеты публикуются как Jotunn от ValheimModding, а старые моды, где упоминается JotunnLib, как правило, имеют в виду ту же библиотеку.
Влияет ли Jotunn на производительность сервера?
Очень мало, когда он уже работает. Основная цена - время запуска из-за генерации HookGenPatcher и регистрации контента, что заметнее по мере роста списка модов.
Зачем Jotunn нужен HookGenPatcher?
Jotunn и многие моды на его основе используют сборки хуков, сгенерированные из кода игры, чтобы цепляться за методы игры. HookGenPatcher генерирует эти сборки при запуске и пересоздаёт их при обновлении игры.


