У Valheim нет API для модов. Каждый известный вам мод для неё - это сборка .NET, внедряемая в процесс игры через BepInEx, а установка их на выделенный сервер означает распаковку одного архива в корневую папку сервера, помещение файлов .dll в BepInEx/plugins и запуск сервера через другой скрипт, не тот, что вы использовали раньше. Именно на последнем большинство и застревает: сервер поднимается, мир загружается, игроки подключаются, а ни один мод не работает, потому что никто не сказал процессу их загружать. Эта статья - вся цепочка целиком, от инжектора до патча, который ломает всё через три недели. Остальное про сервер - порты, аргументы запуска, списки админов, сохранения - есть в руководстве по выделенному серверу Valheim.
Что такое BepInEx и чем он не является#
BepInEx - загрузчик плагинов для игр на Unity. Он цепляется к рантайму до запуска собственного кода игры, загружает сборки из папки плагинов и даёт им библиотеку патчей (Harmony), чтобы переписывать методы игры в памяти. На диске ничего не изменяется. Удалите папку BepInEx, и снова получите ванильный сервер, а это самое полезное его свойство при отладке.
Дистрибутив под Valheim называется BepInExPack Valheim и опубликован на Thunderstore. Берите его, а не оригинальный BepInEx: он привязан к версиям Unity и Mono, с которыми поставляется Valheim, содержит нестриженые библиотеки рантайма, которые сборка игры вырезает, и включает стартовые скрипты. Оригинальный BepInEx загрузится, а потом сломается так, что это будет выглядеть как неисправный мод.
Три вещи, которыми BepInEx не является. Это не система только для сервера: у сервера и у каждого клиента своя копия, и они должны согласовываться. Это не система, терпимая к версиям: мод, скомпилированный под прошломесячную Valheim, упадёт на первом же методе, которого не найдёт. И Iron Gate её не поддерживает, так что любая проблема в этой статье - проблема сообщества с ответом от сообщества.
Установка пакета на сервер#
Скачайте BepInExPack Valheim с Thunderstore и откройте архив. Внутри лежит папка BepInExPack_Valheim, и в корень сервера рядом с valheim_server.x86_64 попадает её содержимое. Копирование самой папки-обёртки - первая классическая ошибка; вы получите BepInExPack_Valheim/BepInEx/, и ничего не загрузится.
После правильной установки корень сервера выглядит так:
valheim_server.x86_64start_server.sh the original, unmodifiedstart_server_bepinex.sh the one you now usedoorstop_libs/ libdoorstop_x64.sounstripped_corlib/BepInEx/ core/ BepInEx itself plugins/ your mods go here patchers/ a few mods need this config/ generated on first runВ Windows инжектор - это winhttp.dll в корне сервера плюс doorstop_config.ini, а запускать вы продолжаете valheim_server.exe как обычно. В Linux внедрение выполняется через переменные окружения, и именно их start_server_bepinex.sh задаёт перед передачей управления настоящему бинарному файлу:
export DOORSTOP_ENABLE=TRUEexport DOORSTOP_INVOKE_DLL_PATH=./BepInEx/core/BepInEx.Preloader.dllexport DOORSTOP_CORLIB_OVERRIDE_PATH=./unstripped_corlibexport LD_LIBRARY_PATH="./doorstop_libs:$LD_LIBRARY_PATH"export LD_PRELOAD="libdoorstop_x64.so:$LD_PRELOAD"./valheim_server.x86_64 -nographics -batchmode -name "Crew" -port 2456 \ -world "Midgard" -password "herring-barrel-42"Этот блок стоит понять, а не копировать, потому что на управляемом хосте стартовый скрипт часто заменить нельзя. Зато обычно можно задать переменные окружения, а пять строк выше и есть весь механизм. Если ваша панель показывает переменные окружения на вкладке Startup, BepInEx можно включить там, не трогая команду. Если нет - спросите: на стороне хоста это правка в одну строку и частая просьба.
Убедитесь, что сработало, по консоли при запуске. До любого вывода Valheim вы должны увидеть баннер BepInEx, а затем по строке на каждый плагин:
[Message: BepInEx] BepInEx 5.4.2202 - valheim_server[Info : BepInEx] Loading [ServerDevcommands 1.70][Info : BepInEx] Loading [DiscordConnector 3.1.0]Отсутствие баннера означает, что процесс стартовал без инжектора, и все остальные симптомы, за которыми вы гоняетесь, вытекают из этого. Тот же вывод пишется в BepInEx/LogOutput.log - это файл, который нужно скачать, когда что-то падает уже после того, как консоль прокрутилась; в статье логи, которые стоит сохранять объясняется, почему забирать его надо до перезапуска.
Только сервер, только клиент и оба#
Это различие решает, будет ли ваш сервер работать, а страницы модов не всегда о нём ясно говорят.
| Вид | Где устанавливается | Примеры |
|---|---|---|
| Только сервер | На сервере | Мосты в Discord, моды команд администратора, логирование |
| Только клиент | У каждого игрока | Интерфейс, HUD, камера, сортировка, клавиши |
| Оба, версии совпадают | На сервере и у каждого клиента | Всё, что меняет правила, предметы, рецепты, существ |
Третья строка существует потому, что мультиплеер Valheim не авторитарный. Сервер хранит мир и ретранслирует состояние, но клиент, владеющий зоной, её симулирует, поэтому изменение правил должно существовать с обеих сторон, иначе обе стороны расходятся во мнении о том, что только что произошло. Рецепт, добавленный только на сервере, не появляется ни в чьём меню крафта; существо, добавленное только у клиента, появляется у этого игрока и тут же исчезает, потому что сервер его не узнаёт.
Короткий список модов, которые безопасно назвать, потому что они стабильны, широко используются и однозначно говорят, к какой стороне относятся:
- Jotunn и HookGenPatcher - библиотеки, а не моды. От Jotunn зависит множество модов с контентом; HookGenPatcher кладётся в
BepInEx/patchers, а не вplugins, и если положить не туда, получится ошибка зависимости, которая читается так, будто отсутствует Jotunn. - ServerSync - библиотека, позволяющая моду отправлять свою конфигурацию с сервера каждому клиенту и отказывать клиентам с несовпадающей версией. Если мод зависит от неё, его настройки авторитарны на стороне сервера, и правка на клиенте ничего не даст.
- Server Devcommands - ответ на вопрос «почему
devcommandsне работает на моём выделенном сервере». Он работает на сервере и даёт администраторам из списка набор команд для читов и отладки, который в ванильной игре доступен только в одиночной. - Discord Connector - только сервер. Отправляет в вебхук входы, смерти, запуск и остановку сервера. Игрокам ничего устанавливать не нужно.
- ServerCharacters - переносит данные персонажа с машины игрока на сервер, что не даёт людям приходить с предметами из творческого мира. Ставится с обеих сторон.
- ValheimPlus (поддерживаемый форк сообщества) - один большой мод конфигурации, покрывающий строительство, выносливость, грузоподъёмность и десятки других значений. Обе стороны, а файл конфигурации называется
BepInEx/config/valheim_plus.cfg, а не по привычной схеме имени мода. - Epic Loot и Plant Everything - моды на контент и правила, оба с обеих сторон, оба ведут себя хорошо.
Со всем остальным: читайте страницу автора. Строка «установите и на сервер тоже» или «только клиенты» там есть всегда, а ошибка в этом - разница между удачным вечером и часом переустановки.
Файлы конфигурации и как держать их в одном месте#
Первый запуск с новым модом создаёт BepInEx/config/<mod GUID>.cfg. До этого ничего полезного не существует, поэтому последовательность установки такая: загрузить .dll, запустить сервер, остановить сервер, отредактировать конфигурацию, запустить снова.
Файлы конфигурации - обычный INI с комментариями и записанными значениями по умолчанию, что делает их читаемыми, но и означает, что они переписываются при запуске. Ключ, который мод больше не распознаёт, отбрасывается, а ключ, добавленный вами вручную не в тот раздел, молча игнорируется. Храните собственную копию правок вне сервера, а не считайте живой файл своей записью.
Для модов на ServerSync вы увидите раздел, помеченный как синхронизируемый с сервером. Эти значения отправляются клиентам при подключении, и локальная правка игроком ничего не даёт - в этом и смысл. Всё, что не помечено так, действует на каждой машине отдельно, и в компании могут оказаться три разных представления о лимите грузоподъёмности, о чём никто не подозревает.
BepInEx/config/BepInEx.cfg содержит настройки самого загрузчика. Две из них стоит знать: уровень логирования, который вы повышаете при отладке и потом понижаете, и HideManagerGameObject, который нескольким модам требуется выставить в true и о чём они сообщают в собственных инструкциях по установке.
Как держать всех игроков на одном списке#
Сбой, с которым сталкиваются все хотя бы раз: на сервере одиннадцать модов, один игрок поставил десять, и его выкидывает при подключении с сообщением о несовместимой версии или, что хуже, он подключается, и мир ведёт себя странно для всех рядом с ним.
Три подхода, в порядке убывания качества:
- Профиль менеджера модов. r2modman, Thunderstore Mod Manager и Gale позволяют собрать профиль и экспортировать его кодом или файлом. Отправьте один код группе; каждый импортирует его и получает одинаковые моды одинаковых версий. Это самый безболезненный способ, и к нему приходит большинство серверов.
- Архив `BepInEx/plugins` и `BepInEx/config`. Грубо, работает, и обрекает вас пересылать его каждый раз, когда вы меняете мод.
- Принудительная проверка версий в самих модах. Моды на ServerSync откажут клиенту с несовпадающей версией с понятным сообщением. Это страховка, а не способ распространения.
Какой бы вы ни выбрали, запишите список модов и версий там, где группа может его прочитать, - закреплённое сообщение в Discord подойдёт. Именно этот список понадобится вам в три часа ночи после патча, а «то, что было установлено в марте» списком не является. Сторона гигиены разобрана подробнее в статье как держать сервер с модами в чистоте.
Стоимость ресурсов и время запуска#
Моды стоят памяти и времени запуска, а не частоты кадров. В руководстве по выделенному серверу Valheim для ванильного сервера на полную компанию названо 4 GB; сервер с большим количеством контента хочет 6-8 GB, и рост идёт от prefab-ов и asset bundle, загружаемых один раз при старте, а не от чего-либо, что масштабируется числом игроков.
Время запуска - сюрприз. Ванильный сервер Valheim готов заметно меньше чем за минуту. Сервер с тридцатью модами, несколько из которых регистрируют новые предметы и существ через Jotunn, может принимать соединения только через две-три минуты, и большая часть этого времени уходит в preloader. Два следствия: не считайте медленный старт зависанием и помните, что автоматическое обнаружение падений может ошибиться. На RE:NODE наблюдатель ищет сервер, который ушёл в офлайн или у которого время работы пошло назад, а три перезапуска за час вызывают предупреждение и открывают тикет - сервер с модами в цикле «старт - падение - старт» на это наткнётся, и это система работает как положено, но знать об этом лучше заранее. Сам цикл разобран в статье почему игровой сервер постоянно перезапускается.
Если память на сервере с модами стабильно растёт и не возвращается, проверьте, какие моды добавляют постоянные объекты мира, прежде чем покупать тариф побольше. Моды на посадки и строительство навсегда увеличивают число хранимых в мире объектов, а это видно и в памяти, и в размере файла сохранения. Метод, как понять, в какой лимит вы на самом деле упираетесь, есть в статье CPU или RAM для игровых серверов.
День, когда выходит патч#
Каждое обновление Valheim ломает моды. Не некоторые обновления - каждое, которое касается сборок, а это почти все. Последовательность, которая сохраняет сервер живым:
- Отключите автоматические обновления на сервере с модами или хотя бы знайте, где переключатель. Обновление, пришедшее, пока люди играют, отключает сервер, пока вы не вмешаетесь.
- Сделайте бэкап всей папки `BepInEx` и мира перед тем, как что-либо трогать. Копия
pluginsиconfigна заведомо рабочей версии стоит больше, чем любая осторожность потом. В статье бэкапы, которые действительно восстанавливаются объясняется, почему копию нужно проверять, а не доверять ей. - Ждите моды, а не игру. Сначала обновите BepInExPack, если он сдвинулся, - после смены Unity это бывает, - затем каждый мод, затем сервер.
- Запустите с отключёнными модами, если торопитесь. Уберите
pluginsв сторону, запустите ванильный сервер и дайте людям играть, пока вы догоняете. Миру не вредит вечер без модов, хотя предметов, добавленных модом с контентом, пока его нет, не будет, так что не заходите так далеко, если у кого-то есть сундук с модовым снаряжением.
Порядок важен, потому что обновление игры при старых модах даёт стену исключений без полезной первой строки. Общая версия этой процедуры - в статье что делать, когда обновление мода ломает сервер.
Устранение неполадок#
В консоли нет баннера BepInEx. Сервер запустился без инжектора. В Linux это значит, что переменные окружения не заданы; в Windows - что в корне нет winhttp.dll.
`libdoorstop_x64.so: cannot open shared object file`. doorstop_libs лежит не там, где её ждёт скрипт, обычно потому, что скопировали папку-обёртку из архива вместо её содержимого.
`Could not load [Mod] because it requires [Jotunn]`. Не хватает зависимости, либо HookGenPatcher лежит в plugins вместо patchers. Страницы модов перечисляют зависимости; установите их все.
Две копии одного плагина. Ошибка дублирующегося GUID, вызванная тем, что в plugins есть и отдельный .dll, и папка с тем же .dll. Выберите одну схему - папка на мод удобнее в управлении - и уберите другую.
Клиенты подключаются и тут же отключаются. Несовпадение версий, которое принудительно проверяет мод. В логе сервера названы мод и обе версии; эта строка и есть ответ.
`MissingMethodException` или `TypeLoadException` после обновления. Мод скомпилирован под предыдущую версию игры. Локально чинить нечего; ждите автора.
Моды загружаются, но в игре ничего не меняется. Либо мод клиентский, а вы установили его только на сервер, либо в его конфигурации он по умолчанию отключён. Проверьте в BepInEx/config сгенерированный файл, прежде чем считать, что он не сработал.
Мир в порядке, но модовый предмет исчез. Мод, который его создал, больше не загружается. Valheim удаляет объекты, которые не может разрешить, при следующей загрузке зоны, и после сохранения мира потеря необратима. Остановите сервер, прежде чем разбираться с пропавшим модом.
FAQ#
Можно ли добавить моды в уже существующий мир?
Да, моды интерфейса, удобства и правил можно безопасно добавлять посреди мира. Моды с контентом, добавляющие строительные элементы или существ, тоже добавлять можно. Рискованно направление в обратную сторону: удаление, потому что всё, что мод разместил в мире, перестаёт разрешаться.
Нужны ли всем игрокам одни и те же моды?
Им нужны одни и те же моды категории «обе стороны» на совпадающих версиях. Только клиентские моды - личный выбор, а только серверные для игроков невидимы. На практике группа пользуется одним профилем, потому что разбираться, что из двенадцати модов к чему относится, - больше работы, чем просто разделить список.
Работает ли BepInEx с кроссплеем?
Сервер отлично работает с обоими. Ограничение на стороне игрока: игроки на Xbox и из Microsoft Store не могут загружать моды, поэтому любой мод, которому нужна клиентская копия, их не пускает. Только серверные моды для них невидимы и проблем не создают.
Где на сервере лежат настройки модов?
В BepInEx/config, по одному файлу на мод, создаваемому при первом запуске после установки мода. Настройки, помеченные как синхронизируемые с сервером, отправляются клиентам при подключении; остальные действуют на каждой машине отдельно.
Почему devcommands всё равно не работает после установки модов?
Потому что игра отключает его на выделенных серверах, а не потому, что не хватает мода. Server Devcommands - мод, который включает его обратно, и он выдаёт команды аккаунтам из adminlist.txt, а не всем подряд.
Сколько модов слишком много?
Жёсткого предела нет; практический потолок - время запуска и ваше терпение в день патча. Тридцать модов - обычный большой список, и он добавляет минуты к каждому запуску. Каждый мод - ещё одна вещь, которая может перестать поддерживаться, так что список, который умещается на одном экране, стареет гораздо лучше того, что не умещается.




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