Кастомные карты для Killing Floor 2
Стоковых карт Killing Floor 2 хватает от силы на пару месяцев регулярной игры — потом начинаешь узнавать каждый угол на KF-Nuked наизусть и тянет за чем-то новым. У сообщества Tripwire на Workshop лежат сотни карт, от аккуратных ремейков классики до откровенно сырых поделок, которые роняют FPS у половины отряда на второй волне. Разберём, как правильно подключить кастомную карту к серверу: от подписки в Workshop до проверки, что она вообще тянет без лагов, прежде чем пускать её в постоянную ротацию.
Содержание
- С чего начинается кастомная карта: Steam Workshop
- Подписка сервера: ServerSubscribedWorkshopItems в KFEngine.ini
- GameMapCycles: где реально живёт список карт
- Синхронизация карты через SteamCMD перед ротацией
- Автозагрузка на стороне клиента: чего ждать игрокам
- Проверка производительности карты перед постоянной ротацией
- Удаление карты и откат подписки
С чего начинается кастомная карта: 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 при тех же настройках — это повод пересмотреть, оставлять ли карту в постоянной ротации или держать её как разовое разнообразие.
Удаление карты и откат подписки
Если карта не прижилась — плохая оптимизация, баги, жалобы игроков — убрать её из сервера так же просто, как добавить, но в обратном порядке:
- Убери имя карты из списка
GameMapCyclesвKFGame.ini, чтобы сервер больше не выбирал её автоматически. - Если карта прямо сейчас активна — смени уровень командой
changelevel KF-BurningParisчерез RCON или WebAdmin, не дожидаясь конца волны. - Удали строку
ServerSubscribedWorkshopItems=с её ID изKFEngine.ini, чтобы сервер перестал её обновлять и синхронизировать при рестартах. - По желанию — вручную удали кэшированные файлы из
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-странице или совпадает с именем файла карты, которое видно в скачанных файлах кэша сервера после успешной синхронизации.