Profile sesji

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.

Profil sesji to deklaratywny pakiet YAML, który autor zawartości dostarcza razem z mapą lub dodatkiem, aby użytkownicy końcowi mogli jednym poleceniem uruchomić powtarzalną sesję OmsiLaunch (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). Ta strona jest normatywną dokumentacją referencyjną formatu omsilaunch.session-profile/v1 w postaci zaimplementowanej przez SessionProfileCompiler w src/OmsiLaunch.Core/SessionProfiles.cs, reguł pierwszeństwa stosowanych przez CLI (CliInput.BuildSpecAsync i RejectProfileConflicts w tools/OmsiLaunch.Cli/Program.cs) oraz katalogu ustawień, które profil może zapisywać (ConfigurationCatalog). Wszystko, co potrafi profil, można też zrobić za pomocą flag CLI i rekordu LaunchSpec; profil jedynie pakuje te wybory.

Stabilność: STABLE_BETA dla parsowania, walidacji, wykrywania konfliktów oraz bloków settings / presentation / internet-textures / behavior (test offline session-profiles.strict-compiler; ścieżka nakładki (overlay) i przywracania jest zweryfikowana w runtime przez RV-005 i RV-006, zob. stan weryfikacji w runtime). Klucze new.date, new.time, new.year i new.weather są w tym buildzie UNAVAILABLE (zob. Blok new).

Lokalizacja i nazewnictwo pakietu#

ElementReguła
Katalog pakietu<installation root>\.omsilaunch\session-profiles\<id>\
Plik profilu<package>\profile.yaml (dokładna nazwa, jeden plik)
ZasobyDowolne pliki lub katalogi wewnątrz katalogu pakietu, wskazywane ścieżką względną z presentation.splash.assets i internet-textures.profile
idMusi być zwykłą nazwą katalogu: nie może być pusty ani składać się z samych białych znaków, nie może zawierać \, / ani : i nie może zawierać sekwencji ... Naruszenia dają OL_E_SESSION_PROFILE_PATH_ESCAPE. Wartość id zadeklarowana w profile.yaml musi być bajt po bajcie równa nazwie katalogu (z rozróżnianiem wielkości liter); w przeciwnym razie OL_E_SESSION_PROFILE_INVALID.
Wybór/predefined-profile:<id> razem z /predefined-profile-index:<n>. Indeks jest obowiązkowy: /predefined-profile bez /predefined-profile-index kończy się błędem OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Brak pakietuOL_E_SESSION_PROFILE_NOT_FOUND
Układ wydaniaPakiet wydania zawiera przykład w .omsilaunch\examples\session-profiles\rmg-leste\ (zob. pakowanie). Przykłady nie są profilami: aby pakiet można było wybrać, należy go skopiować do .omsilaunch\session-profiles\<id>\.

Profil instaluje i usuwa użytkownik lub autor zawartości. OmsiLaunch nigdy nie zapisuje niczego w pakiecie, nigdy go nie kopiuje i nigdy go nie usuwa. Katalog pakietu nie jest częścią żadnej transakcji.

Reguły parsowania#

RegułaZachowanieBłąd
Limit rozmiaruprofile.yaml nie może przekraczać 256 KiB (262,144 bajtów)OL_E_SESSION_PROFILE_INVALID
Kształt dokumentuDokładnie jeden dokument YAML, którego węzeł główny jest mapowaniemOL_E_SESSION_PROFILE_INVALID
Schematschema musi mieć dokładnie wartość omsilaunch.session-profile/v1 (z rozróżnianiem wielkości liter)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Kotwice i aliasyKażdy węzeł z kotwicą YAML (&name) w dowolnym miejscu dokumentu jest odrzucany przed walidacją; aliasy (*name) nie mogą więc wystąpićOL_E_SESSION_PROFILE_INVALID („YAML anchors are not supported.”)
Nieznane kluczeKażde mapowanie jest zamknięte: klucz, którego nie wymieniono dla danego kontekstu w poniższych tabelach, jest odrzucany („Unknown property in <context>: <key>”). Klucze są dopasowywane z rozróżnianiem wielkości liter (Schema: jest nieznanym kluczem). Jedynym otwartym mapowaniem jest settings, którego klucze są zamiast tego walidowane względem katalogu ustawień.OL_E_SESSION_PROFILE_INVALID
SkalaryKażda wartość liścia musi być skalarem; sekwencje i mapowania w miejscu oczekiwanego skalara są odrzucane („<field> must be a scalar.”)OL_E_SESSION_PROFILE_INVALID
LiczbyLiczby całkowite są parsowane z kulturą niezmienną (1, 30); liczby dziesiętne w settings używają . jako separatoraOL_E_SESSION_PROFILE_INVALID
Daty i godzinynew.date.value jest parsowane przez DateOnly.Parse, a new.time.value przez TimeOnly.Parse, w obu przypadkach z kulturą niezmienną; należy używać form ISO yyyy-MM-dd i HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
Błędy składni YAMLZgłaszane z komunikatem parseraOL_E_SESSION_PROFILE_INVALID („Invalid YAML: ...”)
Zawartość wykonywalnaYAML jest parsowany za pomocą YamlDotNet wyłącznie do drzewa reprezentacji; tagi, typy niestandardowe ani wykonywanie kodu nie są obsługiwane

Ukośniki odwrotne w zwykłych (niecytowanych) skalarach są znakami dosłownymi. Ścieżki Windows należy zapisywać z pojedynczym ukośnikiem odwrotnym (maps\Grundorf\global.cfg). Podwojony ukośnik odwrotny w zwykłym skalarze pozostaje w wartości podwojony; zob. Przykład dołączony do pakietu.

Dokumentacja kluczy#

Konteksty są nazwane dokładnie tak, jak nazywa je kompilator. Każdy wymieniony tu klucz jest akceptowany; żaden inny nie jest.

profile (mapowanie główne)#

KluczTypWymaganyOpis
schemastringtakLiterał omsilaunch.session-profile/v1.
idstringtakIdentyfikator pakietu; musi być równy nazwie katalogu.
namestringtakNazwa wyświetlana; zgłaszana w SessionProfileMetadata.Name.
authorstringtakAutor; zgłaszany w SessionProfileMetadata.Author.
versionstringtakCiąg wersji pakietu (dowolna postać, należy ująć go w cudzysłów: "1.0"); zgłaszany w SessionProfileMetadata.Version.
compatibilitymapowanienieZob. compatibility.
newmapowanienieWartości domyślne NEW_MAP. Zob. new.
presetssekwencja mapowańtakOd 1 do 5 wpisów ustawień wstępnych. Zero, więcej niż pięć lub wartość niebędąca sekwencją daje OL_E_SESSION_PROFILE_INVALID.

compatibility#

KluczTypWymaganyOpis
mapssekwencja ciągów znakównieIdentyfikatory map (maps\<Map>\global.cfg), dla których profil jest ważny. / jest normalizowany do \; porównanie nie rozróżnia wielkości liter. Brak listy lub pusta lista oznacza „dowolna mapa”. Niepusta lista jest egzekwowana dla WorldMode.NewMap (względem efektywnego new.map lub /map) oraz dla WorldMode.SavedSituation (względem mapy wskazanej przez wybrany plik .osn, rozwiązanej przez katalog zawartości). Dla WorldMode.LastMapState nie da się ustalić mapy, więc niepusta lista zawsze kończy się błędem. Błąd: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

Blok jest odczytywany i walidowany zawsze, gdy jest obecny, ale do specyfikacji jest stosowany tylko wtedy, gdy wybranym trybem świata jest NEW_MAP (/new, domyślny tryb CLI). Przy /saved:<file.osn> blok jest ignorowany.

KluczTypWymaganyStosowanyOpis
mapstringnietakIdentyfikator mapy w znormalizowanej postaci maps\<Map>\global.cfg (planowanie wymaga dokładnie tego kształtu: zaczyna się od maps\, kończy na \global.cfg, bez ..). Ustawia WorldSpec.MapIdentity.
entrypoint-indexliczba całkowitanietakIndeks prezentowanego punktu wejścia (pozycja liczona od 0 na liście punktów wejścia OMSI). Ustawia PresentedEntrypointIndex i czyści ewentualny identyfikator punktu wejścia.
entrypointstringnietakSurowy identyfikator punktu wejścia. Ustawia EntrypointIdentity i czyści prezentowany indeks. Jeśli obecne są zarówno entrypoint-index, jak i entrypoint, wygrywa entrypoint, ponieważ jest stosowany jako ostatni. Wybór punktu wejścia przez identyfikator jest PARTIAL (BI-001): planowanie zgłasza world.entrypoint-identity jako RUNTIME_PARTIAL, a plan jest niemożliwy do uruchomienia. Zalecany jest entrypoint-index.
datemapowanienienie (UNAVAILABLE)Zob. new.date.
timemapowanienienie (UNAVAILABLE)Zob. new.time.
yearliczba całkowitanienie (UNAVAILABLE)Jawny rok.
weathermapowanienienie (UNAVAILABLE)Zob. new.weather.

date, time, year i weather są kompilowane do DateSpec, TimeSpec, YearSpec i WeatherSpec z DateTimeMode.Explicit / wybranym WeatherMode. Planista sesji (src/OmsiLaunch.Core/SessionPlanner.cs) zgłasza wtedy możliwości world.explicit-date, world.explicit-time, world.explicit-year i weather jako STATICALLY_PARTIAL, dodaje OL_E_CAPABILITY_UNAVAILABLE do komunikatów diagnostycznych planu i oznacza plan jako niemożliwy do uruchomienia. Wtyczka dodatkowo odrzuca przekazanie, którego tryb daty lub czasu nie ma wartości Unset (plugin.request.unsupported). Skutek dla tego buildu: profil ustawiający którykolwiek z tych czterech kluczy można zwalidować za pomocą /plan, ale nie można nim uruchomić sesji (kod wyjścia 1, OL_E_PLAN_NOT_RUNNABLE). W profilach przeznaczonych do uruchamiania należy je pominąć.

new.date#

KluczTypWymaganyOpis
modestringtakMusi mieć wartość explicit (bez rozróżniania wielkości liter). Każda inna wartość daje OL_E_SESSION_PROFILE_INVALID („date must use explicit mode.”).
valuestringtakyyyy-MM-dd.

new.time#

KluczTypWymaganyOpis
modestringtakMusi mieć wartość explicit.
valuestringtakHH:mm lub HH:mm:ss.

new.weather#

KluczTypWymaganyOpis
modestringtakpreset, icao lub real (bez rozróżniania wielkości liter). Cokolwiek innego: OL_E_SESSION_PROFILE_INVALID („Unsupported weather mode”).
presetstringgdy mode: presetNazwa ustawienia wstępnego pogody.
icaostringgdy mode: icaoKod stacji ICAO.

preset (każdy wpis w presets)#

KluczTypWymaganyWartość domyślnaOpis
indexliczba całkowitatakOd 1 do 5, unikatowy w obrębie profilu. Wybierany za pomocą /predefined-profile-index. Duplikat lub wartość spoza zakresu: OL_E_SESSION_PROFILE_INVALID; indeks, który nie występuje nigdzie w profilu: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringtakIdentyfikator ustawienia wstępnego; zgłaszany jako SessionProfileMetadata.PresetId.
namestringtakNazwa wyświetlana ustawienia wstępnego; zgłaszana jako SessionProfileMetadata.PresetName.
settingsmapowanieniebrakSemantyczne ustawienia options.cfg, zob. Ustawienia. Klucze są dopasowywane do katalogu bez rozróżniania wielkości liter.
presentationmapowanieniedziedziczonePrezentacja ekranu startowego, zob. presentation. Gdy brak, ustawienie wstępne dziedziczy wartość bazową (wartość z /spec lub domyślną wartość CLI, Managed).
internet-texturesmapowanieniedziedziczoneZob. internet-textures.
behaviormapowanieniedziedziczoneLimity czasu, zob. behavior.

Stosowane jest tylko wybrane ustawienie wstępne. Każde ustawienie wstępne jest jednak parsowane i walidowane, więc błąd w ustawieniu wstępnym 3 powoduje niepowodzenie żądania ustawienia wstępnego 1.

presentation#

KluczTypWymaganyOpis
splashmapowanietakWymagany, gdy obecny jest presentation („Presentation requires splash.”). Zob. presentation.splash.

presentation.splash#

KluczTypWymaganyWartość domyślnaOpis
modestringtakmanaged instaluje na czas sesji bitmapy ekranu startowego OmsiLaunch (SplashMode.Managed). unset lub native zachowuje własne pliki ekranu startowego OMSI (SplashMode.Unset; Native jest aliasem). Bez rozróżniania wielkości liter. Cokolwiek innego: OL_E_SESSION_PROFILE_INVALID.
languagestringnieENGWersja językowa drugiego docelowego ekranu startowego: PTB, ENG, DEU, FRA (aliasy PT-BR, EN, DE, FR; każda nieznana wartość jest przy budowaniu sesji rozwiązywana do ENG). Przy mode: managed sesja nakłada GUI\NewSplashscreen_ENG.bmp i GUI\NewSplashscreen_<language>.bmp.
assetsstringniezasoby z pakietuKatalog względny wobec pakietu, zawierający ENG.bmp oraz, dla języka language innego niż angielski, <language>.bmp; każdy plik musi być 24-bitowym BMP o rozmiarze 640x480. Katalog musi istnieć w chwili wczytania profilu (OL_E_SESSION_PROFILE_ASSET_MISSING); pliki są walidowane przy uruchomieniu sesji (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Obowiązują reguły ograniczenia ścieżek. Gdy pominięty, używany jest katalog instalacji .omsilaunch\assets\splash (lub domyślne zasoby z pakietu).

Profil nie może ustawić SessionPresentationSpec.SuppressTrayIcon; pozostaje ono false, chyba że ustawi je /spec.

internet-textures#

KluczTypWymaganyOpis
modestringtaknative (InternetTexturesMode.Native, OMSI działa normalnie), disabled (Disabled, objęty profilem mechanizm pobierania działający w procesie jest blokowany na czas sesji), override (Override, profil .itx o zasięgu sesji jest instalowany jako Texture\standard.itx). Bez rozróżniania wielkości liter; cokolwiek innego: OL_E_SESSION_PROFILE_INVALID.
profilestringwymagany dla overrideŚcieżka pliku .itx względna wobec pakietu. Brak klucza przy override: OL_E_SESSION_PROFILE_INVALID; brak pliku: OL_E_SESSION_PROFILE_ASSET_MISSING. Obowiązują reguły ograniczenia ścieżek. Plik musi składać się z par wierszy URL / target z adresami URL http:// lub https:// (w przeciwnym razie OL_E_ITX_PROFILE_INVALID), a każdy cel musi rozwiązywać się do miejsca poniżej katalogu Texture\ instalacji bez przechodzenia przez punkt ponownej analizy (reparse point) (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Wymienione cele i Texture\standard.ipr stają się usunięciami w ramach sesji (zob. transakcje i odzyskiwanie).

behavior#

KluczTypWymaganyWartość domyślnaOpis
startup-timeoutliczba całkowita (sekundy)nie180Czas dozwolony od uruchomienia procesu do stanu Running. Przy wczytywaniu profilu musi być dodatni; sesja dodatkowo wymaga przy uruchomieniu wartości od 1 do 600 (w przeciwnym razie OL_E_START_SESSION). Odpowiada LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutliczba całkowita (sekundy)nie30Odpowiada LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT: nadzorca kończy OMSI bezpośrednio i nigdy nie odczytuje tej wartości.

Gdy obecny jest blok behavior, ustawiane są oba limity czasu (podana wartość lub domyślna) i całkowicie zastępują bazowy LaunchBehaviorSpec, w tym RestoreConfiguration i SuppressStaleClosecheckWarning, które wracają do wartości domyślnych (true, true).

Ustawienia#

Klucze settings to semantyczne nazwy z ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). Kompilator akceptuje klucz tylko wtedy, gdy istnieje (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) i jest zapisywalny (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Wartości są przechowywane jako ciągi znaków i przekształcane w poprawkę options.cfg, gdy sesja buduje swoje nakładki; nieprawidłowa wartość jest więc wykrywana w StartSessionAsync, a nie przy wczytywaniu profilu, i powoduje niepowodzenie sesji z OL_E_START_SESSION, którego komunikat zawiera OL_E_INVALID_SETTING_VALUE: <key>. Każde z poniższych ustawień zapisuje options.cfg; wszystkie mają zasięg sesji i po jej zakończeniu są dokładnie przywracane.

Postacie wartości:

  • bool to true lub false (bez rozróżniania wielkości liter). W przypadku tokenów obecności token jest dodawany lub usuwany; w przypadku tokenów odwróconych (no_*) wartość true usuwa token negatywny.
  • int / decimal są walidowane względem zakresu; wartości z dzielnikiem są zapisywane po podzieleniu (na przykład graphics.minObjectScreenPercent: 5 zapisuje 0.05).
  • string jest zapisywany dosłownie.
Klucz ustawieniaToken options.cfgTypZakres / wartościDowody
general.languagelanguagestringdowolnaSTATICALLY_VALIDATED
general.radioradiostringdowolnaSTATICALLY_VALIDATED
general.alternateViewaltViewbool (obecność)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (obecność)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (obecność)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (obecność odwrócona)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (obecność)STATICALLY_VALIDATED
general.currentDateuseActDatebool (obecność)STATICALLY_VALIDATED
general.currentYearuseActYearbool (obecność)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringdowolnaSTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, zapisywane /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, zapisywane /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (obecność)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (obecność)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (obecność odwrócona)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, zapisywane jako on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (obecność odwrócona)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (obecność odwrócona)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy lub fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (blok 4-wierszowy)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (obecność odwrócona)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (obecność odwrócona)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (obecność odwrócona)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (obecność odwrócona)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (obecność)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (obecność odwrócona)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (obecność odwrócona)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (oba tokeny obecności)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (obecność)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (obecność)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (obecność)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (obecność)STATICALLY_VALIDATED
traffic.randomVehiclesskładowa 0 AIMaxCountRandomint0..1000STATICALLY_VALIDATED (runtime RV-005)
traffic.humansskładowa 1 AIMaxCountRandomint0..1000STATICALLY_VALIDATED (runtime RV-005)
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

Wpisy katalogu, które istnieją, ale nie są zapisywalne (odrzucane z OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (zastąpione przez advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Ograniczenie ścieżek#

presentation.splash.assets i internet-textures.profile są rozwiązywane przez Confined(package root, value):

  1. Ścieżki zakorzenione (C:\...), ścieżki zaczynające się od \ oraz każda ścieżka ze składową równą .. są odrzucane.
  2. Obliczana jest pełna ścieżka, która musi zaczynać się od katalogu pakietu.
  3. Każda istniejąca składowa poniżej katalogu głównego pakietu, aż do ścieżki końcowej włącznie, jest sprawdzana pod kątem atrybutu ReparsePoint. Połączenie (junction), dowiązanie symboliczne katalogu lub dowiązanie symboliczne pliku w dowolnym miejscu tej ścieżki jest odrzucane, podobnie jak składowa, której nie da się sprawdzić (IOException / UnauthorizedAccessException).

Wszystkie trzy błędy to OL_E_SESSION_PROFILE_PATH_ESCAPE. Ta sama reguła punktów ponownej analizy jest stosowana przy budowaniu sesji do celów .itx w Texture\.

Pierwszeństwo i konflikty nadpisań#

CliInput.BuildSpecAsync składa specyfikację w następującej kolejności:

  1. Wartości domyślne (NEW_MAP, wszystko nieustawione, limity czasu 180 s / 30 s).
  2. /spec:<file.json>, jeśli podano, całkowicie zastępuje wartości domyślne.
  3. Katalog główny instalacji: jawny argument instalacji wygrywa z RootPath ze specyfikacji; . oznacza katalog zawierający plik wykonywalny.
  4. Profil (/predefined-profile + /predefined-profile-index): pakiet jest wczytywany, a RejectProfileConflicts działa na surowych argumentach CLI zanim cokolwiek zostanie scalone. Blok świata z punktu wyjścia jest następnie resetowany do pustego WorldSpec wybranego trybu (świat z /spec jest odrzucany, gdy używany jest profil), a SessionProfileCompiler.Apply nakłada profil na punkt wyjścia: new (tylko NEW_MAP), settings (scalane na Environment.General z punktu wyjścia, profil wygrywa dla każdego klucza) oraz presentation, internet-textures, behavior (każdy zastępuje blok z punktu wyjścia tylko wtedy, gdy ustawienie wstępne go definiuje).
  5. Pozostałe argumenty CLI są nakładane na wierzch: /map, /entrypoint, /entrypoint-index, /date, /time, /year, flagi pogody, flagi pojazdu, /set, flagi ekranu startowego, flagi tekstur internetowych, /startup-timeout, /shutdown-timeout. Limity czasu z CLI są stosowane tylko wtedy, gdy zostały podane; w przeciwnym razie obowiązuje wartość ze specyfikacji/profilu/domyślna.
  6. Sprawdzenie zgodności dla trybów innych niż NEW_MAP (ValidateCompatibility).

Argument CLI, który dotyczy pola należącego do wybranego profilu, jest konfliktem odrzucanym z OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (kod wyjścia 2, kategoria invalid_argument). Sprawdzenie odbywa się na poziomie pola, a nie wartości: powtórzenie wartości zdefiniowanej w profilu też jest konfliktem.

Argument CLIKonflikt, gdy profil definiujeTylko w trybie
/mapnew.mapNEW_MAP
/entrypoint lub /entrypoint-indexnew.entrypoint lub new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...ten sam <key> w settings ustawienia wstępnego (bez rozróżniania wielkości liter)dowolny
/splash, /splash-language, /splash-assetspresentation (dowolny)dowolny
/internet-textures, /internet-textures-profileinternet-textures (dowolny)dowolny
/startup-timeout, /shutdown-timeoutbehavior (dowolny)dowolny

Nie są konfliktami: klucze /set, których ustawienie wstępne nie definiuje (są dodawane), flagi pojazdu (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; profil nie może definiować pojazdu gracza) oraz dowolny argument świata przy /saved (blok new nie jest tam stosowany). /map, /entrypoint i /entrypoint-index są nieprawidłowe razem z /saved niezależnie od profili (OL_E_INVALID_ARGUMENT).

Kody błędów#

KodZgłaszany, gdyKod wyjścia CLI
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml nie istnieje2
OL_E_SESSION_PROFILE_PATH_ESCAPEid nie jest zwykłą nazwą katalogu; assets / profile wychodzi poza pakiet lub przechodzi przez punkt ponownej analizy2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema nie ma wartości omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALIDlimit rozmiaru, kształt dokumentu, kotwice, nieznany klucz, brak wymaganego klucza, wartość niebędąca skalarem, błędna liczba/data/godzina, niezgodność id, reguły liczby/indeksów ustawień wstępnych, nieobsługiwane słowa trybu, niedodatni limit czasu, presentation bez splash, override bez profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUNDbrak /predefined-profile-index, wartość spoza 1..5 lub brak ustawienia wstępnego z tym index2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNklucza settings nie ma w katalogu2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEklucz settings jest w katalogu, ale jest tylko do odczytu2
OL_E_SESSION_PROFILE_ASSET_MISSINGkatalog assets lub plik profile nie istnieje wewnątrz pakietu2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps jest niepuste, a efektywnej mapy nie ma na liście (lub nie da się jej ustalić)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTjawny argument CLI dotyczy pola należącego do profilu2

Wszystkie te błędy są zgłaszane podczas kompilowania wiersza polecenia, przed planowaniem. Są to wyjątki SessionProfileException (lub ArgumentException w przypadku konfliktu) i nigdy nie uruchamiają sesji. Pełny katalog znajduje się w dokumentacji błędów; kody wyjścia – w dokumentacji kodów wyjścia.

Jak profil jest widoczny w API#

Po pomyślnym wczytaniu specyfikacja zawiera rekord SessionProfileMetadata w LaunchSpec.SessionProfile:

PoleŹródło
Idid
Namename
Versionversion
Authorauthor
PresetIdid wybranego ustawienia wstępnego
PresetIndexindex wybranego ustawienia wstępnego
PresetNamename wybranego ustawienia wstępnego
PackagePathbezwzględna ścieżka katalogu pakietu

Planista dodaje informacyjny komunikat diagnostyczny session_profile.selected do każdego SessionPlan zbudowanego z takiej specyfikacji, z kluczami danych session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name i session_profile.path. Nie wpływa on na możliwość uruchomienia. Integratorzy korzystający bezpośrednio z publicznego API mogą wywoływać SessionProfileCompiler.Load i SessionProfileCompiler.Apply z OmsiLaunch.Core; reprezentacja YAML nigdy nie przechodzi do OmsiLaunch.Api.

Przykłady#

Przykład 1: profil zawierający tylko ustawienia, jedno ustawienie wstępne#

<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

Uruchomienie: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. Mapa i punkt wejścia pochodzą z wiersza polecenia, ponieważ profil nie definiuje bloku new; dodanie /set:graphics.maxFPS=60 jest dozwolone, a dodanie /set:traffic.humans=10 jest konfliktem.

Przykład 2: profil powiązany z mapą, z trzema ustawieniami wstępnymi i zasobami w pakiecie#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, z plikami assets\splash\ENG.bmp, assets\splash\DEU.bmp i textures\offline.itx wewnątrz pakietu:

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

Uruchomienie: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. Przy /saved:situations\mytrip.osn blok new jest pomijany, a plik .osn musi wskazywać na maps\Grundorf\global.cfg.

Przykład dołączony do pakietu#

Wydanie zawiera docs/examples/session-profiles/rmg-leste/profile.yaml (podgląd). Jest on poprawny składniowo, zgodny ze schematem i wczytałby się bez błędów. Dwie jego właściwości sprawiają, że w tym buildzie w niezmienionej postaci nie uruchamia sesji:

  1. Ustawia new.date, new.time i new.weather, co czyni plan niemożliwym do uruchomienia (zob. Blok new).
  2. Jego wartości ścieżek to zwykłe skalary z podwojonymi ukośnikami odwrotnymi (maps\\RMG Leste\\global.cfg). YAML zachowuje je podwojone, a identyfikatory map są porównywane tekstowo (wyłącznie po normalizacji / do \), więc new.map i compatibility.maps nie pasowałyby do identyfikatora z katalogu maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND podczas planowania). Wartość assets nadal się rozwiązuje, ponieważ normalizacja ścieżek Windows scala podwojone separatory.

Postać możliwa do uruchomienia w tym buildzie:

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