Dokumentacja LaunchSpec

Dokumentacja wersji v0.1.0-beta.3Zobacz źródło na GitHubie

Tłumaczenie oryginalnej strony w języku angielskim dla OmsiLaunch 0.1.0-beta3. Wiążąca jest strona angielska: w razie rozbieżności obowiązują strona angielska i kod.

Ta strona jest normatywną dokumentacją referencyjną rekordu LaunchSpec – rekordu żądania opisującego jedną sesję OmsiLaunch. Opisuje jego kształt w C# (OmsiLaunch.Api), postać pliku JSON wczytywanego przez CLI (/spec:<path>, tools/OmsiLaunch.Cli/LaunchSpecJson.cs), każdą właściwość wraz z typem, wartością domyślną, regułą walidacji i bieżącym działaniem, reguły walidacji, które czynią plan niemożliwym do uruchomienia, oraz pierwszeństwo między flagami CLI, plikami specyfikacji i profilami sesji. Udokumentowano wyłącznie to, co robi bieżący kod.

Powiązane strony: publiczne API, dokumentacja CLI, profile sesji, kody błędów, cykl życia sesji, możliwości.

Skąd pochodzi LaunchSpec#

ŹródłoJak powstaje LaunchSpec
APIIntegrator tworzy rekord i przekazuje go do PlanSessionAsync.
Flagi CLICliInput.BuildSpecAsync zaczyna od wbudowanych wartości domyślnych (NEW_MAP, wszystko nieustawione, wartości domyślne Behavior) i stosuje flagi.
Plik JSON /spec:<path>Wczytywany przez LaunchSpecJson.LoadAsync, a następnie używany jako punkt wyjścia, który flagi CLI nadpisują (zob. pierwszeństwo).
Profil sesji (/predefined-profile:<id> /predefined-profile-index:<n>)SessionProfileCompiler.Apply zapisuje w punkcie wyjścia świat, ustawienia, prezentację, tekstury internetowe i zachowanie z profilu oraz rejestruje metadane SessionProfile.

Poniższy kompletny przykład jest zweryfikowany względem kształtu rekordu. Kopia minimalnego przykładu jest dostarczana jako examples/release-session.example.json (oraz .omsilaunch\examples\release-session.example.json w pakiecie wydania).

Postać JSON#

RegułaSzczegóły
SerializatorSystem.Text.Json z PropertyNameCaseInsensitive = true, ReadCommentHandling = Skip, AllowTrailingCommas = true; nie są zarejestrowane żadne konwertery.
Nazwy właściwościNazwy właściwości C# (Installation, RootPath, ...). Przy wczytywaniu dopasowanie nie uwzględnia wielkości liter; CLI zapisuje je w notacji PascalCase.
WyliczeniaLiczby całkowite (brak konwertera wyliczeń na ciągi znaków). "Mode": 0 jest poprawne; "Mode": "NewMap" jest odrzucane jako źle sformowany JSON. Wartości wymieniono w sekcji Wyliczenia.
OptionalValue<T>Obiekt { "Presence": 0 | 1, "Value": <T or null> }. Presence 0 = Unset (wartość jest ignorowana), 1 = Set (wartość musi być obecna i różna od null; Set z wartością null nie jest walidowane i zachowuje się jak nieprawidłowa wartość). Pominięty element OptionalValue oznacza Unset. Element tylko do odczytu IsSet pojawia się w danych wyjściowych zapisywanych przez CLI i jest przy wczytywaniu akceptowany oraz ignorowany.
Rekordy opcjonalneYear, Weather, Input, Diagnostics, Presentation, InternetTextures, SessionProfile mogą mieć wartość null lub zostać pominięte; akcesory Effective* podstawiają wartości domyślne.
Rekordy wymaganeInstallation, World, Date, Time, Environment (ze wszystkimi ośmioma słownikami, należy użyć {}), Behavior muszą być obecnymi obiektami. Nie są walidowane: wartość null lub brak rekordu powoduje później błąd odwołania do null, który CLI zgłasza jako OL_E_INTERNAL (kod wyjścia 10) lub OL_E_INVALID_ARGUMENT (kod wyjścia 2).
Nieznane właściwościOdrzucane przed powiązaniem: OL_E_SPEC_UNKNOWN_PROPERTY: $.Path.Name (ścieżka używa nazw elementów w postaci zapisanej w pliku). Zawartość słowników (Environment.*) nie jest sprawdzana jako właściwości.
KorzeńMusi być obiektem JSON: OL_E_SPEC_INVALID. Maksymalna głębokość zagnieżdżenia 32.
Rozmiar plikuNajwyżej 1 MiB (1 048 576 bajtów): OL_E_SPEC_TOO_LARGE. Brak pliku: OL_E_SPEC_NOT_FOUND.
Komentarze i końcowe przecinkiKomentarze // i /* */ oraz końcowe przecinki są akceptowane.
Źle sformowany JSONWyjątek parsera nie jest tłumaczony: CLI zgłasza OL_E_INTERNAL z kodem wyjścia 10.
KodowanieUTF-8 (czytnik toleruje BOM). Ukośniki odwrotne w identyfikatorach muszą być poprzedzone znakiem ucieczki ("maps\\Grundorf\\global.cfg"); w identyfikatorach map, sytuacji, pojazdów i plików HOF akceptowane są ukośniki zwykłe.

Kompletny przykład#

{
  // 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
}

Jawną datę, gdy kompilacja (build) ją obsługuje, zapisuje się jako "Date": { "Mode": 1, "Value": { "Presence": 1, "Value": { "Year": 2024, "Month": 5, "Day": 1 } } }, a czas jako { "Mode": 1, "Value": { "Presence": 1, "Value": { "Hour": 7, "Minute": 30, "Second": 0 } } }. W tym buildzie obie czynią plan niemożliwym do uruchomienia (zob. niżej).

Dokumentacja właściwości#

Kolumna „Wykorzystanie” określa, co bieżący kod robi z wartością. Stabilność jest opisana słownictwem ze strony publicznego API.

LaunchSpec (element główny)#

WłaściwośćTyp JSONWymaganaWartość domyślna przy pominięciuWykorzystanieStabilność
Installationobiekt InstallationSpectakbraktakSTABLE_BETA
Worldobiekt WorldSpectakbraktakSTABLE_BETA
Dateobiekt DateSpectakbrakwalidowana; każdy tryb oprócz Unset jest niemożliwy do uruchomieniaPARTIAL
Timeobiekt TimeSpectakbrakwalidowana; każdy tryb oprócz Unset jest niemożliwy do uruchomieniaPARTIAL
PlayerVehicleOptionalValue<PlayerVehicleSpec>nieUnsetrozwiązywana na potrzeby komunikatów diagnostycznych; każde ustawione pole jest niemożliwe do uruchomieniaPARTIAL
Environmentobiekt EnvironmentSpectakbraktak (semantyczna nakładka (overlay) na options.cfg)STABLE_BETA
Behaviorobiekt LaunchBehaviorSpectakbrakczęściowo (zob. rekord)STABLE_BETA / PARTIAL
Yearobiekt YearSpec lub nullnienull → EffectiveYear = tryb Unsetkażdy tryb oprócz Unset jest niemożliwy do uruchomieniaPARTIAL
Weatherobiekt WeatherSpec lub nullnienull → EffectiveWeather = tryb Unsetkażdy tryb oprócz Unset jest niemożliwy do uruchomieniaPARTIAL
Inputobiekt InputSpec lub nullnienull → EffectiveInput = oba nieustawionekażdy ustawiony dokument jest niemożliwy do uruchomieniaPARTIAL
Diagnosticsobiekt DiagnosticsSpec lub nullnienull → EffectiveDiagnostics = wartości domyślnetylko przenoszonaPARTIAL
Presentationobiekt SessionPresentationSpec lub nullnienull → EffectivePresentation = zarządzany ekran startowy, brak języka, brak katalogu niestandardowego, ikona w obszarze powiadomień wyświetlanatakSTABLE_BETA
InternetTexturesobiekt InternetTexturesSpec lub nullnienull → EffectiveInternetTextures = NativetakSTABLE_BETA / EXPERIMENTAL
SessionProfileobiekt SessionProfileMetadata lub nullnienulltylko informacja o pochodzeniu (komunikat diagnostyczny planu session_profile.selected)STABLE_BETA

Akcesory tylko do odczytu (obecne w danych wyjściowych JSON CLI, ignorowane przy wczytywaniu): EffectiveYear, EffectiveWeather, EffectiveInput, EffectiveDiagnostics, EffectivePresentation, EffectiveInternetTextures.

InstallationSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
RootPathstringwymaganaKatalog zawierający Omsi.exe i plugins\. Zob. reguły ścieżek. Pusta wartość/same białe znaki → OL_E_INSTALLATION_NOT_FOUND.takSTABLE_BETA
ExpectedExecutableSha256string lub nullnullDowolny ciąg znaków.W bieżącym kodzie brak odbiorcy: host zawsze oblicza skrót (hash) Omsi.exe i porównuje go z profilem buildu, nigdy z tą wartością.PARTIAL (przenoszona, obecnie bez efektu)

WorldSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
ModeWorldMode intwymagana0 NewMap, 1 SavedSituation, 2 LastMapState (LastSituation to przestarzały alias o tej samej wartości 2).tak; LastMapState → OL_E_CAPABILITY_UNAVAILABLENewMap, SavedSituation: STABLE_BETA; LastMapState: UNAVAILABLE
MapIdentityOptionalValue<string>UnsetDla NewMap: wymagana, w postaci maps\<dir>\global.cfg (bez rozróżniania wielkości liter, / akceptowany, bez ..) i zainstalowana. Ignorowana dla SavedSituation (mapę dostarcza plik .osn).tak (przekazanie)STABLE_BETA
SituationIdentityOptionalValue<string>UnsetDla SavedSituation: wymagana, identyfikator zainstalowanego pliku situations\...\<file>.osn (w postaci zwracanej przez DiscoverAsync(Situations) / /list:situations).tak (przekazanie)STABLE_BETA
PresentedEntrypointIndexOptionalValue<int>UnsetDla NewMap bez EntrypointIdentity: wymagana, >= 0, indeks na prezentowanej przez OMSI liście punktów wejścia mapy. Gdy nieustawiona, jest wysyłana do wtyczki jako -1.tak (przekazanie)STABLE_BETA
EntrypointIdentityOptionalValue<string>UnsetSurowa etykieta punktu wejścia lub identyfikator z wykrywania. Jej ustawienie czyni plan niemożliwym do uruchomienia (world.entrypoint-identity, RUNTIME_PARTIAL, OL_E_CAPABILITY_UNAVAILABLE).przenoszonaPARTIAL
EntrypointEntrypointSpec (tylko do odczytu)obliczanaMode = Identity, gdy ustawiono EntrypointIdentity, w przeciwnym razie PresentedIndex, gdy ustawiono indeks, w przeciwnym razie Unset; PresentedIndex, Identity odzwierciedlają dane wejściowe.pochodnaSTABLE_BETA

DateSpec, TimeSpec, YearSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
ModeDateTimeMode intwymagana (Year: 0, gdy rekord ma wartość null)0 Unset, 1 Explicit, 2 System.Explicit/System → wpis unsupported (world.explicit-date, world.explicit-time, world.explicit-year, STATICALLY_PARTIAL) i OL_E_CAPABILITY_UNAVAILABLE. Tryby są też kopiowane do przekazania startowego, które wtyczka odrzuca, gdy nie mają wartości Unset (do czego nigdy nie dochodzi, bo plan jest niemożliwy do uruchomienia).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. Musi być ustawiona, gdy Mode ma wartość Explicit (w przeciwnym razie OL_E_DATE_TIME_APPLY_FAILED), i musi być nieustawiona, gdy Mode nie ma wartości Explicit (OL_E_INVALID_ARGUMENT). YearSpec.Value nie jest walidowana.tylko walidowanaPARTIAL

WeatherSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
ModeWeatherMode int0, gdy rekord ma wartość null0 Unset, 1 Preset, 2 Icao, 3 RealCurrent.Każdy tryb oprócz Unset → wpis nieobsługiwanej możliwości weather i OL_E_CAPABILITY_UNAVAILABLE.PARTIAL
PresetOptionalValue<string>UnsetNazwa ustawienia wstępnego (preset) (niewalidowana).przenoszonaPARTIAL
IcaoOptionalValue<string>UnsetKod ICAO (niewalidowany).przenoszonaPARTIAL

PlayerVehicleSpec (wewnątrz PlayerVehicle)#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
ModelOptionalValue<string>UnsetIdentyfikator zainstalowanego pliku Vehicles\...\<file>.bus, w przeciwnym razie OL_E_VEHICLE_NOT_FOUND.rozwiązywana do ResolvedContent; następnie nieobsługiwana możliwość player-vehicle.model → OL_E_CAPABILITY_UNAVAILABLEPARTIAL
RepaintOptionalValue<string>UnsetIdentyfikator malowania dla Model (<cti>#item:<n>), w przeciwnym razie OL_E_REPAINT_NOT_FOUND; sprawdzana tylko, gdy ustawiono Model.jak wyżejPARTIAL
HofOptionalValue<string>UnsetZainstalowany plik Vehicles\...\<file>.hof, w przeciwnym razie OL_E_HOF_NOT_FOUND.jak wyżejPARTIAL
FleetNumberOptionalValue<string>UnsetDowolny ciąg znaków.OL_E_CAPABILITY_UNAVAILABLEPARTIAL
RegistrationOptionalValue<string>UnsetDowolny ciąg znaków.OL_E_CAPABILITY_UNAVAILABLEPARTIAL
Enabledbool (tylko do odczytu)obliczanatrue, gdy ustawiono Model. Przekazanie przenosi jako PlayerVehicleEnabled wartość PlayerVehicle.IsSet.pochodnaPARTIAL

PlayerVehicle z Presence 1 i wszystkimi polami nieustawionymi jest akceptowany i nie ma żadnego efektu. Każde ustawione pole czyni plan w tym buildzie niemożliwym do uruchomienia (STATICALLY_PARTIAL).

EnvironmentSpec#

WłaściwośćTypWartość domyślnaWykorzystanieStabilność
General, Advanced, Graphics, AdvancedGraphics, Sound, AiPassengers, Keyboard, Controllerskażda IReadOnlyDictionary<string, OptionalValue<string>>, wymagana ({}, gdy pusta)braktakSTABLE_BETA

Osiem grup jest łączonych; to, w której grupie umieszczono klucz, nie ma znaczenia. Każdy wpis z Presence 1 jest ustawieniem semantycznym z ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs); klucz wybiera plik docelowy (options.cfg dla każdego obecnego klucza) i token. Planowanie sprawdza, czy klucz istnieje (OL_E_UNKNOWN_SETTING) i czy jest zapisywalny (OL_E_SETTING_NOT_WRITABLE); wartość jest walidowana dopiero przy uruchomieniu (OL_E_INVALID_SETTING_VALUE, zgłaszane jako sesja Failed z OL_E_START_SESSION). Klucze nie rozróżniają wielkości liter. Nieustawione wpisy są ignorowane. Flaga CLI /set:<key>=<value> zapisuje do General; ustawienia settings z profilu sesji również są scalane z General.

KluczWartośćUwagi
general.languagestringtoken [language]
general.radiostring
general.alternateView, general.showOwnDriver, general.showErrorMessages, general.autoSave, general.currentTime, general.currentDate, general.currentYeartrue / falsetokeny obecności (autoSave jest odwrotnością noAutoSave)
graphics.screenRatiostring
graphics.maxFPSliczba całkowita 10..200
graphics.tileDistanceliczba całkowita 1..20
graphics.maxObjectDistanceMetersliczba 20..5000
graphics.minObjectScreenPercentliczba 0..10zapisywana po podzieleniu przez 100
graphics.minReflectionObjectScreenPercentliczba 0..50zapisywana po podzieleniu przez 100
graphics.maxObjectComplexityliczba całkowita 0..3
graphics.maxMapComplexityliczba całkowita 0..2
graphics.sunGlow, graphics.loadAllTiles, graphics.stencilBuffer, graphics.rainReflections, graphics.humansInRainReflectionstrue / falsetokeny obecności
graphics.stencilShadowstrue / falsezapisywane jako on / off
graphics.realTimeReflectionseconomy / fullSTATICALLY_PARTIAL
graphics.particlesenabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)jeden blok smokesystems
simulation.collision, simulation.collisionTerrain, simulation.collisionVehicles, simulation.collisionPedestrians, simulation.disableAutomaticScheduleAnalysisPopup, simulation.ticketInfo, simulation.automaticClutchtrue / falsetokeny obecności
simulation.ticketSellingliczba całkowita 0..2
simulation.maintenanceliczba całkowita 0..4
advanced.reducedMultithreadingtrue / falsedwa tokeny OMSI jednocześnie (RUNTIME_PROVEN)
view.driverSmooth, view.driverMoving, controls.autoCenter, controls.reducedSteeringSpeedtrue / falsetokeny obecności
traffic.randomVehiclesliczba całkowita 0..1000składowa 0 wielowierszowego bloku AIMaxCountRandom (zweryfikowana w runtime, macierz RV-005)
traffic.humansliczba całkowita 0..1000składowa 1 bloku AIMaxCountRandom
traffic.factorPercentliczba 1..300
traffic.parkedVehiclesPercentliczba 0..100
traffic.scheduledVehiclesliczba 0..1000
traffic.scheduledLinePriorityliczba 1..4
traffic.passengerFactorPercentliczba 0..200
sound.stereoliczba 0..100
sound.maxSimultaneousSoundsliczba 5..1000
sound.masterVolumeliczba 0..1
advanced.multithreadingCalculate, advanced.multithreadingTextureLoad, graphics.texture, graphics.textureFilterodrzucaneznane, ale niezapisywalne → OL_E_SETTING_NOT_WRITABLE

Modyfikowane pliki zachowują swoje kodowanie (bajty Windows-1252 zachowane; UTF-8/UTF-16 oznaczone BOM respektowane) i znaki końca wiersza.

LaunchBehaviorSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
RestoreConfigurationbooltruedowolnaBrak odbiorcy: pliki należące do sesji są zawsze dokładnie przywracane.PARTIAL (przenoszona, obecnie bez efektu)
SuppressStaleClosecheckWarningbooltruedowolnatrue: plik closecheck istniejący przed sesją jest przy uruchomieniu trwale usuwany (komunikat diagnostyczny closecheck.stale-removed z jego SHA-256; błąd OL_E_CLOSECHECK_REMOVE_FAILED). false: istniejący closecheck pozostaje nietknięty i nie jest traktowany jako usunięcie w ramach sesji. Plik closecheck zapisany przez OMSI w trakcie sesji jest zawsze usuwany podczas przywracania.STABLE_BETA
StartupTimeoutSecondsint1801..600 (w przeciwnym razie ArgumentOutOfRangeException z StartSessionAsync; flaga CLI /startup-timeout wymusza 1..600; profile wymagają > 0). Budżet czasu od uruchomienia nadzorcy do stanu Running; po jego wyczerpaniu sesja kończy się błędem OL_E_STARTUP_TIMEOUT (wtyczka uruchomiona) lub OL_E_PLUGIN_NOT_LOADED.takSTABLE_BETA
ShutdownTimeoutSecondsint30dowolna wartość int (CLI /shutdown-timeout 1..600)Brak odbiorcy: nadzorca natychmiast kończy OMSI za pomocą TerminateProcess; nie ma kooperacyjnego oczekiwania na zamknięcie.PARTIAL (przenoszona, obecnie bez efektu)

InputSpec#

WłaściwośćTypWartość domyślnaWykorzystanieStabilność
KeyboardDocumentOptionalValue<string>UnsetUstawiona → nieobsługiwana możliwość input.keyboard (STATICALLY_PARTIAL) i OL_E_CAPABILITY_UNAVAILABLE. Wykonywanie PATCH/REPLACE dla klawiatury nie jest zaimplementowane.PARTIAL
ControllerDocumentOptionalValue<string>UnsetUstawiona → nieobsługiwana możliwość input.controller i OL_E_CAPABILITY_UNAVAILABLE.PARTIAL

DiagnosticsSpec#

WłaściwośćTypWartość domyślnaWykorzystanieStabilność
LogbooltrueBrak odbiorcy w src/. Ślad hosta <root>\.omsilaunch\diagnostics\<sessionId>-host.log jest zapisywany zawsze.PARTIAL (przenoszona, obecnie bez efektu)
VerboseboolfalseBrak odbiorcy.PARTIAL
OmsiLogAllboolfalseBrak odbiorcy.PARTIAL
ProcessTraceboolfalseBrak odbiorcy.PARTIAL
PluginTraceboolfalseBrak odbiorcy.PARTIAL
NativeTraceboolfalseBrak odbiorcy.PARTIAL

Flagi CLI /log, /logall, /omsi-logall, /verbose, /trace, /trace-process, /trace-plugin, /trace-native ustawiają te wartości logiczne (/logall ustawia Verbose, ProcessTrace, PluginTrace, NativeTrace); są one łączone operacją OR z wartościami ze specyfikacji.

SessionPresentationSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
SplashSplashMode int1 (Managed)0 Unset (alias Native): własne pliki ekranu startowego OMSI pozostają nietknięte. 1 Managed: OmsiLaunch nakłada na czas sesji pliki GUI\NewSplashscreen_ENG.bmp i GUI\NewSplashscreen_<LANG>.bmp (a następnie dokładnie je przywraca).takSTABLE_BETA (macierz RV-006)
LanguageOptionalValue<string>UnsetPTB/PT-BR, ENG/EN, DEU/DE, FRA/FR (bez rozróżniania wielkości liter); każda inna wartość jest normalizowana do ENG. Gdy nieustawiona, odczytywana jest wartość [language] z options.cfg i normalizowana w ten sam sposób.tak (tylko zarządzany ekran startowy)STABLE_BETA
CustomAssetDirectoryOptionalValue<string>UnsetKatalog zawierający ENG.bmp i <LANG>.bmp (640×480, 24-bitowy BMP). Zob. reguły ścieżek. Brak katalogu: OL_E_SPLASH_ASSET_DIRECTORY_MISSING; brak pliku: OL_E_SPLASH_ASSET_MISSING; nieprawidłowy format: OL_E_SPLASH_FORMAT_UNSUPPORTED. Gdy nieustawiona, używany jest <root>\.omsilaunch\assets\splash (jednorazowo zasilany z pakietu), a w przeciwnym razie assets\splash z pakietu.tak (tylko zarządzany ekran startowy)STABLE_BETA
SuppressTrayIconboolfalsetrue wyłącza samodzielny wskaźnik właściciela CLI w obszarze powiadomień Windows.Tylko właściciel CLI; API nie ma ikony w obszarze powiadomień. Nie ma flagi CLI; wartość może pochodzić wyłącznie z pliku specyfikacji.STABLE_BETA

InternetTexturesSpec#

WłaściwośćTypWartość domyślnaPrawidłowe wartościWykorzystanieStabilność
ModeInternetTexturesMode int0 (Native)0 Native: nic się nie zmienia. 1 Disabled: wtyczka blokuje działający w procesie OMSI mechanizm pobierania (telemetria internet-textures.suppressed / internet-textures.suppression.failed). 2 Override: profil .itx jest nakładany jako Texture\standard.itx; jego pliki docelowe i Texture\standard.ipr stają się usunięciami w ramach sesji.takNative: STABLE_BETA; Disabled, Override: EXPERIMENTAL
OverrideProfilePathOptionalValue<string>UnsetWymagana dla Override (OL_E_ITX_PROFILE_REQUIRED). Plik tekstowy z parami wierszy: bezwzględny adres URL http/https, a następnie ścieżka docelowa względna wobec katalogu głównego instalacji, która zawiera składową Texture\, nie jest zakorzeniona, nie zawiera .., nie zaczyna się od \ i nie przechodzi przez żadne połączenie (junction) ani dowiązanie symboliczne (OL_E_ITX_PROFILE_INVALID, OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Zob. reguły ścieżek.takEXPERIMENTAL

SessionProfileMetadata#

WłaściwośćTypWykorzystanieStabilność
Id, Name, Version, Author, PresetId, PresetIndex, PresetName, PackagePathciągi znaków / intRejestrowane w komunikacie diagnostycznym planu session_profile.selected (Data["session_profile.*"]). Poza tym niewykorzystywane; zwykle wypełniane przez kompilator profili sesji, a nie ręcznie.STABLE_BETA

Wyliczenia#

WyliczenieWartości (liczba całkowita JSON)
WorldModeNewMap = 0, SavedSituation = 1, LastMapState = 2, LastSituation = 2 (przestarzały alias; jest to natywna gałąź ostatniego stanu mapy OMSI, nigdy najnowszy plik .osn)
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 (tylko do odczytu Entrypoint.Mode)Unset = 0, PresentedIndex = 1, Identity = 2

Liczby całkowite spoza zadeklarowanego zakresu są zapisywane przez serializator bez zmian i zachowują się jak nieznane wartości (na przykład nieznany WorldMode nie jest ani NEW_MAP, ani SAVED_SITUATION i daje plan bez możliwości świata; wtyczka by go odrzuciła, ale CLI i tak zastępuje tryb – zob. pierwszeństwo).

Reguły walidacji i komunikaty diagnostyczne braku możliwości uruchomienia#

PlanSessionAsync wykonuje LaunchValidation.Validate, a następnie SessionPlanner.PlanAsync. Plan jest możliwy do uruchomienia dokładnie wtedy, gdy żaden kod komunikatu diagnostycznego nie zaczyna się od OL_E_. Pełny zestaw:

Komunikat diagnostycznyWarunekŹródło
OL_E_INSTALLATION_NOT_FOUNDInstallation.RootPath puste lub zawiera same białe znakiLaunchValidation
OL_E_DATE_TIME_APPLY_FAILEDDate.Mode = Explicit bez ustawionej wartości lub z miesiącem/dniem spoza zakresu; Time.Mode = Explicit bez ustawionej wartości lub z godziną/minutą/sekundą spoza zakresuLaunchValidation
OL_E_INVALID_ARGUMENTDate.Value lub Time.Value ustawione, gdy tryb nie jest ExplicitLaunchValidation
OL_E_MAP_NOT_FOUNDNewMap z nieustawionym MapIdentity lub niemającym postaci maps\...\global.cfg (walidacja); NewMap z identyfikatorem, który nie jest zainstalowany (planista)oba
OL_E_ENTRYPOINT_NOT_FOUNDNewMap bez EntrypointIdentity i z nieustawionym lub ujemnym PresentedEntrypointIndexLaunchValidation
OL_E_ENTRYPOINT_REQUIREDNewMap, mapa zainstalowana, brak EntrypointIdentity, PresentedEntrypointIndex nieustawiony (world.presented-entrypoint niedostępna)SessionPlanner
OL_E_SITUATION_NOT_FOUNDSavedSituation bez SituationIdentity (walidacja) lub z identyfikatorem, który nie jest zainstalowany (planista)oba
OL_E_SITUATION_MAP_NOT_FOUNDSavedSituation: mapa wskazana w pliku .osn nie jest zainstalowanaSessionPlanner
OL_E_UNSUPPORTED_OPERATING_SYSTEMśrodowisko inne niż Windows 10+ w systemie x64 z procesem hosta x64 (runtime.current-windows-x64)SessionPlanner
OL_E_INSTALLATION_NOT_WRITABLEbrak katalogu głównego, ustawiony atrybut tylko do odczytu lub brak podkatalogu plugins\ (transaction.exact-restore)SessionPlanner
OL_E_UNSUPPORTED_BUILDbrak Omsi.exe lub jego rozmiar/SHA-256 nie odpowiada ani odciskowi profilu (692EBFBF..., 8 503 440 bajtów), ani skrótowi z listy dozwolonych (omsi.profile.OMSI23004)SessionPlanner
OL_E_CAPABILITY_UNAVAILABLEWorld.Mode = LastMapState; ustawione EntrypointIdentity; tryb Date/Time/Year inny niż Unset; tryb Weather inny niż Unset; ustawione dowolne pole PlayerVehicle; ustawione Input.KeyboardDocument lub Input.ControllerDocumentSessionPlanner
OL_E_VEHICLE_NOT_FOUND, OL_E_REPAINT_NOT_FOUND, OL_E_HOF_NOT_FOUNDPlayerVehicle.Model / Repaint / Hof nie jest zainstalowany (oprócz OL_E_CAPABILITY_UNAVAILABLE)SessionPlanner
OL_E_UNKNOWN_SETTING, OL_E_SETTING_NOT_WRITABLEklucz Environment, którego nie ma w katalogu / który nie jest zapisywalnySessionPlanner
OL_E_SESSION_PRESENTATION_INVALIDbudowanie planu ekranu startowego/ITX zgłosiło wyjątek; komunikat zawiera 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 lub OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATHSessionPlanner
OL_E_RUNTIME_ARTIFACT_MISSINGnie można wczytać odwołania do zestawu plików wtyczki (closure) (OmsiLaunchRuntimePaths) ani manifestu wydania (komunikat może zawierać OL_E_RELEASE_MANIFEST_INVALID)OmsiLaunchService.PlanSessionAsync

Niewalidowane na etapie planowania (błąd występuje przy uruchomieniu jako sesja Failed z OL_E_START_SESSION): wartości ustawień (OL_E_INVALID_SETTING_VALUE), integralność stałej wtyczki (OL_E_PERMANENT_PLUGIN_*), dostępność dzierżawy instalacji (OL_E_INSTALLATION_BUSY), zakres StartupTimeoutSeconds (wyjątek zgłaszany przez StartSessionAsync).

Informacyjne komunikaty diagnostyczne planu: plugin.integrity.reference (komunikat manifest lub self), session_profile.selected.

Pierwszeństwo: flagi CLI, plik specyfikacji i profil sesji#

CliInput.BuildSpecAsync (tools/OmsiLaunch.Cli/Program.cs) buduje efektywną specyfikację w następującej kolejności:

  1. Punkt wyjścia = wbudowane wartości domyślne lub plik /spec, jeśli go podano.
  2. Katalog główny instalacji = jawny argument instalacji, jeśli podano, w przeciwnym razie RootPath z punktu wyjścia; następnie ./pusta wartość → katalog pliku wykonywalnego, Path.GetFullPath. Jawny argument instalacji zawsze ma pierwszeństwo przed RootPath ze specyfikacji.
  3. Profil sesji (/predefined-profile + /predefined-profile-index): jawne argumenty CLI dotykające pola należącego do profilu są odrzucane z OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (pola świata tylko w trybie NEW_MAP; klucze /set obecne w ustawieniu wstępnym; flagi ekranu startowego, gdy ustawienie wstępne ma presentation; flagi tekstur internetowych, gdy ma internet-textures; limity czasu, gdy ma behavior). World z punktu wyjścia jest zastępowany nowym (zachowuje się tylko tryb świata z CLI), po czym stosowane są blok new: profilu (tylko NEW_MAP), settings (do General), presentation, internet-textures, behavior oraz metadane SessionProfile. compatibility.maps jest egzekwowane dla NEW_MAP i SAVED_SITUATION.
  4. Świat: tryb świata z CLI zawsze wygrywa (/new domyślnie, /saved:<osn>, /last); World.Mode z pliku specyfikacji jest zastępowany. Aby uruchomić zapisaną sytuację ze specyfikacji, należy przekazać /saved:. /map oraz /entrypoint//entrypoint-index nadpisują punkt wyjścia; identyfikator /entrypoint z CLI czyści indeks; /saved razem z /map lub flagami punktu wejścia daje OL_E_INVALID_ARGUMENT.
  5. /date, /time, /year, /weather* nadpisują punkt wyjścia, gdy zostały podane (system wybiera DateTimeMode.System).
  6. /no-vehicle czyści PlayerVehicle; poszczególne flagi /vehicle, /repaint, /hof, /fleet, /registration nadpisują poszczególne pola pojazdu gracza z punktu wyjścia.
  7. Wpisy /set:<key>=<value> są dodawane do Environment.General (klucz jest sprawdzany, wartość nie); pozostałe siedem grup pochodzi bez zmian z punktu wyjścia.
  8. /startup-timeout i /shutdown-timeout nadpisują punkt wyjścia tylko wtedy, gdy zostały podane; w przeciwnym razie obowiązuje specyfikacja, potem profil, a potem wartości domyślne 180 s / 30 s. ShutdownTimeoutSeconds ma w nadzorcy status ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT.
  9. /splash, /splash-language, /splash-assets, /internet-textures, /internet-textures-profile nadpisują punkt wyjścia, gdy zostały podane; SuppressTrayIcon pochodzi wyłącznie z punktu wyjścia.
  10. Flagi diagnostyczne są łączone operacją OR z punktem wyjścia.

Wynik: jawna flaga CLI > profil sesji > plik specyfikacji > wbudowana wartość domyślna, z tym że flaga CLI kolidująca z polem należącym do profilu jest błędem, a nie nadpisaniem.

Reguły ścieżek#

ŚcieżkaZachowanie APIZachowanie CLI
Installation.RootPathUżywana w podanej postaci: w operacjach na plikach ścieżki względne są rozwiązywane względem katalogu roboczego procesu. Należy przekazywać ścieżkę bezwzględną. Dzierżawa instalacji, dziennik i katalog zawartości normalizują ją za pomocą Path.GetFullPath.. lub pusta wartość = katalog zawierający OmsiLaunch.exe, nigdy folder roboczy wywołującego; jawny argument instalacji wygrywa ze specyfikacją; wynik jest przekształcany w ścieżkę bezwzględną.
Presentation.CustomAssetDirectoryBezwzględna lub względna wobec Installation.RootPath. Musi istnieć.Tak samo (/splash-assets). Ścieżka assets z profilu sesji jest ograniczona do pakietu profilu i zapisywana jako bezwzględna.
InternetTextures.OverrideProfilePathRozwiązywana za pomocą Path.GetFullPath, czyli względem katalogu roboczego procesu, a nie katalogu głównego instalacji. Musi istnieć.Tak samo (/internet-textures-profile). Ścieżka profile z profilu sesji jest ograniczona do pakietu i zapisywana jako bezwzględna.
Wiersze docelowe ITXWzględne wobec katalogu głównego instalacji; muszą zawierać składową Texture\; bez korzenia, bez .., bez początkowego \, bez składowej będącej połączeniem (junction) lub dowiązaniem symbolicznym.Tak samo.
Identyfikatory zawartości (MapIdentity, SituationIdentity, PlayerVehicle.*)Względne wobec instalacji, bez rozróżniania wielkości liter, / akceptowany; nigdy bezwzględne.Tak samo.

Przenoszone, ale niestosowane#

PoleBieżące działanieStabilność
Installation.ExpectedExecutableSha256brak (host porównuje skrót Omsi.exe z profilem buildu)PARTIAL
Behavior.RestoreConfigurationbrak (przywracanie jest zawsze wykonywane)PARTIAL
Behavior.ShutdownTimeoutSecondsbrak (wymuszone zakończenie; ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT)PARTIAL
Diagnostics.*brak (ślad hosta jest zawsze zapisywany)PARTIAL
Input.KeyboardDocument, Input.ControllerDocumentplan niemożliwy do uruchomienia, gdy ustawionePARTIAL
Date, Time, Year (tryb inny niż Unset)plan niemożliwy do uruchomienia (STATICALLY_PARTIAL)PARTIAL
Weather (tryb inny niż Unset)plan niemożliwy do uruchomienia (STATICALLY_PARTIAL)PARTIAL
PlayerVehicle.* (dowolne ustawione pole)zawartość rozwiązywana na potrzeby komunikatów diagnostycznych, plan niemożliwy do uruchomienia (STATICALLY_PARTIAL)PARTIAL
World.EntrypointIdentityplan niemożliwy do uruchomienia (RUNTIME_PARTIAL)PARTIAL
World.Mode = LastMapState / LastSituationplan niemożliwy do uruchomienia (UNSUPPORTED_FOR_CURRENT_PROFILE)UNAVAILABLE
SessionProfiletylko komunikat diagnostyczny o pochodzeniuSTABLE_BETA