Профили сеанса

Документация версии v0.1.0-beta.3Исходник на GitHub

Перевод исходной страницы на английском языке для OmsiLaunch 0.1.0-beta3. Нормативной является английская страница: при расхождениях приоритет имеют английская страница и код.

Профиль сеанса — это декларативный YAML-пакет, который автор контента поставляет вместе с картой или дополнением, чтобы конечные пользователи могли одной командой запустить воспроизводимый сеанс OmsiLaunch (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). Эта страница — нормативный справочник по формату omsilaunch.session-profile/v1 в том виде, в каком его реализует SessionProfileCompiler в src/OmsiLaunch.Core/SessionProfiles.cs, по правилам приоритета, которые применяет CLI (CliInput.BuildSpecAsync и RejectProfileConflicts в tools/OmsiLaunch.Cli/Program.cs), а также по каталогу параметров, которые может записывать профиль (ConfigurationCatalog). Всё, что умеет профиль, умеют и флаги CLI, и LaunchSpec; профиль лишь упаковывает этот выбор.

Стабильность: STABLE_BETA для разбора, проверки, обнаружения конфликтов и блоков settings / presentation / internet-textures / behavior (офлайн-тест session-profiles.strict-compiler; путь overlay (временная замена файла на время сеанса) и восстановления проверен в runtime в рамках RV-005 и RV-006, см. статус проверки в runtime). Ключи new.date, new.time, new.year и new.weather в этой сборке имеют статус UNAVAILABLE (см. Блок new).

Расположение и именование пакета#

ЭлементПравило
Каталог пакета<installation root>\.omsilaunch\session-profiles\<id>\
Файл профиля<package>\profile.yaml (точное имя, один файл)
РесурсыЛюбые файлы или каталоги внутри каталога пакета, на которые ссылаются относительными путями presentation.splash.assets и internet-textures.profile
idДолжен быть простым именем каталога: он не должен быть пустым или состоять из пробелов, не должен содержать \, / или : и не должен содержать последовательность ... Нарушения дают OL_E_SESSION_PROFILE_PATH_ESCAPE. Значение id, объявленное внутри profile.yaml, должно побайтно совпадать с именем каталога (с учётом регистра); иначе OL_E_SESSION_PROFILE_INVALID.
Выбор/predefined-profile:<id> вместе с /predefined-profile-index:<n>. Индекс обязателен: /predefined-profile без /predefined-profile-index завершается ошибкой OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Пакет отсутствуетOL_E_SESSION_PROFILE_NOT_FOUND
Структура релизаРелизный пакет содержит пример в .omsilaunch\examples\session-profiles\rmg-leste\ (см. упаковку). Примеры не являются профилями: чтобы пакет можно было выбрать, скопируйте его в .omsilaunch\session-profiles\<id>\.

Профиль устанавливает и удаляет пользователь или автор контента. OmsiLaunch никогда не пишет в пакет, никогда его не копирует и никогда не удаляет. Каталог пакета не входит ни в одну транзакцию.

Правила разбора#

ПравилоПоведениеОшибка
Ограничение размераprofile.yaml не должен превышать 256 KiB (262 144 байт)OL_E_SESSION_PROFILE_INVALID
Структура документаРовно один YAML-документ, корневой узел которого — отображение (mapping)OL_E_SESSION_PROFILE_INVALID
Схемаschema должно быть ровно omsilaunch.session-profile/v1 (с учётом регистра)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Якоря и псевдонимыЛюбой узел с YAML-якорем (&name) в любом месте документа отклоняется до проверки; поэтому псевдонимы (*name) встретиться не могутOL_E_SESSION_PROFILE_INVALID («YAML anchors are not supported.»)
Неизвестные ключиКаждое отображение закрыто: ключ, не указанный для своего контекста в таблицах ниже, отклоняется («Unknown property in <context>: <key>»). Ключи сопоставляются с учётом регистра (Schema: — неизвестный ключ). Единственное открытое отображение — settings, ключи которого вместо этого проверяются по каталогу параметров.OL_E_SESSION_PROFILE_INVALID
Скалярные значенияКаждое конечное значение должно быть скаляром; последовательности и отображения там, где ожидается скаляр, отклоняются («<field> must be a scalar.»)OL_E_SESSION_PROFILE_INVALID
ЧислаЦелые числа разбираются с инвариантной культурой (1, 30); в дробных числах в settings разделителем служит .OL_E_SESSION_PROFILE_INVALID
Даты и времяnew.date.value разбирается методом DateOnly.Parse, а new.time.value — методом TimeOnly.Parse, оба с инвариантной культурой; используйте формы ISO yyyy-MM-dd и HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
Синтаксические ошибки YAMLСообщаются с текстом сообщения парсераOL_E_SESSION_PROFILE_INVALID («Invalid YAML: ...»)
Исполняемое содержимоеYAML разбирается с помощью YamlDotNet только в дерево представления; теги, пользовательские типы и выполнение кода не поддерживаются

Обратные косые черты в простых (не заключённых в кавычки) скалярах являются обычными символами. Пути Windows записываются с одинарной обратной косой чертой (maps\Grundorf\global.cfg). Удвоенная обратная косая черта в простом скаляре остаётся в значении удвоенной; см. Пример из релизного пакета.

Справочник по ключам#

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

profile (корневое отображение)#

КлючТипОбязательноОписание
schemaстрокадаЛитерал omsilaunch.session-profile/v1.
idстрокадаИдентификатор пакета; должен совпадать с именем каталога.
nameстрокадаОтображаемое имя; передаётся в SessionProfileMetadata.Name.
authorстрокадаАвтор; передаётся в SessionProfileMetadata.Author.
versionстрокадаСтрока версии пакета (в свободной форме, заключайте в кавычки: "1.0"); передаётся в SessionProfileMetadata.Version.
compatibilityотображениенетСм. compatibility.
newотображениенетЗначения по умолчанию для NEW_MAP. См. new.
presetsпоследовательность отображенийдаОт 1 до 5 записей пресетов. Ноль, более пяти записей или значение, не являющееся последовательностью, дают OL_E_SESSION_PROFILE_INVALID.

compatibility#

КлючТипОбязательноОписание
mapsпоследовательность строкнетИдентификаторы карт (maps\<Map>\global.cfg), для которых действителен этот профиль. / нормализуется в \; сравнение без учёта регистра. Отсутствующий или пустой список означает «любая карта». Непустой список применяется для WorldMode.NewMap (к итоговому new.map или /map) и для WorldMode.SavedSituation (к карте, на которую ссылается выбранный .osn, разрешаемой через каталог контента). Для WorldMode.LastMapState карту определить невозможно, поэтому непустой список всегда приводит к ошибке. Ошибка: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

Блок читается и проверяется всякий раз, когда он присутствует, но применяется к спецификации только тогда, когда выбранный режим мира — NEW_MAP (/new, значение CLI по умолчанию). При /saved:<file.osn> блок игнорируется.

КлючТипОбязательноПрименяетсяОписание
mapстроканетдаИдентификатор карты в нормализованной форме maps\<Map>\global.cfg (планирование требует именно такой формы: начинается с maps\, заканчивается на \global.cfg, без ..). Устанавливает WorldSpec.MapIdentity.
entrypoint-indexцелоенетдаИндекс точки входа из показываемого списка (позиция с отсчётом от 0 в списке точек входа OMSI). Устанавливает PresentedEntrypointIndex и сбрасывает идентификатор точки входа, если он был.
entrypointстроканетдаНеобработанный идентификатор точки входа. Устанавливает EntrypointIdentity и сбрасывает индекс из показываемого списка. Если присутствуют и entrypoint-index, и entrypoint, побеждает entrypoint, потому что он применяется последним. Выбор точки входа по идентификатору имеет статус PARTIAL (BI-001): при планировании world.entrypoint-identity сообщается как RUNTIME_PARTIAL, и план неисполним. Предпочтительно использовать entrypoint-index.
dateотображениенетнет (UNAVAILABLE)См. new.date.
timeотображениенетнет (UNAVAILABLE)См. new.time.
yearцелоенетнет (UNAVAILABLE)Явно заданный год.
weatherотображениенетнет (UNAVAILABLE)См. new.weather.

date, time, year и weather компилируются в DateSpec, TimeSpec, YearSpec и WeatherSpec с DateTimeMode.Explicit / выбранным WeatherMode. Затем планировщик сеанса (src/OmsiLaunch.Core/SessionPlanner.cs) сообщает возможности world.explicit-date, world.explicit-time, world.explicit-year и weather как STATICALLY_PARTIAL, добавляет OL_E_CAPABILITY_UNAVAILABLE в диагностику плана и помечает план как неисполнимый. Кроме того, плагин отклоняет данные передачи при запуске, если режим даты или времени не Unset (plugin.request.unsupported). Следствие для этой сборки: профиль, задающий любой из этих четырёх ключей, можно проверить с помощью /plan, но нельзя запустить сеанс (код выхода 1, OL_E_PLAN_NOT_RUNNABLE). В профилях, предназначенных для запуска, эти ключи следует опускать.

new.date#

КлючТипОбязательноОписание
modeстрокадаДолжно быть explicit (без учёта регистра). Любое другое значение даёт OL_E_SESSION_PROFILE_INVALID («date must use explicit mode.»).
valueстрокадаyyyy-MM-dd.

new.time#

КлючТипОбязательноОписание
modeстрокадаДолжно быть explicit.
valueстрокадаHH:mm или HH:mm:ss.

new.weather#

КлючТипОбязательноОписание
modeстрокадаpreset, icao или real (без учёта регистра). Всё остальное: OL_E_SESSION_PROFILE_INVALID («Unsupported weather mode»).
presetстрокапри mode: presetИмя пресета погоды.
icaoстрокапри mode: icaoКод станции ICAO.

preset (каждая запись presets)#

КлючТипОбязательноПо умолчаниюОписание
indexцелоедаОт 1 до 5, уникален в пределах профиля. Выбирается с помощью /predefined-profile-index. Дубликат или значение вне диапазона: OL_E_SESSION_PROFILE_INVALID; индекс, которого нет нигде в профиле: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idстрокадаИдентификатор пресета; передаётся как SessionProfileMetadata.PresetId.
nameстрокадаОтображаемое имя пресета; передаётся как SessionProfileMetadata.PresetName.
settingsотображениенетнетСемантические параметры options.cfg, см. Параметры. Ключи сопоставляются с каталогом без учёта регистра.
presentationотображениенетнаследуетсяОформление заставки, см. presentation. Если блок отсутствует, пресет наследует базовое значение (значение из /spec или значение CLI по умолчанию, Managed).
internet-texturesотображениенетнаследуетсяСм. internet-textures.
behaviorотображениенетнаследуетсяТайм-ауты, см. behavior.

Применяется только выбранный пресет. Тем не менее разбираются и проверяются все пресеты, поэтому ошибка в пресете 3 приводит к отказу запроса на пресет 1.

presentation#

КлючТипОбязательноОписание
splashотображениедаОбязательно, если присутствует presentation («Presentation requires splash.»). См. presentation.splash.

presentation.splash#

КлючТипОбязательноПо умолчаниюОписание
modeстрокадаmanaged устанавливает на время сеанса растровые изображения заставки OmsiLaunch (SplashMode.Managed). unset или native сохраняет собственные файлы заставки OMSI (SplashMode.Unset; Native — псевдоним). Без учёта регистра. Всё остальное: OL_E_SESSION_PROFILE_INVALID.
languageстроканетENGЯзык второй целевой заставки: PTB, ENG, DEU, FRA (псевдонимы PT-BR, EN, DE, FR; любое неизвестное значение при построении сеанса разрешается в ENG). При mode: managed сеанс накладывает overlay на GUI\NewSplashscreen_ENG.bmp и GUI\NewSplashscreen_<language>.bmp.
assetsстроканетресурсы из пакетаКаталог относительно пакета, содержащий ENG.bmp и, для языка language, отличного от английского, <language>.bmp; каждый файл должен быть 24-битным BMP размером 640x480. Каталог должен существовать при загрузке профиля (OL_E_SESSION_PROFILE_ASSET_MISSING); файлы проверяются при запуске сеанса (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Действуют правила ограничения путей. Если опущено, используется .omsilaunch\assets\splash установки (или значения по умолчанию из пакета).

Профиль не может задать SessionPresentationSpec.SuppressTrayIcon; значение остаётся false, если его не задаёт /spec.

internet-textures#

КлючТипОбязательноОписание
modeстрокадаnative (InternetTexturesMode.Native, OMSI работает как обычно), disabled (Disabled, профилированный встроенный в процесс загрузчик подавляется на время сеанса), override (Override, профиль .itx для сеанса устанавливается как Texture\standard.itx). Без учёта регистра; всё остальное: OL_E_SESSION_PROFILE_INVALID.
profileстрокаобязательно для overrideПуть к файлу .itx относительно пакета. Ключ отсутствует при override: OL_E_SESSION_PROFILE_INVALID; файл отсутствует: OL_E_SESSION_PROFILE_ASSET_MISSING. Действуют правила ограничения путей. Файл должен состоять из пар строк URL / target с URL http:// или https:// (иначе OL_E_ITX_PROFILE_INVALID), и каждая цель должна разрешаться внутри каталога Texture\ установки без прохождения через точку повторной обработки (reparse point) (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Перечисленные цели и Texture\standard.ipr становятся удалениями сеанса (см. транзакции и восстановление после сбоя).

behavior#

КлючТипОбязательноПо умолчаниюОписание
startup-timeoutцелое (секунды)нет180Время, отведённое от запуска процесса до состояния Running. При загрузке профиля должно быть положительным; при запуске сеанс дополнительно требует от 1 до 600 (иначе OL_E_START_SESSION). Соответствует LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutцелое (секунды)нет30Соответствует LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT (принимается для совместимости, сейчас ни на что не влияет): супервизор напрямую завершает OMSI и никогда не читает это значение.

Если блок behavior присутствует, задаются оба тайм-аута (указанное значение или значение по умолчанию), и они полностью заменяют базовый LaunchBehaviorSpec, включая RestoreConfiguration и SuppressStaleClosecheckWarning, которые возвращаются к значениям по умолчанию (true, true).

Параметры#

Ключи settings — это семантические имена из ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). Компилятор принимает ключ, только если он существует (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) и доступен для записи (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Значения хранятся как строки и преобразуются в изменения options.cfg, когда сеанс строит свои overlay; поэтому недопустимое значение обнаруживается в StartSessionAsync, а не при загрузке профиля, и приводит к сбою сеанса с OL_E_START_SESSION, сообщение которого содержит OL_E_INVALID_SETTING_VALUE: <key>. Каждый параметр ниже записывает в options.cfg; все они действуют только в пределах сеанса и после сеанса точно восстанавливаются.

Формы значений:

  • bool — true или false (без учёта регистра). Для токенов присутствия токен добавляется или удаляется; для инвертированных токенов (no_*) true удаляет отрицательный токен.
  • int / decimal проверяются по диапазону; значения с делителем сохраняются делёнными (например, graphics.minObjectScreenPercent: 5 записывает 0.05).
  • string записывается дословно.
Ключ параметраТокен options.cfgТипДиапазон / значенияПодтверждение
general.languagelanguagestringлюбоеSTATICALLY_VALIDATED
general.radioradiostringлюбоеSTATICALLY_VALIDATED
general.alternateViewaltViewbool (присутствие)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (присутствие)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (присутствие)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (инвертированное присутствие)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (присутствие)STATICALLY_VALIDATED
general.currentDateuseActDatebool (присутствие)STATICALLY_VALIDATED
general.currentYearuseActYearbool (присутствие)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringлюбоеSTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, сохраняется /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, сохраняется /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (присутствие)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (присутствие)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (инвертированное присутствие)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, записывается как on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (инвертированное присутствие)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (инвертированное присутствие)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy или fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (блок из 4 строк)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (инвертированное присутствие)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (инвертированное присутствие)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (инвертированное присутствие)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (инвертированное присутствие)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (присутствие)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (инвертированное присутствие)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (инвертированное присутствие)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (оба токена присутствия)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (присутствие)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (присутствие)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (присутствие)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (присутствие)STATICALLY_VALIDATED
traffic.randomVehiclesкомпонент 0 AIMaxCountRandomint0..1000STATICALLY_VALIDATED (RV-005 в runtime)
traffic.humansкомпонент 1 AIMaxCountRandomint0..1000STATICALLY_VALIDATED (RV-005 в runtime)
traffic.factorPercentAIUnschedFactorint1..300STATICALLY_VALIDATED
traffic.parkedVehiclesPercentAIMaxCountParkedint0..100STATICALLY_VALIDATED
traffic.scheduledVehiclesAIMaxCountScheduledint0..1000STATICALLY_VALIDATED
traffic.scheduledLinePriorityAIPriorityScheduledint1..4STATICALLY_VALIDATED
traffic.passengerFactorPercentAIPassFactorint0..200STATICALLY_VALIDATED
sound.stereosound_stereoint0..100STATICALLY_VALIDATED
sound.maxSimultaneousSoundssound_maxcountint5..1000STATICALLY_VALIDATED
sound.masterVolumesound_vol_masterdecimal0..1STATICALLY_VALIDATED

Записи каталога, которые существуют, но недоступны для записи (отклоняются с OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (заменены на advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Ограничение путей#

presentation.splash.assets и internet-textures.profile разрешаются с помощью Confined(package root, value):

  1. Корневые пути (C:\...), пути, начинающиеся с \, и любые пути с компонентом, равным .., отклоняются.
  2. Вычисляется полный путь, и он должен начинаться с каталога пакета.
  3. Каждый существующий компонент ниже корня пакета вплоть до конечного пути включительно проверяется на наличие атрибута ReparsePoint. Junction, символическая ссылка на каталог или символическая ссылка на файл в любом месте этого пути отклоняются, как и компонент, который невозможно проверить (IOException / UnauthorizedAccessException).

Все три вида ошибок дают OL_E_SESSION_PROFILE_PATH_ESCAPE. То же правило для точек повторной обработки применяется к целям .itx внутри Texture\ при построении сеанса.

Приоритет и конфликты переопределения#

CliInput.BuildSpecAsync составляет спецификацию в следующем порядке:

  1. Значения по умолчанию (NEW_MAP, ничего не задано, тайм-ауты 180 s / 30 s).
  2. /spec:<file.json>, если указан, полностью заменяет значения по умолчанию.
  3. Корневой каталог установки: явный аргумент установки имеет приоритет над RootPath из спецификации; . означает каталог, содержащий исполняемый файл.
  4. Профиль (/predefined-profile + /predefined-profile-index): пакет загружается, и RejectProfileConflicts проверяет необработанные аргументы CLI до какого-либо объединения. Затем блок мира в основе сбрасывается в пустой WorldSpec выбранного режима (мир из /spec отбрасывается, если используется профиль), и SessionProfileCompiler.Apply накладывает профиль на основу: new (только NEW_MAP), settings (объединяются поверх Environment.General основы, по каждому ключу побеждает профиль), а также presentation, internet-textures, behavior (каждый заменяет блок основы, только если его определяет пресет).
  5. Остальные аргументы CLI накладываются сверху: /map, /entrypoint, /entrypoint-index, /date, /time, /year, флаги погоды, флаги ТС, /set, флаги заставки, флаги интернет-текстур, /startup-timeout, /shutdown-timeout. Тайм-ауты из CLI применяются, только если указаны; иначе остаётся значение из спецификации/профиля/по умолчанию.
  6. Проверка совместимости для режимов, отличных от NEW_MAP (ValidateCompatibility).

Аргумент CLI, направленный на поле, которым владеет выбранный профиль, является конфликтом и отклоняется с OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (код выхода 2, категория invalid_argument). Проверка выполняется по полю, а не по значению: повтор собственного значения профиля тоже является конфликтом.

Аргумент CLIКонфликтует, если профиль определяетТолько в режиме
/mapnew.mapNEW_MAP
/entrypoint или /entrypoint-indexnew.entrypoint или new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...тот же <key> в settings пресета (без учёта регистра)любом
/splash, /splash-language, /splash-assetspresentation (любой)любом
/internet-textures, /internet-textures-profileinternet-textures (любой)любом
/startup-timeout, /shutdown-timeoutbehavior (любой)любом

Не являются конфликтами: ключи /set, которые пресет не определяет (они добавляются), флаги ТС (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; профиль не может определить ТС игрока) и любой аргумент мира при /saved (блок new там не применяется). /map, /entrypoint и /entrypoint-index недопустимы вместе с /saved независимо от профилей (OL_E_INVALID_ARGUMENT).

Коды ошибок#

КодКогда возникаетКод выхода CLI
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml не существует2
OL_E_SESSION_PROFILE_PATH_ESCAPEid не является простым именем каталога; assets / profile выходит за пределы пакета или проходит через точку повторной обработки2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema не равно omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALIDограничение размера, структура документа, якоря, неизвестный ключ, отсутствующий обязательный ключ, нескалярное значение, неверное число/дата/время, несовпадение id, правила количества/индексов пресетов, неподдерживаемые слова режимов, неположительный тайм-аут, presentation без splash, override без profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND/predefined-profile-index отсутствует, вне диапазона 1..5 или нет пресета с таким index2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNключа settings нет в каталоге2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEключ settings есть в каталоге, но доступен только для чтения2
OL_E_SESSION_PROFILE_ASSET_MISSINGкаталог assets или файл profile не существует внутри пакета2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps не пуст, а итоговой карты в нём нет (или её невозможно определить)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTявный аргумент CLI направлен на поле, которым владеет профиль2

Все эти ошибки возникают во время компиляции командной строки, до планирования. Это SessionProfileException (или ArgumentException для конфликта), и они никогда не запускают сеанс. Полный каталог приведён в разделе ошибки; коды выхода — в разделе коды выхода.

Как профиль отображается в API#

После успешной загрузки спецификация содержит запись SessionProfileMetadata в LaunchSpec.SessionProfile:

ПолеИсточник
Idid
Namename
Versionversion
Authorauthor
PresetIdid выбранного пресета
PresetIndexindex выбранного пресета
PresetNamename выбранного пресета
PackagePathабсолютный путь к каталогу пакета

Планировщик добавляет информационное диагностическое сообщение session_profile.selected в каждый SessionPlan, построенный из такой спецификации, с ключами данных session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name и session_profile.path. Оно не влияет на исполнимость. Интеграторы, напрямую использующие публичный API, могут вызывать SessionProfileCompiler.Load и SessionProfileCompiler.Apply из OmsiLaunch.Core; YAML-представление никогда не попадает в OmsiLaunch.Api.

Примеры#

Пример 1: профиль только с параметрами, один пресет#

<root>\.omsilaunch\session-profiles\quiet-evening\profile.yaml

schema: omsilaunch.session-profile/v1
id: quiet-evening
name: Quiet evening
author: Example author
version: "1.0"
presets:
  - index: 1
    id: default
    name: Low traffic, no autosave
    settings:
      traffic.randomVehicles: 40
      traffic.humans: 60
      general.autoSave: false
      sound.masterVolume: 0.6

Запуск: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. Карта и точка входа берутся из командной строки, потому что профиль не определяет блок new; добавить /set:graphics.maxFPS=60 можно, а добавление /set:traffic.humans=10 является конфликтом.

Пример 2: профиль, привязанный к карте, с тремя пресетами и ресурсами в пакете#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, с assets\splash\ENG.bmp, assets\splash\DEU.bmp и textures\offline.itx внутри пакета:

schema: omsilaunch.session-profile/v1
id: grundorf-tour
name: Grundorf guided tour
author: Example team
version: "2.1"
compatibility:
  maps:
    - maps\Grundorf\global.cfg
new:
  map: maps\Grundorf\global.cfg
  entrypoint-index: 0
presets:
  - index: 1
    id: low
    name: Low-end PC
    settings:
      graphics.maxFPS: 30
      graphics.tileDistance: 3
      graphics.rainReflections: false
    presentation:
      splash:
        mode: managed
        language: DEU
        assets: assets\splash
    internet-textures:
      mode: disabled
    behavior:
      startup-timeout: 300
  - index: 2
    id: mid
    name: Mid-range PC
    settings:
      graphics.maxFPS: 60
      graphics.tileDistance: 6
    internet-textures:
      mode: override
      profile: textures\offline.itx
  - index: 3
    id: high
    name: High-end PC
    settings:
      graphics.maxFPS: 120
      graphics.tileDistance: 10
      advanced.reducedMultithreading: false
    presentation:
      splash:
        mode: native

Запуск: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. С /saved:situations\mytrip.osn блок new пропускается, и .osn должен ссылаться на maps\Grundorf\global.cfg.

Пример из релизного пакета#

Релиз содержит docs/examples/session-profiles/rmg-leste/profile.yaml (просмотр). Он синтаксически корректен, соответствует схеме и загрузился бы без ошибок. Две особенности не позволяют ему в неизменном виде запустить сеанс в этой сборке:

  1. Он задаёт new.date, new.time и new.weather, из-за чего план становится неисполнимым (см. Блок new).
  2. Его значения путей — простые скаляры с удвоенными обратными косыми чертами (maps\\RMG Leste\\global.cfg). YAML сохраняет их удвоенными, а идентификаторы карт сравниваются как текст (только после нормализации / в \), поэтому new.map и compatibility.maps не совпали бы с идентификатором из каталога maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND при планировании). Значение assets при этом разрешается, потому что нормализация путей Windows схлопывает удвоенные разделители.

Исполнимая форма для этой сборки:

schema: omsilaunch.session-profile/v1
id: rmg-leste
name: RMG Leste
author: Equipe RMG
version: "1.0"
compatibility:
  maps:
    - maps\RMG Leste\global.cfg
new:
  map: maps\RMG Leste\global.cfg
  entrypoint-index: 3
presets:
  - index: 1
    id: weak
    name: PC fraco
    settings:
      graphics.maxFPS: 30
      graphics.tileDistance: 3
    presentation:
      splash:
        mode: managed
        language: PTB
        assets: assets\splash
    internet-textures:
      mode: disabled
  - index: 2
    id: medium
    name: PC medio
    settings:
      graphics.maxFPS: 40
      graphics.tileDistance: 5
  - index: 3
    id: strong
    name: PC forte
    settings:
      graphics.maxFPS: 60
      graphics.tileDistance: 8