RE:NODE

Руководства11 мин чтения

Ротация карт и свои карты на игровом сервере

Как устроена ротация карт на игровых серверах: mapcycle.txt, группы карт CS2, слои Squad, миссии Arma, циклы KF2 и Sandstorm, голосования за карту и загрузка своих карт.

0 прочтений

Ротация карт - это список, по которому сервер идёт, когда заканчивается матч: сыграть эту карту, затем следующую, а в конце вернуться в начало. Она есть почти в каждой раундовой игре, но хранит её каждая по-своему - mapcycle.txt в играх на Source и GoldSrc, группы карт и коллекции Workshop в CS2, списки слоёв в Squad, классы миссий в Arma 3, GameMapCycles в Killing Floor 2, MapCycle.txt со сценариями в Insurgency: Sandstorm. В играх с постоянным миром, таких как Minecraft, Rust или Valheim, ротации нет вообще: у них один мир, и меняют его через вайп. Ниже - где лежит список в каждой игре, что завершает карту, как в это вписываются голосования и как составить ротацию, с которой игроки не уходят на середине.

Два вида серверов: с ротацией и с постоянным миром#

Прежде чем говорить о файлах, - различие, от которого зависит, относится ли всё это к вам.

Серверы с ротацией играют карту один матч или до лимита времени, а затем загружают другую. Так работают шутеры и большинство раундовых кооперативных игр: Team Fortress 2, Counter-Strike во всех версиях, режимы Garry's Mod вроде TTT и Prop Hunt, кампании Left 4 Dead 2, Squad, Insurgency: Sandstorm, Killing Floor 2. Лицо такого сервера во многом определяет его ротация.

Серверы с постоянным миром загружают один мир и держат его. Сюда относятся Minecraft, Rust, Valheim, 7 Days to Die, Project Zomboid, DayZ, Palworld и любая игра на выживание или строительство. "Сменить карту" означает остановить сервер и направить его на другой мир или сид, а в случае Rust это ежемесячный вайп. Выбор карты в этих играх тоже есть - размер мира, сид, пользовательские карты, карты от сообщества, - но это решение, которое принимается один раз на вайп, а не цикл. Об этой стороне - в статьях вайпы в Rust без потери игроков и своя генерация мира в Minecraft.

Дальше в статье речь пойдёт о первом виде.

Что завершает карту#

Ротация имеет смысл, только если что-то велит серверу двигаться дальше. Игры используют какую-то комбинацию из четырёх триггеров:

Триггерcvar в Source / GoldSrcЧто происходит
Лимит времениmp_timelimit (минуты)Карта меняется по истечении времени, обычно в конце раунда
Лимит победmp_winlimitКарта меняется, когда команда набирает N побед
Лимит раундовmp_maxroundsКарта меняется после N раундов
Лимит фраговmp_fraglimitИгры в духе deathmatch, кто первый наберёт N

0 отключает лимит. Если все лимиты равны 0, карта сама никогда не сменится, и это частая причина жалоб "моя ротация не работает": со списком всё в порядке, просто ничто не завершает карту. В TF2 обычная публичная настройка - mp_timelimit 30 с mp_winlimit 0; в CS важнее лимиты раундов и побед, потому что матчи там считаются в раундах.

В играх не на Source есть свои аналоги, обычно в настройках игрового режима, - длительность матча, число раундов или волн, условие победы. Карта в KF2 заканчивается, когда пройдены волны (и босс) или вся команда погибла; слой в Squad заканчивается, когда кончаются тикеты или истекает лимит времени.

Source и GoldSrc: mapcycle.txt#

Team Fortress 2, Counter-Strike: Source, Garry's Mod, Left 4 Dead 2 и Counter-Strike 1.6 читают простой текстовый файл с одним названием карты в строке, без расширения:

tf/cfg/mapcycle.txt
ctf_2fortpl_badwatercp_process_finalkoth_harvest_finalpl_upwardcp_granary_pro_rc8

Где лежит файл, зависит от игры. В TF2 это tf/cfg/mapcycle.txt, а если вы его не создали, используется mapcycle_default.txt. В старых играх и CS 1.6 он лежит в корне папки игры (cstrike/mapcycle.txt). cvar mapcyclefile задаёт, какой файл использовать, так что можно держать несколько и переключаться между ними из server.cfg.

Правила, на которых спотыкаются:

  • Карта из цикла, которой нет на диске, пропускается (а в некоторых играх из-за неё сервер вообще перестаёт менять карты). Каждое название должно точно совпадать с .bsp в папке maps, в Linux - с учётом регистра.
  • Сервер читает файл при смене карты. Править его посреди карты можно; изменение применится со следующего перехода.
  • nextmap в консоли показывает, что будет дальше. changelevel <map> переключает сразу, не отключая игроков. map <map> делает более жёсткую перезагрузку, при которой все отключаются и подключаются заново.

Голосования и номинации с SourceMod и AMX Mod X

Фиксированный цикл предсказуем; голосование удерживает людей. На Source 1 нужные плагины идут в комплекте с SourceMod, хотя некоторые из них устанавливаются в addons/sourcemod/plugins/disabled/, и чтобы их включить, их нужно переместить на одну папку выше:

  • mapchooser.smx - за несколько минут до лимита запускает голосование среди карт из цикла (или своего списка).
  • rockthevote.smx - игроки пишут rtv; если согласных достаточно, голосование начинается сразу.
  • nominations.smx - игроки пишут nominate, чтобы добавить карту в следующее голосование.
  • nextmap.smx - включён по умолчанию; показывает и контролирует следующую карту.
  • randomcycle.smx - выбирает следующую карту из цикла случайно.

В CS 1.6 AMX Mod X поставляется с mapchooser.amxx и nextmap.amxx, которые включаются в addons/amxmodx/configs/plugins.ini, плюс меню голосования для админов, читающее addons/amxmodx/configs/maps.ini. Плагинная сторона для каждой игры описана в статьях плагины AMX Mod X для Counter-Strike 1.6 и плагины SourceMod для Team Fortress 2.

В Garry's Mod конец карты обрабатывают сами игровые режимы. TTT заканчивается после ttt_round_limit раундов или ttt_time_limit_minutes, а затем меняет карту; большинство серверов добавляют аддон для голосования за карту (обычно MapVote от Willox), который цепляется за этот момент. Подробности - в статье сервер Garry's Mod TTT.

CS2: группы карт и коллекции Workshop#

Counter-Strike 2 не использует mapcycle.txt так, как это делала CS:S. Его ротация берётся из групп карт, описанных в game/csgo/gamemodes_server.txt (для начала скопируйте поставляемый файл .example). Группа карт - это именованный список карт; строка запуска выбирает игровой режим и группу:

bash
$ ./cs2 -dedicated +game_type 0 +game_mode 1 +mapgroup mg_active +map de_inferno

game_type 0 с game_mode 1 - это Competitive; game_mode 0 - Casual. Встроенные группы вроде mg_active следуют текущему пулу карт Valve, который меняется от операции к операции. Для своей ротации опишите собственную группу в gamemodes_server.txt и передайте её название.

Карты из Workshop подключаются по-другому. +host_workshop_collection <id> загружает коллекцию Steam Workshop и прокручивает её; +host_workshop_map <id> загружает одну карту из Workshop. Коллекция скачивается при старте, так что коллекция из 40 карт означает долгий первый запуск и много занятого места на диске. Для загрузок из Workshop серверу нужен токен Steam. Оба варианта разобраны в статье карты и коллекции Workshop в CS2, а полная строка запуска - в статье настройка сервера Counter-Strike 2.

Другие игры: слои, миссии и сценарии#

Squad

Squad разделяет карты и слои - слой это карта с игровым режимом, фракциями и версией (Narva_RAAS_v1). Ротация - это список слоёв в SquadGame/ServerConfig/LayerRotation.cfg, а MapRotationMode в Server.cfg определяет, идёт ли сервер по этому списку слоёв или по списку уровней - допустимые значения перечислены в комментариях к файлу вашей версии. Админы меняют слой командой AdminChangeLayer и задают следующий через AdminSetNextLayer. Названия слоёв меняются, когда карты переделывают, так что ротация, работавшая месяц назад, может содержать названия, которых больше нет; проверяйте лог сервера после каждого обновления Squad. Полный файл - в статье конфиг сервера Squad и админы.

Arma 3

В Arma 3 карты называются "миссиями", а ротация хранится в виде классов внутри server.cfg:

server.cfg
class Missions{    class Mission1    {        template = "MyCoop.Altis";        difficulty = "Regular";    };    class Mission2    {        template = "Invade_Annex.Stratis";        difficulty = "Veteran";    };};

template - это имя файла миссии (из MPMissions) без .pbo. Если класс Missions есть, сервер сам ведёт ротацию, а не ждёт, пока админ выберет миссию через #missions. Большинство сообществ Arma играют одну длинную миссию, а не цикл; класс всё равно стоит описать, чтобы сервер сам восстанавливался после перезапуска. Подробнее - в статье server.cfg и миссии Arma 3.

Killing Floor 2

KF2 хранит свой цикл в KFGame/Config/PCServer-KFGame.ini в секции [KFGame.KFGameInfo]:

PCServer-KFGame.ini
[KFGame.KFGameInfo]GameMapCycles=(Maps=("KF-BurningParis","KF-Outpost","KF-BioticsLab"))ActiveMapCycle=0

Строк GameMapCycles может быть несколько; ActiveMapCycle выбирает одну по индексу. На карты из Workshop сервер должен быть подписан - строками ServerSubscribedWorkshopItems= в секции [OnlineSubsystemSteamworks.KFWorkshopSteamworks] файла PCServer-KFEngine.ini, - и они же должны быть в цикле. Остальное - в гайде по серверу Killing Floor 2.

Insurgency: Sandstorm

Sandstorm прокручивает сценарии, а не карты. Insurgency/Config/Server/MapCycle.txt содержит по одному сценарию в строке - либо просто название сценария, либо с параметрами, например освещением:

MapCycle.txt
Scenario_Farmhouse_Checkpoint_SecurityScenario_Hideout_Checkpoint_Insurgents(Scenario="Scenario_Refinery_Push_Security",Lighting="Night")

В названии сценария закодированы карта, режим и сторона, так что сервер Checkpoint перечисляет только сценарии Checkpoint. Полный список режимов - в гайде по серверу Insurgency: Sandstorm.

Пользовательские карты и как доставить их игрокам#

Ротации из стандартных карт больше ничего не нужно. Но как только вы добавляете пользовательскую карту, игроки должны её получить, и от того, как они её получают, зависит, останутся ли они.

ИграКак клиенты получают пользовательские карты
TF2, CS:S, GMod, L4D2Скачивание с сервера или FastDL по HTTP
Garry's ModWorkshop через resource.AddWorkshop или коллекцию
CS2Только Steam Workshop
KF2, Squad, SandstormПодписка в Workshop или mod.io, автоматически при входе
Arma 3.pbo миссии скачивается при входе; моды должны быть установлены заранее

Для Source 1 важнее всего правильно настроить скачивание. Без FastDL клиент тянет карту с самого игрового сервера на ограниченной скорости, и для карты на 60 МБ это минуты на экране загрузки и хороший шанс, что игрок сдастся. Если sv_downloadurl указывает на веб-сервер со сжатыми в .bz2 копиями тех же файлов, загрузка идёт быстро, а игровой сервер тратит канал на игру. Настройка описана в статье Workshop и FastDL в Garry's Mod, и тот же способ работает для TF2 и CS:S.

Файлы карт ещё и занимают место. Карты Source обычно весят 20-100 МБ каждая, карты CS2 из Workshop могут весить несколько сотен, а игры, работающие через Workshop, кэшируют всё, что когда-либо скачивали. Ротация из 50 карт - это несколько гигабайт, что важно на маленьком тарифе, - см. статью сколько места нужно игровому серверу.

Как составить ротацию, ради которой остаются#

Техническая часть простая. От чего зависит, будет ли ваш сервер полон в 21:00, - так это от самого списка.

Начинайте с популярных карт. Первая карта после перезапуска - та, которую видят люди, листающие браузер серверов. Сервер, который в прайм-тайм стоит на малоизвестной пользовательской карте, пролистывают. Поставьте первыми две-три всеобщие любимые карты, а эксперименты держите в середине.

Подбирайте карты под число игроков. Большие карты пустеют при десяти игроках; маленькие при тридцати превращаются в хаос. Существуют плагины, которые переключаются между двумя циклами в зависимости от числа игроков, а mapchooser из SourceMod можно направить на разные списки. Даже без них "ночной" цикл из маленьких карт, который включается, когда на сервере тихо, удерживает тех немногих, кто есть, от ухода.

Не повторяйте слишком рано. Голосование без памяти каждый раз выбирает одну и ту же любимую карту. mapchooser в SourceMod исключает недавно сыгранные карты (sm_mapvote_exclude задаёт, сколько именно); пользуйтесь этим.

Отсеивайте по данным. Логи сервера фиксируют каждую смену карты и число игроков на ней. Карту, с которой уходит половина сервера в первые пять минут после загрузки, нужно убрать из ротации, как бы она вам ни нравилась. Больше о чтении таких сигналов - в статье как растить сообщество игрового сервера.

Пусть пользовательских карт будет меньшинство. Две-три хорошо сделанные пользовательские карты дают серверу лицо. Пятнадцать означают, что большинство игроков при большинстве смен карты что-то скачивают.

Решение проблем со сменой карт#

Карта никогда не меняется. Все условия завершения равны 0, или плагин переопределяет следующую карту. Проверьте mp_timelimit, mp_winlimit и mp_maxrounds, затем nextmap.

Сервер всегда возвращается на одну и ту же карту. Файл цикла не читается - не то расположение, не тот mapcyclefile, или все остальные записи недействительны и пропускаются. Следите за консолью при смене карты: ищите строки "map not found".

Сервер упал при смене карты. Пользовательская карта повреждена или требует контента, которого на сервере нет. Загрузите её отдельно через changelevel и следите за логом. Второй подозреваемый - плагины, цепляющиеся за сущности карты.

Игроков кикает с "missing map". Скачивание выключено (sv_allowdownload 0), URL FastDL неверный, или .bz2 на веб-сервере не совпадает с картой на игровом сервере.

Коллекция Workshop не загружается. Нет токена Steam, коллекция приватная, или карту удалили из Workshop. Консоль выводит id предмета, который не загрузился.

FAQ#

Можно ли сделать ротацию на сервере Minecraft или Rust?

Не в том же смысле. Они держат один постоянный мир. Можно переключать миры, остановив сервер и изменив level-name (Minecraft) или настройки карты (Rust), или держать несколько миров через плагин вроде Multiverse, но автоматически в конце матча ничего не меняется.

Сколько карт должно быть в ротации?

Достаточно, чтобы одна и та же карта не возвращалась за вечер, и немного, чтобы каждую успевали играть. При лимите в 30 минут разумно начать с восьми-двенадцати карт. Голосования уменьшают нужное число, потому что игроки пропускают те карты, которые им не нравятся.

Почему голосование всё время выбирает одну и ту же карту?

Потому что ничто ему не мешает. Исключите недавно сыгранные карты из голосования, ограничьте, как часто карту можно номинировать, или уберите любимую карту из голосования и поставьте её в фиксированный цикл на определённое место.

Вызывают ли пользовательские карты лаги на сервере?

Могут. Плохо оптимизированная карта с множеством динамических сущностей каждый tick стоит серверу CPU, а огромная - памяти. Тестируйте каждую новую карту на полном сервере, прежде чем добавлять её в основную ротацию.

Нужен ли перезапуск после изменения ротации?

Обычно нет. Source и GoldSrc читают цикл при смене карты, а SourceMod перечитывает свои списки карт в начале карты. Группы карт CS2 и большинство игр не на Source читают ротацию при старте, так что им перезапуск нужен.


Комментарии

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

0/2000