MAATRIX GAMES / Блог / Mordhau: краш при загрузке плагина или кастомной карты

Mordhau: краш при загрузке плагина или кастомной карты

MAATRIX GAMES

Поставил новую карту с Workshop или добавил мутатор через mod.io — и сервер вместо ротации тихо падает, а в консоли перед этим ничего толком не сказано. Знакомая ситуация: Mordhau подключает сторонний контент сразу с двух разных площадок, и когда что-то расходится по ID, версии или зависимостям, движок скорее рушится, чем ругается человеческим языком. Разберём рабочую методику: как понять, виноват мод или карта, как бинарным поиском вычислить конкретного виновника среди списка Mods=, как свести Workshop ID и Resource ID без путаницы и куда смотреть, если дело в недостающих зависимостях.

Сначала пойми: мод или карта — и в какой момент падает

Прежде чем что-то трогать в конфиге, важно понять, к какому этапу привязано падение — это резко сужает круг подозреваемых.

Краш сразу при старте сервера, ещё до захода на первую карту ротации. Почти всегда виноват один из ID в Mods= — либо контент не докачался (сервер завис в загрузке и упал по таймауту), либо файл повреждён, либо в списке случайно оказался ID несуществующего или удалённого автором предмета.

Краш при changelevel на конкретную карту или сразу после захода на неё. Подозревай саму карту: несовпадение версии между тем, что прописано в MapRotation, и тем, что реально докачано, либо проблемную геометрию/коллизии внутри самого уровня.

Краш во время матча без явной привязки к событию. Здесь виноватым может быть и мутатор с утечкой (например, мод, который спавнит объекты на тик и не подчищает их), и карта с нестабильной физикой в конкретном месте, куда игроки забредают не сразу. Без логов и метода исключения тут не разобраться — переходи к следующему разделу.

Если сервер падает буквально в первые секунды после ./MordhauServer.sh, а список модов у тебя пустой — проблема не в контенте, а в самом окружении (порт занят, битые файлы установки после неудачного app_update) — сюда метод отключения модов не относится, сначала проверь целостность установки через SteamCMD с флагом validate.

Логи и краш-репорты: где реально искать причину

Стандартный вывод в терминале при обрыве сессии SSH теряется, а UE4-движок (на котором сделан Mordhau) пишет куда больше, чем видно на экране. Запускай сервер с флагом -log, чтобы консоль писала подробный вывод, и сразу перенаправляй его в файл — тогда после падения не придётся гадать по памяти:

./MordhauServer.sh FL_Grad -log 2>&1 | tee -a mordhau_console.log

Основной лог движка лежит отдельно от этого вывода — в Mordhau/Saved/Logs/Mordhau.log относительно каталога установки (на Linux это, например, /home/mordhau/server/Mordhau/Saved/Logs/Mordhau.log, если сервер поднят по базовой инструкции по Mordhau). Смотри хвост сразу после краша:

tail -n 200 /home/mordhau/server/Mordhau/Saved/Logs/Mordhau.log

Если движок успел зафиксировать падение как штатный краш (а не просто вылет процесса), рядом появится дамп в Mordhau/Saved/Crashes/ — папка с подпапкой на каждый инцидент, внутри .log с колстеком и иногда .dmp-файл. Колстек редко говорит что-то понятное неспециалисту, но по нему обычно видно, в каком модуле произошло падение — если там мелькает имя pak-файла мода или явно движковый код загрузки уровня, это уже подсказка, в какую сторону копать.

Если сервер поднят через systemd, проверь код завершения процесса:

journalctl -u mordhau --since "2 hours ago" | tail -n 100

Main process exited, code=killed, status=11/SEGV — сегфолт, чаще всего вина стороннего pak-мода или движка на кривом контенте карты. status=9/KILL без видимой нагрузки перед падением — подозревай OOM-killer (dmesg | grep -i oom), актуально для тяжёлых Frontline-карт на серверах с минимумом RAM из таблицы в статье про установку.

Поднять сервер Mordhau за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Метод исключения: отключаем моды по одному

Список подключённого контента в Mordhau задаётся строкой Mods= в Game.ini (секция [/Script/Mordhau.MordhauGameSession]) и дублируется параметром -mods= в команде запуска — если у тебя это уже настроено для кастомных карт, логика та же самая для мутаторов и любых других модов:

[/Script/Mordhau.MordhauGameSession]
Mods=1234567890,2233445566,458284

Как и с любой правкой Game.ini, редактировать список нужно на остановленном сервере — иначе при следующем штатном завершении процесс перезапишет файл версией из памяти, и твои правки молча пропадут.

Если модов немного (3-6) — отключай по одному, начиная с последнего добавленного: свежие изменения первыми под подозрением. Убрал ID из Mods=, убрал этот же ID из MapRotation (если это была карта), перезапустил, прогнал полный цикл смены карт. Если модов больше — дели список пополам, оставляй в конфиге только одну половину и проверяй: краш пропал — виновник там, сохранился — ищи в оставшейся половине. Повторяй бисекцию, пока не останется один кандидат.

Отдельно держи в уме: некоторые мутаторы явно завязаны друг на друга (например, мод-надстройка, которая требует базовый ассет-пак того же автора) — если отключить только один ID из связки, второй может начать падать сам, уже по другой причине. Читай описание мода на странице — авторы обычно прямо пишут про такие зависимости.

Кастомная карта: сверяем версию между Mods, MapRotation и клиентом

Если краш локализован именно на карте, а не на старте сервера, вспомни, что в Mordhau ID карты должен совпадать одновременно в двух местах — Mods= (или -mods=) и MapRotation. Подробно эта механика разобрана в статье про кастомные карты для Mordhau, но применительно к крашу важны два частых сценария рассинхрона:

Автор обновил карту в Steam Workshop или на mod.io уже после того, как ты прописал её ID. Сам ID не меняется при обновлении, но содержимое за ним — да. Если апдейт автора внёс правки, несовместимые с текущей версией движка сервера (или наоборот — сервер ещё не обновился до нужного патча), геометрия и клиентская, и серверная копия карты могут разойтись ровно настолько, чтобы вызвать краш при загрузке. Проверь дату последнего обновления на странице мода — если она свежее твоей последней проверки сервера, это первый подозреваемый.

ID карты остался в MapRotation, но выпал из Mods= (или наоборот). Тогда сервер при попытке загрузить карту не находит файлы уровня — в логе это обычно видно как ошибка поиска пакета перед падением. Сверь оба списка построчно, не полагайся на память.

Если карта скачана недавно и падение происходит у части игроков, а не у всех — вероятная причина не в сервере, а в том, что клиент не успел докачать контент полностью (нестабильный канал, обрыв закачки). Попроси игрока переподключиться или, если карта тяжёлая, предупреди в Discord сервера, что первый заход после смены ротации может занять заметно больше времени.

Недостающие зависимости: Steam Workshop, mod.io и системные библиотеки

У Mordhau, в отличие от игр с одной площадкой модов, контент приходит из двух разных источников с разными типами идентификаторов — и путаница между ними сама по себе частая причина краша:

  • Workshop ID vs Resource ID. Карты и моды из Steam Workshop (steamcommunity.com/app/629800/workshop/) используют числовой Workshop ID из адресной строки. Контент с mordhau.mod.io использует свой собственный Resource ID, указанный прямо на странице мода. Оба типа ID пишутся в один и тот же список Mods= вперемешку — но если скопировать не тот ID (например, внутренний ID страницы mod.io вместо явно подписанного Resource ID), сервер попытается запросить несуществующий или чужой предмет и либо не поднимется, либо упадёт при попытке его смонтировать.
  • Связка карта + зависимый мод. Некоторые карты требуют отдельно подключённый ассет-пак или мутатор того же автора — без него уровень частично не грузится, что на практике чаще выглядит как краш, чем как явная ошибка. Список зависимостей почти всегда указан в описании на странице мода — проверяй его перед добавлением ID в конфиг, а не постфактум.
  • 32-битные системные библиотеки на Linux. Если сервер вообще не поднимается (падает ещё до применения Mods=, сразу на старте бинарника), причина может быть не в контенте, а в окружении: SteamCMD и часть сопутствующих библиотек требуют 32-битных зависимостей даже на 64-битной системе. Проверь, что стоят lib32gcc-s1 и lib32stdc++6 (см. установку в статье про запуск Mordhau) — их отсутствие даёт крах на самом старте, который легко спутать с проблемой контента.
  • Место на диске. Каждый добавленный Workshop-предмет или mod.io-мод докачивается и хранится локально на сервере и у каждого подключившегося клиента. Если диск сервера почти заполнен, докачка обрывается на середине — а недокачанный pak-файл почти гарантированно роняет сервер при попытке его смонтировать в ротации. df -h перед добавлением очередной пачки карт — недорогая привычка.

Частые причины по опыту

Если метод исключения ещё не запущен, а разобраться хочется быстрее — вот на что чаще всего падает грех:

  • Свежедобавленный мод без тестового прогона. Поставили несколько ID в Mods= разом перед открытием ротации, один из них конфликтует с другим или банально битый.
  • Перепутанный ID между Steam Workshop и mod.io. Скопировали не тот номер со страницы — визуально оба выглядят просто как последовательность цифр, и ошибка не бросается в глаза при беглой проверке конфига.
  • Карта, обновлённая автором после того, как ты её протестировал. Работала неделю назад — не значит, что будет работать сегодня, если автор выкатил патч.
  • ID есть в одном списке, но забыт в другом. Mods= без соответствующей строки в MapRotation (или наоборот) — частая опечатка при ручном редактировании конфига без копипаста.
  • Нехватка места на диске под докачку контента. Особенно на серверах с минимальным тарифом, где под саму игру и десяток модов быстро кончается свободное место.

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

Поднять сервер Mordhau за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Как быстро понять: мод виноват или карта, если лог ничего толком не говорит?

Временно оставь в Mods= и MapRotation только официальные карты без единого стороннего ID и прогони полный цикл ротации. Если краш пропал — причина в контенте, ищи её методом исключения. Если сохранился — дело не в модах, смотри на системные зависимости и целостность установки.

Можно ли смешивать Steam Workshop ID и mod.io Resource ID в одном списке Mods=?

Да, это штатный сценарий — оба типа контента подключаются через одну и ту же строку, движок сам разбирается, откуда докачивать. Проблема возникает не от смешивания как такового, а от опечатки или перепутанного номера.

Сервер падает только при определённом количестве игроков на карте — это тоже про мод или карту?

Чаще указывает на мутатор с утечкой (например, спавнит объекты без очистки) либо на карту с нестабильной физикой под нагрузкой — много активных сущностей или разрушаемых объектов. Смотри график RAM в панели хостинга перед моментом падения: плавный рост говорит про утечку в моде, резкий скачок в конкретный момент боя — про саму карту.

Нужно ли писать автору мода или карты, если нашёл виновника?

Стоит, приложив кусок лога из Mordhau.log или дамп из Saved/Crashes — если автор ещё поддерживает контент, это ускорит фикс для всех. Для давно заброшенных модов быстрее поискать альтернативу на Workshop или mod.io, чем ждать ответа.

Restart=on-failure в systemd спасает от даунтайма при таком краше?

Спасает от долгого простоя — сервис поднимется заново через RestartSec, — но не лечит первопричину: если виноват конкретный мод или карта, сервер будет падать по кругу при каждом наступлении на те же условия, пока ты его не найдёшь и не уберёшь из Mods=.