RE:NODE

Руководства14 мин чтения

Команды и cvar сервера CS2: от server.cfg до RCON

Где сервер Counter-Strike 2 хранит настройки, какие cvar важны, как игровые режимы незаметно переопределяют server.cfg и какие команды RCON выполнять на лету.

1 прочтений

Сервер 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/:

code
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
последнее словоСтрока запускапорт, токен, тикрейтserver.cfgпри каждой картеgamemode_*.cfgумолчания Valvegamemode_*_server.cfgваши переопределенияЖивые cvarчто видят игроки
Какой конфиг побеждает при загрузке карты

Отсюда практическое правило: всё, что начинается с mp_, кладите в gamemode_<mode>_server.cfg, а всё, что начинается с sv_, а также hostname, rcon_password и tv_, - в server.cfg. Файлы _server в поставку не входят, вы создаёте их сами, и это поддерживаемое место для переопределений, поэтому они переживают обновление игры, которое переписывает собственные конфиги Valve.

Строка запуска#

На вашей собственной Linux-машине установка и запуск выглядят так:

bash
$ 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_typegame_modeРежим
casual00Казуальный
competitive01Соревновательный, MR12
wingman02Wingman, 2 на 2
armsrace10Arms Race
demolition11Demolition
deathmatch12Deathmatch
custom20Custom, для режимов на плагинах

Задавать алиас в строке запуска надёжнее всего, потому что смена 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, а не по названию:

code
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, в котором нет ничего лишнего:

game/csgo/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 01 пропускает аутентификацию 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 (или в файл, соответствующий вашему режиму). Значения ниже - стандартная соревновательная настройка.

game/csgo/cfg/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_gun0 ничего, 1 лучшее оружие, 2 текущее оружие
mp_free_armor0 нет, 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. Из консоли клиента:

code
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, которой ждут старые инструменты статистики. Если вы подключаете внешний сервис статистики, выясните, на каком из двух он говорит, прежде чем тратить вечер на правило файрвола.

Две консольные команды экономят больше времени, чем любое руководство:

code
find alltalkhelp mp_maxrounds

find <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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000