Выделенный сервер Killing Floor 2 - это бесплатная загрузка через SteamCMD (app id 232130), он работает на Linux и Windows, вмещает шесть игроков в режиме Survival и вполне обходится 3-4 ГБ памяти на одном быстром ядре. С первого раза почти все спотыкаются об одно из двух. Во-первых, сервер сам пишет свои конфигурационные файлы при первом запуске и затирает всё, что вы положили туда заранее, поэтому порядок такой: установить, запустить, остановить, править. Во-вторых, большую часть того, что хочется поменять - карту, режим, сложность, число волн - вы не найдёте ни в одном конфиге: всё это задаётся в строке запуска, в строке, похожей на URL, которую дописывают к имени карты. Разберётесь с этими двумя вещами - остальное сводится к деталям.
Что даёт выделенный сервер#
Killing Floor 2 - кооперативный шутер с волнами врагов, а сервер представляет собой урезанную копию игры без рендера. Он загружает одну карту, запускает один режим и перезапускает карту, когда игра заканчивается. Лобби нет, голосования за режим нет (есть только голосование за карту), а сменить режим можно только перезапуском процесса с другой строкой запуска.
Режимы и имя класса, которое нужно каждому:
| Режим | Класс игры | Игроков |
|---|---|---|
| Survival | KFGameContent.KFGameInfo_Survival | 6 |
| Weekly Outbreak | KFGameContent.KFGameInfo_WeeklySurvival | 6 |
| Endless | KFGameContent.KFGameInfo_Endless | 6 |
| Objective | KFGameContent.KFGameInfo_Objective | 6 |
| Versus Survival | KFGameContent.KFGameInfo_VersusSurvival | 12 |
Игра сбалансирована под шестерых. В Versus помещается двенадцать, потому что половина из них играет за Zed. Поднять лимит можно, и это делают, но одной настройкой тут не обойтись: предел задаёт класс режима, так что придётся менять MaxPlayers для каждого режима, web admin сбрасывает его при каждой смене карты, а на практике серверы используют отдельный mutator для лимита игроков. Даже тогда таблица результатов без кастомного HUD рисует только шесть строк. Состав волн, экономика dosh и здоровье боссов рассчитаны на шестерых, поэтому больший сервер - это игра проще и шумнее, а не крупнее.
Администрирование здесь не такое, как вы ждёте, если пришли из игр на Source. Здесь нет rcon_password, нет консольной команды rcon и нет порта Source RCON. Удалённое управление - это небольшой веб-сервер, встроенный в игровой сервер и по умолчанию выключенный, плюс ini-файлы. Веб-панель описана ниже, и это самое полезное, что можно включить.
Требования и потребление ресурсов#
Сервер нетребователен к памяти и умеренно нагружает одно ядро. Дороже всего обходятся поиск пути и физика Zed, поэтому пик - это поздняя волна на большой карте с полным лобби, а не бой с боссом.
| Конфигурация | RAM | CPU | Примечания |
|---|---|---|---|
| 6 игроков, стандартные карты, Survival | 1-2 ГБ | 1 ядро | В простое часто заметно меньше 1 ГБ |
| 6 игроков, несколько карт из workshop | 2-3 ГБ | 1-1,5 ядра | Пики приходятся на загрузку карт |
| 12 игроков, Versus | 2-3 ГБ | 1,5 ядра | Больше объектов, память почти та же |
| Endless, долгие сессии | 3 ГБ | 1,5-2 ядра | Память растёт по ходу длинного забега |
Эти цифры намеренно ниже, чем указывают на большинстве страниц хостеров. Один шестиместный экземпляр Killing Floor 2 замеряли: несколько сотен мегабайт резидентной памяти и пара процентов современного ядра. Честный совет: память - не то, за что здесь стоит платить, и переплачивать за 8 ГБ потому, что так написано в сравнительной таблице, - значит выбрасывать деньги.
- CPU: симуляция игры фактически однопоточная, поэтому сервер принимает
-PREFERREDPROCESSOR=для закрепления за ядром. Держит ли девятая волна на Hell on Earth свой tick rate, решает тактовая частота; число ядер почти ничего не значит. Общая версия этого довода - CPU или RAM для игровых серверов. - Диск: вот настоящее ограничение. Для игры такого возраста установка велика - закладывайте 30 ГБ, а если планируете кэшировать большую подборку из workshop, то и больше, потому что каждый подписанный элемент распаковывается в кэш сервера и остаётся там.
- Сеть: полная игра на шестерых нетребовательна, порядка 100-200 КБ/с на игрока. По-настоящему новичкам мешают загрузки из workshop, а они идут из Steam, а не от вас.
Рост памяти за длинный забег в Endless - это норма, а не утечка, которую можно починить. Ежедневный перезапуск в час, когда никто не играет, держит её на месте; этот довод разобран в статье расписания перезапусков, которые помогают.
Установка и первый запуск#
Сервер в SteamCMD доступен анонимно, так что аккаунт не нужен:
$ steamcmd +force_install_dir /home/kf2/server +login anonymous \ +app_update 232130 validate +quitЕсли сам SteamCMD вам в новинку, в статье SteamCMD простыми словами разобраны app id, validate и скрипты обновления. Путаница начинается с исполняемого файла. На Linux это:
Binaries/Win64/KFGameSteamServer.bin.x86_64Это не опечатка. Нативный сервер под Linux лежит в папке Win64, потому что систему сборки так и не переименовали. В Windows рядом лежит KFServer.exe.
Теперь самое важное: запустите сервер один раз и остановите его, прежде чем что-либо править. Первый запуск записывает полный набор конфигурационных файлов в KFGame/Config/, и если там уже лежит файл в непонятной серверу форме, его заменят. Запустите, дождитесь загрузки карты, корректно остановите, потом редактируйте.
$ cd /home/kf2/server/Binaries/Win64$ ./KFGameSteamServer.bin.x86_64 \ KF-BioticsLab?Game=KFGameContent.KFGameInfo_Survival?Difficulty=2?GameLength=1 \ -Port=7777 -QueryPort=27015Строка запуска: карта, режим, сложность и длина#
Всё после имени карты - параметры в стиле URL, разделённые ?, и они главнее соответствующих значений в ini. Три главных:
| Параметр | Значения |
|---|---|
Game | Класс режима из таблицы выше |
Difficulty | 0 Normal, 1 Hard, 2 Suicidal, 3 Hell on Earth |
GameLength | 0 Short (4 волны), 1 Medium (7 волн), 2 Long (10 волн) |
Имена стандартных карт все начинаются с KF-: KF-BioticsLab, KF-Outpost, KF-BurningParis, KF-Farmhouse, KF-VolterManor и так далее. Карта, которую вы назвали в командной строке, - это та, с которой сервер стартует; куда он пойдёт дальше, решает цикл карт в ini.
Здесь же можно передать ?MaxPlayers=6 и ?Mutator=Package.ClassName, а если mutator-ов несколько, их перечисляют через запятую. На хостинге с панелью эту строку вы вообще не набираете: те же значения видны как поля на вкладке Startup, и на RE:NODE именно там живут карта, режим, сложность и длина. Изменить одно и перезапустить - вот и вся операция.
Файлы конфигурации и настройки, которые стоит менять#
В KFGame/Config/ лежит по файлу на подсистему, с префиксом платформы. В Windows имена начинаются с PCServer-, в Linux - с LinuxServer-. Три файла, которых вы коснётесь:
| Файл | Что хранит |
|---|---|
PCServer-KFGame.ini | Имя сервера, пароли, цикл карт, MOTD, голосования, игровые переключатели |
PCServer-KFEngine.ini | Подписки workshop, менеджеры загрузки, сеть |
KFWeb.ini | Панель web admin |
KFWebAdmin.ini | Несколько учётных записей web admin, если они нужны |
-ConfigSubDir=<name> даёт экземпляру собственную папку в KFGame/Config, и именно так запускают несколько серверов из одной установки, не давая им бороться за одни и те же файлы.
Ключи в PCServer-KFGame.ini, которые заслуживают внимания:
[Engine.GameReplicationInfo]ServerName=Frankfurt Hell on EarthShortName=HoE[Engine.AccessControl]AdminPassword=a-long-random-stringGamePassword=[Engine.GameInfo]MaxPlayers=12MaxSpectators=2GameDifficulty=1.000000MaxIdleTime=0.000000bKickLiveIdlers=False[KFGame.KFGameInfo]GameMapCycles=(Maps=("KF-BurningParis","KF-BioticsLab","KF-Outpost"))ServerMOTD=Welcome. \n \n Have fun and good luck!bDisableTeamCollision=FalsebDisableKickVote=FalseKickVotePercentage=0.660000bDisableMapVote=FalseMapVoteDuration=60.000000bDisablePublicTextChat=False[KFGameContent.KFGameInfo_Survival]MaxPlayers=6По порядку:
ServerName- то, что показывает браузер серверов. Делайте короче и включите в имя сложность: люди фильтруют глазами, а не фильтром.AdminPassword- единственный пароль, который есть у сервера. Он пускает в веб-панель и даёт права администратора в игре. ПустойGamePasswordозначает публичный сервер; зададите его - сервер станет закрытым и, как правило, пропадёт из браузера.- Число игроков задаётся дважды.
[Engine.GameInfo] MaxPlayers- потолок движка, по умолчанию 12. Реально действует значение для конкретного режима в[KFGameContent.KFGameInfo_Survival], по умолчанию 6. Если поднять первое без второго, не изменится вообще ничего, и поэтому так много людей решают, что настройка сломана. GameMapCycles- список списков, и большинству серверов нужен ровно один. Каждая названная в нём карта должна существовать на сервере, включая карты из workshop, иначе цикл встанет на отсутствующей записи. Документированный предел - 519 карт в ротации, за ним сервер начинает вести себя неправильно.ServerMOTD,BannerLinkиWebsiteLinkживут в[KFGame.KFGameInfo], а не в собственных секциях.\n- перевод строки. Учтите, что сохранение настроек из панели web admin имеет привычку обнулятьWebsiteLink.- Кик за бездействие - это
MaxIdleTimeплюсbKickLiveIdlersв[Engine.GameInfo], и0означает «никогда». - Количество волн - не ключ. Оно берётся из
GameLength, который задаётся в строке запуска.
Общее правило для Killing Floor 2: Tripwire не раз меняла поставляемый ini между сезонами. Файл, который сервер записал для вас, - авторитетный список ключей для вашей версии; руководство - это список тех, о которых стоит подумать.
Web admin#
Панель web admin - это небольшой HTTP-сервер внутри игрового сервера. Она даёт живой список игроков с киком и баном, текущие карту и режим с возможностью сменить оба без перезапуска, окно чата, консоль и редакторы для большинства настроек выше. Пока вы её не включите, она выключена:
[IpDrv.WebServer]Applications[0]=WebAdmin.KF2ServerAdminApplicationPaths[0]=/ServerAdminListenPort=8080MaxConnections=18bEnabled=trueПерезапустите, затем откройте http://your-server-address:8080/ServerAdmin и войдите с именем пользователя Admin и паролем из AdminPassword. Если пароль пуст, войти нельзя вообще, а панель не скажет почему. Если нужно больше одной учётной записи, KFWebAdmin.ini переключает класс аутентификации на многопользовательский и создаёт MultiAdmin.ini для их хранения.
Две практические заметки. Смена карты или режима из панели вступает в силу немедленно и никого не выкидывает, что куда приятнее перезапуска. И любая настройка, изменённая в панели, записывается в ini-файлы, так что панель и файлы - это два взгляда на одно и то же, а не два конкурирующих источника истины.
Порты и как игроки вас находят#
| Порт | Протокол | Назначение |
|---|---|---|
7777 | UDP | Игровой трафик |
27015 | UDP | Steam query - с ним общается браузер серверов |
20560 | UDP | Steam |
8080 | TCP | Web admin, только если вы его включили |
Игровой порт и query-порт задаются через -Port= и -QueryPort=, и есть особенность, которую полезно знать: изменение -Port= автоматически сдвигает query-порт на ту же величину, если вы не передали и -QueryPort=. Это удобно, когда запущено несколько экземпляров, и неожиданно, когда нет. Все три UDP-порта должны быть доступны; если сервер работает прекрасно, но никогда не появляется в браузере, почти всегда виноват заблокированный или неверный query-порт. Ещё один, исходящий: сервер Weekly Outbreak запрашивает время по NTP на UDP 123, чтобы понять, какой weekly сейчас актуален. В статье порты игровых серверов объяснено, зачем нужен query-порт и что ломается, когда открыт только один из пары.
Игроки находят вас тремя способами: через браузер в игре, который медленный и сильно фильтрует; через избранное, добавленное по адресу; или через консоль. В Killing Floor 2 остаётся консоль Unreal, так что игрок может нажать клавишу консоли и ввести:
open 203.0.113.10:7777Это надёжная проверка, когда браузер не помогает. Если open работает, а браузер вас не показывает, с сервером всё в порядке, а с query-портом нет.
На RE:NODE игровой и query-порты выделяются вместе с сервером, а пароль администратора генерируется при установке. Web admin нужен собственный порт, который вы добавляете на вкладке Network.
Карты из workshop, mutator-ы и пользовательский контент#
Killing Floor 2 подтягивает контент из workshop по id, а не по подписке. Id перечисляются в конфиге движка:
[OnlineSubsystemSteamworks.KFWorkshopSteamworks]ServerSubscribedWorkshopItems=1234567890ServerSubscribedWorkshopItems=1234567891[IpDrv.TcpNetDriver]DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownloadПо одной строке на элемент, с повторением, а не списком через запятую. Строку DownloadManagers чаще всего забывают, и она должна быть первой записью в уже существующем списке под [IpDrv.TcpNetDriver]: без неё карта есть у сервера, а у подключающихся клиентов нет, и это выглядит как сломанный сервер, а не как пропущенная строка.
При следующем запуске сервер скачает каждый элемент в KFGame/Cache/<id>/0/BrewedPC, а настоящее имя карты - это файл .kfm внутри без расширения. Следите за консолью при первом запуске, потому что неверный id падает молча. В Linux есть давний баг: сервер не создаёт папку кэша, так что перед запуском сделайте mkdir -p KFGame/Cache.
Скачанная карта ещё не игровая. Killing Floor 2 требует для неё блок summary в PCServer-KFGame.ini, прежде чем она появится в цикле и списке голосования:
[KF-MyCustomMap KFMapSummary]MapName=KF-MyCustomMapScreenshotPathName=UI_MapPreview_TEX.UI_MapPreview_PlaceholderИмя секции - это имя файла карты, затем пробел и KFMapSummary; форма достаточно необычная, чтобы стоило скопировать её точно. Затем добавьте карту в GameMapCycles. Подключающихся игроков направляют на те же элементы workshop, и Steam скачивает их на стороне клиента, поэтому первое подключение к сильно модифицированному серверу медленное, а карта, которую клиент не смог скачать, проявляется игроком, застрявшим на экране загрузки.
Mutator-ы передаются в строке запуска как ?Mutator=Package.ClassName, а несколько разделяются запятыми внутри одного ?Mutator=, а не повторяются. Их можно доставлять через workshop так же, как карты.
Теперь то, что меняет вид сервера, который вы запускаете. Tripwire ведёт белый список, и сервер с любой модификацией, которой в нём нет, помечается как Unranked: игроки на нём не получают опыт перков, пока играют. Ванильный и внесённый в белый список контент оставляют сервер Ranked. Это не баг и не настройка хостера, а политика издателя, и об этом надо сказать людям в первую очередь, прежде чем они проведут вечер, прокачиваясь на вашем сервере. Известные моды сами указывают свой статус, а некоторые популярные просто никогда не вносили в белый список.
Более общая механика контента workshop на сервере - подборки, сроки обновлений, что происходит, когда автор публикует заново - разобрана в статье моды Steam Workshop на выделенных серверах. Самое важное оттуда для нашего случая: автор, обновивший карту посреди сезона, сломает ваш цикл, ничего не сообщив, поэтому после обновления смотрите консоль, а не узнавайте от игрока.
Обновления, перезапуски и резервные копии#
Клиенты и серверы Killing Floor 2 должны совпадать в точности. После каждого патча - а Tripwire выпускает сезонные обновления контента - серверу нужно выполнить app_update, прежде чем кто-то сможет зайти, а игрок с новой сборкой, попавший на старый сервер, получает ошибку версии без подробностей.
Резервировать стоит немного, и потерять это легко:
KFGame/Config/- все сделанные вами настройки, включая список workshop и summary карт.- Всё, что вы положили в
KFGame/вручную, например карты, которые вы размещаете сами, а не из workshop.
Файла мира здесь нет. У сервера Killing Floor 2 нет постоянного состояния, которое нужно оберегать, кроме конфигурации, потому что прогресс перков хранится в профиле Steam каждого игрока, а не на вашем сервере. Поэтому backup дешёвые, а восстановление быстрое: держите копию папки конфигурации перед каждым патчем и каждым раундом правок. В статье бэкапы, которые действительно восстанавливаются - о той половине, которую пропускают, то есть о проверке, что копия исправна.
На RE:NODE тарифы Killing Floor 2 включают слоты для backup, восстановление - одна кнопка, а вкладка Schedules запустит ночной backup и ежедневный перезапуск с предупреждающей командой перед ним. Если сервер упирается в лимит памяти, контейнер останавливается и запускается заново с чистого листа, а не уходит в swap, и на игровом сервере без состояния это стоит вам одной волны и ничего больше.
Устранение неполадок#
Мои правки в ini постоянно пропадают. Вы правили при работающем сервере или до первого запуска. Остановите сервер, правьте, запускайте.
Сервер не появляется в браузере. Проверьте, что query-порт открыт по UDP и совпадает с -QueryPort=. Проверьте командой open ip:7777 из консоли игры: если подключение проходит, игровой порт в порядке, а проблема только на стороне query.
Web admin отказывает в подключении. Нужно bEnabled=true в PCServer-KFWeb.ini, сервер перезапущен после этого, порт web admin открыт по TCP. Учтите, что этот порт - TCP, тогда как всё остальное - UDP, и это сбивает тех, кто копирует правила файрвола.
Web admin открывается, но отвергает пароль. AdminPassword пуст или содержит пробел в конце. Панель выдаёт одну и ту же ошибку в обоих случаях.
Карта из workshop не скачивается. Id неверный или это id подборки, а не элемента. Подборки не принимаются - перечислите каждый элемент.
Карта из workshop скачивается, но её нет в списке голосования. Блок KFMapSummary отсутствует или имя секции не совпадает с файлом карты точно. Держите регистр одинаковым в цикле, в блоке summary и в самом файле.
У сервера карта из workshop есть, у клиентов нет. Строка DownloadManagers отсутствует в [IpDrv.TcpNetDriver] или не является первой записью в этом списке.
В логе повторяется «Attempting server re-register now» и ожидание Steam Server UID. На той же машине запущена игра Steam, установка ни разу не проверялась через validate или не установлены входящие в комплект зависимости UE3Redist.
Мой стартовый скрипт постоянно сбрасывается. validate в строке обновления SteamCMD каждый раз перезаписывает поставляемый стартовый скрипт. Держите собственную копию под другим именем.
Игроки получают несовпадение версий. Выполните app_update на сервере. Если сервер модифицированный, моды тоже нужно обновить, прежде чем люди смогут играть; общий порядок действий - в статье что делать, когда обновление мода всё ломает.
Сервер вечно играет одну карту. GameMapCycles пуст, содержит только эту карту или называет несуществующую карту, и цикл не может пройти дальше неё.
FAQ#
Сколько игроков вмещает сервер Killing Floor 2?
Шесть в Survival, Endless, Objective и Weekly, двенадцать в Versus Survival. Предел в шесть игроков - это решение по балансу, а не ограничение железа. MaxPlayers можно поднять, но размер волн, dosh и здоровье боссов от этого не масштабируются, так что игра становится проще и шумнее, а не крупнее.
Есть ли в Killing Floor 2 RCON?
Нет. Порта или пароля RCON в стиле Source здесь нет. Удалённое управление - это встроенная панель web admin по HTTP плюс тот доступ к консоли, который даёт ваш хостер. Поэтому пароль администратора заслуживает той же заботы, какую вы уделили бы паролю RCON.
Сколько RAM нужно серверу Killing Floor 2?
Меньше, чем обычно продают. Экземпляр Survival на шестерых со стандартными картами замеряли на нескольких сотнях мегабайт; 2-3 ГБ с запасом хватает для контента из workshop и длинного забега в Endless. Реальное требование - диск: одна установка занимает десятки гигабайт. Покупайте тактовую частоту и хранилище, а не память.
Где менять сложность?
В строке запуска, как ?Difficulty= со значением от 0 до 3, или вживую из панели web admin. Значение в ini перекрывается строкой запуска, поэтому правка файла и перезапуск иногда кажутся бесполезными.
Получают ли игроки опыт перков на моём сервере?
На ванильном сервере или сервере из белого списка - да, а прогресс хранится в их аккаунте Steam, а не на вашем сервере, так что ничто из вашего не может его потерять. Запустите модификацию, которой нет в белом списке Tripwire, и сервер станет Unranked: играть можно, но опыт не начисляется. Если это ваш случай, укажите это в имени сервера.
Можно ли запускать пользовательские карты без Steam Workshop?
Да: положите файл .kfm в папку карт сервера, добавьте ему блок KFMapSummary и место в цикле. Загвоздка в том, что скачать её игрокам тогда негде, поэтому файл должен уже быть у каждого, кто подключается. Именно эту задачу и решает распространение через workshop.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.