server.toml
server.toml читается функцией LoadServerConfig — это минимальный плоский parser key = value (подмножество TOML-скаляров), а не полноценный TOML. Практические следствия:
- Только плоские ключи. Секции
[section]и вложенные таблицы игнорируются. - Массивы — в одну строку:
resources = ["a", "b"]. Многострочные массивы не поддерживаются (parser читает файл построчно). - Bool «истинно» при
true,1,yesилиon; любое другое значение =false. - Кавычки вокруг строк необязательны и срезаются автоматически (
name = "X"иname = Xэквивалентны). - Комментарии
#обрезают строку до конца — не используйте#внутри значений (URL, паролей). - Неизвестные ключи молча игнорируются.
Поля разделены на две группы: (A) читаемые parser (их установка работает) и (B) присутствующие в ServerConfig, но НЕ читаемые плоским parser (установка ни на что не влияет — сохраняется значение по умолчанию из сборки).
Пример
name = "My Varion Server"
host = "0.0.0.0"
port = 7788
httpPort = 7789
maxPlayers = 128
maxQueueSlots = 32
gamemode = "roleplay"
channel = "release"
minClientBuild = 0
tickRate = 64
streamingDistance = 300
migrationDistance = 150
debug = false
collectClientDiagnostics = false
encryptTransport = true
announce = true
masterListUrl = "https://master.example/api"
serverPassword = ""
language = "en"
description = "Freeroam + roleplay"
website = "https://example.com"
tags = ["roleplay", "voice"]
resourcesDir = "resources"
resources = ["my-gamemode"]
modulesDir = "modules"
spawnAfterConnect = false(A) Читаемые поля
| Ключ | Тип | Default | Назначение |
|---|---|---|---|
name | string | "Varion Server" | Имя сервера в браузере серверов |
host | string | "0.0.0.0" | Адрес привязки игрового сокета |
port | uint16 | 7788 | UDP/ENet-порт игры |
httpPort | uint16 | 7789 | HTTP-порт (манифест, файлы ресурсов, /server-info.json) |
maxPlayers | uint32 | 1024 | Лимит принятых игроков |
maxQueueSlots | uint32 | 64 | Доп. ENet-слоты для очереди подключения (сверх maxPlayers) |
gamemode | string | "freeroam" | Метка режима для браузера серверов |
channel | string | "release" | Канал релиза (release/rc/dev); клиент должен совпадать |
minClientBuild | uint32 | 0 | Минимальный билд клиента (0 = без ограничения) |
tickRate | uint32 | 64 | Частота серверного тика (Гц) |
streamingDistance | float | 300 | Радиус стриминга сущностей (м) |
migrationDistance | float | 150 | Радиус миграции владельца пустых машин к ближайшему игроку (м) |
debug | bool | false | Debug-логирование |
collectClientDiagnostics | bool | false | Разрешить клиентам выгружать хвосты логов на HTTP-эндпоинт |
clientDiagnosticsDir | string | "logs/client-diagnostics" | Каталог для выгруженных клиентских логов |
encryptTransport | bool | true | Шифрование транспорта (ECDH P-256 + AES-256-GCM) |
announce | bool | true | Публиковать в masterlist (false = не публиковать даже при заданном URL) |
masterListUrl | string | "" | URL masterlist-бэкенда (пусто = не публиковать) |
description | string | "" | Описание для браузера серверов |
website | string | "" | Сайт сервера |
language | string | "en" | Язык сервера |
serverPassword | string | "" | Пароль подключения (пусто = без пароля) |
useEarlyAuth | bool | false | Включить внешнюю страницу входа до завершения подключения |
earlyAuthUrl | string | "" | URL страницы early-auth |
useCloudAuth | bool | false | Включить проверку облачной личности на handshake (см. примечание) |
spawnAfterConnect | bool | false | Только dev: движок спавнит игрока сам (см. примечание) |
resourcesDir | string | "resources" | Каталог ресурсов |
modulesDir | string | "modules" | Каталог нативных модулей |
resources | string[] | [] | Ресурсы по порядку; пусто = авто-скан всех подпапок с resource.toml |
modules / loadModules | string[] | [] | Читается, но НЕ используется (см. примечание) |
tags | string[] | [] | Теги для браузера серверов |
Примечания к (A):
- Точные имена ключей. Именно
maxPlayers,maxQueueSlots,serverPassword. Старыеplayers,queueSlots,passwordне читаются. resourcesпуст → авто-скан. Загрузится каждая подпапкаresourcesDirсresource.toml(ресурсы сenabled = falseпропускаются). Непустой список загружается строго по указанному порядку и по точным именам папок — wildcard-ы (*,dir/*) в нём НЕ раскрываются.- JS host стартует сам. Любой ресурс
type = "js"с непустымmainавтоматически запускает серверный JavaScript-host — запись вmodulesне нужна. modules/loadModulesне влияет на загрузку. Ключ парсится, но загрузчик модулей грузит ВСЕ библиотеки (*.dll/*.so) изmodulesDirнезависимо от этого списка.
(B) Поля, НЕ читаемые плоским parser
Эти поля объявлены в ServerConfig, но у плоского parser нет их разбора — установка в server.toml ни на что не влияет, сохраняется значение из сборки (колонка Default). Не тратьте время на их настройку через TOML.
| Ключ | Тип | Default (из сборки) | Назначение |
|---|---|---|---|
maxEntities | uint32 | 65535 | Верхний лимит сущностей |
maxStreamedEntities | uint32 | 8192 | Лимит одновременно стримингуемых сущностей |
serverAntiCheat | bool | true | Флаг античита |
extendedLogging | bool | true | Расширенное логирование |
masterListToken | string | "" | Inline-токен владельца сервера |
masterListTokenFile | string | "data/masterlist-token.txt" | Путь к кэшу токена |
publicHost | string | "" | Публичный host для бэкенда |
serverId | string | "" | Официальная личность сервера |
serverLicenseToken | string | "" | Inline-proof лицензии |
serverLicenseTokenFile | string | "data/server-license.txt" | Файл proof лицензии |
requireServerLicense | bool | false | Падать при старте без личности/proof |
allowLocalUnlicensed | bool | true | Разрешить локальный dev-режим без лицензии |
dataDir | string | "data" | Каталог данных |
configFile | string | "server.toml" | Путь к конфигу (задаётся аргументом запуска, не из TOML) |
cloudAuthUrl | string | "" | URL проверки облачной личности |
cloudAuthRequired | bool | true | Требовать облачную личность |
cloudApiUrl | string | "" | URL облачного API |
cloudApiToken | string | "" | Токен облачного API |
spawnX | float | 215.76 | X dev-спавна |
spawnY | float | -810.12 | Y dev-спавна |
spawnZ | float | 30.73 | Z dev-спавна |
spawnHeading | float | 157.0 | Heading dev-спавна |
spawnModel | uint32 | 0x705E61F2 (mp_m_freemode_01) | Модель dev-спавна |
debugSpawnRemotePed | bool | false | Тестовый серверный ped через обычный стриминг |
debugRemotePedNetworkId | uint16 | 65000 | Network id тестового ped |
debugRemotePedModel | uint32 | 0x9B22DBAF (player_one) | Модель тестового ped |
debugRemotePedOffsetX | float | 2.0 | Смещение X тестового ped |
debugRemotePedOffsetY | float | 0.0 | Смещение Y тестового ped |
debugRemotePedOffsetZ | float | 0.0 | Смещение Z тестового ped |
debugRemotePedHeading | float | 337.0 | Heading тестового ped |
Две важные асимметрии
- Cloud-auth подключён наполовину.
useCloudAuthчитается (можно включить), но ни одно из его детальных полей —cloudAuthUrl,cloudAuthRequired,cloudApiUrl,cloudApiToken— не читается. Облачную проверку можно включить, но нельзя настроить через TOML. (Early-auth, напротив, подключён полностью: читаются иuseEarlyAuth, иearlyAuthUrl.) - Dev-спавн фиксирован.
spawnAfterConnectчитается (dev-fallback можно включить), ноspawnX/Y/Z,spawnHeading,spawnModelне читаются — точка спавна жёстко зашита в сборку (215.76, -810.12, 30.73, heading157, модельmp_m_freemode_01). Для боевого сервера держитеspawnAfterConnect = falseи спавните из ресурса в обработчикеplayerReadyчерез SDK.
Идентичность и лицензия
Поля личности и лицензии (serverId, masterListToken, serverLicenseToken*, requireServerLicense, allowLocalUnlicensed, publicHost) и модель доверия описаны в Masterlist. Важно: кроме masterListUrl и announce, перечисленные там ключи текущим плоским parser server.toml не читаются — они сохраняют значения из сборки.