RE:NODE

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

Порядок загрузки модов на игровых серверах

Как работают порядок загрузки модов, зависимости и конфликты на игровых серверах - Minecraft, Arma и DayZ, 7 Days to Die, Factorio, RimWorld, Zomboid, ARK и FiveM.

0 прочтений

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

Три вещи, которые путают#

Словами «порядок загрузки» называют три разные проблемы, и исправляются они по-разному.

  1. Порядок зависимостей. Мод B использует код или данные мода A, поэтому A должен загрузиться первым. Ошибётесь - и B не загрузится, обычно с ошибкой об отсутствующем классе, отсутствующем аддоне или nil-ссылке при запуске. Именно эта проблема не даёт серверу стартовать.
  2. Порядок переопределения. Моды A и B меняют одно и то же значение - размер стака дерева, характеристики винтовки, таблицу лута. Загружаются оба, и вы получаете то, что применилось последним (или первым, в зависимости от игры). Ничего не падает; просто настройка делает не то, чего вы ждали.
  3. Конфликты кода. Два мода патчат одну и ту же функцию в коде игры. Порядок может помочь, а может не иметь значения, потому что патчи несовместимы при любом порядке. Отсюда самые странные вылеты и самые длинные вечера.

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

Побеждает последний, побеждает первый или решает загрузчик#

МодельКак работаетИгры
Побеждает последнийБолее поздние моды перезаписывают более ранниеXML-патчи 7 Days to Die, defs в RimWorld, плагины Bethesda
Побеждает первыйПервый мод, предоставивший ассет, его и оставляетARK (ActiveMods в Survival Evolved)
Сортирует загрузчикПорядок вычисляется из объявленных зависимостейMinecraft Forge, NeoForge и Fabric, Factorio
Порядок запускаВсё стартует в указанном порядке; без переопределенийРесурсы FiveM, плагины Minecraft

Зная, какую модель использует игра, вы понимаете, что пробовать. В игре, где побеждает последний, опустите нужный мод ниже в списке. В игре с сортировкой загрузчиком перекладывание файлов в папке ничего не даст; исправляйте объявление зависимостей или убирайте конфликт. В игре с порядком запуска зависимость просто должна стартовать раньше того, что её использует.

Minecraft: решает загрузчик#

У Forge, NeoForge и Fabric нет порядка загрузки, который можно редактировать. Вы кладёте jar-файлы в mods/, а загрузчик читает метаданные каждого мода - META-INF/neoforge.mods.toml в актуальном NeoForge, META-INF/mods.toml в Forge и старом NeoForge, fabric.mod.json в Fabric, - строит граф зависимостей и сортирует его.

Под вашим контролем только то, какие jar-файлы присутствуют. Поэтому и ошибки, которые вы видите, касаются наличия и версий:

code
Mod create requires flywheel 1.0.0 or aboveCurrently, flywheel is not installed

В метаданных Fabric есть поля depends, recommends, breaks и conflicts. Запись breaks останавливает сервер с понятным сообщением, где названы оба мода; conflicts только предупреждает. В NeoForge аналог - type зависимости со значениями required, optional, incompatible или discouraged. Читайте эти сообщения буквально - это одни из самых понятных ошибок, какие выдаёт любая игра с модами.

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

Плагины Paper - другая система с той же идеей. В plugin.yml каждого плагина объявляются depend (жёсткая зависимость - без неё плагин не загрузится), softdepend (загрузиться после неё, если она есть) и loadbefore. Если плагин падает с «Unknown dependency», названного плагина нет вовсе, а не он стоит не в том порядке.

plugin.yml
name: MyShopdepend: [Vault]softdepend: [LuckPerms, PlaceholderAPI]

Arma 3 и DayZ: строка -mod#

Игры Bohemia загружают моды из параметра запуска -mod=, через точку с запятой, в порядке написания:

bash
-mod="@CF;@Dabs Framework;@DayZ-Expansion-Core;@DayZ-Expansion-Vehicles"-serverMod="@ServerOnlyTools"

На деле работают два порядка. Порядок в -mod определяет, какие папки загружаются первыми. Внутри модов config.cpp каждого аддона объявляет requiredAddons в своём классе CfgPatches, и движок по нему упорядочивает уже сами классы конфигурации. Мод, который правильно объявляет зависимости, работает почти на любой позиции в -mod; мод, который этого не делает, зависит от того, поставите ли вы его предпосылки первыми. Практическое правило: сначала фреймворки (Community Framework, в Arma 3 - CBA_A3), затем крупные контентные моды, затем моды, которые их патчат, затем мелкие правки.

-serverMod загружает моды только на сервере, и это правильно для админских инструментов и серверных скриптов, которые клиентам не нужны. Всё, что добавляет предметы, транспорт или объекты на карте, должно быть в -mod, и каждый клиент тоже должен это загрузить.

Вторая половина - ключи подписи. Каждый мод поставляет .bikey в своей папке keys, и сервер (при включённой проверке подписей) пускает только клиентов, чьи моды подписаны ключом, который есть в собственной папке keys сервера. Клиент, кикнутый за несовпадение подписи, обычно имеет другую версию мода, а не другой порядок. Сторона DayZ разобрана в статье о сервере DayZ и модах, а Linux-серверы добавляют ловушку с регистром, описанную в статье Linux или Windows для игровых серверов.

7 Days to Die: папки по алфавиту и XPath#

7 Days to Die загружает каждую папку в Mods/, в которой есть ModInfo.xml, в алфавитном порядке имён папок. Сама игра кладёт туда одну папку, 0_TFP_Harmony, отсюда и соглашение о числовых префиксах: переименовав папку в 1_SomeMod или zz_MyTweaks, вы сдвигаете её в порядке.

Большинство модов не заменяют XML-файлы игры, а патчат их операциями XPath:

Mods/zz_MyTweaks/Config/items.xml
<configs>  <set xpath="/items/item[@name='resourceWood']/property[@name='Stacknumber']/@value">1000</set></configs>

Патчи применяются в порядке загрузки, каждый поверх результата предыдущего, так что побеждает последний мод, выполнивший set для значения. Вот почему мод с личными правками должен стоять в конце, с именем вроде zz_. Если более ранний мод удалил узел, который пытается пропатчить более поздний, поздний патч не сработает, и лог об этом сообщит. Ищите в нём предупреждения XPath после каждого изменения модов; это недооценённая причина «моя настройка ничего не сделала». Моды-переработки вроде Darkness Falls меняют так много, что большинству других модов нужна совместимая версия, чтобы стоять рядом. Подробнее - в статье об админ-командах и модах 7 Days to Die.

Factorio: зависимости в info.json#

Factorio упорядочивает моды по info.json каждого мода. Массив dependencies использует префиксы:

ПрефиксЗначение
нетОбязательная, загружается до этого мода
?Необязательная; загружается до этого мода, если есть
(?)Необязательная и скрытая из списка модов
!Несовместимость; игра откажется запускать оба вместе
~Обязательная, но не влияет на порядок загрузки
info.json
"dependencies": ["base >= 2.0", "? space-age", "! some-conflicting-mod"]

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

RimWorld, Zomboid, ARK, FiveM и другие#

RimWorld

Порядок в RimWorld - это список activeMods в ModsConfig.xml, и более поздние моды переопределяют более ранние. Принято ставить сначала Harmony, затем Core (ludeon.rimworld), затем DLC, затем фреймворки, затем контент, затем патчи. About/About.xml каждого мода может объявлять loadAfter, loadBefore и modDependencies, и инструменты сортировки вроде RimSort читают их и расставляют список за вас. Для мультиплеера через мод Multiplayer у каждого игрока должны быть те же моды в том же порядке; мод это проверяет и отклоняет несовпадения. Как их синхронизировать, рассказано в руководстве по мультиплеерному серверу RimWorld.

Project Zomboid

В серверном ini Zomboid моды перечисляются в двух строках, которые должны совпадать: WorkshopItems= содержит ID Workshop для загрузки, Mods= - ID модов для включения, и там и там через точку с запятой. Карты идут в третьей строке, Map=, где порядок имеет значение: сначала пользовательские карты, а базовая карта Muldraugh, KY - последней, иначе клетки пользовательской карты перекрываются ванильными. В Build 42 изменились некоторые соглашения об ID модов, поэтому копируйте ID с актуальной страницы каждого мода в Workshop, а не из старого руководства. Подробности - в статье о модах Project Zomboid и Workshop.

ARK

В ARK: Survival Evolved ActiveMods= в GameUserSettings.ini перечислял ID Workshop, и когда два мода предоставляли один и тот же ассет, побеждал указанный первым - противоположно большинству игр. ARK: Survival Ascended перешёл на моды CurseForge, которые передаются через -mods= в строке запуска. Ставьте мод, который должен иметь приоритет, раньше, а моды карт держите на позиции, указанной в их документации.

FiveM

Ресурсы FiveM не переопределяют друг друга; они стартуют в порядке строк ensure в server.cfg, и ресурс, который вызывает exports другого, должен стартовать после него. Ресурсы также могут объявлять dependencies в fxmanifest.lua, и FiveM запустит их первыми или откажет с понятным сообщением. Обычный порядок - коннектор базы данных, затем фреймворк, затем ресурсы фреймворка, затем всё остальное:

server.cfg
ensure oxmysqlensure ox_libensure qb-coreensure [qb]ensure [standalone]

Имена в квадратных скобках - это папки ресурсов, которые запускаются вместе. Почему фреймворк должен подняться раньше зависящих от него ресурсов, объясняется в статье о фреймворках FiveM: ESX, QBCore и Qbox.

Valheim и другие игры на BepInEx

У BepInEx нет вообще никакого порядка, видимого пользователю. Он загружает каждую DLL плагина из BepInEx/plugins, а плагин, которому нужен другой, объявляет это в коде атрибутом BepInDependency - жёстко (без неё плагин не загрузится) или мягко (загрузиться после неё, если она есть). Отсутствующая жёсткая зависимость отмечается в BepInEx/LogOutput.log, а плагин пропускается. Конфликты - это патчи Harmony от двух модов на один и тот же метод игры, они проявляются как ошибки с именем метода. Какие моды должны быть и у клиентов, разобрано в руководстве по серверу Valheim с BepInEx.

SourceMod

SourceMod загружает плагины .smx из addons/sourcemod/plugins, а всё, что перемещено в подпапку disabled, пропускается. Плагины, зависящие от natives другого плагина или от расширения, не загружаются и пишут ошибку в лог ошибок SourceMod, пока поставщик не появится; sm plugins list показывает, какие загрузились, а какие нет. Помимо этого порядок редко важен, но два плагина, перехватывающие одно событие и меняющие одно значение, могут бороться, и результат зависит от того, чей хук сработает последним. Быстрее всего это подтвердить, отключив один из пары.

Клиент и сервер должны совпадать#

На большинстве серверов с модами список модов сервера - это договор, которому должен соответствовать каждый клиент:

  • Контентные моды - новые предметы, существа, блоки, транспорт, карты - должны быть с обеих сторон в одной версии.
  • Только серверные моды - админские инструменты, backup, античит, мосты в Discord - только на сервере.
  • Только клиентские моды - интерфейс, миникарты, шейдеры - только у клиентов, а в Minecraft некоторые из них роняют сервер, если поставить их на него.

Несовпадение проявляется как отказ в подключении, кик через несколько секунд после входа или объекты, которые у одних игроков есть, а у других нет. Моды BepInEx в Valheim, модпаки Minecraft и Factorio проверяют это явно; другие оставляют вас искать это по рассинхронам. Опубликовать точный список с версиями - половина работы по содержанию сервера с модами. Как держать компанию в синхроне, рассказано в статье о сервере с модами для друзей.

Поиск конфликта#

Когда сервер с модами сломался и подозрение падает на порядок:

  1. Читайте первую ошибку, а не последнюю. Первое исключение или строка об отсутствующей зависимости называет мод, который не загрузился. Всё, что после, - последствия.
  2. Проверяйте зависимости раньше порядка. Большинство проблем «с порядком загрузки» - это отсутствующая зависимость или зависимость не той версии.
  3. Ищите предупреждения о переопределении. Неудачные XPath в 7 Days to Die, красные ошибки RimWorld при запуске, предупреждения conflicts в Fabric.
  4. Делите пополам. Отключите половину модов, проверьте и продолжайте делить пополам ту половину, где проблема. Двадцать модов - это пять раундов. Полная процедура есть в статье что делать, когда обновление мода всё сломало.
  5. Меняйте по одному, и перед каждым изменением держите backup рабочей папки модов.

В RE:NODE нет списка одобренных модов: вы загружаете их через файловый менеджер или SFTP либо используете поддержку Workshop в самой игре, а консоль построчно показывает вывод загрузчика. Слоты для backup на каждом игровом тарифе означают, что рабочую папку модов, конфиги и мир можно восстановить одной кнопкой, если изменение пошло не так.

FAQ#

Важен ли порядок загрузки модов на серверах Minecraft?

Не в смысле расстановки списка. Forge, NeoForge и Fabric сортируют моды по объявленным зависимостям. Важно, чтобы каждая зависимость была на месте в совместимой версии и чтобы никакие два мода не патчили один и тот же код несовместимо.

Какой мод побеждает, когда два мода меняют одно и то же?

Зависит от игры. В 7 Days to Die и RimWorld обычно побеждает более поздний мод; в ARK: Survival Evolved побеждал более ранний; в Minecraft и Factorio решает загрузчик по зависимостям. Узнайте, какую модель использует ваша игра, прежде чем переставлять.

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

В играх, которые строго проверяют список модов, - RimWorld Multiplayer, Skyrim Together, Factorio - да, или как минимум тот же список и версии. В Arma 3 и DayZ управляет список -mod сервера, а клиентам нужны те же моды и подписи.

Почему мод не загружается, хотя лежит в папке?

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

Есть ли инструмент, который сортирует моды автоматически?

Для некоторых игр. RimSort для RimWorld читает метаданные модов и расставляет список; Minecraft и Factorio сортируют себя сами. Для Arma 3, DayZ и 7 Days to Die вы в основном следуете позиции, указанной в документации каждого мода, и его зависимостям.


Комментарии

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

0/2000