Référence de LaunchSpec

Documentation de la version v0.1.0-beta.3Voir la source sur GitHub

Traduction de la page originale en anglais d’OmsiLaunch 0.1.0-beta3. La page anglaise fait foi : en cas de divergence, la page anglaise et le code prévalent.

Cette page est la référence normative de LaunchSpec, l'enregistrement de requête qui décrit une session OmsiLaunch : sa forme C# (OmsiLaunch.Api), sa forme de fichier JSON telle que chargée par la CLI (/spec:<path>, tools/OmsiLaunch.Cli/LaunchSpecJson.cs), chaque propriété avec son type, sa valeur par défaut, sa règle de validation et son effet actuel, les règles de validation qui rendent un plan non exécutable, et la priorité entre les options de la CLI, les fichiers de spécification et les profils de session. Seul ce que fait le code actuel est documenté.

Pages associées : API publique, référence de la CLI, profils de session, codes d'erreur, cycle de vie de la session, capacités.

Origine d'un LaunchSpec#

SourceComment elle devient un LaunchSpec
APIL'intégrateur construit l'enregistrement et le transmet à PlanSessionAsync.
Options de la CLICliInput.BuildSpecAsync part des valeurs par défaut intégrées (NEW_MAP, tout non défini, valeurs par défaut de Behavior) et applique les options.
Fichier JSON /spec:<path>Chargé par LaunchSpecJson.LoadAsync, puis utilisé comme base que les options de la CLI remplacent (voir priorité).
Profil de session (/predefined-profile:<id> /predefined-profile-index:<n>)SessionProfileCompiler.Apply écrit dans la base le monde, les paramètres, la présentation, les textures Internet et le comportement du profil, et enregistre les métadonnées SessionProfile.

L'exemple complet ci-dessous est vérifié par rapport à la forme de l'enregistrement. Une copie de l'exemple minimal est livrée sous examples/release-session.example.json (et .omsilaunch\examples\release-session.example.json dans le paquet de version).

Forme JSON#

RègleDétail
SérialiseurSystem.Text.Json avec PropertyNameCaseInsensitive = true, ReadCommentHandling = Skip, AllowTrailingCommas = true ; aucun convertisseur n'est enregistré.
Noms de propriétésLes noms de propriétés C# (Installation, RootPath, ...). La correspondance est insensible à la casse au chargement ; la CLI les écrit en PascalCase.
ÉnumérationsEntiers (il n'existe pas de convertisseur d'énumération en chaîne). "Mode": 0 est valide ; "Mode": "NewMap" est rejeté comme JSON mal formé. Les valeurs sont listées dans Énumérations.
OptionalValue<T>Un objet { "Presence": 0 | 1, "Value": <T or null> }. Presence 0 = Unset (la valeur est ignorée), 1 = Set (la valeur doit être présente et non nulle ; un Set avec une valeur nulle n'est pas validé et se comporte comme une valeur invalide). Un membre OptionalValue omis vaut Unset. Le membre en lecture seule IsSet apparaît dans la sortie écrite par la CLI ; il est accepté et ignoré au chargement.
Enregistrements facultatifsYear, Weather, Input, Diagnostics, Presentation, InternetTextures, SessionProfile peuvent être null ou omis ; les accesseurs Effective* substituent les valeurs par défaut.
Enregistrements obligatoiresInstallation, World, Date, Time, Environment (avec les huit dictionnaires, utilisez {}), Behavior doivent être des objets présents. Ils ne sont pas validés : un enregistrement null ou manquant échoue plus tard sur une référence nulle, que la CLI signale comme OL_E_INTERNAL (sortie 10) ou OL_E_INVALID_ARGUMENT (sortie 2).
Propriétés inconnuesRejetées avant la liaison : OL_E_SPEC_UNKNOWN_PROPERTY: $.Path.Name (le chemin utilise les noms de membres tels qu'écrits dans le fichier). Le contenu des dictionnaires (Environment.*) n'est pas vérifié en tant que propriétés.
RacineDoit être un objet JSON : OL_E_SPEC_INVALID. Profondeur d'imbrication maximale 32.
Taille du fichierAu plus 1 MiB (1 048 576 octets) : OL_E_SPEC_TOO_LARGE. Fichier manquant : OL_E_SPEC_NOT_FOUND.
Commentaires et virgules finalesLes commentaires // et /* */ ainsi que les virgules finales sont acceptés.
JSON mal forméL'exception de l'analyseur n'est pas traduite : la CLI signale OL_E_INTERNAL avec le code de sortie 10.
EncodageUTF-8 (une BOM est tolérée par le lecteur). Les barres obliques inverses dans les identités doivent être échappées ("maps\\Grundorf\\global.cfg") ; les barres obliques sont acceptées pour les identités de carte, de situation, de véhicule et de HOF.

Exemple complet#

{
  // Comments and trailing commas are accepted. Enums are integers.
  "Installation": {
    "RootPath": ".",                          // "." = directory that contains OmsiLaunch.exe (CLI only)
    "ExpectedExecutableSha256": null          // carried, not consumed
  },
  "World": {
    "Mode": 0,                                // 0 NewMap, 1 SavedSituation, 2 LastMapState (unavailable)
    "MapIdentity": { "Presence": 1, "Value": "maps\\Grundorf\\global.cfg" },
    "SituationIdentity": { "Presence": 0, "Value": null },
    "PresentedEntrypointIndex": { "Presence": 1, "Value": 1 },
    "EntrypointIdentity": { "Presence": 0, "Value": null }
  },
  "Date": { "Mode": 0, "Value": { "Presence": 0, "Value": null } },
  "Time": { "Mode": 0, "Value": { "Presence": 0, "Value": null } },
  "Year": null,
  "Weather": null,
  "PlayerVehicle": { "Presence": 0, "Value": null },
  "Environment": {
    "General": {
      "traffic.randomVehicles": { "Presence": 1, "Value": "150" },
      "graphics.maxFPS": { "Presence": 1, "Value": "60" }
    },
    "Advanced": {}, "Graphics": {}, "AdvancedGraphics": {},
    "Sound": {}, "AiPassengers": {}, "Keyboard": {}, "Controllers": {}
  },
  "Behavior": {
    "RestoreConfiguration": true,             // carried, restore always happens
    "SuppressStaleClosecheckWarning": true,
    "StartupTimeoutSeconds": 180,             // 1..600
    "ShutdownTimeoutSeconds": 30              // carried, not consumed
  },
  "Input": null,
  "Diagnostics": null,
  "Presentation": {
    "Splash": 1,                              // 0 Unset/Native (keep OMSI files), 1 Managed
    "Language": { "Presence": 0, "Value": null },
    "CustomAssetDirectory": { "Presence": 0, "Value": null },
    "SuppressTrayIcon": false
  },
  "InternetTextures": {
    "Mode": 0,                                // 0 Native, 1 Disabled, 2 Override
    "OverrideProfilePath": { "Presence": 0, "Value": null }
  },
  "SessionProfile": null
}

Une date explicite, lorsque le build la prend en charge, s'écrit "Date": { "Mode": 1, "Value": { "Presence": 1, "Value": { "Year": 2024, "Month": 5, "Day": 1 } } } et une heure { "Mode": 1, "Value": { "Presence": 1, "Value": { "Hour": 7, "Minute": 30, "Second": 0 } } }. Sur ce build, les deux rendent le plan non exécutable (voir ci-dessous).

Référence des propriétés#

La colonne « Consommée » indique ce que le code actuel fait de la valeur. La stabilité utilise le vocabulaire de la page de l'API publique.

LaunchSpec (racine)#

PropriétéType JSONObligatoireValeur par défaut si omiseConsomméeStabilité
Installationobjet InstallationSpecouiaucuneouiSTABLE_BETA
Worldobjet WorldSpecouiaucuneouiSTABLE_BETA
Dateobjet DateSpecouiaucunevalidée ; tout mode autre que Unset est non exécutablePARTIAL
Timeobjet TimeSpecouiaucunevalidée ; tout mode autre que Unset est non exécutablePARTIAL
PlayerVehicleOptionalValue<PlayerVehicleSpec>nonUnsetrésolue pour les diagnostics ; tout champ défini est non exécutablePARTIAL
Environmentobjet EnvironmentSpecouiaucuneoui (overlay sémantique de options.cfg)STABLE_BETA
Behaviorobjet LaunchBehaviorSpecouiaucuneen partie (voir l'enregistrement)STABLE_BETA / PARTIAL
Yearobjet YearSpec ou nullnonnull → EffectiveYear = mode Unsettout mode autre que Unset est non exécutablePARTIAL
Weatherobjet WeatherSpec ou nullnonnull → EffectiveWeather = mode Unsettout mode autre que Unset est non exécutablePARTIAL
Inputobjet InputSpec ou nullnonnull → EffectiveInput = les deux non définistout document défini est non exécutablePARTIAL
Diagnosticsobjet DiagnosticsSpec ou nullnonnull → EffectiveDiagnostics = valeurs par défauttransportée uniquementPARTIAL
Presentationobjet SessionPresentationSpec ou nullnonnull → EffectivePresentation = écran de démarrage géré, pas de langue, pas de répertoire personnalisé, icône de notification affichéeouiSTABLE_BETA
InternetTexturesobjet InternetTexturesSpec ou nullnonnull → EffectiveInternetTextures = NativeouiSTABLE_BETA / EXPERIMENTAL
SessionProfileobjet SessionProfileMetadata ou nullnonnullprovenance uniquement (diagnostic de plan session_profile.selected)STABLE_BETA

Accesseurs en lecture seule (présents dans la sortie JSON de la CLI, ignorés au chargement) : EffectiveYear, EffectiveWeather, EffectiveInput, EffectiveDiagnostics, EffectivePresentation, EffectiveInternetTextures.

InstallationSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
RootPathchaîneobligatoireRépertoire contenant Omsi.exe et plugins\. Voir les règles de chemin. Vide/espaces uniquement → OL_E_INSTALLATION_NOT_FOUND.ouiSTABLE_BETA
ExpectedExecutableSha256chaîne ou nullnullN'importe quelle chaîne.Aucun consommateur dans le code actuel : l'hôte calcule toujours le hash de Omsi.exe et le compare au profil de build, jamais à cette valeur.PARTIAL (transportée, actuellement sans effet)

WorldSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
ModeWorldMode intobligatoire0 NewMap, 1 SavedSituation, 2 LastMapState (LastSituation est un alias obsolète de même valeur 2).oui ; LastMapState → OL_E_CAPABILITY_UNAVAILABLENewMap, SavedSituation : STABLE_BETA ; LastMapState : UNAVAILABLE
MapIdentityOptionalValue<string>UnsetPour NewMap : obligatoire, de la forme maps\<dir>\global.cfg (insensible à la casse, / accepté, pas de ..) et installée. Ignorée pour SavedSituation (le .osn fournit la carte).oui (handoff)STABLE_BETA
SituationIdentityOptionalValue<string>UnsetPour SavedSituation : obligatoire, une identité situations\...\<file>.osn installée (telle que renvoyée par DiscoverAsync(Situations) / /list:situations).oui (handoff)STABLE_BETA
PresentedEntrypointIndexOptionalValue<int>UnsetPour NewMap sans EntrypointIdentity : obligatoire, >= 0, un index dans la liste des points d'entrée présentée par OMSI pour la carte. Envoyé au plugin sous la forme -1 lorsqu'il n'est pas défini.oui (handoff)STABLE_BETA
EntrypointIdentityOptionalValue<string>UnsetUn libellé brut de point d'entrée ou une identité de découverte. La définir rend le plan non exécutable (world.entrypoint-identity, RUNTIME_PARTIAL, OL_E_CAPABILITY_UNAVAILABLE).transportéePARTIAL
EntrypointEntrypointSpec (lecture seule)calculéeMode = Identity lorsque EntrypointIdentity est défini, sinon PresentedIndex lorsque l'index est défini, sinon Unset ; PresentedIndex, Identity reflètent les entrées.dérivéeSTABLE_BETA

DateSpec, TimeSpec, YearSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
ModeDateTimeMode intobligatoire (Year : 0 lorsque l'enregistrement est null)0 Unset, 1 Explicit, 2 System.Explicit/System → entrée unsupported (world.explicit-date, world.explicit-time, world.explicit-year, STATICALLY_PARTIAL) et OL_E_CAPABILITY_UNAVAILABLE. Les modes sont également copiés dans le handoff de démarrage, que le plugin rejette lorsqu'ils ne valent pas Unset (jamais atteint, car le plan est non exécutable).PARTIAL
ValueOptionalValue<SemanticDate> / OptionalValue<SemanticTime> / OptionalValue<int>UnsetSemanticDate : Year, Month 1..12, Day 1..31 ; SemanticTime : Hour 0..23, Minute 0..59, Second 0..59. Doit être définie lorsque Mode vaut Explicit (sinon OL_E_DATE_TIME_APPLY_FAILED) et ne doit pas être définie lorsque Mode ne vaut pas Explicit (OL_E_INVALID_ARGUMENT). YearSpec.Value n'est pas validée.validée uniquementPARTIAL

WeatherSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
ModeWeatherMode int0 lorsque l'enregistrement est null0 Unset, 1 Preset, 2 Icao, 3 RealCurrent.Tout mode autre que Unset → entrée non prise en charge weather et OL_E_CAPABILITY_UNAVAILABLE.PARTIAL
PresetOptionalValue<string>UnsetNom de préréglage (non validé).transportéePARTIAL
IcaoOptionalValue<string>UnsetCode OACI (non validé).transportéePARTIAL

PlayerVehicleSpec (dans PlayerVehicle)#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
ModelOptionalValue<string>UnsetIdentité Vehicles\...\<file>.bus installée, sinon OL_E_VEHICLE_NOT_FOUND.résolue dans ResolvedContent ; ensuite player-vehicle.model non pris en charge → OL_E_CAPABILITY_UNAVAILABLEPARTIAL
RepaintOptionalValue<string>UnsetUne identité de livrée de Model (<cti>#item:<n>), sinon OL_E_REPAINT_NOT_FOUND ; vérifiée uniquement lorsque Model est défini.idemPARTIAL
HofOptionalValue<string>UnsetVehicles\...\<file>.hof installé, sinon OL_E_HOF_NOT_FOUND.idemPARTIAL
FleetNumberOptionalValue<string>UnsetN'importe quelle chaîne.OL_E_CAPABILITY_UNAVAILABLEPARTIAL
RegistrationOptionalValue<string>UnsetN'importe quelle chaîne.OL_E_CAPABILITY_UNAVAILABLEPARTIAL
Enabledbool (lecture seule)calculéetrue lorsque Model est défini. C'est PlayerVehicle.IsSet que le handoff transporte sous le nom PlayerVehicleEnabled.dérivéePARTIAL

Un PlayerVehicle avec Presence 1 et tous les champs non définis est accepté et n'a aucun effet. Tout champ défini rend le plan non exécutable sur ce build (STATICALLY_PARTIAL).

EnvironmentSpec#

PropriétéTypeValeur par défautConsomméeStabilité
General, Advanced, Graphics, AdvancedGraphics, Sound, AiPassengers, Keyboard, ControllersIReadOnlyDictionary<string, OptionalValue<string>> chacune, obligatoire ({} si vide)aucuneouiSTABLE_BETA

Les huit groupes sont concaténés ; le groupe dans lequel une clé est placée n'a aucun effet. Chaque entrée avec Presence 1 est un paramètre sémantique de ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs) ; la clé sélectionne le fichier cible (options.cfg pour toutes les clés actuelles) et le jeton. La planification vérifie que la clé existe (OL_E_UNKNOWN_SETTING) et qu'elle est accessible en écriture (OL_E_SETTING_NOT_WRITABLE) ; la valeur n'est validée qu'au démarrage (OL_E_INVALID_SETTING_VALUE, signalé comme une session Failed avec OL_E_START_SESSION). Les clés sont insensibles à la casse. Les entrées non définies sont ignorées. L'option de la CLI /set:<key>=<value> écrit dans General ; les settings des profils de session sont également fusionnés dans General.

CléValeurRemarques
general.languagechaînejeton [language]
general.radiochaîne
general.alternateView, general.showOwnDriver, general.showErrorMessages, general.autoSave, general.currentTime, general.currentDate, general.currentYeartrue / falsejetons de présence (autoSave est l'inverse de noAutoSave)
graphics.screenRatiochaîne
graphics.maxFPSentier 10..200
graphics.tileDistanceentier 1..20
graphics.maxObjectDistanceMetersnombre 20..5000
graphics.minObjectScreenPercentnombre 0..10stocké divisé par 100
graphics.minReflectionObjectScreenPercentnombre 0..50stocké divisé par 100
graphics.maxObjectComplexityentier 0..3
graphics.maxMapComplexityentier 0..2
graphics.sunGlow, graphics.loadAllTiles, graphics.stencilBuffer, graphics.rainReflections, graphics.humansInRainReflectionstrue / falsejetons de présence
graphics.stencilShadowstrue / falseécrit sous la forme on / off
graphics.realTimeReflectionseconomy / fullSTATICALLY_PARTIAL
graphics.particlesenabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)un bloc smokesystems
simulation.collision, simulation.collisionTerrain, simulation.collisionVehicles, simulation.collisionPedestrians, simulation.disableAutomaticScheduleAnalysisPopup, simulation.ticketInfo, simulation.automaticClutchtrue / falsejetons de présence
simulation.ticketSellingentier 0..2
simulation.maintenanceentier 0..4
advanced.reducedMultithreadingtrue / falsedeux jetons OMSI à la fois (RUNTIME_PROVEN)
view.driverSmooth, view.driverMoving, controls.autoCenter, controls.reducedSteeringSpeedtrue / falsejetons de présence
traffic.randomVehiclesentier 0..1000composante 0 du bloc multiligne AIMaxCountRandom (validé à l'exécution, matrice RV-005)
traffic.humansentier 0..1000composante 1 de AIMaxCountRandom
traffic.factorPercentnombre 1..300
traffic.parkedVehiclesPercentnombre 0..100
traffic.scheduledVehiclesnombre 0..1000
traffic.scheduledLinePrioritynombre 1..4
traffic.passengerFactorPercentnombre 0..200
sound.stereonombre 0..100
sound.maxSimultaneousSoundsnombre 5..1000
sound.masterVolumenombre 0..1
advanced.multithreadingCalculate, advanced.multithreadingTextureLoad, graphics.texture, graphics.textureFilterrejetéesconnues mais non accessibles en écriture → OL_E_SETTING_NOT_WRITABLE

Les fichiers modifiés conservent leur encodage (octets Windows-1252 préservés ; UTF-8/UTF-16 marqués par une BOM respectés) et leurs fins de ligne.

LaunchBehaviorSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
RestoreConfigurationbooltruetoutesAucun consommateur : les fichiers détenus par la session sont toujours restaurés à l'identique.PARTIAL (transportée, actuellement sans effet)
SuppressStaleClosecheckWarningbooltruetoutestrue : un fichier closecheck qui existe avant la session est supprimé définitivement au démarrage (diagnostic closecheck.stale-removed avec son SHA-256 ; échec OL_E_CLOSECHECK_REMOVE_FAILED). false : un closecheck existant est laissé tel quel et ne constitue pas une suppression de session. Le closecheck qu'OMSI écrit pendant la session est toujours supprimé lors de la restauration.STABLE_BETA
StartupTimeoutSecondsint1801..600 (sinon ArgumentOutOfRangeException levée par StartSessionAsync ; l'option de la CLI /startup-timeout impose 1..600 ; les profils exigent > 0). Budget de temps entre le démarrage du superviseur et Running ; à l'expiration, la session échoue avec OL_E_STARTUP_TIMEOUT (plugin démarré) ou OL_E_PLUGIN_NOT_LOADED.ouiSTABLE_BETA
ShutdownTimeoutSecondsint30tout int (CLI /shutdown-timeout 1..600)Aucun consommateur : le superviseur termine OMSI immédiatement avec TerminateProcess ; il n'y a pas d'attente d'arrêt coopératif.PARTIAL (transportée, actuellement sans effet)

InputSpec#

PropriétéTypeValeur par défautConsomméeStabilité
KeyboardDocumentOptionalValue<string>UnsetDéfinie → input.keyboard non pris en charge (STATICALLY_PARTIAL) et OL_E_CAPABILITY_UNAVAILABLE. L'exécution PATCH/REPLACE du clavier n'est pas implémentée.PARTIAL
ControllerDocumentOptionalValue<string>UnsetDéfinie → input.controller non pris en charge et OL_E_CAPABILITY_UNAVAILABLE.PARTIAL

DiagnosticsSpec#

PropriétéTypeValeur par défautConsomméeStabilité
LogbooltrueAucun consommateur dans src/. La trace de l'hôte <root>\.omsilaunch\diagnostics\<sessionId>-host.log est toujours écrite.PARTIAL (transportée, actuellement sans effet)
VerboseboolfalseAucun consommateur.PARTIAL
OmsiLogAllboolfalseAucun consommateur.PARTIAL
ProcessTraceboolfalseAucun consommateur.PARTIAL
PluginTraceboolfalseAucun consommateur.PARTIAL
NativeTraceboolfalseAucun consommateur.PARTIAL

Les options de la CLI /log, /logall, /omsi-logall, /verbose, /trace, /trace-process, /trace-plugin, /trace-native renseignent ces booléens (/logall définit Verbose, ProcessTrace, PluginTrace, NativeTrace) ; elles sont combinées par OU avec les valeurs de la spécification.

SessionPresentationSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
SplashSplashMode int1 (Managed)0 Unset (alias Native) : les fichiers d'écran de démarrage propres à OMSI ne sont pas modifiés. 1 Managed : OmsiLaunch applique en overlay GUI\NewSplashscreen_ENG.bmp et GUI\NewSplashscreen_<LANG>.bmp pour la session (restaurés à l'identique ensuite).ouiSTABLE_BETA (matrice RV-006)
LanguageOptionalValue<string>UnsetPTB/PT-BR, ENG/EN, DEU/DE, FRA/FR (insensible à la casse) ; toute autre valeur est normalisée en ENG. Lorsqu'elle n'est pas définie, la valeur [language] de options.cfg est lue et normalisée de la même manière.oui (écran de démarrage géré uniquement)STABLE_BETA
CustomAssetDirectoryOptionalValue<string>UnsetRépertoire contenant ENG.bmp et <LANG>.bmp (640×480, BMP 24 bits). Voir les règles de chemin. Répertoire manquant : OL_E_SPLASH_ASSET_DIRECTORY_MISSING ; fichier manquant : OL_E_SPLASH_ASSET_MISSING ; format incorrect : OL_E_SPLASH_FORMAT_UNSUPPORTED. Lorsqu'elle n'est pas définie, <root>\.omsilaunch\assets\splash est utilisé (initialisé une fois à partir du paquet), sinon le assets\splash du paquet.oui (écran de démarrage géré uniquement)STABLE_BETA
SuppressTrayIconboolfalsetrue supprime l'indicateur autonome de la zone de notification Windows du propriétaire CLI.Propriétaire CLI uniquement ; l'API n'a pas d'icône de notification. Il n'existe pas d'option de la CLI ; la valeur ne peut provenir que d'un fichier de spécification.STABLE_BETA

InternetTexturesSpec#

PropriétéTypeValeur par défautValeurs validesConsomméeStabilité
ModeInternetTexturesMode int0 (Native)0 Native : rien ne change. 1 Disabled : le plugin neutralise le téléchargeur intégré au processus d'OMSI (télémétrie internet-textures.suppressed / internet-textures.suppression.failed). 2 Override : le profil .itx est appliqué en overlay sous Texture\standard.itx ; ses fichiers cibles et Texture\standard.ipr deviennent des suppressions de session.ouiNative : STABLE_BETA ; Disabled, Override : EXPERIMENTAL
OverrideProfilePathOptionalValue<string>UnsetObligatoire pour Override (OL_E_ITX_PROFILE_REQUIRED). Un fichier texte composé de paires de lignes : une URL http/https absolue, puis un chemin cible relatif à la racine de l'installation qui contient un composant Texture\, n'est pas enraciné, ne contient pas .., ne commence pas par \ et ne traverse aucune jonction ni aucun lien symbolique (OL_E_ITX_PROFILE_INVALID, OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Voir les règles de chemin.ouiEXPERIMENTAL

SessionProfileMetadata#

PropriétéTypeConsomméeStabilité
Id, Name, Version, Author, PresetId, PresetIndex, PresetName, PackagePathchaînes / intEnregistrées dans le diagnostic de plan session_profile.selected (Data["session_profile.*"]). Pas consommées autrement ; normalement renseignées par le compilateur de profils de session, pas à la main.STABLE_BETA

Énumérations#

ÉnumérationValeurs (entier JSON)
WorldModeNewMap = 0, SavedSituation = 1, LastMapState = 2, LastSituation = 2 (alias obsolète ; il s'agit de la branche native d'OMSI « dernier état de la carte », jamais du .osn le plus récent)
DateTimeModeUnset = 0, Explicit = 1, System = 2
WeatherModeUnset = 0, Preset = 1, Icao = 2, RealCurrent = 3
SplashModeUnset = 0, Native = 0 (alias), Managed = 1
InternetTexturesModeNative = 0, Disabled = 1, Override = 2
PresenceUnset = 0, Set = 1
EntrypointMode (Entrypoint.Mode en lecture seule)Unset = 0, PresentedIndex = 1, Identity = 2

Les entiers hors de la plage déclarée sont stockés tels quels par le sérialiseur et se comportent comme des valeurs inconnues (par exemple, un WorldMode inconnu n'est ni NEW_MAP ni SAVED_SITUATION et produit un plan sans capacité de monde ; le plugin le rejetterait, mais la CLI remplace de toute façon le mode, voir la priorité).

Règles de validation et diagnostics de non-exécutabilité#

PlanSessionAsync exécute LaunchValidation.Validate puis SessionPlanner.PlanAsync. Un plan est exécutable exactement lorsqu'aucun code de diagnostic ne commence par OL_E_. L'ensemble complet :

DiagnosticConditionSource
OL_E_INSTALLATION_NOT_FOUNDInstallation.RootPath vide ou composé uniquement d'espacesLaunchValidation
OL_E_DATE_TIME_APPLY_FAILEDDate.Mode = Explicit sans valeur définie ou avec un mois/jour hors plage ; Time.Mode = Explicit sans valeur définie ou avec une heure/minute/seconde hors plageLaunchValidation
OL_E_INVALID_ARGUMENTDate.Value ou Time.Value définie alors que le mode ne vaut pas ExplicitLaunchValidation
OL_E_MAP_NOT_FOUNDNewMap avec MapIdentity non définie ou pas de la forme maps\...\global.cfg (validation) ; NewMap avec une identité qui n'est pas installée (planificateur)les deux
OL_E_ENTRYPOINT_NOT_FOUNDNewMap sans EntrypointIdentity et avec PresentedEntrypointIndex non défini ou négatifLaunchValidation
OL_E_ENTRYPOINT_REQUIREDNewMap, carte installée, pas de EntrypointIdentity, PresentedEntrypointIndex non défini (world.presented-entrypoint indisponible)SessionPlanner
OL_E_SITUATION_NOT_FOUNDSavedSituation sans SituationIdentity (validation) ou avec une identité qui n'est pas installée (planificateur)les deux
OL_E_SITUATION_MAP_NOT_FOUNDSavedSituation : la carte nommée dans le .osn n'est pas installéeSessionPlanner
OL_E_UNSUPPORTED_OPERATING_SYSTEMpas Windows 10+ sur un système x64 avec un processus hôte x64 (runtime.current-windows-x64)SessionPlanner
OL_E_INSTALLATION_NOT_WRITABLErépertoire racine manquant, attribut lecture seule défini ou absence de sous-répertoire plugins\ (transaction.exact-restore)SessionPlanner
OL_E_UNSUPPORTED_BUILDOmsi.exe manquant, ou sa taille/son SHA-256 ne correspond ni à l'empreinte du profil (692EBFBF..., 8 503 440 octets) ni à un hash de la liste autorisée (omsi.profile.OMSI23004)SessionPlanner
OL_E_CAPABILITY_UNAVAILABLEWorld.Mode = LastMapState ; EntrypointIdentity défini ; mode de Date/Time/Year différent de Unset ; mode de Weather différent de Unset ; un champ quelconque de PlayerVehicle défini ; Input.KeyboardDocument ou Input.ControllerDocument définiSessionPlanner
OL_E_VEHICLE_NOT_FOUND, OL_E_REPAINT_NOT_FOUND, OL_E_HOF_NOT_FOUNDPlayerVehicle.Model / Repaint / Hof non installé (en plus de OL_E_CAPABILITY_UNAVAILABLE)SessionPlanner
OL_E_UNKNOWN_SETTING, OL_E_SETTING_NOT_WRITABLEune clé de Environment absente du catalogue / non accessible en écritureSessionPlanner
OL_E_SESSION_PRESENTATION_INVALIDla construction du plan d'écran de démarrage/ITX a levé une exception ; le message porte OL_E_SPLASH_ASSET_DIRECTORY_MISSING, OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED, OL_E_ITX_PROFILE_REQUIRED, OL_E_ITX_PROFILE_MISSING, OL_E_ITX_PROFILE_INVALID ou OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATHSessionPlanner
OL_E_RUNTIME_ARTIFACT_MISSINGla référence de la closure du plugin (OmsiLaunchRuntimePaths) ou le manifeste de version ne peut pas être chargé (le message peut porter OL_E_RELEASE_MANIFEST_INVALID)OmsiLaunchService.PlanSessionAsync

Non validé au moment de la planification (échoue au démarrage sous la forme d'une session Failed avec OL_E_START_SESSION) : valeurs des paramètres (OL_E_INVALID_SETTING_VALUE), intégrité du plugin permanent (OL_E_PERMANENT_PLUGIN_*), disponibilité du bail (OL_E_INSTALLATION_BUSY), plage de StartupTimeoutSeconds (levée par StartSessionAsync).

Diagnostics de plan informatifs : plugin.integrity.reference (message manifest ou self), session_profile.selected.

Priorité : options de la CLI, fichier de spécification et profil de session#

CliInput.BuildSpecAsync (tools/OmsiLaunch.Cli/Program.cs) construit la spécification effective dans cet ordre :

  1. Base = valeurs par défaut intégrées, ou le fichier /spec lorsqu'il est fourni.
  2. Racine de l'installation = l'argument d'installation explicite s'il est fourni, sinon le RootPath de la base ; ensuite ./vide → répertoire de l'exécutable, Path.GetFullPath. Un argument d'installation explicite l'emporte toujours sur le RootPath de la spécification.
  3. Profil de session (/predefined-profile + /predefined-profile-index) : les arguments explicites de la CLI qui touchent un champ détenu par le profil sont rejetés avec OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (champs de monde uniquement en mode NEW_MAP ; clés /set présentes dans le préréglage ; options d'écran de démarrage lorsque le préréglage a presentation ; options de textures Internet lorsqu'il a internet-textures ; timeouts lorsqu'il a behavior). Le World de la base est remplacé par un nouveau (seul le mode de monde de la CLI subsiste), puis le bloc new: du profil (NEW_MAP uniquement), settings (dans General), presentation, internet-textures, behavior et les métadonnées SessionProfile sont appliqués. compatibility.maps est appliqué pour NEW_MAP et SAVED_SITUATION.
  4. Monde : le mode de monde de la CLI l'emporte toujours (/new par défaut, /saved:<osn>, /last) ; le World.Mode du fichier de spécification est remplacé. Pour exécuter une situation enregistrée à partir d'une spécification, passez /saved:. /map et /entrypoint//entrypoint-index remplacent la base ; une identité /entrypoint de la CLI efface l'index ; /saved avec /map ou des options de point d'entrée donne OL_E_INVALID_ARGUMENT.
  5. /date, /time, /year, /weather* remplacent la base lorsqu'ils sont fournis (system sélectionne DateTimeMode.System).
  6. /no-vehicle efface PlayerVehicle ; les options individuelles /vehicle, /repaint, /hof, /fleet, /registration remplacent les champs individuels du véhicule du joueur de la base.
  7. Les entrées /set:<key>=<value> sont ajoutées à Environment.General (clé vérifiée, valeur non) ; les sept autres groupes proviennent de la base sans modification.
  8. /startup-timeout et /shutdown-timeout ne remplacent la base que lorsqu'ils sont fournis ; sinon s'appliquent la spécification, puis le profil, puis les valeurs par défaut 180 s / 30 s. ShutdownTimeoutSeconds est ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT pour le superviseur.
  9. /splash, /splash-language, /splash-assets, /internet-textures, /internet-textures-profile remplacent la base lorsqu'ils sont fournis ; SuppressTrayIcon provient uniquement de la base.
  10. Les options de diagnostic sont combinées par OU avec la base.

Résultat : option explicite de la CLI > profil de session > fichier de spécification > valeur par défaut intégrée, à ceci près qu'une option de la CLI en conflit avec un champ détenu par le profil est une erreur et non un remplacement.

Règles de chemin#

CheminComportement de l'APIComportement de la CLI
Installation.RootPathUtilisé tel quel : dans les opérations sur les fichiers, les chemins relatifs sont résolus par rapport au répertoire de travail du processus. Passez un chemin absolu. Le bail, le journal et le catalogue de contenu le normalisent avec Path.GetFullPath.. ou vide = le répertoire qui contient OmsiLaunch.exe, jamais le dossier de travail de l'appelant ; un argument d'installation explicite l'emporte sur la spécification ; le résultat est rendu absolu.
Presentation.CustomAssetDirectoryAbsolu, ou relatif à Installation.RootPath. Doit exister.Idem (/splash-assets). Un chemin assets de profil de session est confiné au paquet du profil et stocké sous forme absolue.
InternetTextures.OverrideProfilePathRésolu avec Path.GetFullPath, c'est-à-dire relativement au répertoire de travail du processus, et non à la racine de l'installation. Doit exister.Idem (/internet-textures-profile). Un chemin profile de profil de session est confiné au paquet et stocké sous forme absolue.
Lignes cibles ITXRelatives à la racine de l'installation ; doivent contenir un composant Texture\ ; pas de racine, pas de .., pas de \ initial, aucun composant jonction/lien symbolique.Idem.
Identités de contenu (MapIdentity, SituationIdentity, PlayerVehicle.*)Relatives à l'installation, insensibles à la casse, / accepté ; jamais absolues.Idem.

Transporté mais non appliqué#

ChampEffet actuelStabilité
Installation.ExpectedExecutableSha256aucun (l'hôte compare le hash de Omsi.exe au profil de build)PARTIAL
Behavior.RestoreConfigurationaucun (la restauration s'exécute toujours)PARTIAL
Behavior.ShutdownTimeoutSecondsaucun (arrêt forcé ; ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT)PARTIAL
Diagnostics.*aucun (la trace de l'hôte est toujours écrite)PARTIAL
Input.KeyboardDocument, Input.ControllerDocumentplan non exécutable lorsqu'ils sont définisPARTIAL
Date, Time, Year (mode autre que Unset)plan non exécutable (STATICALLY_PARTIAL)PARTIAL
Weather (mode autre que Unset)plan non exécutable (STATICALLY_PARTIAL)PARTIAL
PlayerVehicle.* (tout champ défini)contenu résolu pour les diagnostics, plan non exécutable (STATICALLY_PARTIAL)PARTIAL
World.EntrypointIdentityplan non exécutable (RUNTIME_PARTIAL)PARTIAL
World.Mode = LastMapState / LastSituationplan non exécutable (UNSUPPORTED_FOR_CURRENT_PROFILE)UNAVAILABLE
SessionProfilediagnostic de provenance uniquementSTABLE_BETA