Сервер Counter-Strike 2 настраивается в трёх местах, и почти вся путаница вокруг него возникает из-за того, что непонятно, какое из трёх главнее. Строка запуска хранит то, что нужно движку до загрузки чего бы то ни было: порт, токен, tick rate. game/csgo/cfg/server.cfg хранит идентичность сервера и сетевые настройки. А конфиг игрового режима выполняется после server.cfg при каждой загрузке карты, задаёт правила раундов и перезаписывает всё, что вы поставили в server.cfg и что он тоже задаёт. Последняя фраза - ответ на вопрос «почему мой mp_maxrounds постоянно сбрасывается».
Эта статья - справочник по всем трём: полезные параметры запуска, cvar, которые меняют что-то ощутимое, и команды, которые выполняются вживую через RCON. Предполагается, что сервер и токен у вас уже есть; как к этому прийти, описано в статье установка сервера Counter-Strike 2.
Что читает сервер и в каком порядке#
Выделенный сервер CS2 ставится из приложения Steam 730 - того же app id, что и у самой игры, - и раскладывается в дерево, где всё интересное лежит в game/csgo/:
game/ bin/linuxsteamrt64/cs2 the server binary csgo/ cfg/ server.cfg execed on every map load gamemode_competitive.cfg Valve's mode defaults gamemode_competitive_server.cfg your overrides gamemode_casual.cfg gamemode_deathmatch.cfg addons/ Metamod and plugins, if you add them maps/ installed and workshop maps gamemodes_server.txt map groups and per-mode convarsОтсюда практическое правило: всё, что начинается с mp_, кладите в gamemode_<mode>_server.cfg, а всё, что начинается с sv_, а также hostname, rcon_password и tv_, - в server.cfg. Файлы _server в поставку не входят, вы создаёте их сами, и это поддерживаемое место для переопределений, поэтому они переживают обновление игры, которое переписывает собственные конфиги Valve.
Строка запуска#
На вашей собственной Linux-машине установка и запуск выглядят так:
$ steamcmd +force_install_dir /home/cs2/server +login anonymous \ +app_update 730 validate +quit$ cd /home/cs2/server$ ./game/bin/linuxsteamrt64/cs2 -dedicated -usercon \ -port 27015 -maxplayers_override 12 -tickrate 128 \ +game_alias competitive +map de_dust2 \ +sv_setsteamaccount YOUR_GSLT_TOKENНа хостинге с панелью вы это не набираете: те же значения стоят в полях вкладки Startup, а строку собирает панель. В любом случае важны вот эти параметры:
| Параметр | Что делает |
|---|---|
-dedicated | Запуск без интерфейса. Без него вы запускаете саму игру |
-usercon | Включает RCON. Без него RCON нет, какой бы пароль вы ни задали |
-port 27015 | Игровой порт, UDP, и порт RCON, TCP |
-maxplayers_override 12 | Число слотов. Перекрывает то, чего хочет режим |
-tickrate 128 | Частота симуляции. По умолчанию 64 |
-insecure | Отключает VAC. Только для закрытого тестового сервера |
+game_alias competitive | Задаёт режим до загрузки первой карты |
+map de_dust2 | Первая карта. Без неё сервер простаивает |
+sv_setsteamaccount | Ваш Game Server Login Token |
+exec autoexec.cfg | Один раз выполняет конфиг при запуске, до любой карты |
Именно с токеном чаще всего ошибаются. sv_setsteamaccount должен стоять в строке запуска, а не в server.cfg, потому что сервер входит в Steam до загрузки карты, то есть до чтения любых конфигов. Задайте его в обоих местах, и значения разойдутся. Valve выдаёт токен аккаунту Steam, которому принадлежит игра, по одному на сервер, и он принадлежит вам, а не вашему хостеру; как создать его для приложения 730 и за что токен банят, рассказано в статье токены Steam для игровых серверов. Без токена сервер всё равно работает и принимает прямые подключения, просто не появляется в публичном списке.
Игровые режимы и группа карт#
В CS2 осталась схема CS:GO из двух целых чисел. game_type выбирает семейство, game_mode - вариант внутри него, а game_alias задаёт оба по имени.
| Алиас | game_type | game_mode | Режим |
|---|---|---|---|
casual | 0 | 0 | Казуальный |
competitive | 0 | 1 | Соревновательный, MR12 |
wingman | 0 | 2 | Wingman, 2 на 2 |
armsrace | 1 | 0 | Arms Race |
demolition | 1 | 1 | Demolition |
deathmatch | 1 | 2 | Deathmatch |
custom | 2 | 0 | Custom, для режимов на плагинах |
Задавать алиас в строке запуска надёжнее всего, потому что смена game_type или game_mode на лету требует смены карты, а наполовину применённые режимы порождают самые странные баги, какие вам доведётся отлаживать. Если вы запускаете плагин с собственными правилами - retakes, deathmatch, режим арены, - семейство custom оставляет правила игры в покое.
Ротация карт устроена в два слоя. Слой движка - это mapcycle.txt в game/csgo/, по одному названию карты в строке, читаемый через cvar mapcyclefile, плюс changelevel <map>, чтобы перейти прямо сейчас, и mp_match_end_changelevel 1, чтобы переходить по окончании матча. Выше лежит слой Valve, gamemodes_server.txt: файл в формате KeyValues, который вы создаёте из gamemodes_server.txt.example, лежащего рядом; он описывает группы карт и позволяет задавать cvar для каждого режима в одном месте. Серверы сообществ с системой голосования обычно игнорируют оба слоя и отдают управление плагину, о чём рассказано в статье плагины CS2: Metamod и CounterStrikeSharp.
Карты из мастерской загружаются по id, а не по названию:
host_workshop_map 3070596702ds_workshop_changelevel de_cacheПервая команда скачивает и загружает одну карту из мастерской. Для загрузки целой коллекции в разные периоды жизни CS2 требовался ключ Steam Web API, и это требование не раз менялось, так что проверьте текущее поведение, прежде чем строить ротацию на нём. Серверу с одной картой это не касается.
Боты заполняют режим, в котором иначе один человек стоял бы на респауне. bot_quota 8 вместе с bot_quota_mode fill держит на сервере восемь игроков всего и убирает ботов по мере прихода людей; bot_quota_mode normal добавляет восемь ботов независимо от людей. bot_difficulty принимает значения от 0 до 3, bot_kick убирает всех, а bot_stop 1 замораживает их для тренировки. Боты на сервере сообщества - вопрос подачи, а не техники: запись в списке с 2/10 пропускают, а с 8/10 нажимают, и люди, которые заходят, находят ботов. Решите, какой компромисс вам нужен, пока за вас этого не решил кто-то другой.
server.cfg: какие настройки стоит задавать#
Вот server.cfg, в котором нет ничего лишнего:
hostname "Longship 5v5 // EU"rcon_password "a-long-random-string"sv_password ""sv_lan 0sv_region 3// Networksv_maxrate 0sv_minrate 196608sv_hibernate_when_empty 1sv_hibernate_postgame_delay 30// Voice and chatsv_full_alltalk 0sv_deadtalk 1// Safetysv_cheats 0sv_allow_votes 1mp_endmatch_votenextmap 1// Logginglog onsv_logfile 1sv_logecho 1sv_logbans 1// GOTVtv_enable 1tv_port 27020tv_autorecord 1tv_delay 0| Cvar | Примечания |
|---|---|
hostname | Название в списке серверов. Укажите в нём регион, по нему фильтруют |
rcon_password | Длинный и случайный. Пустой значит, что RCON выключен, а не открыт |
sv_password | Непустой делает сервер закрытым |
sv_lan 0 | 1 пропускает аутентификацию Steam. Закрытый сервер, а не скрытый |
sv_region | Регион в списке: 0 восток США, 3 Европа, 4 Азия, 255 весь мир |
sv_minrate | Нижняя граница пропускной способности клиента. Не даёт урезанному клиенту навредить себе |
sv_hibernate_when_empty | Сводит нагрузку на CPU к нулю, когда никого нет |
sv_full_alltalk | Все слышат всех, обе команды, живые и мёртвые |
sv_visiblemaxplayers | Показывает меньше слотов, чем есть, для зарезервированных мест |
sv_cheats | Должен быть 1 для тренировочных команд. Никогда на публичном сервере |
О sv_hibernate_when_empty 1 стоит сказать отдельно. Простаивающий сервер CS2 с включённой гибернацией почти не использует CPU, а это важно, когда тариф покупает долю ядра, а не целое ядро. Цена в том, что во время гибернации GOTV отключается и любой плагин, работающий по таймеру, останавливается, так что матчевому серверу, который пишет демо между раундами, гибернация нужна выключенной, а серверу сообщества - включённой.
Cvar для голоса были перестроены между CS:GO и CS2, и старый sv_alltalk теперь не тот рычаг. Если вы идёте по руководству для CS:GO и какого-то cvar не существует, консоль прямо об этом скажет - см. команду find ниже.
sv_visiblemaxplayers - приём с резервным слотом, и знать его полезно, потому что плагин не нужен. Купите двенадцать слотов, поставьте sv_visiblemaxplayers 11, и в списке сервер будет выглядеть заполненным на одиннадцати, а двенадцатый останется свободным для того, кого вы пустите. Это только прячет слот; чтобы контролировать, кто его займёт, нужен плагин, который выкидывает игрока с наименьшим приоритетом. На небольшом сервере сообщества одного скрытого слота хватает для решения настоящей проблемы: админ не может зайти на собственный полный сервер, чтобы разобраться с кем-то.
Cvar раундов, денег и матча#
Это mp_, поэтому они идут в gamemode_competitive_server.cfg (или в файл, соответствующий вашему режиму). Значения ниже - стандартная соревновательная настройка.
mp_maxrounds 24mp_overtime_enable 1mp_overtime_maxrounds 6mp_overtime_startmoney 12500mp_halftime 1mp_match_can_clinch 1mp_maxmoney 16000mp_startmoney 800mp_afterroundmoney 0mp_freezetime 15mp_roundtime 1.92mp_roundtime_defuse 1.92mp_roundtime_hostage 1.92mp_buytime 20mp_buy_anywhere 0mp_friendlyfire 1mp_solid_teammates 1mp_death_drop_gun 1mp_death_drop_grenade 2mp_autoteambalance 0mp_limitteams 0mp_warmuptime 60mp_warmup_pausetimer 0mp_timelimit 0| Cvar | Значение |
|---|---|
mp_maxrounds | Раундов в основное время. 24 - это MR12, соревновательная длина CS2 |
mp_overtime_maxrounds | Раундов в овертайме. 6 - это MR3 |
mp_halftime | Смена сторон на перерыве. Выключенный даёт одностороннюю игру |
mp_match_can_clinch | Заканчивать матч, когда счёт уже не догнать |
mp_roundtime_defuse | Длина раунда в минутах. 1.92 - это 1:55 |
mp_freezetime | Время на закупку и разговоры до начала раунда |
mp_buytime | Секунды, в течение которых меню покупки остаётся открытым после freezetime |
mp_maxmoney | Потолок денег. 16000 - соревновательное значение |
mp_death_drop_gun | 0 ничего, 1 лучшее оружие, 2 текущее оружие |
mp_free_armor | 0 нет, 1 кевлар, 2 кевлар и шлем, бесплатно каждый раунд |
mp_autoteambalance | Для любого матча выключен. Включён для казуальных серверов с неровным наполнением |
mp_timelimit | Минуты на карту. 0 значит, что исход решают раунды |
mp_roundtime - запасное значение, а два специальных перекрывают его на картах соответствующих типов, поэтому задавайте все три, иначе на картах с обезвреживанием получите 1:55, а на картах с заложниками что-то другое. Разминка заканчивается командой mp_warmup_end, а не ожиданием, а mp_warmup_pausetimer 1 замораживает таймер разминки на неопределённый срок, так матчевый сервер дожидается десяти человек.
Названия команд для скрима задаются через mp_teamname_1 и mp_teamname_2, а mp_teamflag_1 и mp_teamflag_2 принимают двухбуквенные коды стран. Они показываются в таблице счёта и в GOTV. Вся схема матчевого сервера, включая ножевой раунд и работу с демо, описана в статье соревновательный матчевый сервер CS2.
Tick rate и sub-tick#
Серверы CS2 работают на 64 tick, если не передать -tickrate 128. Это меняет меньше, чем в CS:GO, и прежде чем платить за это, полезно понять почему.
Source 2 помечает ввод игрока временем, когда он произошёл, а не тиком, в котором он дошёл, поэтому стрельба и движение вычисляются с sub-tick-разрешением даже на сервере с 64 tick. Регистрация попаданий, из-за которой в CS:GO и спорили о 128 tick, теперь в основном от тика не зависит. К тику по-прежнему привязано всё, что симулируется на каждом тике: физика гранат, точные кадры jump-throw и разрешение всего, что плагин делает в обработчике тика. Сервер на 128 tick к тому же производит заметно более тяжёлые демо GOTV.
Цена - примерно вдвое больше CPU на игрока. На тарифе, который покупает фиксированную долю ядра, это реальное ограничение, а не абстракция, и сервер на 128 tick, упёршийся в лимит CPU, хуже сервера на 64 tick, который до лимита не доходит. Измерению посвящена статья что на самом деле означает tick rate; короткий вывод для CS2 такой: 64 для сервера сообщества и 128 только для соревновательного, где будут спорить о jump-throw.
Cvar скорости стали проще, чем были. sv_minrate и sv_maxrate ограничивают байты в секунду на клиента, 0 означает отсутствие максимума, а пара sv_maxcmdrate и sv_maxupdaterate из CS:GO больше не работает так, как описывают старые руководства. Не трогайте rate, пока не измерили проблему. Около 60-120 КБ/с на игрока для CS2 - нормально.
RCON, кики и баны#
RCON работает по TCP на игровом порту, требует -usercon в строке запуска и непустого rcon_password. Из консоли клиента:
rcon_address 203.0.113.10:27015rcon_password a-long-random-stringrcon statusКонсоль панели - путь надёжнее: она аутентифицируется вашим аккаунтом в панели, а не паролем, который путешествует с каждой командой, и ей вообще не нужен открытый порт. RCON через интернет - протокол с открытым текстом; статья безопасная работа с RCON короткая, и две минуты на неё стоит потратить.
| Команда | Что делает |
|---|---|
status | Игроки, их user id, Steam id, пинг и текущая карта |
users | Более короткий список игроков |
kick <name> | Выгоняет игрока по имени |
kickid <userid> <reason> | Выгоняет по id, который напечатал status. Надёжно при странных именах |
banid <minutes> <userid> | Бан. 0 минут - навсегда |
banip <minutes> <ip> | Бан по адресу |
writeid | Сохраняет баны по id в banned_user.cfg |
writeip | Сохраняет баны по адресу в banned_ip.cfg |
removeid / removeip | Снимает одну запись |
changelevel <map> | Меняет карту, не отключая игроков |
mp_restartgame 1 | Перезапускает игру через одну секунду |
mp_warmup_end | Немедленно завершает разминку |
mp_pause_match / mp_unpause_match | Замораживает и возобновляет игру |
exec <file> | Выполняет конфиг из game/csgo/cfg/ |
say <text> | Пишет в чат от имени сервера |
Баны движка примитивны: они хранятся в плоском файле, без writeid пропадают при перезапуске и не несут ни причины, ни читаемого срока, ни общего списка между серверами. Если нужно больше, чем выкинуть одного человека, ответ - плагин с базой данных, и именно поэтому серверы сообществ CS2 вообще ставят CounterStrikeSharp.
Журналы и поиск cvar, который вы смутно помните#
log on вместе с sv_logfile 1 пишет в game/csgo/logs/, по одному файлу на сессию, с подключениями, убийствами, чатом и действиями администраторов. sv_logecho 1 дублирует журнал в консоль, а это нужно на панели, где вы смотрите именно на консоль. sv_logbans 1 записывает баны в тот же поток, чтобы через шесть недель ответить на вопрос «кто и когда их забанил».
CS2 умеет пересылать журнал по HTTP через logaddress_add_http "http://10.0.0.5:8080/", и это не UDP-команда logaddress_add из CS:GO, которой ждут старые инструменты статистики. Если вы подключаете внешний сервис статистики, выясните, на каком из двух он говорит, прежде чем тратить вечер на правило файрвола.
Две консольные команды экономят больше времени, чем любое руководство:
find alltalkhelp mp_maxroundsfind <text> выводит все cvar и команды, в названии или справке которых есть этот текст, с их текущими значениями. help <cvar> печатает описание и значение по умолчанию. Вместе они за пять секунд снимают любой вопрос «существует ли этот cvar в CS2», а это важно, потому что огромная часть советов по CS2 в интернете - это советы по CS:GO с другими цифрами. О том, за чем ещё стоит следить в этом выводе, рассказано в статье как читать консоль.
Диагностика#
Сервер не появляется в списке. Почти всегда дело в токене: нет sv_setsteamaccount, токен отозван или один и тот же токен стоит на двух серверах. Посмотрите в журнале запуска строки входа в Steam. Если прямое подключение работает, а запись в списке нет, это признак проблемы с токеном, а не с сетью.
RCON не принимает пароль. Убедитесь, что -usercon есть в строке запуска. Без него сервер вообще не открывает слушатель RCON, и любой пароль неверен. Затем убедитесь, что вы обращаетесь к игровому порту по TCP - тому же номеру, что и у игрового порта UDP.
Cvar откатывается после каждого раунда или карты. Его сбрасывает конфиг игрового режима. Перенесите его в gamemode_<mode>_server.cfg.
`mp_maxrounds` не действует. Либо mp_timelimit ненулевой и заканчивает карту раньше, либо режим не соревновательный. Проверьте game_type и game_mode через status и find game_mode.
Игроки подключаются и тут же вылетают. Проверьте, что sv_lan равен 0, и поищите в журнале ошибки VAC или аутентификации Steam. Сервер, запущенный с -insecure, не будет нормально аутентифицировать клиентов.
Консоль полна сообщений «unknown command». Конфиг от CS:GO на сервере CS2. Разбирайте его через find; примерно каждый десятый cvar сменил имя или исчез.
Высокая нагрузка на CPU при пустом сервере. sv_hibernate_when_empty равен 0, либо какой-то плагин не даёт серверу заснуть. Смотрите график CPU за период без игроков, а не гадайте.
FAQ#
Где находится server.cfg на сервере CS2?
game/csgo/cfg/server.cfg, внутри каталога установки. Обратите внимание на двойной путь: в дереве CS2 есть папка game, а папка мода внутри неё по-прежнему называется csgo. Файл выполняется при каждой загрузке карты, поэтому изменения конфига вступают в силу со следующей карты, без перезапуска.
Почему мой сервер CS2 сбрасывает настройки mp_?
Потому что конфиг игрового режима выполняется после server.cfg и задаёт те же cvar. Кладите значения mp_ в game/csgo/cfg/gamemode_competitive_server.cfg - вариант с _server это поддерживаемый Valve файл переопределений, и он переживает обновления.
Стоит ли 128 tick в CS2?
Для соревновательного сервера, где тренируют раскидки гранат, да. Для сервера сообщества нет. Sub-tick-тайминг ввода убрал большую часть аргументов про регистрацию попаданий, а 128 tick стоит примерно вдвое больше CPU на игрока.
Нужен ли GSLT для закрытого сервера CS2?
Только для публичного списка. Без токена сервер работает, и друзья могут подключаться по адресу, для закрытой группы этого достаточно. С токеном сервер попадает в список, при этом токен должен быть вашим и использоваться одновременно только на одном сервере.
Как сделать одного игрока администратором?
В CS2 на уровне движка нет понятия администратора, кроме пароля RCON. Чтобы дать кому-то ограниченные права - кик, смена карты, мут, - нужно установить Metamod:Source и фреймворк плагинов, в котором есть файл администраторов с флагами для каждого игрока.
Сколько игроков вмещает сервер CS2?
До 64 через -maxplayers_override, но практический ответ зависит от режима. Соревновательный - 10, Wingman - 4, казуальный - от 10 до 20, deathmatch - от 16 до 24. Свыше 24 стоимость CPU на игрока и размеры карт перестают сочетаться.




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