RE:NODE

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

Arma 3: server.cfg, basic.cfg, миссии и headless-клиенты

Все настройки server.cfg, которые стоит менять, что на самом деле делает basic.cfg, ротация миссий и сложность, команды администратора и настройка headless-клиента.

0 прочтений

Сервер Arma 3 настраивается двумя файлами с обманчиво похожими названиями и одним флагом командной строки на каждый. server.cfg, передаваемый через -config=, содержит всё, что относится к серверу как к месту, куда заходят люди: его название, пароли, администраторов, ротацию миссий, настройки безопасности. basic.cfg, передаваемый через -cfg=, содержит несколько значений сетевой настройки, которые почти никому не нужно менять. Сложность не лежит ни в одном из них: она давно переехала в профиль сервера, и это по-прежнему самая частая причина, по которой настройка отказывается сохраняться.

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

Запуск сервера: командная строка и порты#

Полная строка запуска на Linux выглядит так:

bash
$ ./arma3server_x64 -port=2302 \    -config=cfg/server.cfg \    -cfg=cfg/basic.cfg \    -profiles=profiles -name=server \    -mod="@cba_a3;@ace" -serverMod="@server_only" \    -world=empty -autoInit -filePatching

Важные части:

  • `-config=` - это server.cfg, а `-cfg=` - это basic.cfg. Они расположены наоборот по сравнению с тем, что все бы подумали, и если их перепутать, сервер запустится, проигнорирует ваши настройки и ничего об этом не скажет.
  • `-profiles=` и `-name=` определяют, куда записывается профиль сервера. Всё, что касается сложности, лежит в файле в этом каталоге, названном по -name.
  • `-world=empty` не даёт серверу загружать Альтис при запуске. Это экономит память и время старта, и причин не использовать его нет.
  • `-mod=` - это список, который должен быть и у клиентов. `-serverMod=` загружается только сервером, для таких вещей, как серверный античит или мод логирования. Если положить серверный мод в -mod=, каждый игрок будет впустую скачивать его.
  • `-autoInit` запускает миссию, не дожидаясь игрока, и для пользы требует persistent = 1 в server.cfg.
  • `-filePatching` разрешает распакованные папки миссий и работает в паре с allowedFilePatching в конфиге.

Для установки самого сервера нужен аккаунт Steam: выделенный сервер Arma 3 и, что важнее, любой мод из Workshop должны скачиваться с аккаунта, владеющего игрой, а анонимный SteamCMD этого не умеет. На RE:NODE сервер создаётся, как только проходит платёж, а установка ждёт на вкладке Setup эти учётные данные, которые хранятся в том виде, в каком вы их ввели, поэтому используйте запасной аккаунт, а не основной. Сторона загрузки в целом разобрана в статье SteamCMD простыми словами.

Порты образуют блок, начинающийся с -port:

ПортПротоколНазначение
2302UDPИгровой трафик и голос
2303UDPSteam query, порт, с которым общается браузер серверов
2304UDPSteam master
2305UDPЗарезервирован под голос
2306UDPBattlEye

Изменение -port сдвигает весь блок, поэтому двум серверам на одной машине нужно не меньше 100 портов между ними. Именно поэтому тарифы Arma 3 на RE:NODE включают пять выделений, а больше можно добавить на вкладке Network. Если сервер работает, но его никто не находит, первым подозреваемым становится порт query - см. порты игрового сервера.

server.cfg: настройки, которые важны#

Идентификация и доступ:

server.cfg
hostname = "Our Arma 3 server";password = "";passwordAdmin = "a-long-random-string";serverCommandPassword = "a-different-long-string";maxPlayers = 40;admins[] = {"76561198000000000"};motd[] = {"Rules in the Discord", "Teamkilling is a ban"};motdInterval = 5;logFile = "server_console.log";

password - это пароль для входа, и на публичном сервере он пустой. passwordAdmin вы вводите после #login, и он должен быть длинным, потому что любой, кто его знает, сможет перезапустить вашу миссию. serverCommandPassword - третий, отдельный пароль для серверных команд, отдаваемых клиентом, и именно он нужен headless-клиенту. admins[] перечисляет UID игроков, получающих права администратора вообще без входа, и это лучший способ вести персонал на сервере, где администраторов больше одного.

Безопасность:

config
verifySignatures = 2;BattlEye = 1;kickDuplicate = 1;allowedFilePatching = 1;requiredBuild = 0;onUnsignedData = "kick (_this select 0)";onHackedData = "kick (_this select 0)";onDifferentData = "";

verifySignatures = 2 - это настройка, из-за которой ключи модов имеют значение: каждый мод, который загружает клиент, должен быть подписан ключом, лежащим в папке keys/ сервера. Это же причина половины всех сообщений «я не могу зайти», и отключить проверку, чтобы они прекратились, - как раз неверное решение. allowedFilePatching принимает 0 для никого, 1 только для headless-клиентов и 2 для всех; 1 - правильный ответ на сервере, который использует headless-клиент и больше ничего.

Голосования:

config
voteMissionPlayers = 3;voteThreshold = 0.33;allowedVoteCmds[] = {};

voteThreshold больше 1 полностью отключает голосования, чего хочет большинство организованных групп. Если оставить значение по умолчанию на публичном сервере, три человека смогут проголосовать за смену вашей миссии.

Поведение сети:

config
disconnectTimeout = 90;maxdesync = 150;maxping = 500;maxpacketloss = 50;kickClientsOnSlowNetwork[] = {0,0,0,0};

Четыре числа в kickClientsOnSlowNetwork соответствуют desync, ping, потере пакетов и проверке «не отвечает»: 0 предупреждает, 1 кикает. Кикать по ping заманчиво и обычно ошибочно, потому что показатель ping в Arma подскакивает во время загрузки и на загруженном кадре. Сначала предупреждайте, неделю смотрите лог, а потом решайте. Как отличить действительно плохое соединение от загруженного, рассказано в статье задержка, jitter и потеря пакетов.

Персистентность и голос:

config
persistent = 1;autoInit = 1;timeStampFormat = "short";disableVoN = 0;vonCodecQuality = 30;vonCodec = 1;

persistent = 1 оставляет миссию работать, когда уходит последний игрок, - это нужно серверу кампании и не нужно серверу для scrim. autoInit = 1 запускает первую миссию при старте, а не ждёт чьего-либо подключения, и без persistent он вообще ничего не делает.

Сложность переехала из server.cfg#

Начиная с Arma 3 1.58 сложность в server.cfg не настраивается. Конфиг лишь называет пресет для каждой миссии: Recruit, Regular, Veteran или Custom. Сами настройки лежат в профиле сервера - файле .Arma3Profile, который записывается в каталог -profiles, в папку с именем из -name.

server.Arma3Profile
class DifficultyPresets{    class CustomDifficulty    {        class Options        {            reducedDamage = 0;            groupIndicators = 0;            friendlyTags = 0;            enemyTags = 0;            detectedMines = 0;            commands = 1;            waypoints = 1;            weaponInfo = 2;            stanceIndicator = 1;            staminaBar = 1;            weaponCrosshair = 0;            visionAid = 0;            thirdPersonView = 0;            cameraShake = 1;            scoreTable = 1;            deathMessages = 0;            vonID = 1;            mapContent = 0;            autoReport = 0;            multipleSaves = 0;        };        aiLevelPreset = 3;    };    class CustomAILevel    {        skillAI = 0.5;        precisionAI = 0.3;    };};

Две ловушки. Файла не существует, пока сервер хотя бы раз не запускался с -name=, так что на свежей установке до первого запуска править нечего. И сервер перезаписывает профиль при корректном завершении, поэтому правка, сделанная на работающем сервере, отбрасывается в момент, когда вы его нормально останавливаете. Сначала остановите, потом правьте, потом запускайте.

aiLevelPreset = 3 выбирает пользовательский уровень ИИ, заданный ниже. precisionAI - тот параметр, который стоит понизить: при высоких значениях ИИ стреляет с постоянством, которого не переживёт ни один матч с людьми, и большая часть жалоб на несправедливость Arma - это значение precision, которое никто не уменьшил.

Миссии, ротация и персистентность#

Миссии - это файлы .pbo в mpmissions/ с именем вида missionName.worldName. Ротация объявляется в конце server.cfg:

server.cfg
class Missions{    class Mission_01    {        template = "co40_liberation.Altis";        difficulty = "Custom";        class Params {};    };    class Mission_02    {        template = "tvt30_assault.Malden";        difficulty = "Veteran";    };};missionWhitelist[] = {"co40_liberation.Altis", "tvt30_assault.Malden"};

template - это имя файла pbo без расширения, включая мир: co40_liberation.Altis, а не co40_liberation. Ошибка здесь - причина, по которой миссия не появляется в списке. Сервер проигрывает классы по порядку и возвращается к первому, когда заканчивается последний.

class Params задаёт параметры миссии, которые определяет сама миссия: время суток, правила возрождения, количество ИИ. Имена берутся из собственного description.ext миссии, поэтому они разные для каждой миссии, а недопустимый параметр игнорируется без сообщения. Белый список миссий ограничивает то, что можно выбрать или за что можно проголосовать, и это важно на сервере, где любого могут выбрать администратором голосованием.

Для постоянной кампании вся ротация - это одна миссия плюс persistent = 1 и autoInit = 1: сервер запускает миссию при старте, держит её, пока никого нет, и продолжает работать. Для группы с игровыми сессиями оставьте persistent выключенным, чтобы миссия чисто завершалась, когда все ушли, а следующую выбирайте через #missions.

basic.cfg и миф о сетевой настройке#

basic.cfg - место, где умирают интернет-советы по Arma. Типичный файл:

basic.cfg
MaxMsgSend = 128;MaxSizeGuaranteed = 512;MaxSizeNonguaranteed = 256;MinBandwidth = 131072;MaxBandwidth = 2097152000;MinErrorToSend = 0.001;MinErrorToSendNear = 0.01;MaxCustomFileSize = 0;class sockets{    maxPacketSize = 1400;};

Вот неудобная версия. Значения по умолчанию верны почти для любого сервера, значения, гуляющие по постам на форумах, подбирались под конкретную машину на конкретном соединении примерно в 2014 году, и вставка чужого файла с той же вероятностью навредит, что и поможет.

Тронуть стоит два параметра:

  • `MaxCustomFileSize = 0` блокирует пользовательские лица и звуковые файлы игроков. На публичном сервере это очевидная выгода: исчезает целая категория раздражающего контента и небольшая поверхность атаки.
  • `MaxMsgSend` управляет тем, сколько сообщений сервер отправляет за цикл симуляции. Увеличение может снизить desync, когда у сервера есть запас CPU, и ухудшает ситуацию, когда его нет, потому что сообщения тогда встают в очередь. Меняйте на один шаг, запустите #monitor на одну сессию и запишите, что произошло.

maxPacketSize лучше не трогать, если вы не знаете MTU пути, а на хостинговом сервере вы его не контролируете.

Команды администратора#

Войдите из внутриигрового чата командой #login <passwordAdmin> либо попадите в admins[] и пропустите вход.

КомандаЧто делает
#login <password>Стать администратором, #logout для выхода
#missionsОткрывает экран выбора миссии
#restartПерезапускает текущую миссию
#reassignПерезапускает и возвращает всех к выбору слота
#shutdownОстанавливает процесс сервера
#kick <name>Отключает игрока
#exec ban <name>Банит, записывая в список банов
#lock, #unlockЗапрещает и разрешает новые подключения
#userlistВыводит подключённых игроков и их UID
#monitor <seconds>Выводит FPS сервера и количество объектов, 0 для остановки
#vote admin <name>Игроки голосуют за назначение администратором, если разрешено

#monitor 5 - самое полезное в этом списке. Он выводит частоту кадров сервера в чат каждые пять секунд, а FPS сервера - это число, которое решает, хорошо ли играется миссия. Здоровый сервер держится около своего предела. Ниже примерно 20 ИИ начинает заметно плохо себя вести: медленные реакции, запоздалый поиск пути, группы, которые стоят на месте. Ниже 10 не работает ничего, и никакая сетевая настройка не спасёт. Это число падает с ростом количества ИИ, и именно для этого нужен headless-клиент. Общая версия этого довода есть в статье что на самом деле значит tick rate.

Есть ещё собственный RCon от BattlEye, настраиваемый в BEServer_x64.cfg в папке BattlEye через RConPassword и RConPort. К нему подключаются внешние инструменты администрирования, а его протокол не шифруется, поэтому считайте порт только локальным, а пароль - секретом, который никогда нельзя использовать повторно. Общий случай разобран в статье безопасная работа с RCON.

Headless-клиенты#

Симуляция Arma в основном однопоточная, и на долгой миссии именно ИИ в конце концов перегружает этот поток. Headless-клиент - это второй процесс Arma, который подключается к серверу как клиент без графики, берёт во владение группы ИИ, которые ему передаёт миссия, и симулирует их в своём потоке. На миссии, построенной под него, перенос пятидесяти групп ИИ с сервера может стать разницей между перестрелкой на третьем часу, в которую можно играть, и той, что ползёт.

Со стороны сервера нужны три вещи:

server.cfg
headlessClients[] = {"127.0.0.1"};localClient[] = {"127.0.0.1"};serverCommandPassword = "a-different-long-string";

headlessClients[] сообщает серверу, с каких адресов разрешено подключаться как headless. localClient[] помечает их как локальные, что освобождает от ограничений пропускной способности, рассчитанных на игроков с домашними соединениями: без него headless-клиент ограничивается как игрок и не помогает. Оба принимают loopback-адрес, когда headless-клиент работает на той же машине, а так и должно быть.

Со стороны клиента - тот же бинарный файл с -client:

bash
$ ./arma3server_x64 -client -connect=127.0.0.1 -port=2302 \    -password="" -mod="@cba_a3;@ace" \    -profiles=profiles -name=HC -world=empty

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

А теперь то, что большинство руководств пропускает: миссия должна это поддерживать. Headless-клиент ничего не делает, пока в миссии нет слота headless-клиента и кода, передающего ему группы ИИ после подключения. Фреймворки, рассчитанные на долгие миссии, обычно это умеют; миссия из workshop без упоминания об этом в описании, как правило, не умеет, и запуск headless-клиента рядом с ней стоит вам памяти и ничего не даёт.

Две честные оговорки для хостинговых серверов. Headless-клиент - это второй процесс Arma, поэтому ему нужно собственное ядро и пара гигабайт памяти. На тарифе с жёстким лимитом CPU - один контейнер на сервер, ограниченный купленной долей - headless-клиент расходует тот же запас, так что он помогает, только если внутри вашего лимита действительно есть свободный CPU, а не свободные ядра на машине. И если headless-клиенту отказывают при подключении, сначала проверьте headlessClients[], потом список модов: на эти две причины приходится почти каждый случай. Прежде чем решать, в какой именно лимит вы упираетесь, стоит прочитать CPU или RAM для игровых серверов.

Диагностика#

Сервер не появляется в браузере. Порт Steam query, то есть -port плюс один, закрыт или занят. Вход по IP работает, а браузер нет - это быстрый способ подтвердить.

Мои изменения в server.cfg ничего не делают. -config= и -cfg= перепутаны, либо путь неверный, и сервер работает на настройках по умолчанию. Лог запуска называет файл, который был загружен.

Настройки сложности постоянно откатываются. Вы правили профиль на работающем сервере, и он был перезаписан при завершении. Остановите сервер, правьте, запускайте.

Миссии нет в списке. В значении template не хватает имени мира, pbo нет в mpmissions/ или missionWhitelist[] его исключает.

У игроков «session lost» на экране загрузки. Несовпадение мода или подписи. При verifySignatures = 2 ключ должен лежать в keys/, а у клиента должна быть та же версия мода, а не просто тот же мод.

Моды загружаются на Windows и не загружаются на Linux. Linux чувствителен к регистру, а папки модов и имена pbo в Arma часто написаны в смешанном регистре. Приведите папку мода и её содержимое к нижнему регистру или используйте загрузчик, который делает это за вас.

Два часа всё в порядке, а потом всё ползёт. Количество ИИ. Запустите #monitor 5, посмотрите, как падает FPS сервера, и либо сократите ИИ, который порождает миссия, либо настройте headless-клиент.

`autoInit` не запускает миссию. Ему нужен persistent = 1. Еженедельный перезапуск по расписанию на постоянном сервере всё равно стоит иметь - см. расписания перезапусков, которые помогают.

FAQ#

Чем отличаются -config и -cfg в Arma 3?

-config= загружает server.cfg, в котором лежат название сервера, пароли, администраторы, настройки безопасности и ротация миссий. -cfg= загружает basic.cfg, в котором лежит сетевая настройка. Названия неинтуитивны, и если их перепутать, вы молча получите сервер с настройками по умолчанию.

Где задаётся сложность сервера Arma 3?

В профиле сервера, а не в server.cfg. Конфиг лишь называет пресет для каждой миссии; значения, стоящие за Custom, лежат в файле .Arma3Profile в каталоге -profiles. Правьте его при остановленном сервере, иначе он будет перезаписан.

Сколько игроков вмещает сервер Arma 3?

maxPlayers задаёт предел, но реальное ограничение - число слотов миссии и CPU. Шестьдесят игроков на хорошо построенной миссии - обычное дело; тот же сервер умирает на тридцати, если миссия порождает несколько сотен ИИ, потому что именно ИИ съедает время кадра.

Нужен ли мне headless-клиент?

Только если ваша миссия его поддерживает и узкое место - ИИ. Запустите #monitor 5 в тяжёлый момент: если FPS сервера падает при загруженном CPU и в миссии много ИИ, headless-клиент поможет. Если в миссии нет слота headless, он ничего не делает.

Какие порты нужны серверу Arma 3?

UDP 2302 для игры, 2303 для Steam query, 2304 для Steam master, 2305 зарезервирован под голос и 2306 для BattlEye. При изменении -port они сдвигаются блоком.

Можно ли изменить basic.cfg, чтобы исправить desync?

Редко. Desync в Arma почти всегда означает, что у сервера кончилось время кадра, а не что у сети кончилась пропускная способность. Сначала исправьте количество ИИ, измерьте через #monitor, и только потом корректируйте MaxMsgSend, по одному шагу за раз.


Комментарии

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

0/2000