Сервер живёт на одной карте бесконечно, а после конца матча возвращается на dust2 — классическая ситуация, когда настройка mapcycle CS2 сделана наполовину. В CS2 за ротацию отвечают сразу две сущности: файл mapcycle.txt со списком карт и mapgroup из gamemodes_server.txt, который передаётся в параметрах запуска. Работают они вместе, и если настроить только одну, карты будут меняться не так, как вы задумали.
Кто за что отвечает
Разделение простое, но неочевидное:
| Что | Где лежит | Как включается | За что отвечает |
|---|---|---|---|
| mapcycle | game/csgo/cfg/mapcycle.txt | mapcyclefile в server.cfg | Плоский список карт по порядку; следующая берётся из него после матча |
| mapgroup | game/csgo/gamemodes_server.txt | +mapgroup в параметрах запуска | Какие карты вообще доступны для голосования и режима |
Если mapgroup не задан, сервер использует встроенный дефолтный набор, и ваш mapcycle.txt может частично игнорироваться. Отсюда и берётся вечный dust2.
Перед тем как трогать ротацию, убедитесь, что у вас корректно выставлены game_mode и game_type — набор карт привязан к режиму.
Как устроен mapcycle CS2: файл mapcycle.txt
Лежит здесь:
game/csgo/cfg/mapcycle.txtФормат — по одной карте на строку, без расширений и кавычек:
de_mirage
de_inferno
de_nuke
de_ancient
de_anubis
de_dust2
de_trainПодключается переменной в server.cfg:
mapcyclefile "mapcycle.txt"Если хотите держать несколько ротаций (например, отдельно для будней и для ивентов), заведите mapcycle_comp.txt и mapcycle_event.txt и переключайте mapcyclefile из соответствующего конфига. Как подключать конфиги через exec, разобрано в статье про server.cfg.
gamemodes_server.txt и mapgroup
В корне game/csgo/ лежит gamemodes_server.txt.example. Скопируйте его в gamemodes_server.txt — оригинал с суффиксом .example сервер не читает, и это ошибка номер один при первой настройке.
Внутри находится блок mapgroups. Свою группу описываете так:
"mapgroups"
{
"mg_active"
{
"name" "mg_active"
"maps"
{
"de_mirage" ""
"de_inferno" ""
"de_nuke" ""
"de_ancient" ""
"de_anubis" ""
"de_dust2" ""
"de_train" ""
}
}
}Пустые кавычки справа — это не опечатка, туда пишутся дополнительные атрибуты карты, и обычно они не нужны.
Как включить mapgroup
Группа не активируется сама. Её имя передаётся в параметрах запуска сервера:
+game_type 0 +game_mode 1 +mapgroup mg_active +map de_mirageПорядок важен: game_type и game_mode идут до mapgroup, иначе игра успевает подтянуть дефолтный набор. Где именно править строку запуска на хостинге, описано в статье про параметры запуска сервера CS2.
Проверить, что группа применилась, можно из консоли:
mapgroupКоманда покажет текущую активную группу и список карт в ней.
Голосование за следующую карту
После конца матча CS2 умеет показывать экран голосования. Включается парой переменных в server.cfg:
mp_endmatch_votenextmap 1
mp_endmatch_votenextleveltime 20
mp_match_end_restart 0mp_endmatch_votenextleveltime — сколько секунд висит экран выбора. Двадцати обычно хватает; на большом паблике имеет смысл поднять до 25–30, потому что часть людей в этот момент уже листает Steam.
Если голосование выключено, сервер просто берёт следующую карту из mapcycle.txt. Это предсказуемее и на матчевом сервере даже удобнее.
Принудительно назначить карту после текущей можно так:
nextlevel de_nukeЗначение сбрасывается после смены карты — полезно, когда нужно один раз выдернуть сервер на конкретную карту, не ломая ротацию.
Ротация из workshop-коллекции
Для серверов с кастомными картами — surf, bhop, KZ, авторские de_ — держать список руками бессмысленно. CS2 умеет крутить целую коллекцию мастерской:
+host_workshop_collection 1234567890Сервер сам скачает все карты коллекции и будет их ротировать. Одиночная карта подключается через +host_workshop_map <id>.
Нюансы, о которых узнают на практике: карты из коллекции скачиваются при старте, поэтому первый запуск после добавления новой карты идёт дольше обычного, а при обновлении карты автором сервер подтянет новую версию только после рестарта. Подробнее — в статье про карты из workshop.
Смешивать коллекцию и mapcycle.txt можно, но тогда в mapcycle пишутся имена файлов карт из коллекции, а не их ID.
Проверка: почему ротация не работает
Разберём по шагам то, что ломается чаще всего.
- Файл называется
gamemodes_server.txt.example. Переименуйте, перезапустите. mapgroupне передан в строке запуска. Командаmapgroupв консоли покажет чужую группу — например, дефолтную соревновательную.- Карта есть в mapcycle, но её нет в mapgroup. Сервер её пропустит.
- Опечатка в имени карты.
de_anubisпротивde_Anubis— регистр имеет значение на Linux. - Матч не заканчивается. Если
mp_maxroundsне выставлен и стоит бесконечный режим, ротации просто неоткуда взяться. Смотрите настройку раундов. - Карта из workshop не скачалась. Проверьте, что коллекция публичная и сервер имеет доступ в интернет к CDN Steam.
Частые вопросы
Можно ли менять карту без перезапуска сервера?
Да, из консоли или по RCON: changelevel de_nuke для обычных карт и host_workshop_map <id> для карт мастерской. Второй вариант фактически перезагружает сервер, игроков выкинет.
Как исключить карту из ротации на время?
Проще всего закомментировать её нельзя — mapcycle.txt комментарии не понимает. Просто удалите строку и уберите карту из mapgroup, затем перезапустите сервер.
Нужен ли mapcycle, если включено голосование?
Формально нет — игроки выберут карту сами. Но список нужен как запасной путь: если голосование не состоялось или его выключили, сервер возьмёт следующую карту именно из mapcycle.txt.
Коротко
Держите два файла в согласии: mapcycle.txt со списком по порядку и mapgroup в gamemodes_server.txt с тем же набором карт, плюс +mapgroup в параметрах запуска. Для кастомных карт вместо этого проще подключить workshop-коллекцию целиком.
Если сервер под CS2 ещё выбираете — тарифы тут, панель позволяет править параметры запуска без обращения в поддержку.