MAATRIX GAMES / Блог / Кастомные карты для Killing Floor 2

Кастомные карты для Killing Floor 2

MAATRIX GAMES

Стоковых карт Killing Floor 2 хватает от силы на пару месяцев регулярной игры — потом начинаешь узнавать каждый угол на KF-Nuked наизусть и тянет за чем-то новым. У сообщества Tripwire на Workshop лежат сотни карт, от аккуратных ремейков классики до откровенно сырых поделок, которые роняют FPS у половины отряда на второй волне. Разберём, как правильно подключить кастомную карту к серверу: от подписки в Workshop до проверки, что она вообще тянет без лагов, прежде чем пускать её в постоянную ротацию.

С чего начинается кастомная карта: Steam Workshop

Карты для KF2 распространяются исключительно через Steam Workshop — отдельных .zip-архивов с ручной установкой, как в некоторых старых играх на Source, тут нет. Находишь карту в разделе Workshop у Killing Floor 2 в Steam, жмёшь «Подписаться» — и у тебя в клиенте она появится автоматически при следующем запуске игры. Но сервер работает отдельно от твоего личного клиента: чтобы карта была доступна игрокам, подписаться должен именно сервер, а не твой аккаунт.

Перед тем как тащить карту на сервер, полезно зайти на её страницу в Workshop и посмотреть на две вещи: дату последнего обновления автора (заброшенные карты годами не обновлялись под патчи Tripwire, и что-то может отвалиться) и комментарии — там обычно быстро всплывают жалобы на лаги, застревание ZED в текстурах или проблемы с навигационной сеткой (NavMesh), из-за которой боты и AI-директор ведут себя странно.

Из URL страницы карты нужен Workshop ID — числовой идентификатор в конце ссылки вида steamcommunity.com/sharedfiles/filedetails/?id=XXXXXXXXX. Именно эту цифру будем прописывать в конфиге сервера.

Если сервер ещё не поднят — сначала пройди базовую установку: она подробно разобрана в статье «Как поднять сервер Killing Floor 2», там же объяснено, где лежат конфиги KFGame/Config и как всё запускается через SteamCMD с app id 232130.

Подписка сервера: ServerSubscribedWorkshopItems в KFEngine.ini

За список карт и модов, на которые подписан сам сервер, отвечает не KFGame.ini, а другой файл — KFGame/Config/LinuxServer-KFEngine.ini (на Windows-сборке — PCServer-KFEngine.ini). Открываем его и скроллим в самый конец файла — там находится параметр ServerSubscribedWorkshopItems.

Добавляем Workshop ID карты через запятую, если подписок уже несколько:

[Engine.OnlineSubsystemSteamworks]
ServerSubscribedWorkshopItems=123456789
ServerSubscribedWorkshopItems=987654321

Для нескольких предметов строку ServerSubscribedWorkshopItems= можно повторять на отдельных строках — так и добавляется каждая новая карта или мод, без разделения запятыми внутри одной строки.

Там же, в секции [IpDrv.TcpNetDriver] того же KFEngine.ini, должна быть строка, отвечающая за автоматическую раздачу контента клиентам:

[IpDrv.TcpNetDriver]
DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload

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

Не забудь и про bAllowSubscribedItems=True в KFGame.ini (секция [KFGame.KFGameInfo]) — без него сервер вообще не будет учитывать список подписок Workshop, даже если он корректно прописан в KFEngine.ini.

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

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

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

GameMapCycles: где реально живёт список карт

Здесь легко запутаться: сама подписка на Workshop-предмет — это KFEngine.ini, а вот ротация карт — это уже другой файл, KFGame/Config/LinuxServer-KFGame.ini, секция [KFGame.KFGameInfo], параметр GameMapCycles. Именно там перечисляются карты, между которыми сервер будет переключаться сам после каждой волны или матча:

[KFGame.KFGameInfo]
GameMapCycles=(Maps=("KF-BurningParis","KF-Nuked","KF-Outpost","KF-CustomMapName"))

Имя карты в списке — это её внутреннее имя пакета (обычно совпадает с названием .kfm/.udk файла карты, что-то вроде KF-CustomMapName), а не то, что написано в заголовке Workshop-страницы. Точное имя удобнее всего смотреть в файлах, которые скачаются в кэш после подписки (см. ниже), либо в описании самой карты на Workshop — авторы почти всегда указывают внутреннее имя пакета отдельной строкой.

Одна практическая грабля: если карт в списке становится действительно много (близко к паре сотен и больше), у части хостеров и в комьюнити встречаются сообщения о нестабильности WebAdmin и самого списка ротации на очень длинных GameMapCycles. Для десятка-двух кастомных карт это не проблема, но если тащишь на сервер сразу большую коллекцию — добавляй карты пачками и проверяй, что сервер нормально стартует после каждой партии, а не разом всё содержимое подборки.

Синхронизация карты через SteamCMD перед ротацией

Просто прописать ServerSubscribedWorkshopItems мало — карта скачивается сервером не мгновенно, а при следующем запуске, и иногда встроенная загрузка через OnlineSubsystemSteamworks капризничает (в комьюнити регулярно всплывают жалобы вида «сервер не видит контент серверов для депо 232090»). Поэтому надёжнее сначала вручную синхронизировать карту через SteamCMD, а уже потом добавлять её в GameMapCycles.

Важный нюанс: сама карта как контент Workshop привязана не к app id дедикейтед-сервера (232130), а к основному app id клиента Killing Floor 2 — 232090. Команда для ручной загрузки:

sudo su - steam
cd ~/steamcmd
./steamcmd.sh +login anonymous +workshop_download_item 232090 123456789 +quit

Замени 123456789 на реальный Workshop ID своей карты. Скачанный контент ляжет в ~/Steam/steamapps/workshop/content/232090/123456789/ — оттуда его при необходимости можно скопировать вручную в кэш сервера, но обычно проще дать самому серверу подхватить файлы при рестарте: после того как ID прописан в ServerSubscribedWorkshopItems и сервер один раз успешно стартовал с доступом в интернет, готовый контент оседает в KFGame/Cache/123456789/0/BrewedPC/ — это и есть признак того, что подписка сработала и карту можно смело добавлять в GameMapCycles.

Проверить, что всё скачалось, перед тем как выкатывать карту игрокам:

ls -la /home/steam/kf2server/KFGame/Cache/123456789/0/BrewedPC/

Если папка пустая или отсутствует — карта не подтянулась, и добавлять её ID в ротацию пока рано: игроки без неё в кэше клиента получат ошибку загрузки или зависнут на экране подключения.

Автозагрузка на стороне клиента: чего ждать игрокам

Когда всё настроено правильно, игроку ничего вручную скачивать не нужно — при попытке зайти на сервер с картой, которой нет в его локальном кэше, клиент Killing Floor 2 сам предложит скачать недостающий контент через Steam Workshop и покажет прогресс-бар загрузки прямо в игре. Это тот самый механизм DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload, который мы включили в KFEngine.ini.

Проблема в том, что скорость такой автозагрузки целиком зависит от серверов Steam CDN и никак не ускоряется настройками твоего игрового сервера — на популярной карте в 300-500 МБ первое подключение может занять несколько минут, и часть казуальных игроков просто уйдёт на другой сервер, не дождавшись. Стоит явно написать размер и количество кастомных карт в описании сервера (через GameName или MOTD), чтобы игроки понимали, чего ждать при первом заходе.

Похожий принцип автоматической раздачи модов через Workshop мы разбирали для Garry's Mod — общая механика Steam Workshop одинаковая, разница только в конкретных именах ini-параметров у каждой игры на своём движке.

Проверка производительности карты перед постоянной ротацией

Не все карты сообщества одинаково хорошо оптимизированы — это касается любой игры с открытым Workshop, и KF2 не исключение. Автор-энтузиаст может сделать визуально роскошную карту с детализированными текстурами и десятками источников света, но без нормальной оптимизации коллизий и LOD (уровней детализации) она начнёт душить и клиентский FPS, и серверный тикрейт на поздних волнах, когда одновременно активны десятки ZED.

Прежде чем добавлять карту в постоянную ротацию продакшен-сервера, стоит:

  • Прогнать приватный тест-матч. Подними отдельный тестовый инстанс или временно смени карту на боевом сервере в непиковые часы, собери 2-3 игроков и пройди полную сессию волн на Hell on Earth — именно на максимальной сложности нагрузка на CPU от количества одновременных ZED выше всего.
  • Последить за журналом на предмет варнингов. Запусти сервер с флагом -log и посмотри вывод при загрузке карты — обилие сообщений о missing textures, broken NavMesh или ошибках коллизий обычно значит, что карту стоит либо доработать (если ты сам её автор), либо не тащить на постоянку.
  • Проверить, не застревают ли ZED и боты. Карты с кривой навигационной сеткой — частая причина, когда специальные ZED массово застревают в одной точке карты или, наоборот, спаунятся в недоступных для игроков местах.
  • Спросить фидбек у отряда напрямую. Субъективное ощущение «эта карта лагает» от живых игроков часто ловит проблемы, которые не видны по логам или сухим цифрам — учитывай его наравне с техническими проверками.

Точных цифр FPS или тикрейта, при которых карту стоит забраковать, дать нельзя — они сильно зависят от железа хоста, числа игроков и выбранной сложности. Ориентируйся на сравнение: если на новой кастомной карте отряд ощутимо просаживается по сравнению со стоковыми KF-BurningParis или KF-Nuked при тех же настройках — это повод пересмотреть, оставлять ли карту в постоянной ротации или держать её как разовое разнообразие.

Удаление карты и откат подписки

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

  1. Убери имя карты из списка GameMapCycles в KFGame.ini, чтобы сервер больше не выбирал её автоматически.
  2. Если карта прямо сейчас активна — смени уровень командой changelevel KF-BurningParis через RCON или WebAdmin, не дожидаясь конца волны.
  3. Удали строку ServerSubscribedWorkshopItems= с её ID из KFEngine.ini, чтобы сервер перестал её обновлять и синхронизировать при рестартах.
  4. По желанию — вручную удали кэшированные файлы из KFGame/Cache/<WorkshopID>/, если карта была явно проблемной и место на диске нужно освободить.

После правки конфигов сервер нужно перезапустить, чтобы изменения в KFEngine.ini точно применились — на лету через WebAdmin список подписок Workshop не всегда обновляется корректно.

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

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

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

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

Можно ли добавить карту без перезапуска сервера?

Подписку на новый Workshop ID — нет, KFEngine.ini читается при старте. А вот переключиться на уже скачанную и добавленную ранее карту можно на лету командой changelevel через RCON или WebAdmin.

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

Чаще всего не хватает строки DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload в секции [IpDrv.TcpNetDriver] файла KFEngine.ini, либо сама карта у сервера не докачалась — проверь папку KFGame/Cache/<WorkshopID>/0/BrewedPC/ на предмет содержимого.

Нужен ли отдельный аккаунт Steam для подписки сервера на карты?

Нет, подписка сервера идёт через ServerSubscribedWorkshopItems в конфиге и синхронизацию SteamCMD с анонимным логином — покупать игру или заводить отдельный аккаунт для сервера не требуется.

Сколько кастомных карт можно держать в ротации одновременно?

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

Где взять точное внутреннее имя карты для GameMapCycles?

Обычно оно указано автором в описании на Workshop-странице или совпадает с именем файла карты, которое видно в скачанных файлах кэша сервера после успешной синхронизации.