RE:NODE

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

Сервер Assetto Corsa: конфиг, машины и трассы

Запуск выделенного сервера Assetto Corsa: server_cfg.ini и entry_list.ini, сессии, динамическая трасса, порты, модовый контент и AssettoServer.

0 прочтений

Выделенный сервер Assetto Corsa - это acServer, небольшая программа без графики, которая поставляется вместе с игрой и доступна как бесплатная загрузка через SteamCMD. Настраивается он двумя текстовыми файлами, cfg/server_cfg.ini и cfg/entry_list.ini, ему нужны TCP и UDP на 9600 плюс HTTP-порт 8081, а 2 GB памяти вытянут полную сетку. Контент он не раздаёт: у каждого гонщика должны быть уже куплены или установлены именно те машины и трасса, которые вы указали в конфиге, иначе его отсекут на проверке контрольной суммы.

Этот последний пункт удивляет тех, кто пришёл из других игр. Загрузки при подключении здесь нет. Сервер с модовыми машинами означает, что вы говорите гонщикам, что и откуда ставить, а расхождение версий даже в одном файле заканчивается киком с сообщением, которое никому ничего не объясняет. Разберитесь с этим, и остальное - приятный вечер за выбором длительности сессий.

Что такое выделенный сервер Assetto Corsa#

acServer - собственный серверный бинарник Kunos. Он хранит структуру сессий, отслеживает время кругов и позиции, применяет штрафы и передаёт состояние машин между клиентами. Физика по-прежнему считается на машине каждого гонщика; сервер решает, кто где находится и что происходит в сессии.

Три свойства определяют, как с ним работать:

  • На практике он однопоточный. Настройка NUM_THREADS существует, но полная сетка на одном современном ядре справляется прекрасно, а добавление ядер сервер быстрее не делает.
  • Он отдаёт контент по ссылке, а не по значению. TRACK=ks_nordschleife означает «трасса в папке content/tracks/ks_nordschleife у всех». У сервера есть копия, чтобы считать контрольные суммы; он никому её не отправляет.
  • HTTP-порт не необязателен. Через него идут и регистрация в лобби, и внутриигровая панель сведений о сервере. Сервер с открытым 9600 и закрытым 8081 работает прекрасно и никому не виден.

Assetto Corsa достаточно стара, чтобы окружающая её экосистема значила не меньше, чем базовый сервер. Content Manager - то, чем пользуются почти все, чтобы править эти файлы, запускать серверы и просматривать их список, а AssettoServer - полная замена acServer, на которой работает большинство современных серверов free roam и с трафиком. Оба описаны ниже, но сначала выучите ванильные файлы: всё остальное строится на них.

Требования и потребление ресурсов#

СеткаRAMvCPUПримечания
До 12 машин2 GB1Практика и небольшие лиги
16-24 машины2-3 GB1.5Обычный гоночный сервер
24-32 машины3-4 GB2Ограничен боксами в питлейне, а не железом
AssettoServer с ИИ-трафиком4-8 GB2-3ИИ-машины симулируются на сервере
  • CPU: важна тактовая частота, а не число ядер, как сказано выше. Исключение - AssettoServer с сотнями ИИ-машин трафика: это принципиально иная нагрузка и единственный случай, когда сервер Assetto Corsa становится дорогим.
  • Диск: сам серверный бинарник крошечный. Диск заполняет контент - стандартная установка занимает пару гигабайт, а модовый сервер с трафиком, пятьюдесятью машинами и дорожной сетью в 100 км может дойти до десятков гигабайт.
  • Сеть: состояние каждого клиента рассылается всем остальным, так что трафик растёт примерно как квадрат размера сетки, умноженный на CLIENT_SEND_INTERVAL_HZ. Сервер на 24 машины - это ощутимая, пусть и скромная, нагрузка на исходящий канал. Гонщики чувствуют задержку и джиттер; см. задержка, джиттер и потери пакетов.

Установка сервера#

Папка сервера уже есть в установленной игре по пути steamapps/common/assettocorsa/server/, в ней лежат acServer.exe и бинарник acServer для Linux. Для машины без графики загрузите его напрямую:

bash
$ steamcmd +force_install_dir /home/ac/server +login anonymous \    +app_update 302550 validate +quit$ cd /home/ac/server$ ./acServer

Структура такая:

code
acServercfg/server_cfg.inicfg/entry_list.inicontent/cars/content/tracks/

Скопируйте папки машин и трасс, которые собираетесь использовать. Стандартный контент можно взять из установленной игры; серверу нужны файлы данных для контрольных сумм, а не текстуры высокого разрешения, но копировать всю папку проще, а диск дёшев. Общая схема скриптовых установок и обновлений описана в статье SteamCMD простыми словами, а SFTP и файловый менеджер - практичный способ перенести большую папку с контентом на хостируемый сервер.

server_cfg.ini: важные настройки#

cfg/server_cfg.ini
[SERVER]NAME=Thursday GT3 LeagueCARS=ks_ferrari_488_gt3;ks_mclaren_650_gt3;ks_porsche_911_gt3_r_2016CONFIG_TRACK=TRACK=ks_brands_hatchSUN_ANGLE=16PASSWORD=ADMIN_PASSWORD=change-thisMAX_CLIENTS=20UDP_PORT=9600TCP_PORT=9600HTTP_PORT=8081CLIENT_SEND_INTERVAL_HZ=18REGISTER_TO_LOBBY=1PICKUP_MODE_ENABLED=1LOCKED_ENTRY_LIST=0LOOP_MODE=1RACE_OVER_TIME=180RESULT_SCREEN_TIME=60ALLOWED_TYRES_OUT=2START_RULE=2DAMAGE_MULTIPLIER=50FUEL_RATE=100TYRE_WEAR_RATE=100ABS_ALLOWED=1TC_ALLOWED=1STABILITY_ALLOWED=0AUTOCLUTCH_ALLOWED=1TYRE_BLANKETS_ALLOWED=1FORCE_VIRTUAL_MIRROR=1MAX_CONTACTS_PER_KM=5KICK_QUORUM=85VOTING_QUORUM=80VOTE_DURATION=20BLACKLIST_MODE=1
КлючЧто делает
NAMEНазвание в лобби. Укажите в нём класс и день
CARSИмена папок из content/cars, через точку с запятой
TRACKИмя папки из content/tracks
CONFIG_TRACKВариант трассы, для трасс с несколькими. Пусто для варианта по умолчанию
MAX_CLIENTSРазмер сетки. Не может превышать число боксов на трассе
ADMIN_PASSWORDВводится в чате как /admin password для получения прав администратора
PASSWORDПароль для входа
PICKUP_MODE_ENABLED1 позволяет гонщикам занимать любой свободный слот. 0 - режим бронирования
LOCKED_ENTRY_LIST1 закрепляет каждый слот за GUID, указанным для него
LOOP_MODE1 бесконечно перезапускает последовательность сессий
START_RULE0 заблокировано до зелёного, 1 телепорт в питы, 2 проезд по пит-лейну
ALLOWED_TYRES_OUTСколько колёс можно вынести за трассу, прежде чем засчитается срезание. -1 отключает
DAMAGE_MULTIPLIERВ процентах. 0 - без повреждений, 100 - полные
FUEL_RATE, TYRE_WEAR_RATEПроценты от реального расхода
ABS_ALLOWED, TC_ALLOWED0 запрещено, 1 как с завода, 2 принудительно включено
STABILITY_ALLOWEDСистема стабилизации. 0 для всего соревновательного
MAX_CONTACTS_PER_KMКикает гонщиков, которые продолжают во что-то врезаться. 0 отключает
KICK_QUORUM, VOTING_QUORUMПроцент гонщиков, необходимый для принятия голосования
CLIENT_SEND_INTERVAL_HZЧастота обновлений для клиентов. 18 - значение из поставки
REGISTER_TO_LOBBY1 публично показывает сервер в списке

Несколько замечаний, которые сэкономят вечер:

  • CARS и TRACK - это имена папок, а не отображаемые названия. ks_brands_hatch, а не «Brands Hatch». Откройте content/tracks и скопируйте то, что видите.
  • CONFIG_TRACK - подпапка варианта трассы. У Brands Hatch есть Indy и GP; у Нордшляйфе несколько. Пустое значение на трассе, у которой нет варианта по умолчанию, - частая причина, по которой сервер завершается при запуске.
  • MAX_CLIENTS выше числа боксов на трассе не даёт больше машин. Он даёт сервер, который капризничает в начале сессии. Прежде чем задавать размер сетки, проверьте трассу.
  • CLIENT_SEND_INTERVAL_HZ - самое близкое к настройке частоты тиков, что есть в этой игре. Повышение выше значения из поставки стоит трафика и почти ничего не даёт; если гонщики жалуются на телепортации, сначала посмотрите на потери пакетов. Прежде чем крутить этот регулятор, стоит прочитать что на самом деле означает частота тиков.
  • ADMIN_PASSWORD вводится во внутриигровом чате как /admin и пароль, после чего вам становятся доступны команды /kick, /ban, /next_session и /restart_session.

Ключи времени определяют, как ведёт себя публичный сервер, когда им никто не занимается. LOOP_MODE=1 заставляет последовательность сессий повторяться бесконечно, а это именно то, что нужно, пока рядом нет человека, который бы её перезапускал. RACE_OVER_TIME - сколько времени отстающие могут финишировать после того, как победитель пересёк линию: 180 секунд щедро для спринта и скупо для гонки на выносливость. RESULT_SCREEN_TIME - мёртвое время в конце каждого цикла, так что на загруженном pickup-сервере делайте его коротким.

Ключи голосования стоит задавать осознанно, а не оставлять по умолчанию. KICK_QUORUM=85 означает, что для исключения человека нужно 85 процентов сетки, а на сервере с шестью машинами это все до одного. Если сервер публичный и без присмотра, снизьте значение; если это лига, поднимите до 100 или полностью отключите голосование и полагайтесь на ADMIN_PASSWORD, потому что голосование за кик - инструмент, которым злоупотребляют, когда гонка пошла плохо.

Есть также интерфейс плагинов - UDP_PLUGIN_LOCAL_PORT, UDP_PLUGIN_ADDRESS и AUTH_PLUGIN_ADDRESS, - с помощью которого к серверу подключаются внешние инструменты, такие как трекеры времени кругов и системы рейтинга. Если вы такое не запускаете, оставьте все три пустыми.

Сессии, динамическая трасса и погода#

Последовательность сессий задаётся тем, какие секции существуют и в каком порядке записаны. Сервер только с секцией [PRACTICE] - это сервер открытой практики; добавьте [QUALIFY] и [RACE], и получится гоночный уик-энд по кругу.

ini
[PRACTICE]NAME=PracticeTIME=20IS_OPEN=1[QUALIFY]NAME=QualifyTIME=15IS_OPEN=1[RACE]NAME=RaceLAPS=12WAIT_TIME=60IS_OPEN=1[DYNAMIC_TRACK]SESSION_START=94RANDOMNESS=2LAP_GAIN=30SESSION_TRANSFER=80[WEATHER_0]GRAPHICS=3_clearBASE_TEMPERATURE_AMBIENT=20BASE_TEMPERATURE_ROAD=6VARIATION_AMBIENT=2VARIATION_ROAD=1WIND_BASE_SPEED_MIN=0WIND_BASE_SPEED_MAX=10WIND_BASE_DIRECTION=30WIND_VARIATION_DIRECTION=15

TIME - это минуты для практики и квалификации; в гонке вместо него используется LAPS, а для гонки по времени - TIME. WAIT_TIME - секунды на решётке до того, как погаснут огни. IS_OPEN определяет, могут ли опоздавшие присоединиться к идущей сессии: в лиге ставьте 0 для гонки, а на публичном сервере оставьте 1, где запрет на вход означает лишь пустой сервер.

Динамическая трасса - это сцепление в процентах, и это самая недоиспользуемая возможность файла. SESSION_START=94 начинает с чуть «зелёной» трассы, LAP_GAIN=30 означает, что сцепление улучшается на один процент за каждые тридцать кругов, пройденных всеми гонщиками, а SESSION_TRANSFER=80 переносит восемьдесят процентов набранного сцепления в следующую сессию. Если поставить начало ниже 90, первая практика покажется сломанной любому, кто привык к хотлапам офлайн, так что предупредите людей.

Секции погоды нумеруются с нуля, и сервер выбирает между ними. GRAPHICS - идентификатор пресета погоды, то есть имя папки в погодном контенте игры, так что модовая погода работает, если она есть у всех. BASE_TEMPERATURE_ROAD - это смещение относительно температуры воздуха, а не абсолютное значение: воздух 20 при дороге 6 означает трассу в 26 градусов. Ошибка здесь - причина странного поведения шин на некоторых серверах.

entry_list.ini и стартовая решётка#

Каждый слот на решётке - это запись. Число записей должно быть не меньше MAX_CLIENTS, и ни то, ни другое не может превышать число боксов на трассе.

cfg/entry_list.ini
[CAR_0]MODEL=ks_ferrari_488_gt3SKIN=rosso_corsaSPECTATOR_MODE=0DRIVERNAME=TEAM=GUID=BALLAST=0RESTRICTOR=0[CAR_1]MODEL=ks_mclaren_650_gt3SKIN=00_mclarenSPECTATOR_MODE=0DRIVERNAME=TEAM=GUID=76561198012345678BALLAST=20RESTRICTOR=0

Работу делают четыре поля:

  • MODEL должен быть одной из машин, перечисленных в CARS, а SKIN - папкой в каталоге skins этой машины.
  • Оставьте GUID пустым для открытого слота. Впишите SteamID64, и при LOCKED_ENTRY_LIST=1 этот слот принадлежит только этому гонщику - так лига гарантирует каждому его номер и ливрею.
  • BALLAST в килограммах и RESTRICTOR в процентах - инструменты баланса для каждого гонщика. Это честный способ держать смешанную по уровню лигу плотной, применяемый к каждой записи, а не к каждой машине.
  • SPECTATOR_MODE=1 помечает запись как слот наблюдателя, который не ездит.

Править это вручную для сетки в 24 машины утомительно, и именно тут Content Manager оправдывает своё место: он создаёт оба файла, проверяет, что модели и скины существуют, и умеет упаковать набор контента для ваших гонщиков.

Порты, лобби и подключение#

ПортПротоколНазначение
9600UDPСостояние машин
9600TCPПодключение и чат
8081TCPHTTP: регистрация в лобби и сведения о сервере
регистрация по HTTPпросмотр спискасписок машин и сведениязаезд и гонкаГонщикклиент ACHTTP-точкапорт 8081acServerTCP и UDP 9600Лобби Kunosпубличный список серверов
Как гонщик попадает на сервер Assetto Corsa

Все три порта должны быть доступны из интернета. Классический сбой: открыть 9600 на обоих протоколах, забыть про 8081 и потом не понимать, почему сервер, к которому друзья заходят по прямому подключению, никогда не появляется в списке. Почему игра разбивает себя на порты подобным образом, рассказано в статье порты игровых серверов.

Гонщики заходят через внутриигровой список, через браузер Content Manager или прямым подключением к address:9600. Имя хоста работает так же, как адрес - запись A описана в статье подключение домена к игровому серверу, - и его стоит настроить, если вы ждёте, что люди будут его вводить.

Модовый контент, AssettoServer и CSP#

Модовые машины и трассы - причина, по которой Assetto Corsa жива спустя десять лет, и всё это целиком проблема распространения. Правила такие:

  • Устанавливайте мод на сервер точно так же, как на клиент: папка машины в content/cars, папка трассы в content/tracks.
  • У каждого гонщика должна быть та же версия того же мода. Assetto Corsa считает контрольные суммы ключевых файлов, и гонщика с другой сборкой той же машины отклоняют с ошибкой контрольной суммы. Частичной совместимости нет.
  • Публикуйте точную ссылку на загрузку и версию для всего, что есть на вашем сервере, и храните этот список вместе с резервными копиями конфигов. Сайты с модами тихо выпускают файлы заново, а «на прошлой неделе работало» обычно означает, что кто-то скачал заново.

AssettoServer - это открытая замена acServer. Он читает те же server_cfg.ini и entry_list.ini, добавляет собственный extra_cfg.yml и даёт то, чего у ванильного сервера никогда не было: ИИ-трафик на стороне сервера, погоду и течение времени в реальном времени, синхронизируемые через Custom Shaders Patch, систему плагинов и гораздо лучшие инструменты администрирования. Почти на каждом сервере free roam и с трафиком, на который вы заходили, работает он.

Плата за это в том, что самые интересные возможности требуют Custom Shaders Patch на клиенте, так что сервер, зависящий от CSP, недоступен для чистой установки. Для лиги с фиксированными сессиями на стандартном контенте ванильный acServer проще и вполне достаточен. Для всего, что связано с free roam, нужен AssettoServer, а ИИ-трафик - то, чему нужны дополнительные память и CPU из таблицы размеров выше.

Устранение неполадок#

«Checksum failed» при подключении гонщика. Его копия машины или трассы отличается от серверной. Тот же мод, другая версия, либо набор скинов перезаписал файл данных. Сравните версии, а не переустанавливайте вслепую.

Сервер работает, но его нет в списке. REGISTER_TO_LOBBY=1, затем HTTP-порт. Почти всегда дело в HTTP-порте.

Сервер сразу завершается при запуске. Прочитайте вывод: в нём названа папка машины или трассы, которую не удалось найти. Обычно это опечатка в CARS, отсутствующий вариант трассы в CONFIG_TRACK или контент, скопированный не в ту папку. Как быстро вытаскивать ответ из этого вывода, рассказано в статье как читать консоль.

Машины появляются в странных местах или сессия ломается на старте. MAX_CLIENTS или список записей больше, чем число боксов на трассе.

Все получают проезд по пит-лейну на старте. START_RULE=2 и гонщики, которые двигаются до зелёного. Либо объясните правило, либо поставьте 0.

Гонщиков телепортирует или мотает. Это потери пакетов между ними и сервером, а не CLIENT_SEND_INTERVAL_HZ. Пусть проверят свой маршрут, прежде чем вы поменяете серверную настройку, затрагивающую всех.

Время кругов не сохраняется между сессиями. Ванильный сервер пишет результаты в свою папку результатов и больше никуда. Постоянные таблицы результатов дают плагин на интерфейсе UDP или AssettoServer.

Делайте резервную копию cfg/, списка контента и всей конфигурации плагинов. Сам контент можно скачать заново; конфигурацию, на согласование которой лига потратила три недели, - нет, а резервная копия, из которой вы ни разу не восстанавливались, - это гипотеза, см. резервные копии, из которых действительно восстанавливаются.

FAQ#

Нужно ли владеть Assetto Corsa, чтобы запустить сервер?

Нет. Выделенный сервер - это отдельное бесплатное приложение с app id 302550, оно устанавливается через анонимный вход в SteamCMD. Копия в папке с игрой - то же самое.

Сколько машин вмещает сервер?

Столько, сколько боксов на трассе, а для стандартных трасс это обычно от 18 до 32. Значение MAX_CLIENTS выше этого числа создаёт проблемы, а не добавляет слоты.

Отправляет ли сервер моды игрокам?

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

Чем отличаются acServer и AssettoServer?

acServer - исходный сервер Kunos. AssettoServer - открытая замена, которая читает те же конфиги и добавляет ИИ-трафик, динамическую погоду и время через Custom Shaders Patch и систему плагинов. На AssettoServer работают серверы free roam; лигам с фиксированными сессиями он часто не нужен.

Почему моего сервера нет в лобби?

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

Как закрепить слот за конкретным гонщиком?

Впишите его SteamID64 в поле GUID записи в entry_list.ini и задайте LOCKED_ENTRY_LIST=1. Тогда этот слот, машина и скин принадлежат только ему.


Комментарии

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

0/2000