Ротация карт (map rotation): настройка
Если сервер весь вечер крутит одни и те же три карты по кругу — игроки быстро заскучают и уйдут искать сервер поинтереснее. А если добавить в ротацию карту, которую никто не тестировал, есть риск получить краш или зависшую игру прямо посреди вечера, когда на сервере полный слот. Разберём, как устроена ротация карт на серверах раундовых игр (CS2, TF2, L4D2, Insurgency, Squad и похожих), как настроить смену по времени или по раундам, чем votemap лучше жёсткого списка и как не словить грабли с кастомными картами.
Содержание
Как устроена ротация карт: базовый принцип
На большинстве серверов с раундовой структурой (Source-игры, Unreal-шутеры типа Squad и Killing Floor 2, SCP: Secret Laboratory) ротация держится на трёх вещах:
- Список карт — текстовый файл или конфиг, где карты перечислены построчно или через блоки с параметрами.
- Условие смены — таймер (
mp_timelimit), число раундов (mp_maxrounds) или победа команды до N побед (mp_winlimit). - Указатель на следующую карту — сервер идёт по списку сверху вниз и зацикливается, либо выбирает карту случайно/по голосованию.
Важный нюанс: концепция ротации применима не ко всем играм в равной степени. У песочниц с персистентным миром (Rust, ARK, Valheim) карта одна на весь вайп — там вместо ротации карт вы настраиваете расписание вайпов. А вот у раундовых шутеров карта меняется постоянно, и без нормально настроенной ротации сервер либо застревает на одной карте, либо переключается вслепую на что-то неиграбельное.
Списки карт по движкам: mapcycle.txt и gamemodes_server.txt
В TF2, CS:GO (и частично в CS2 через legacy-режимы) ротация лежит в файле mapcycle.txt в папке игры (например tf/cfg/mapcycle.txt или csgo/cfg/mapcycle.txt). Формат предельно простой — одна карта на строку:
cp_dustbowl
cp_gravelpit
pl_badwater
koth_harvest_final
cp_process_final
Сервер запускает mp_timelimit (минуты на карту) или mp_winlimit (победы до смены), и когда условие выполнено, берёт следующую строку. Дошёл до конца файла — начинает сначала. Файл читается при старте карты, так что после правки нужен changelevel на текущую карту или полный рестарт, чтобы список подтянулся заново.
Путь к файлу задаётся через mapcyclefile mapcycle.txt в server.cfg, можно указать и своё имя — удобно, если держите несколько пресетов ротации (будни/выходные, разные игровые режимы).
В CS2 механика немного сложнее, чем плоский mapcycle.txt. Ротация строится вокруг gamemodes_server.txt и групп карт (mapgroups), где карты привязаны к режиму (competitive, wingman, deathmatch). Пример минимальной группы под комьюнити-сервер с активным режимом:
"maps"
{
"mapgroups"
{
"mg_active"
{
"maps"
{
"de_dust2" ""
"de_mirage" ""
"de_inferno" ""
"de_ancient" ""
"de_anubis" ""
}
}
}
"gametypes"
{
"custom"
{
"mode1"
{
"map_groups"
{
"mg_active" ""
}
}
}
}
}
Смена карты в CS2 обычно триггерится через mp_timelimit, mp_maxrounds или явный changelevel de_mirage из консоли/RCON. Если работаете через RCON-клиент, дерганье changelevel вручную — рабочий вариант для проверки карты перед тем, как включать её в общую ротацию; про подключение и базовые команды есть отдельная статья про RCON-подключение и основные команды.
Для workshop-карт в CS2 группа collection задаётся отдельно через +host_workshop_collection <id>, и такие карты стоит держать в отдельном списке ротации, а не мешать с official maps в одном файле — так проще откатить, если конкретная кастомная карта начнёт всех крашить.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверСмена по времени, по раундам или по счёту
Три основных механизма условия смены, и выбор зависит от формата сервера:
- По времени (
mp_timelimit 30) — предсказуемо, удобно для паблик-серверов с постоянным потоком новых игроков: карта сменится ровно через N минут независимо от хода матча. - По числу раундов (
mp_maxrounds 24в CS-играх, аналоги в других движках) — честнее для соревновательного формата, но длительность непредсказуема: если команда играет осторожно, раунды тянутся дольше. - По победам (
mp_winlimit 16) — карта заканчивается, когда одна команда набрала нужное число побед; хорошо сочетается с half-time на карту.
На практике многие админы комбинируют: например mp_timelimit 35 как жёсткий потолок плюс mp_maxrounds 30 как более вероятный триггер — карта сменится по тому условию, которое наступит раньше. Это страхует от ситуации, когда затянувшийся матч держит одну карту час с лишним.
Голосование за карту: votemap вместо жёсткой ротации
Жёсткая ротация неплохо работает как база, но игроки часто хотят выбирать сами. Для Source-игр стандартное решение — плагины из SourceMod: Nominations (nominations.smx) и MapChooser (mapchooser.smx). Логика такая:
- Игроки номинируют карты командой
!nominateв течение матча. - За 60–120 секунд до конца карты (настраивается через
mp_chattimeи параметры плагина) появляется голосование с 3–5 вариантами. - Побеждает карта с наибольшим числом голосов, включается опция "Extend" — продлить текущую карту, если она заходит игрокам.
Основные параметры в cfg/sourcemod/mapchooser.cfg:
// Время до конца карты, когда стартует голосование (в секундах)
sm_mapvote_starttime 3
// Включить опцию "не менять карту"
sm_mapvote_include_current 1
// Пул карт для голосования — либо весь mapcycle, либо отдельный nominations.ini
sm_extendmap_limit 2
Votemap не отменяет базовый mapcycle — он выбирает следующую карту *из* пула, который вы всё равно должны собрать и протестировать заранее. Для серверов, где ядро игроков — постоянные завсегдатаи, а не разовые заходы, голосование почти всегда повышает удержание сильнее, чем жёсткий список.
Как собрать сбалансированный пул карт
Ротация из десяти похожих карт быстро приедается даже с голосованием. При составлении пула стоит держать в голове несколько принципов:
- Не перегружайте одним типом. Если в CS2-ротации восемь defusal-карт и ни одной hostage — добавьте разнообразия по режиму, если ваш сервер вообще поддерживает несколько типов.
- Чередуйте размер и темп. Компактные карты (быстрые перестрелки, короткие раунды) вперемешку с крупными (больше тактики, дольше матчи) — так ротация не выматывает одним ритмом весь вечер.
- Держите 1–2 "проверенных хита" рядом с новыми картами. Если добавляете свежую кастомную карту, не убирайте сразу популярную — дайте игрокам возможность вернуться на знакомое, если новая не зайдёт.
- Не превращайте пул в десятки позиций. 10–16 карт — комфортный диапазон для большинства паблик-серверов: достаточно разнообразия, но игроки успевают выучить карту и не теряются в списке при голосовании.
Для игр с открытыми мастерскими (CS2, Garry's Mod, Rust в части карт-заготовок) полезно смотреть, что реально играбельно и не сырое — про подбор карт из Steam Workshop есть отдельный разбор для кастомных карт CS2 из Steam Workshop.
Тестирование карт перед добавлением в ротацию
Самая частая причина ночного даунтайма — карта, которую добавили в mapcycle без проверки. Прежде чем закидывать карту (особенно кастомную, скачанную с воркшопа или стороннего сайта) в общий список, стоит пройти минимальный чек-лист:
- Загрузить карту отдельно, без остальной ротации —
changelevel <имя_карты>или+mapпри старте тестового инстанса. - Проверить, что карта вообще стартует без ошибок в консоли — отсутствующие текстуры/модели (
ERROR: material not found) не всегда критичны, но missing navmesh для ботов или сломанные spawn-точки — уже блокер. - Пройтись по карте одному или с парой друзей — застревания в текстурах, дыры в геометрии за пределами игровой зоны, зоны без коллизий.
- Проверить спавны команд — если спавн выкидывает игрока за пределы карты или в текстуру, до релиза это не заметишь, а на живом сервере это будет жалоба каждые пять минут.
- Только после этого добавлять карту в
mapcycle.txt/ mapgroup и, если используете votemap, в пул номинаций.
Если карта пришла с воркшопа и требует зависимостей (например, кастомные модели или звуки, упакованные отдельным аддоном), стоит убедиться, что зависимость подключена в конфиге workshop-коллекции — иначе на чужих клиентах карта прогрузится с "розовыми текстурами" даже при том, что у вас на тесте всё выглядело нормально.
Типичные грабли ротации
Несколько ошибок, которые встречаются чаще всего:
- Опечатка в имени карты в mapcycle.txt — сервер либо пропускает строку молча, либо крашится при попытке сменить карту, в зависимости от движка. Сверяйте имя файла карты (
.bspбез расширения) с тем, что записано в списке. - Удалённая или переименованная карта осталась в списке — при ремейке карты автор иногда меняет имя файла (
de_map_v2вместоde_map), а старая запись остаётся в ротации и рано или поздно ловит ошибку загрузки. - Голосование без ограничения повторов — если не настроить cooldown на недавно сыгранные карты (
sm_mapvote_exclude_currentи похожие параметры), одна и та же популярная карта может выпадать три раза подряд, что раздражает не меньше, чем жёсткая ротация без выбора. - Слишком короткий timelimit для крупных карт — большие тактические карты (Squad, Insurgency: Sandstorm) с коротким лимитом времени обрываются на середине штурма, и матч ощущается незавершённым.
Общий подход простой: mapcycle или mapgroups задают базовый список, условие смены (время/раунды/счёт) определяет, когда сервер переключится, а votemap-плагины добавляют игрокам право голоса поверх этой базы. Главное — не полениться проверить каждую карту отдельно перед тем, как отправить её в общий пул, особенно если это кастомная карта с воркшопа: одна нерабочая точка спавна способна испортить вечер всему серверу.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Нужно ли перезапускать сервер после правки mapcycle.txt?
Не всегда — обычно хватает changelevel на текущую карту, чтобы список перечитался; полный рестарт нужен реже, но если изменения не подхватились, это первое, что стоит попробовать.
Можно ли настроить ротацию так, чтобы карты не повторялись, пока не пройдёт весь список?
Да, при последовательном mapcycle это поведение по умолчанию — сервер идёт по списку сверху вниз и зацикливается только после последней строки; со случайным выбором или votemap повторы контролируются отдельными параметрами плагина.
Что делать, если после добавления новой карты сервер крашится при попытке на неё переключиться?
Сначала проверьте карту в одиночном тесте вне общей ротации и посмотрите консоль на ошибки загрузки — чаще всего дело в отсутствующих зависимостях воркшоп-аддона или в опечатке в имени файла карты.
Работает ли votemap без сторонних плагинов, "из коробки"?
В части игр есть встроенное голосование (например, у некоторых Unreal-шутеров), но для Source-игр (CS2, TF2, L4D2) стандартный путь — SourceMod-плагины MapChooser и Nominations, коробочной альтернативы сравнимого качества там нет.
Стоит ли включать в ротацию сразу много кастомных карт?
Лучше вводить их постепенно, по одной-две за раз, и следить за реакцией игроков и стабильностью — резкая замена половины пула официальных карт на непроверенные кастомные обычно снижает удержание, а не повышает его.