Матч-сервер - это публичный сервер, из которого убрали всё веселье. Ни голосования за смену карты, ни автобаланса команд, который тихо переставляет вашего энтри-фрагера, ни разминки, закончившейся по таймеру, пока один игрок ещё ставил обновление. Вместо этого у него есть конфиг, с которым он запускается в бой, способ поставить паузу, демо всего произошедшего и покадровая резервная копия по раундам, чтобы сбой в 19-м раунде стоил пяти минут, а не матча.
Коротко: положите правила матча в live.cfg, который ничто другое не перезаписывает, ведите вечер через MatchZy, а не вручную, пишите GOTV с первого раунда и включите собственные резервные копии раундов движка до того, как они понадобятся. Остальное - подробности, включая тренировочный сервер, который той же группе понадобится к концу второй недели.
Что должен делать матч-сервер, чего не делает публичный#
| Требование | Как оно выполняется |
|---|---|
| Одинаковые правила каждый раз | Один live.cfg, запускаемый через exec в момент старта, а не разбросанный по файлам |
| Дождаться десятерых | Разминка с замороженным таймером и система готовности |
| Честно распределить стороны | Ножевой раунд, затем остаться или поменяться |
| Остановить часы | Тактические тайм-ауты и пауза администратора |
| Доказать, что произошло | Запись GOTV с первого раунда |
| Пережить сбой | Резервные копии раундов на диске, восстанавливаемые в идущий матч |
| Не пускать посторонних | Пароль или белый список из десяти Steam id через плагин |
Ничего экзотического в этом списке нет, и большая часть уже есть в движке. Плагин ставят не из-за возможностей, а потому что делать всё вручную значит, что администратор вводит одиннадцать команд в нужном порядке, пока девять человек ждут, а одна опечатка перезапускает игру при счёте 12-7.
Конфиг матча#
Это файл, который сервер запускает через exec в момент старта матча. Храните его как game/csgo/cfg/live.cfg и вызывайте явно; не полагайтесь на server.cfg, потому что конфиг игрового режима срабатывает после server.cfg при каждой загрузке карты и отменит половину написанного. Эта ловушка порядка разобрана в статье команды и cvar-ы сервера CS2, и именно из-за неё матчевые конфиги вообще существуют отдельными файлами.
// Format: MR12 with MR3 overtimemp_maxrounds 24mp_halftime 1mp_halftime_duration 15mp_overtime_enable 1mp_overtime_maxrounds 6mp_overtime_startmoney 12500mp_match_can_clinch 1mp_match_end_restart 0mp_match_restart_delay 15mp_endmatch_votenextmap 0// Economymp_maxmoney 16000mp_startmoney 800mp_afterroundmoney 0mp_playercashawards 1mp_teamcashawards 1// Roundmp_freezetime 15mp_roundtime 1.92mp_roundtime_defuse 1.92mp_roundtime_hostage 1.92mp_buytime 20mp_buy_anywhere 0mp_free_armor 0mp_death_drop_gun 1mp_death_drop_grenade 2mp_death_drop_defuser 1mp_friendlyfire 1mp_solid_teammates 1// No interferencemp_autoteambalance 0mp_limitteams 0mp_autokick 0mp_forcecamera 1mp_timelimit 0mp_team_intro_time 0// Timeoutsmp_team_timeout_time 30mp_team_timeout_max 4mp_team_timeout_ot_add_each 1mp_team_timeout_ot_max 1// Voicesv_full_alltalk 0sv_deadtalk 1// Safetysv_cheats 0mp_warmup_pausetimer 0Про некоторые из них стоит сказать пару слов. mp_maxrounds 24 - это MR12, формат, на котором остановился соревновательный CS2; лига, всё ещё играющая MR15, ставит 30, а mp_overtime_maxrounds 6 нужен в любом случае. mp_match_can_clinch 1 завершает матч при 13-4, а не доигрывает раунды, которые никому не нужны. mp_autokick 0 не даёт серверу выкинуть игрока за бездействие во время тактической паузы, а это действительно плохой вечер. mp_team_intro_time 0 пропускает вступительный ролик, который CS2 показывает перед первым раундом. А mp_forcecamera 1 ограничивает погибших наблюдением за своей командой, и это разница между скримом и игрой на честном слове.
Названия команд задаются в mp_teamname_1 и mp_teamname_2, а двухбуквенные коды - в mp_teamflag_1 и mp_teamflag_2. Они появляются на табло и, что полезнее, в демо GOTV через полгода, когда вы не можете вспомнить, кто играл.
Разминка, ножевой раунд и запуск вручную#
Это должен делать плагин. Но вы должны знать, что именно он делает, потому что когда он забарахлит в 20:55, вам придётся делать это вручную.
Сначала разминка. mp_warmuptime 300 вместе с mp_warmup_pausetimer 1 даёт бесконечную разминку: часы отображаются, но не идут вниз, поэтому никого не торопят и никому не приходится перезапускать её снова и снова. mp_warmup_end завершает её, когда вы готовы.
Ножевой раунд - это конфиг и две команды:
mp_startmoney 0mp_maxmoney 0mp_free_armor 0mp_give_player_c4 0mp_ct_default_primary ""mp_ct_default_secondary ""mp_ct_default_melee "weapon_knife"mp_t_default_primary ""mp_t_default_secondary ""mp_t_default_melee "weapon_knife"mp_death_drop_gun 0mp_death_drop_grenade 0mp_buytime 0mp_buy_anywhere 0mp_freezetime 10mp_roundtime 5mp_roundtime_defuse 5mp_maxrounds 1mp_warmup_endmp_restartgame 1Затем выбирает победившая команда. Если она остаётся, выполните live.cfg и mp_restartgame 3. Если меняется сторонами, сначала выполните mp_swapteams, затем те же два шага. Объявите это в чате трижды, чтобы никто не мог сказать, что читал Discord, потому что первый раунд боевого матча, сыгранный одной командой, которая думала, что всё ещё идёт нож, - самый старый спор в Counter-Strike.
MatchZy: плагин, который ведёт вечер#
MatchZy - плагин для CounterStrikeSharp, поэтому ему нужны Metamod:Source и CounterStrikeSharp под ним; установка описана в статье плагины CS2 с Metamod и CounterStrikeSharp. Когда он загружен, вечер идёт из чата.
| Команда | Кто | Эффект |
|---|---|---|
.ready / .unready | Игроки | Готовность. Матч начинается, когда готово достаточно игроков |
.forceready | Админ | Запускает в любом случае |
.knife | - | Ножевой раунд, затем .stay или .switch от победителя |
.pause / .unpause | Игроки | Пауза в конце раунда, продолжение, когда согласны обе стороны |
.tac | Игроки | Тактический тайм-аут, засчитывается в лимит команды |
.stop | Игроки | Восстановить текущий раунд. Согласны должны быть обе команды |
.restore <round> | Админ | Восстановить любой раунд из его файла резервной копии |
.map <name> | Админ | Сменить карту, не выходя из режима матча |
.score | Любой | Текущий счёт и состояние серии |
MatchZy поставляется со своими конфигами в game/csgo/cfg/MatchZy/ (конфиги разминки, ножа и матча), а значит, редактировать нужно cfg/MatchZy/live.cfg, а не файл, который вы написали выше, и плагин запускает его в нужный момент. Его собственные настройки - это convar-ы с префиксом matchzy_ в той же папке; первое, что вы измените, - число готовых игроков, необходимое для старта. Имена между релизами меняются, поэтому читайте ту версию, которую скачали, а не двухлетнюю статью в блоге.
Для всего, что организованнее пикапа, MatchZy загружает описание матча в JSON, из файла на сервере или по URL:
{ "matchid": "renode-scrim-014", "num_maps": 1, "players_per_team": 5, "skip_veto": true, "maplist": ["de_mirage"], "team1": { "name": "Longship", "players": { "76561198012345678": "anna" } }, "team2": { "name": "Drakkar", "players": { "76561198087654321": "jan" } }}Загрузка этого конфига переводит сервер в режим матча с нужной картой, названиями команд и белым списком: подключиться могут только перечисленные Steam id, и каждый автоматически попадает в свою команду. Для серии до двух побед поставьте num_maps равным 3 и перечислите три карты. Это же крючок, которым воспользовался бы бот Discord или небольшая веб-страница, чтобы создавать матчи, не касаясь консоли.
GOTV и демо#
GOTV - это одновременно ретранслятор для зрителей и рекордер демо, и важна именно вторая половина. Включайте его до матча, а не после того, как кто-то попросит клип.
tv_enable 1tv_port 27020tv_autorecord 1tv_delay 0tv_delaymapchange 1tv_maxclients 8tv_name "Longship GOTV"tv_password ""tv_relaypassword ""tv_snapshotrate 32tv_autorecord 1 начинает демо на каждом матче и записывает его на диск, когда карта заканчивается; tv_record <name> и tv_stoprecord делают то же вручную. tv_delay - задержка трансляции в секундах, и в этой настройке ошибаются в обе стороны: 0 подходит серверу только для демо, где никто не смотрит вживую, а что-то вроде 90-120 нужно, если к GOTV подключены зрители, потому что зритель без задержки - это обвинение в гостинге, которое только ждёт своего часа. tv_delaymapchange 1 удерживает смену карты, пока задержанная трансляция не догонит, чтобы последний раунд не обрезался.
Зрители подключаются к порту GOTV, а не к игровому порту, и поэтому серверу CS2 нужно два выделения портов, а не одно. Демо пишутся в game/csgo/ с датой и картой в имени, и полная карта MR12 - это пара сотен мегабайт при 64 тик и больше при 128, так что загруженный скрим-сервер заполняет диск за недели, а не за месяцы. Две привычки решают это: скачивайте нужные демо и поставьте на сервере запланированную задачу, которая удаляет всё старше месяца. Этот приём описан в статье запланированные задачи, которые стоит иметь; на RE:NODE вкладка Schedules запускает консольную команду по cron-выражению, так что очистка - задача, которую вы настраиваете один раз.
Смотрите демо, положив его в папку csgo клиента и выполнив playdemo <name>, либо подключившись к <address>:27020, пока матч идёт.
Резервные копии раундов и восстановление после сбоя#
Движок записывает полный снимок матча в начале каждого раунда, если ему позволить, и почти никто не включает это, пока не понадобится в первый раз.
mp_backup_round_auto 1mp_backup_round_file "match"mp_backup_restore_load_file "match_round12.txt"При mp_backup_round_auto 1 сервер пишет в game/csgo/ один небольшой текстовый файл на раунд с счётом, деньгами, экипировкой и сторонами. mp_backup_restore_load_file <file> загружает один из них обратно, и матч продолжается с начала того раунда с сохранённой у всех экономикой. Это работает после сбоя, после перезапуска и после раунда, который нужно переиграть, потому что у кого-то закрылась игра во время закупки.
MatchZy опирается на это через .stop, который восстанавливает текущий раунд, когда его вводят обе команды, и .restore <round> для администратора. Файлы плагина и файлы движка - не одно и то же, так что при работе с MatchZy пользуйтесь его командами и не смешивайте их.
Резервные копии раундов меняют и отношение к сбоям. Если контейнер упирается в лимит памяти, его останавливают и запускают заново с чистого состояния, а не оставляют буксовать, что звучит жёстко, пока не сравнишь с пятнадцатью минутами ползущего сервера. С включёнными копиями такой перезапуск стоит времени на повторное подключение и одной команды. Без них он стоит матча. Тот же довод относится к резервным копиям самого сервера: см. резервные копии, которые действительно восстанавливаются, где речь о дисциплине, а не о кнопке.
Тренировочный сервер для той же группы#
Вторая вещь, о которой просит команда, - место, где можно бросать смоки. Это то же серверное ПО с почти противоположным конфигом, и ему нужен sv_cheats 1, поэтому это ни в коем случае не должен быть публичный сервер.
sv_cheats 1mp_limitteams 0mp_autoteambalance 0mp_maxmoney 60000mp_startmoney 60000mp_afterroundmoney 60000mp_buytime 60000mp_buy_anywhere 1mp_freezetime 0mp_roundtime 60mp_roundtime_defuse 60mp_respawn_on_death_t 1mp_respawn_on_death_ct 1mp_death_drop_gun 0mp_death_drop_grenade 0sv_infinite_ammo 1ammo_grenade_limit_total 5mp_ct_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_incgrenade weapon_decoy"mp_t_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_molotov weapon_decoy"sv_grenade_trajectory_prac_pipreview 1sv_grenade_trajectory_prac_trailtime 8sv_showimpacts 1sv_showimpacts_time 8bot_quota 0bot_stop 1sv_full_alltalk 1mp_warmup_endmp_restartgame 1Весь смысл файла - в cvar-ах траектории гранат и попаданий: траектории рисуют линию, по которой прошла граната, и оставляют её на sv_grenade_trajectory_prac_trailtime секунд, а sv_showimpacts отмечает, куда пули попали на самом деле, в сравнении с тем, куда, по мнению клиента, они летели. sv_rethrow_last_grenade перебрасывает последнюю гранату из той же точки, и его стоит повесить на клавишу. noclip требует sv_cheats 1, который теперь включён.
У MatchZy есть собственный режим практики, и это более аккуратный путь, если плагин уже установлен: он выставляет всё это, добавляет команды для точек возрождения и таймера и возвращает сервер в исходное состояние. Запускать практику и матчи на одном сервере можно, пока кто-нибудь не забывает выполнить боевой конфиг; одновременно - нельзя, так что если группа достаточно велика для обоих режимов сразу, это два сервера.
Размер, тикрейт и сеть#
Сервер CS2 на десять игроков с записью GOTV не тяжёл. Тяжёлым его делают 128 тик, которые примерно вдвое повышают нагрузку на CPU на игрока, и CounterStrikeSharp, приносящий в процесс среду выполнения .NET.
| Конфигурация | Память | CPU |
|---|---|---|
| 5v5, 64 тик, ваниль, GOTV | 1 GB | 1 ядро |
| 5v5, 64 тик, MatchZy и один-два плагина | 2 GB | 1,5 ядра |
| 5v5, 128 тик, MatchZy, запись GOTV | 2-3 GB | 2 ядра |
| Тренировочный сервер, 128 тик, много работы с гранатами | 2 GB | 2 ядра |
Тикрейт - спор, который стоит решить пораньше. CS2 ставит временные метки на вводе с субтиковой точностью, поэтому регистрация попаданий зависит от тикрейта гораздо меньше, чем в CS:GO, и честный довод за 128 тик теперь опирается на симуляцию гранат и движения, а не на то, попадают ли ваши выстрелы; измерения есть в статье что на самом деле значит тикрейт. Если ваша команда тренирует раскидки на 128 и играет официальные матчи на 128, играйте матч на 128. В остальных случаях 64 с запасом лучше, чем 128 на пределе CPU.
Ощущение от скрима определяет не тикрейт, а расстояние между десятью игроками и сервером. Все в одном регионе с сервером и никто на wifi побеждает любой конфиг на этой странице. Как выяснить, что из трёх портит вечер конкретному игроку, рассказано в статье задержка, джиттер и потеря пакетов, и обычно виноват джиттер.
Устранение неполадок#
Матч стартует при 0-0, но деньги неверные. Боевой конфиг выполнен после перезапуска, а не до него. Сначала exec, потом mp_restartgame 1.
Раунды заканчиваются на 1:55 на одной карте и по-другому на другой. Вы задали mp_roundtime, но не mp_roundtime_defuse и mp_roundtime_hostage. Специфичные побеждают на тех типах карт, которые называют.
Сервер меняет карту после матча. Включены mp_match_end_restart или mp_endmatch_votenextmap. Оба должны быть 0 на матч-сервере.
К GOTV никто не может подключиться. Порт GOTV не выделен или не открыт. Это отдельный UDP-порт, не совпадающий с игровым, и на хостинге с панелью он должен существовать как выделение до того, как tv_port сможет его занять.
Демо пропало после сбоя. GOTV записывает файл, когда запись останавливается. Жёсткий сбой посреди карты его теряет. Именно для этого нужны резервные копии раундов, и это довод в пользу планового перезапуска между сессиями, а не одного долгоживущего процесса.
Игроков автобалансом кидает не в ту команду. Это делают mp_autoteambalance 1 и mp_limitteams. В матчевом конфиге оба должны быть 0.
Паузу нельзя снять. Для одних команд паузы нужны обе стороны, для других - администратор. В MatchZy: .unpause от другой команды или от администратора с нужным флагом.
FAQ#
Каков стандартный соревновательный формат матча CS2?
MR12: mp_maxrounds 24, играют до 13, стороны меняются на 12-м раунде при mp_halftime 1. Овертайм - MR3 с mp_overtime_maxrounds 6 и стартовыми $12,500, повторяется, пока кто-нибудь не победит.
Нужен ли мне MatchZy или можно провести матч на одних конфигах?
Провести можно и на конфигах. Вы потеряете систему готовности, автоматизацию ножевого раунда, тайм-ауты, которые считают сами себя, и восстановление раунда одной командой. Постоянной команде плагин окупается в первый же раз, когда кто-то отключится в 19-м раунде.
Где сохраняются демо GOTV?
В каталоге игры, game/csgo/, с датой и картой в имени, когда включён tv_autorecord. Скачивайте их через файловый менеджер или по SFTP. Они большие, поэтому удаляйте или архивируйте их по расписанию, а не когда заполнится диск.
Можно ли запустить тренировочный и матч-сервер на одном плане?
Не одновременно на одном сервере, потому что практике нужен sv_cheats 1, а в матче его быть не должно. Один сервер можно переключать между ними конфигами или запустить два небольших, что в итоге и делает большинство команд.
Как не пускать посторонних на скрим?
Задайте sv_password и сообщите его десятерым или загрузите конфиг матча MatchZy, который вносит Steam id из него в белый список и отклоняет всех остальных. Пароль проще; белый список ещё и ставит людей в правильную команду.
Регистрируются ли мои выстрелы лучше на 128 тик в CS2?
Гораздо меньше, чем в CS:GO. Субтиковая синхронизация означает, что сервер оценивает выстрел в момент, когда он был сделан, а не на следующем тике. Физика гранат и движение по-прежнему считаются по тикам, и это остающийся настоящий довод за 128.




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