CS2 — server.cfg и gamemodes для разных режимов
Один сервер, три режима — паблик по вечерам в competitive, пара часов wingman на выходных и deathmatch для разогрева перед матчем. Проблема в том, что один общий server.cfg с одним набором mp_-конваров под это не годится: то, что нормально для 5x5 с MR12, сломает экономику wingman и превратит deathmatch в тягомотину с раундами. Разберём, как развести конфиги по режимам через gamemodes_server.txt, какие конвары реально отличаются между competitive/wingman/deathmatch, и как настроить автоматическое переключение карт и режимов без ручного передёргивания сервера.
Содержание
Зачем вообще уходить от одного server.cfg
Базовая установка (если ещё не поднимали сервер с нуля — сначала инструкция по установке CS2-сервера) обычно даёт один server.cfg с одним game_type/game_mode на старте и статичной картой. Это нормально для сервера под один режим, но если сообщество хочет разнообразия — держать всё в одном файле неудобно и местами невозможно: часть mp_-конваров в CS2 применяется только внутри «своего» режима, и Valve намеренно блокирует их вне подходящего game_type/game_mode, чтобы никто не подкрутил экономику соревновательного режима через боковую дверь.
Практическая схема, которая реально работает: общий server.cfg держит только то, что одинаково для всего сервера (порт, hostname, RCON, GSLT), а специфика режима и карты уходит в gamemodes_server.txt и per-map конфиги cfg/<mapname>.cfg, которые сервер подхватывает автоматически при загрузке карты. Дальше — конвары под каждый из трёх режимов и как их развести без взаимных конфликтов.
Competitive: конвары под турнирный стандарт
С переходом на MR12 (первым до 13 побед, до этого была MR15) стандартный competitive-конфиг заметно компактнее старого. Базовый набор для server.cfg конкурентного режима:
game_type 0
game_mode 1
mp_maxrounds 24
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_overtime_startmoney 10000
mp_halftime 1
mp_halftime_duration 15
mp_freezetime 20
mp_buytime 20
mp_startmoney 800
mp_free_armor 0
mp_c4timer 40
sv_deadtalk 1
sv_talk_enemy_dead 0
sv_talk_enemy_living 0
Ключевое отличие от казуальных настроек — экономика считается по правилам штатной механики проигрышных бонусов (Loss Bonus), а не задаётся вручную конваром «после раунда». mp_startmoney 800 и mp_free_armor 0 вместе с этой механикой держат баланс закупок близким к тому, что видят игроки в официальном матчмейкинге. Точные значения таймингов (mp_freezetime, mp_buytime) Valve периодически подкручивает от патча к патчу — если сервер турнирный, перед серьёзным матчем сверьтесь с актуальным конфигом из свежего gamemodes.txt, а не полагайтесь на цифры из старой заметки, включая эту.
Для 128-тик соревновательного инстанса закладывайте запас CPU — просадки тикрейта на конкурентном сервере игроки чувствуют острее всего, разбор диагностики есть в статье про лаги и тикрейт CS2-сервера.
Поднять сервер Counter-Strike 2 за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверWingman: компактный конфиг под 2х2
Wingman — не «competitive с двумя игроками», а отдельный режим со своей экономикой и MR8 (до 9 побед) вместо MR12. Если скопировать competitive-конфиг один в один и просто ограничить слоты — экономика и овертайм поедут криво.
game_type 0
game_mode 2
mp_maxrounds 16
mp_overtime_enable 1
mp_overtime_maxrounds 6
mp_halftime 1
mp_halftime_duration 10
mp_freezetime 15
mp_buytime 20
mp_startmoney 800
mp_limitteams 1
mp_autoteambalance 1
bot_quota 0
Карты тоже отдельные — используются компактные версии вроде de_shortdust, de_lake, de_stmarc и «wingman»-варианты классических карт, заточенные под два входа и быстрый темп раунда, а не полноразмерные competitive-карты. Если посадить wingman на обычный de_dust2 целиком, раунды растянутся и экономика перестанет ощущаться сбалансированной — карта проектировалась под 5x5, а не под пару игроков на команду.
mp_limitteams 1 тут важнее, чем в 5x5 — при 2х2 дисбаланс в один игрока (1 против 2) полностью ломает раунд, тогда как в классике это менее критично.
Deathmatch: встроенный режим с бонус-оружием
Здесь стоит различать два разных «дэтматча»: самодельный free-for-all на mp_-конварах респауна (подробно разобран в статье про кастомные режимы surf, bhop и deathmatch) и штатный официальный режим Deathmatch (game_type 1, game_mode 2) со своей встроенной механикой бонус-оружия — именно он обычно нужен для разогрева перед матчем, потому что близко имитирует official quickplay.
game_type 1
game_mode 2
mp_dm_bonus_weapon_dropped 1
mp_dm_bonus_length_max 30
mp_dm_bonus_length_min 15
mp_dm_time_between_bonus_min 20
mp_dm_time_between_bonus_max 40
mp_respawn_immunitytime 3
mp_free_armor 2
mp_roundtime 60
mp_maxrounds 0
mp_dm_bonus_* конвары управляют периодическим появлением «бонусного» оружия — того самого, за которое в клиентском UI показывается таймер и подсказка, какое оружие сейчас даёт больше очков за килл. Это встроенная логика официального дэтматча, а не то, что собирается вручную из голых mp_respawn_on_death_* конваров — если нужен именно самодельный FFA без этой механики, смотрите статью про кастомные режимы, там другой набор конваров и другая логика. mp_respawn_immunitytime даёт короткую неуязвимость после респауна — без неё в плотном дэтматче свежевозрождённого игрока убивают раньше, чем он успевает сориентироваться.
Структура gamemodes_server.txt
Файл game/csgo/cfg/gamemodes.txt — это дефолтная конфигурация режимов от Valve, она перезаписывается при каждом обновлении сервера, поэтому редактировать её напрямую бессмысленно: правки слетят после следующего app_update 730. Для кастомизации существует отдельный файл game/csgo/cfg/gamemodes_server.txt — сервер читает его поверх дефолтного и накладывает переопределения, а Valve его не трогает при апдейтах.
Формат — KeyValues (тот же, что у большинства конфигов Source-движка): корневой блок с именами режимов, внутри каждого — свои настройки, включая список карт для ротации в этом режиме:
"gamemodes_server.txt"
{
"competitive"
{
"maps"
{
"de_dust2" "1"
"de_mirage" "1"
"de_inferno" "1"
"de_ancient" "1"
"de_anubis" "1"
}
}
"wingman"
{
"maps"
{
"de_shortdust" "1"
"de_lake" "1"
}
}
"custom"
{
"maps"
{
"workshop/3287654321/aim_botz" "1"
}
}
}
Важная практика, а не опция: перед тем как писать gamemodes_server.txt руками, откройте текущий gamemodes.txt того же сервера и скопируйте оттуда блок нужного режима как шаблон — точные имена ключей и вложенность у Valve иногда меняются между патчами, и самый надёжный источник актуального формата — файл, который реально пришёл с текущей версией сервера, а не старая инструкция (эта включительно). Правите копию, а не оригинал, и держите файл под git или хотя бы бэкапом — типовая ошибка «слетела кастомная ротация после обновления» почти всегда означает, что кто-то правил gamemodes.txt вместо gamemodes_server.txt.
Автопереключение карт по режиму
Список карт внутри блока режима в gamemodes_server.txt определяет, какие карты вообще доступны для этого режима, но саму ротацию — что после чего — задаёт mapcyclefile (обычно mapcycle.txt, путь указывается конваром mapcyclefile в server.cfg). Простейший рабочий вариант — один mapcycle.txt со списком карт одного режима, если сервер вообще не переключает режимы:
de_dust2
de_mirage
de_inferno
de_ancient
Если нужно чередовать сами режимы (например, будни — competitive, выходные вечером — deathmatch), автоматика на уровне одного запущенного процесса CS2 ограничена: game_type/game_mode задаются при старте процесса и конварами их можно поменять на лету не всегда предсказуемо, особенно для конкурентных режимов с блокировкой части конваров. Практичнее два подхода:
- Расписание через systemd-таймер и обёрточный скрипт. Отдельные unit-файлы (или один параметризованный) с разными
+game_type/+game_mode/+mapи разными+exec, между которымиsystemctl restartпереключает сервер по расписаниюcron/systemd.timer. Минус — короткий даунтайм на рестарт, зато предсказуемое поведение. - Смена карты с сохранением режима через RCON. Внутри одного режима
changelevel <mapname>или встроенная логикаmp_match_end_changelevel 1(сервер сам переходит на следующую картуmapcycle.txtпо окончании матча) работает без даунтайма и без какого-либо скрипта — это закрывает 90% реальных задач ротации, если сервер не меняет сам режим, а только карты внутри него.
Для Workshop-карт в ротации коллекцию подключают через host_workshop_collection <ID> — сервер докачивает всё содержимое коллекции при старте, подробности и разбор ID есть в статье про кастомные карты из Steam Workshop. Комбинация «коллекция под конкретный режим + свой mapcycle.txt на этот режим» — рабочая схема для сервера, который живёт несколькими режимами по расписанию.
Типичные грабли
- Конвар режима не применяется. Часть
mp_-конваров заблокирована вне «своего»game_type/game_mode— если значение не берётся, первым делом проверьте, тот ли сейчас активен режим, а не опечатку в конваре. - Правки исчезли после обновления сервера. Почти всегда значит, что редактировали
gamemodes.txtвместоgamemodes_server.txt— первый Valve перезаписывает при каждомapp_update. - Wingman-карта не подгружается в ротацию. Проверьте, что карта прописана именно в блоке
wingmanфайлаgamemodes_server.txt, а не только в общемmapcycle.txt— блок режима определяет, что вообще доступно для выбора внутри него. - После смены режима economy/timers ведут себя странно. Полный рестарт процесса сервера с новыми
+game_type/+game_modeпри старте надёжнее, чем попытка переключить их конварами на лету — некоторые внутренние состояния (например, экономика раунда) инициализируются один раз при старте карты в конкретном режиме.
Поднять сервер Counter-Strike 2 за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверЧастые вопросы
Можно ли держать competitive и deathmatch на одном сервере одновременно?
Одновременно на одном запущенном процессе — нет, режим и слоты у него один. Чередовать по расписанию через рестарт с разными +game_type/+game_mode — можно и это рабочая практика.
Обязательно ли трогать gamemodes_server.txt, если нужен только один режим?
Нет, если сервер живёт одним competitive- или deathmatch-конфигом без кастомной ротации карт, достаточно server.cfg и обычного mapcycle.txt — файл режимов нужен именно для тонкой настройки списка карт и переопределений по каждому режиму отдельно.
Почему wingman-конфиг не подходит для 5x5 на маленьких картах?
Экономика и таймеры wingman заточены под MR8 и два игрока в команде — на 5x5 с этими же значениями раунды и покупки будут постоянно рассинхронизированы с реальным темпом матча.
Как проверить, какой режим сейчас реально активен на сервере?
Через RCON: команда status покажет текущую карту, а значения game_type/game_mode без аргумента вернут активные числа — сверьте с таблицей режимов из базовой инструкции по установке.
Что делать, если после патча Valve изменила поведение конвара из этой статьи?
Сверяться со свежим gamemodes.txt, который пришёл с последним app_update 730, — это самый актуальный источник, точнее любой статьи, включая эту.