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

Left 4 Dead 2: краш при загрузке плагина или кастомной карты

MAATRIX GAMES

Сервер L4D2 держался нормально, пока не поставил новый плагин или не добавил кастомную кампанию из Workshop — и теперь он либо не стартует вообще, либо падает ровно в момент загрузки конкретной карты. В консоли или пусто, или что-то невнятное про gameinfo и extensions. Знакомая история: L4D2 — старая игра на движке Source, community-контент под неё пишут кто во что горазд, и разные версии SourceMod, MetaMod и самих кампаний между собой не всегда дружат. Разберём рабочую методику поиска виновника — без гаданий и переустановки сервера с нуля.

Сначала диагностика: что говорит консоль и лог, прежде чем что-то трогать

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

-condebug -conclearlog

Это пишет весь консольный вывод в left4dead2/console.log — после следующего краша открывай именно его, а не пытайся вспомнить, что мелькнуло на экране. Плюс включи серверные логи:

log on
sv_logfile 1
sv_logecho 1

Логи ложатся в left4dead2/logs/. Дальше смотри на три источника независимо:

  • console.log — последние строки перед обрывом. Если видишь Error loading plugin или Failed to load addon — это SourceMod/MetaMod, не карта.
  • addons/sourcemod/logs/errors_YYYYMMDD.log — сюда SourceMod пишет собственные ошибки плагинов, включая те, что не убивают процесс, а просто отключают плагин. Если тут пусто, а краш есть — вероятнее MetaMod, движок или сама карта.
  • память в момент краша. Рекомендованный минимум под L4D2-сервер — около 1 ГБ RAM, и это довольно скромный запас: если на сервер одновременно грузится тяжёлая кастомная кампания с большими текстурами и десяток плагинов, OOM killer в Linux может прибить процесс без единой строчки в логе движка — это выглядит один в один как краш, но лечится не поиском бага в плагине, а апгрейдом тарифа. Проверь dmesg | grep -i oom или journalctl -k | grep -i oom сразу после падения, прежде чем тратить час на бинарный поиск.

Если про базовую настройку и автозапуск сервера L4D2 у тебя ещё вопросы — см. инструкцию по установке сервера Left 4 Dead 2, там же про сервисный файл и рестарт при падении. Общий разбор того, как читать логи и краш-репорты на игровых серверах, — в отдельной статье про краш-репорты.

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

Если лог показывает, что дело в SourceMod-плагине, не гадай — методично исключай. Плагины лежат в left4dead2/addons/sourcemod/plugins/, конфиги — в left4dead2/addons/sourcemod/configs/.

Шаг 1. Отключи всё разом. Создай папку plugins/disabled (SourceMod по умолчанию её не загружает) и перенеси туда все .smx-файлы, кроме ядра (папка plugins/ может содержать базовые плагины движка — их не трогай, если не уверен, что это именно они). Перезапусти сервер, попробуй воспроизвести краш (загрузить ту же карту, дождаться того же триггера). Если краша нет — виновник среди плагинов, идём дальше. Если краш повторился — переходи к разделу про MetaMod и кастомные карты, плагины ни при чём.

Шаг 2. Бинарный поиск. Верни половину плагинов обратно, перезапусти, проверь. Если краш вернулся — виновник в этой половине, если нет — в другой. При 20 плагинах это находит виновника примерно за 4-5 перезапусков вместо 20 по одному. Через RCON удобно сверяться со списком загруженного на лету:

sm plugins list
meta list

Первая команда покажет статус каждого SourceMod-плагина (running / paused / error), вторая — что видит MetaMod. Плагин с пометкой ошибки загрузки — первый кандидат, даже если сервер формально не упал: часть плагинов при ошибке просто не грузится, а не роняет процесс, и настоящий краш может давать соседний плагин, который зависит от первого.

Шаг 3. Проверь версию плагина. Каждый крупный апдейт L4D2 (движок регулярно получает патчи безопасности и правки геймплея) иногда ломает совместимость с плагинами, скомпилированными под старый SDK — особенно те, что используют signature-based хуки через SDKHooks или left4dhooks. Если плагин не обновлялся автором больше года — это первый подозреваемый при краше именно после апдейта игры, даже если раньше он год работал стабильно. Ищи форк или актуальную версию на AlliedModders, а не пытайся чинить бинарник вручную.

Поднять сервер Left 4 Dead 2 за пару минут

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

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

MetaMod:Source — совместимость версий и порядок загрузки

MetaMod — это прослойка, через которую SourceMod (и многие standalone-плагины вроде админ-панелей) цепляются к движку. Она подключается через left4dead2/addons/metamod.vdf и правку left4dead2/gameinfo.txt, куда должна быть добавлена строка вида:

Game    left4dead2/addons/metamod

в секцию SearchPaths. Если после обновления сервера или переустановки этой строки нет — MetaMod не подключится вообще, и все плагины на нём молча не загрузятся (это не краш, а просто «сервер работает, но без модов» — проверь meta version через RCON, если команда не отвечает — вот причина).

Если же MetaMod подключён, но версия слишком старая или слишком новая относительно версии SourceMod — это классика падений именно при загрузке карты, а не при старте сервера: MetaMod успевает инициализироваться, а SourceMod падает на первом хуке события карты. Правило простое: ставь актуальные версии MetaMod:Source и SourceMod с их официальных страниц одновременно, не смешивай старый MM:S с новым SM или наоборот — это самая частая причина «краш только при смене карты, а не на старте».

Кастомная карта или кампания роняет сервер: на что смотреть

Если бинарный поиск по плагинам ничего не дал (краш воспроизвёлся даже с пустой папкой плагинов), проблема в самой карте или кампании. У L4D2-кампаний, в отличие от одиночных карт, есть свои грабли:

  • Отсутствует или битый .nav-файл. Кампания без nav-меша не обязательно крашит сервер, но боты (заражённые-директор, выжившие-боты) могут вести себя криво или зависать — если краш совпадает по времени с моментом, когда должен появиться Director (спавн орды, финал), проверь наличие .nav рядом с .bsp в архиве карты.
  • Кастомный VScript кампании. Многие продвинутые кампании используют скрипты (scripts/vscripts/) для управления событиями финала, спецзаражённых, панической орды. Если скрипт написан под другую версию движка или ссылается на несуществующую функцию — сервер может упасть именно в момент триггера события, а не при загрузке карты. Это выглядит как «падает не сразу, а через 10 минут игры» — характерный признак именно скриптовой, а не файловой проблемы.
  • Битый или неполный VPK. Скачанный вручную (не через Workshop) архив кампании иногда оказывается неполным — не хватает моделей, звуков или самого mission-файла. Переустановка карты с нуля (удалить папку/VPK и скачать заново) часто чинит именно такие краши.
  • Несовместимость с движком после патчей. У L4D2 были крупные технические апдейты движка, после которых часть старых кастомных кампаний (особенно написанных ещё в 2010-х) даёт краш на определённых картах кампании — обычно решается свежей версией карты от автора или community-патчем, если такой существует; универсального фикса тут нет.

Похожая логика диагностики применима и на CS2 — если у тебя параллельно есть сервер на этом движке, посмотри разбор проблем с загрузкой кастомных карт в CS2, там частично пересекающиеся причины (VPK, консистентность файлов).

Расхождение версии карты у игрока и на сервере

Отдельный источник «краша», который на самом деле не краш сервера, а рассинхрон клиента и сервера: автор кампании в Workshop выпустил обновление, сервер (если настроен на host_workshop_collection или auto-update) подтянул новую версию, а у части игроков в Steam-кэше осталась старая. Результат — не всегда честный краш, а разрыв соединения или зависание на загрузке у конкретных игроков, при этом остальные заходят нормально. Отличить от настоящего краша сервера просто: если падает процесс целиком (весь сервер лежит, все отключились одновременно) — это серверная проблема (плагин/карта/память). Если у одних игроков всё ок, а у других зависание именно на экране загрузки конкретной кампании — это версия карты.

Что проверить:

host_workshop_collection <id коллекции>
workshop_start_map <bsp-имя карты>

Убедись, что коллекция на сервере действительно содержит актуальную версию нужной кампании. Игрокам с проблемой — попросить отписаться и подписаться на Workshop-предмет заново в Steam, это форсирует передачу актуальной версии. Серверный sv_pure тоже стоит проверить: слишком строгий sv_pure 2 без явно разрешённых путей может резать легитимный кастомный контент кампании как «нечестный», что тоже маскируется под «карта не грузится».

Недостающие зависимости: extensions, gamedata, обновления движка

Последняя частая причина — плагин или MetaMod-модуль ссылается на то, чего физически нет на сервере:

  • Extensions. Многие плагины (например, использующие MySQL, работу с сокетами, продвинутые SDK-хуки) требуют отдельных .ext.so/.ext.dll в addons/sourcemod/extensions/. Без нужного расширения плагин либо не грузится с понятной ошибкой в логе, либо — если написан небрежно и не проверяет наличие зависимости — роняет весь процесс при попытке вызвать несуществующую функцию. sm exts list через RCON покажет, что реально подгружено.
  • Gamedata-файлы. SourceMod хранит сигнатуры функций движка (нужные для хуков) в addons/sourcemod/gamedata/*.txt. После крупного обновления L4D2 сигнатуры могут «уехать» — старый gamedata не находит нужный адрес в памяти, и плагин либо тихо отключается, либо, в худшем случае, хукает не туда и валит сервер. Обновление SourceMod до актуальной версии обычно подтягивает актуальный gamedata вместе с ним.
  • Зависимость плагина от другого плагина. Часть популярных модов (левый администрирование, кастомные экономики, античит-надстройки) требуют базовый фреймворк вроде left4dhooks или SDKHooks отдельным файлом. Если фреймворк не установлен, а плагин-надстройка не проверяет это заранее — падение при первом обращении к отсутствующей функции.

Если после чистки логов и бинарного поиска виновник так и не находится, имеет смысл собрать console.log за момент краша и минимальный список плагинов/карты и спросить на форуме AlliedModders или у автора конкретной кампании — часто это уже известный баг с готовым патчем.

Поднять сервер Left 4 Dead 2 за пару минут

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

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

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

Сервер падает сразу при старте, а не при загрузке карты — плагин или карта?

Почти всегда плагин или MetaMod: карта грузится позже в цикле запуска, так что краш до неё физически не может быть её виной. Начинай с раздела про отключение плагинов.

Можно ли обойтись без бинарного поиска, если плагинов немного?

Да, при 3-5 плагинах проще отключить по одному последовательно — экономия времени на бинарном поиске заметна только от 8-10 плагинов и выше.

Краш происходит не всегда, а через раз на той же карте — с чего начинать?

Это чаще признак VScript-триггера кампании или гонки состояний в плагине (например, обращение к игроку, который уже отключился), а не банальной несовместимости версий — проверяй момент краша по логу, а не только факт его наличия.

После обновления сервера всё, что работало, разом отвалилось — почему?

Скорее всего разошлись версии MetaMod и SourceMod, либо устарел gamedata. Обнови оба компонента до актуальных версий с одного и того же релиза, не смешивай.

Стоит ли ставить sv_pure 0, чтобы точно исключить проблему с консистентностью файлов?

Как временный диагностический шаг — да, это быстро отсекает версию «дело в sv_pure». Но постоянно держать его выключенным не стоит: это открывает дорогу читерским текстурам и моделям у части игроков.