Сервер Arma 3 настраивается двумя файлами с обманчиво похожими названиями и одним флагом командной строки на каждый. server.cfg, передаваемый через -config=, содержит всё, что относится к серверу как к месту, куда заходят люди: его название, пароли, администраторов, ротацию миссий, настройки безопасности. basic.cfg, передаваемый через -cfg=, содержит несколько значений сетевой настройки, которые почти никому не нужно менять. Сложность не лежит ни в одном из них: она давно переехала в профиль сервера, и это по-прежнему самая частая причина, по которой настройка отказывается сохраняться.
Этот материал проходит по обоим файлам ключ за ключом, затем разбирает ротацию миссий, команды администратора и headless-клиент - единственный самый большой прирост производительности для миссии с большим количеством ИИ, а заодно и то, что чаще всего настраивают неправильно. О загрузке модов, ключах и подписях читайте в статье сервер Arma 3 и список модов, который не загружается.
Запуск сервера: командная строка и порты#
Полная строка запуска на Linux выглядит так:
$ ./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:
| Порт | Протокол | Назначение |
|---|---|---|
2302 | UDP | Игровой трафик и голос |
2303 | UDP | Steam query, порт, с которым общается браузер серверов |
2304 | UDP | Steam master |
2305 | UDP | Зарезервирован под голос |
2306 | UDP | BattlEye |
Изменение -port сдвигает весь блок, поэтому двум серверам на одной машине нужно не меньше 100 портов между ними. Именно поэтому тарифы Arma 3 на RE:NODE включают пять выделений, а больше можно добавить на вкладке Network. Если сервер работает, но его никто не находит, первым подозреваемым становится порт query - см. порты игрового сервера.
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 игроков, получающих права администратора вообще без входа, и это лучший способ вести персонал на сервере, где администраторов больше одного.
Безопасность:
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-клиент и больше ничего.
Голосования:
voteMissionPlayers = 3;voteThreshold = 0.33;allowedVoteCmds[] = {};voteThreshold больше 1 полностью отключает голосования, чего хочет большинство организованных групп. Если оставить значение по умолчанию на публичном сервере, три человека смогут проголосовать за смену вашей миссии.
Поведение сети:
disconnectTimeout = 90;maxdesync = 150;maxping = 500;maxpacketloss = 50;kickClientsOnSlowNetwork[] = {0,0,0,0};Четыре числа в kickClientsOnSlowNetwork соответствуют desync, ping, потере пакетов и проверке «не отвечает»: 0 предупреждает, 1 кикает. Кикать по ping заманчиво и обычно ошибочно, потому что показатель ping в Arma подскакивает во время загрузки и на загруженном кадре. Сначала предупреждайте, неделю смотрите лог, а потом решайте. Как отличить действительно плохое соединение от загруженного, рассказано в статье задержка, jitter и потеря пакетов.
Персистентность и голос:
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.
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:
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. Типичный файл:
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, который подключается к серверу как клиент без графики, берёт во владение группы ИИ, которые ему передаёт миссия, и симулирует их в своём потоке. На миссии, построенной под него, перенос пятидесяти групп ИИ с сервера может стать разницей между перестрелкой на третьем часу, в которую можно играть, и той, что ползёт.
Со стороны сервера нужны три вещи:
headlessClients[] = {"127.0.0.1"};localClient[] = {"127.0.0.1"};serverCommandPassword = "a-different-long-string";headlessClients[] сообщает серверу, с каких адресов разрешено подключаться как headless. localClient[] помечает их как локальные, что освобождает от ограничений пропускной способности, рассчитанных на игроков с домашними соединениями: без него headless-клиент ограничивается как игрок и не помогает. Оба принимают loopback-адрес, когда headless-клиент работает на той же машине, а так и должно быть.
Со стороны клиента - тот же бинарный файл с -client:
$ ./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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.