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

Left 4 Dead 2: установка модов и кампаний на сервер

MAATRIX GAMES

Сервер L4D2 уже стоит и работает, но хочется больше — админ-команды через SourceMod, кастомная орда через плагин, свежая кампания с Workshop вместо надоевших четырёх ванильных. И тут начинаются грабли: плагин не грузится, карта не качается у половины игроков, а сервер вдруг начинает ругаться на несовпадение файлов. Разберём по шагам, куда что класть, как не разойтись версиями с клиентами и как раздать тяжёлый контент без танцев с Workshop.

Кампания, карта и плагин — это не одно и то же

Прежде чем лезть в addons/, стоит развести три разных типа контента, потому что ставятся и синхронизируются они по-разному:

  • Кампания — набор карт с общим сюжетом, финалом и настройками Director'а (искусственного режиссёра, который управляет спавном орды). Кампания обязана быть у всех подключающихся игроков — это тяжёлый VPK с картами, текстурами и звуком.
  • Отдельная карта — то же самое, но без обвязки кампании, часто survival- или versus-режим на одной локации. Тоже обязательна у клиента.
  • SourceMod-плагин — работает только на сервере, меняет логику (лимиты, RCON-команды, кастомную экономику, античит), клиенту сам файл плагина не нужен — игрок видит только результат его работы.

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

MetaMod:Source и SourceMod — фундамент под любые плагины

Голые SourceMod-плагины без прослойки MetaMod:Source не заработают — MetaMod цепляет SourceMod к движку. Ставится это в основную папку мода left4dead2/:

  1. Скачай актуальные архивы MetaMod:Source и SourceMod с их официальных страниц (AlliedModders) — версии под Linux, если сервер на Linux.
  2. Распакуй содержимое обоих архивов прямо в left4dead2/addons/ — папки metamod, sourcemod и файл metamod.vdf окажутся рядом.
  3. Открой left4dead2/gameinfo.txt и убедись, что в секции SearchPaths есть строка:
Game    left4dead2/addons/metamod

Без неё движок вообще не увидит MetaMod, и все плагины на нём будут молча не грузиться — сервер при этом продолжит работать как обычный ванильный, без единой ошибки в консоли, что и сбивает с толку новичков.

  1. Перезапусти сервер и проверь через RCON или прямо в серверной консоли:
meta version
sm version

Обе команды должны вернуть номера версий, а не «unknown command» — если команда не отвечает, разбор надо начинать заново с пункта про gameinfo.txt.

Важное правило совместимости: ставь MetaMod:Source и SourceMod одной актуальной парой релизов и не смешивай старую версию одного с новой версией другого. Рассинхрон версий MM:S/SM — самая частая причина падения сервера именно в момент смены карты, а не при старте (подробнее в статье про краш плагина или карты на L4D2).

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

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

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

Установка SourceMod-плагинов

Когда MetaMod и SourceMod на месте, сами плагины кладутся точечно:

  • Файл плагина (.smx) — в left4dead2/addons/sourcemod/plugins/.
  • Конфиг плагина, если есть (.cfg) — в left4dead2/addons/sourcemod/configs/.
  • Переводы фраз, если плагин их использует — в left4dead2/addons/sourcemod/translations/.

Часть плагинов раздаётся исходником (.sp), а не скомпилированным .smx — тогда потребуется компилятор spcomp, который идёт в комплекте SourceMod, либо готовая сборка от автора. Компилировать вручную стоит только если нет готового .smx под нужную версию SourceMod — большинство популярных плагинов уже собраны и лежат на AlliedModders прямо в архиве.

После перезапуска сервера проверяй загрузку через RCON:

sm plugins list
meta list

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

Типичная ошибка новичков — положить плагин прямо в sourcemod/plugins/, а не в sourcemod/plugins/disabled/, если он ставился ради теста и должен быть выключен. SourceMod по умолчанию грузит всё, что лежит в корне plugins/, и не трогает содержимое disabled/ — этим удобно пользоваться, чтобы временно отключить плагин, не удаляя файл.

Кастомные кампании: вручную и через Steam Workshop

Кампании и отдельные карты ставятся как VPK-архивы в ту же папку:

left4dead2/addons/<название_кампании>.vpk

Если качаешь кампанию вручную с сайтов вроде L4DMaps — просто копируешь готовый VPK в addons/ и рестартуешь сервер, changelevel на карту кампании подхватит её сразу.

Для Workshop-контента у дедикейтед-сервера L4D2 нет встроенной автозагрузки коллекции при старте (в отличие, например, от Garry's Mod, где Workshop-коллекция подключается одной строкой) — скачивать нужно явно через SteamCMD, используя appid самой игры (550), а не сервера:

./steamcmd.sh +login anonymous +workshop_download_item 550 <published_file_id> +quit

Скачанный контент окажется в steamapps/workshop/content/550/<id>/, откуда VPK нужно перенести (или симлинком подключить) в left4dead2/addons/. Для целой коллекции проще прописать в server.cfg или в строке запуска:

host_workshop_collection <id_коллекции>

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

Частая ошибка — обновление кампании автором в Workshop. Сервер с host_workshop_collection подтягивает новую версию сам при следующем рестарте, а вот у игроков в Steam-кэше может остаться старая, пока Steam не досмотрит подписку — тогда часть игроков виснет именно на загрузке карты, хотя остальные заходят нормально. Это не краш сервера, а версионный рассинхрон конкретных клиентов — лечится переподпиской на Workshop-предмет со стороны игрока.

Синхронизация версий клиент-сервер: sv_pure и sv_consistency

Source-движок следит, чтобы у клиента и сервера были одинаковые (или хотя бы допустимые) версии игровых файлов — карт, моделей, звуков. За это отвечают два параметра в server.cfg:

sv_consistency 1
sv_pure 1
  • sv_consistency 1 требует точного совпадения определённого набора файлов (в основном моделей и материалов) между клиентом и сервером — без этого при коннекте клиент может получить отказ или краш при загрузке карты, если версия контента отличается.
  • sv_pure регулирует, какие клиентские файлы разрешено подменять. sv_pure 0 — без ограничений (годится только для приватных тестов, открывает дорогу читерским текстурам). sv_pure 1 — файлы должны совпадать с серверными, если сервер явно не разрешил исключение через whitelist. sv_pure 2 — самый строгий режим, разрешены только файлы, идущие в оригинальной поставке игры и явно подписанные сервером; лишний кастомный контент кампании при sv_pure 2 без корректного whitelist может резаться как «нечестный», что выглядит как обычная ошибка загрузки карты.

Для сервера с кастомными кампаниями и модами стоит держать sv_pure 1 — это разумный баланс между защитой от читеров и совместимостью с community-контентом. Если после установки новой кампании игроки жалуются на странные ошибки при коннекте именно к этой карте — временно понижай до sv_pure 0 как диагностический шаг, чтобы отсечь версию «дело в консистентности», а не гадать вслепую.

Отдельно стоит проверять журнал версий самого движка: крупные технические патчи Valve иногда меняют формат файлов, и старые кампании, написанные под прежнюю версию SDK, могут начать давать сбои именно на этапе проверки консистентности — обычно чинится свежей версией карты от автора.

FastDL: раздача карт и контента без Steam Workshop

Если кампании ставишь вручную (не через Workshop), игрокам всё равно нужно как-то докачать тяжёлые файлы карты при коннекте — для этого в Source есть FastDL, отдельный HTTP-сервер с картами и контентом, с которого клиент качает файлы напрямую, а не через игровой UDP-канал (который для этого не предназначен и работает медленно).

В server.cfg прописывается адрес:

sv_allowdownload 1
sv_allowupload 0
sv_downloadurl "https://fastdl.твой-домен.ru/l4d2/"

sv_allowupload 0 отключает загрузку файлов от клиента на сервер (спреи и подобное) — для игрового сервера это не нужно и только тратит ресурсы.

На веб-сервере структура папок должна зеркалить структуру мода:

fastdl/l4d2/
├── maps/
│   └── c6m1_riverbank_custom.bsp.bz2
├── materials/
│   └── models/props_custom/…
├── models/
│   └── props_custom/…
└── sound/
    └── custom/…

Карту и тяжёлые ассеты стоит паковать в .bz2 — движок Source умеет докачивать сжатые файлы напрямую и сам их распаковывать на клиенте, экономя трафик:

bzip2 -k left4dead2/maps/c6m1_riverbank_custom.bsp

На стороне nginx или Apache важно не забыть корректный Content-Type для .bz2 (application/octet-stream подходит) и разрешить листинг или хотя бы прямой доступ по прямому пути — если веб-сервер отдаёт 403 или редиректит на HTML-страницу вместо файла, клиент получит битую докачку, которая выглядит как «карта не грузится», хотя причина чисто в раздаче.

Типичные ошибки с FastDL:

  • Забыли синхронизировать содержимое. Файл в addons/ на сервере обновили, а на FastDL — нет. Игроки качают старую версию, получают рассинхрон с sv_consistency.
  • HTTPS без валидного сертификата. Часть клиентов Source откажется докачивать с самоподписанного сертификата — используй нормальный TLS (Let's Encrypt подходит) или обычный HTTP, если приемлемо для твоей аудитории.
  • Не тот путь в архиве. Структура на FastDL должна повторять структуру left4dead2/, включая подпапки — просто свалить все файлы в одну директорию не сработает, клиент ищет по относительному пути.

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

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

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

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

Нужен ли FastDL, если все кампании ставятся только через Steam Workshop?

Нет, Workshop-контент клиент скачивает через Steam напрямую, отдельный веб-сервер для этого не нужен. FastDL актуален именно для VPK, установленных вручную в addons/.

Можно ли ставить SourceMod-плагины без перезапуска сервера?

Частично — команда sm plugins reload_all подхватит изменения в уже загруженных плагинах и новые файлы в plugins/, но при проблемах с MetaMod или самой прослойкой SourceMod полный рестарт надёжнее и экономит время на диагностике.

Сервер не ругается на плагин, но и не работает — в чём дело?

Проверь sm plugins list и лог addons/sourcemod/logs/errors_YYYYMMDD.log — часть плагинов при конфликте зависимостей просто не активируется, не выводя ошибку в основную консоль.

Обязательно ли ставить одинаковую версию SourceMod у всех плагинов сразу?

Нет, SourceMod сам по себе обратно совместим в пределах актуальной ветки — важно синхронизировать именно пару MetaMod/SourceMod между собой, а не гнаться за версией под каждый отдельный плагин.

Что делать, если кастомная кампания весит несколько гигабайт и FastDL упирается в канал сервера?

Вынеси FastDL на отдельный хостинг или CDN, не привязанный к каналу игрового сервера — раздача статики не требует тех же ресурсов, что сама игра, и разделение снимает нагрузку с основного канала при пиковом коннекте игроков.