MAATRIX GAMES / Блог / CS2 — server.cfg и gamemodes для разных режимов

CS2 — server.cfg и gamemodes для разных режимов

MAATRIX GAMES

Один сервер, три режима — паблик по вечерам в 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, — это самый актуальный источник, точнее любой статьи, включая эту.