Sitzungsprofile

Dokumentation für Version v0.1.0-beta.3Quelle auf GitHub ansehen

Übersetzung der englischen Originalseite für OmsiLaunch 0.1.0-beta3. Maßgeblich ist die englische Seite: Bei Abweichungen gelten die englische Seite und der Code.

Ein Sitzungsprofil ist ein deklaratives YAML-Paket, das ein Inhaltsautor mit einer Karte oder einem Add-on ausliefert, damit Endanwender mit einem einzigen Befehl eine reproduzierbare OmsiLaunch-Sitzung starten können (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). Diese Seite ist die normative Referenz für das Format omsilaunch.session-profile/v1, wie es von SessionProfileCompiler in src/OmsiLaunch.Core/SessionProfiles.cs implementiert wird, für die von der CLI angewendeten Rangfolgeregeln (CliInput.BuildSpecAsync und RejectProfileConflicts in tools/OmsiLaunch.Cli/Program.cs) sowie für den Einstellungskatalog, den ein Profil schreiben darf (ConfigurationCatalog). Alles, was ein Profil kann, können auch die CLI-Flags und die LaunchSpec; ein Profil bündelt diese Entscheidungen lediglich.

Stabilität: STABLE_BETA für Parsing, Validierung, Konflikterkennung und die Blöcke settings / presentation / internet-textures / behavior (Offline-Test session-profiles.strict-compiler; der Overlay- und Wiederherstellungspfad ist durch RV-005 und RV-006 zur Laufzeit validiert, siehe Status der Runtime-Validierung). Die Schlüssel new.date, new.time, new.year und new.weather sind in diesem Build UNAVAILABLE (siehe Der new-Block).

Ablageort und Benennung des Pakets#

ElementRegel
Paketverzeichnis<installation root>\.omsilaunch\session-profiles\<id>\
Profildatei<package>\profile.yaml (exakter Name, eine Datei)
AssetsBeliebige Dateien oder Verzeichnisse innerhalb des Paketverzeichnisses, auf die über relative Pfade aus presentation.splash.assets und internet-textures.profile verwiesen wird
idMuss ein einfacher Verzeichnisname sein: Er darf nicht leer sein oder nur aus Leerraum bestehen, darf weder \, / noch : enthalten und darf die Zeichenfolge .. nicht enthalten. Verstöße ergeben OL_E_SESSION_PROFILE_PATH_ESCAPE. Der in profile.yaml deklarierte id-Wert muss Byte für Byte mit dem Verzeichnisnamen übereinstimmen (unter Beachtung der Groß-/Kleinschreibung); andernfalls OL_E_SESSION_PROFILE_INVALID.
Auswahl/predefined-profile:<id> zusammen mit /predefined-profile-index:<n>. Der Index ist obligatorisch: /predefined-profile ohne /predefined-profile-index scheitert mit OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Fehlendes PaketOL_E_SESSION_PROFILE_NOT_FOUND
Release-LayoutDas Release-Paket liefert ein Beispiel unter .omsilaunch\examples\session-profiles\rmg-leste\ aus (siehe Paketierung). Beispiele sind keine Profile: Kopieren Sie ein Paket nach .omsilaunch\session-profiles\<id>\, um es auswählbar zu machen.

Ein Profil wird vom Anwender oder vom Inhaltsautor installiert und entfernt. OmsiLaunch schreibt nie in ein Paket, kopiert es nie und löscht es nie. Das Paketverzeichnis ist nicht Teil einer Transaktion.

Parsing-Regeln#

RegelVerhaltenFehler
Größenlimitprofile.yaml darf 256 KiB (262,144 Bytes) nicht überschreitenOL_E_SESSION_PROFILE_INVALID
DokumentformGenau ein YAML-Dokument, dessen Wurzelknoten ein Mapping istOL_E_SESSION_PROFILE_INVALID
Schemaschema muss exakt omsilaunch.session-profile/v1 lauten (unter Beachtung der Groß-/Kleinschreibung)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Anker und AliaseJeder Knoten, der irgendwo im Dokument einen YAML-Anker (&name) trägt, wird vor der Validierung abgelehnt; Aliase (*name) können daher nicht vorkommenOL_E_SESSION_PROFILE_INVALID („YAML anchors are not supported.“)
Unbekannte SchlüsselJedes Mapping ist geschlossen: Ein Schlüssel, der in den folgenden Tabellen für seinen Kontext nicht aufgeführt ist, wird abgelehnt („Unknown property in <context>: <key>“). Schlüssel werden unter Beachtung der Groß-/Kleinschreibung verglichen (Schema: ist ein unbekannter Schlüssel). Das einzige offene Mapping ist settings, dessen Schlüssel stattdessen gegen den Einstellungskatalog validiert werden.OL_E_SESSION_PROFILE_INVALID
SkalareJeder Blattwert muss ein Skalar sein; Sequenzen und Mappings an Stellen, an denen ein Skalar erwartet wird, werden abgelehnt („<field> must be a scalar.“)OL_E_SESSION_PROFILE_INVALID
ZahlenGanzzahlen werden mit der invarianten Kultur geparst (1, 30); Dezimalzahlen in settings verwenden . als TrennzeichenOL_E_SESSION_PROFILE_INVALID
Datum und Uhrzeitnew.date.value wird von DateOnly.Parse und new.time.value von TimeOnly.Parse geparst, beide mit invarianter Kultur; verwenden Sie die ISO-Formen yyyy-MM-dd und HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
YAML-SyntaxfehlerWerden mit der Meldung des Parsers gemeldetOL_E_SESSION_PROFILE_INVALID („Invalid YAML: ...“)
Ausführbarer InhaltYAML wird mit YamlDotNet nur in einen Repräsentationsbaum geparst; Tags, benutzerdefinierte Typen oder Codeausführung werden nicht unterstützt

Backslashes in einfachen (nicht in Anführungszeichen gesetzten) Skalaren sind literale Zeichen. Schreiben Sie Windows-Pfade mit einem einzelnen Backslash (maps\Grundorf\global.cfg). Ein doppelter Backslash in einem einfachen Skalar bleibt im Wert doppelt; siehe Das mitgelieferte Beispiel.

Schlüsselreferenz#

Kontexte werden genau so benannt, wie der Compiler sie benennt. Jeder hier aufgeführte Schlüssel wird akzeptiert, sonst keiner.

profile (Wurzel-Mapping)#

SchlüsselTypErforderlichBeschreibung
schemastringjaLiteral omsilaunch.session-profile/v1.
idstringjaPaketkennung; muss dem Verzeichnisnamen entsprechen.
namestringjaAnzeigename; gemeldet in SessionProfileMetadata.Name.
authorstringjaAutor; gemeldet in SessionProfileMetadata.Author.
versionstringjaVersionszeichenfolge des Pakets (frei formuliert, in Anführungszeichen setzen: "1.0"); gemeldet in SessionProfileMetadata.Version.
compatibilityMappingneinSiehe compatibility.
newMappingneinNEW_MAP-Standardwerte. Siehe new.
presetsSequenz von Mappingsja1 bis 5 Voreinstellungseinträge. Null, mehr als fünf oder ein Wert, der keine Sequenz ist, ergibt OL_E_SESSION_PROFILE_INVALID.

compatibility#

SchlüsselTypErforderlichBeschreibung
mapsSequenz von StringsneinKartenidentitäten (maps\<Map>\global.cfg), für die dieses Profil gültig ist. / wird zu \ normalisiert; der Vergleich erfolgt ohne Beachtung der Groß-/Kleinschreibung. Eine fehlende oder leere Liste bedeutet „jede Karte“. Ist sie nicht leer, wird sie für WorldMode.NewMap (gegen die wirksame new.map oder /map) und für WorldMode.SavedSituation (gegen die Karte, auf die die ausgewählte .osn verweist, aufgelöst über den Inhaltskatalog) erzwungen. Für WorldMode.LastMapState lässt sich keine Karte ableiten, daher scheitert eine nicht leere Liste immer. Fehler: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

Der Block wird gelesen und validiert, sobald er vorhanden ist, aber nur dann auf die Spec angewendet, wenn der ausgewählte Weltmodus NEW_MAP ist (/new, der CLI-Standard). Unter /saved:<file.osn> wird der Block ignoriert.

SchlüsselTypErforderlichAngewendetBeschreibung
mapstringneinjaKartenidentität in der normalisierten Form maps\<Map>\global.cfg (die Planung verlangt genau diese Form: beginnt mit maps\, endet mit \global.cfg, kein ..). Setzt WorldSpec.MapIdentity.
entrypoint-indexGanzzahlneinjaIndex des angezeigten Einstiegspunkts (0-basierte Position in der Einstiegspunktliste von OMSI). Setzt PresentedEntrypointIndex und löscht eine etwaige Einstiegspunktidentität.
entrypointstringneinjaRohe Einstiegspunktidentität. Setzt EntrypointIdentity und löscht den angezeigten Index. Sind sowohl entrypoint-index als auch entrypoint vorhanden, gewinnt entrypoint, weil es zuletzt angewendet wird. Die Auswahl über die Einstiegspunktidentität ist PARTIAL (BI-001): Die Planung meldet world.entrypoint-identity als RUNTIME_PARTIAL, und der Plan ist nicht ausführbar. Verwenden Sie bevorzugt entrypoint-index.
dateMappingneinnein (UNAVAILABLE)Siehe new.date.
timeMappingneinnein (UNAVAILABLE)Siehe new.time.
yearGanzzahlneinnein (UNAVAILABLE)Explizites Jahr.
weatherMappingneinnein (UNAVAILABLE)Siehe new.weather.

date, time, year und weather werden in DateSpec, TimeSpec, YearSpec und WeatherSpec mit DateTimeMode.Explicit / dem ausgewählten WeatherMode kompiliert. Der Sitzungsplaner (src/OmsiLaunch.Core/SessionPlanner.cs) meldet daraufhin die Capabilities world.explicit-date, world.explicit-time, world.explicit-year und weather als STATICALLY_PARTIAL, fügt den Plandiagnosen OL_E_CAPABILITY_UNAVAILABLE hinzu und kennzeichnet den Plan als nicht ausführbar. Das Plugin lehnt zusätzlich eine Übergabe ab, deren Datums- oder Zeitmodus nicht Unset ist (plugin.request.unsupported). Folge für diesen Build: Ein Profil, das einen dieser vier Schlüssel setzt, kann mit /plan validiert werden, aber keine Sitzung starten (Exitcode 1, OL_E_PLAN_NOT_RUNNABLE). Lassen Sie sie in Profilen weg, die ausgeführt werden sollen.

new.date#

SchlüsselTypErforderlichBeschreibung
modestringjaMuss explicit sein (ohne Beachtung der Groß-/Kleinschreibung). Jeder andere Wert ergibt OL_E_SESSION_PROFILE_INVALID („date must use explicit mode.“).
valuestringjayyyy-MM-dd.

new.time#

SchlüsselTypErforderlichBeschreibung
modestringjaMuss explicit sein.
valuestringjaHH:mm oder HH:mm:ss.

new.weather#

SchlüsselTypErforderlichBeschreibung
modestringjapreset, icao oder real (ohne Beachtung der Groß-/Kleinschreibung). Alles andere: OL_E_SESSION_PROFILE_INVALID („Unsupported weather mode“).
presetstringbei mode: presetName der Wettervoreinstellung.
icaostringbei mode: icaoICAO-Stationscode.

preset (jeder Eintrag von presets)#

SchlüsselTypErforderlichStandardwertBeschreibung
indexGanzzahlja1 bis 5, eindeutig innerhalb des Profils. Wird mit /predefined-profile-index ausgewählt. Doppelt oder außerhalb des Bereichs: OL_E_SESSION_PROFILE_INVALID; ein Index, der im Profil nirgends existiert: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringjaKennung der Voreinstellung; gemeldet als SessionProfileMetadata.PresetId.
namestringjaAnzeigename der Voreinstellung; gemeldet als SessionProfileMetadata.PresetName.
settingsMappingneinkeinerSemantische options.cfg-Einstellungen, siehe Einstellungen. Schlüssel werden ohne Beachtung der Groß-/Kleinschreibung mit dem Katalog verglichen.
presentationMappingneingeerbtStartbilddarstellung, siehe presentation. Fehlt der Block, erbt die Voreinstellung die Ausgangsbasis (/spec-Wert oder den CLI-Standard, Managed).
internet-texturesMappingneingeerbtSiehe internet-textures.
behaviorMappingneingeerbtTimeouts, siehe behavior.

Nur die ausgewählte Voreinstellung wird angewendet. Dennoch wird jede Voreinstellung geparst und validiert, sodass ein Fehler in Voreinstellung 3 eine Anforderung für Voreinstellung 1 scheitern lässt.

presentation#

SchlüsselTypErforderlichBeschreibung
splashMappingjaErforderlich, wenn presentation vorhanden ist („Presentation requires splash.“). Siehe presentation.splash.

presentation.splash#

SchlüsselTypErforderlichStandardwertBeschreibung
modestringjamanaged installiert für die Sitzung die Startbild-Bitmaps von OmsiLaunch (SplashMode.Managed). unset oder native belässt die eigenen Startbilddateien von OMSI (SplashMode.Unset; Native ist ein Alias). Ohne Beachtung der Groß-/Kleinschreibung. Alles andere: OL_E_SESSION_PROFILE_INVALID.
languagestringneinENGSprache des zweiten Startbildziels: PTB, ENG, DEU, FRA (Aliase PT-BR, EN, DE, FR; alles Unbekannte wird beim Aufbau der Sitzung zu ENG aufgelöst). Mit mode: managed legt die Sitzung GUI\NewSplashscreen_ENG.bmp und GUI\NewSplashscreen_<language>.bmp als Overlay an.
assetsstringneinmitgelieferte AssetsVerzeichnis relativ zum Paket, das ENG.bmp und, bei einer nicht englischen language, <language>.bmp enthält; jede Datei muss ein 640x480-BMP mit 24 Bit sein. Das Verzeichnis muss beim Laden des Profils existieren (OL_E_SESSION_PROFILE_ASSET_MISSING); die Dateien werden beim Sitzungsstart validiert (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Die Regeln zur Pfadbeschränkung gelten. Wird der Schlüssel weggelassen, wird .omsilaunch\assets\splash der Installation (oder die mitgelieferten Standarddateien) verwendet.

Ein Profil kann SessionPresentationSpec.SuppressTrayIcon nicht setzen; der Wert bleibt false, sofern ihn nicht eine /spec setzt.

internet-textures#

SchlüsselTypErforderlichBeschreibung
modestringjanative (InternetTexturesMode.Native, OMSI verhält sich normal), disabled (Disabled, der profilierte prozessinterne Downloader wird für die Sitzung unterdrückt), override (Override, ein sitzungsbezogenes .itx-Profil wird als Texture\standard.itx installiert). Ohne Beachtung der Groß-/Kleinschreibung; alles andere: OL_E_SESSION_PROFILE_INVALID.
profilestringerforderlich für overridePfad relativ zum Paket zur .itx-Datei. Fehlender Schlüssel bei override: OL_E_SESSION_PROFILE_INVALID; fehlende Datei: OL_E_SESSION_PROFILE_ASSET_MISSING. Die Regeln zur Pfadbeschränkung gelten. Die Datei muss aus URL- / target-Zeilenpaaren mit http://- oder https://-URLs bestehen (andernfalls OL_E_ITX_PROFILE_INVALID), und jedes Ziel muss unterhalb des Texture\-Verzeichnisses der Installation aufgelöst werden, ohne einen Analysepunkt (Reparse Point) zu durchlaufen (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Die aufgeführten Ziele und Texture\standard.ipr werden zu Sitzungslöschungen (siehe Transaktionen und Recovery).

behavior#

SchlüsselTypErforderlichStandardwertBeschreibung
startup-timeoutGanzzahl (Sekunden)nein180Zulässige Zeit vom Prozessstart bis Running. Muss beim Laden des Profils positiv sein; die Sitzung verlangt beim Start zusätzlich 1 bis 600 (andernfalls OL_E_START_SESSION). Entspricht LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutGanzzahl (Sekunden)nein30Entspricht LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT: Der Supervisor beendet OMSI direkt und liest diesen Wert nie.

Ist der behavior-Block vorhanden, werden beide Timeouts gesetzt (angegebener Wert oder Standardwert) und ersetzen die LaunchBehaviorSpec der Ausgangsbasis vollständig, einschließlich RestoreConfiguration und SuppressStaleClosecheckWarning, die auf ihre Standardwerte (true, true) zurückfallen.

Einstellungen#

settings-Schlüssel sind die semantischen Namen aus ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). Der Compiler akzeptiert einen Schlüssel nur, wenn er existiert (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) und beschreibbar ist (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Werte werden als Strings gespeichert und in einen options.cfg-Patch umgewandelt, wenn die Sitzung ihre Overlays aufbaut; ein ungültiger Wert wird daher erst bei StartSessionAsync erkannt, nicht beim Laden des Profils, und lässt die Sitzung mit OL_E_START_SESSION scheitern, dessen Meldung OL_E_INVALID_SETTING_VALUE: <key> enthält. Jede der folgenden Einstellungen schreibt in options.cfg; alle sind sitzungsbezogen und werden nach der Sitzung exakt wiederhergestellt.

Wertformen:

  • bool ist true oder false (ohne Beachtung der Groß-/Kleinschreibung). Bei Präsenz-Tokens wird das Token hinzugefügt oder entfernt; bei invertierten Tokens (no_*) entfernt true das negative Token.
  • int / decimal werden gegen den Bereich validiert; Werte mit einem Divisor werden geteilt gespeichert (z. B. schreibt graphics.minObjectScreenPercent: 5 den Wert 0.05).
  • string wird unverändert geschrieben.
Einstellungsschlüsseloptions.cfg-TokenTypBereich / WerteNachweis
general.languagelanguagestringbeliebigSTATICALLY_VALIDATED
general.radioradiostringbeliebigSTATICALLY_VALIDATED
general.alternateViewaltViewbool (Präsenz)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (Präsenz)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (Präsenz)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (invertierte Präsenz)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (Präsenz)STATICALLY_VALIDATED
general.currentDateuseActDatebool (Präsenz)STATICALLY_VALIDATED
general.currentYearuseActYearbool (Präsenz)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringbeliebigSTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, gespeichert /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, gespeichert /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (Präsenz)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (Präsenz)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (invertierte Präsenz)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, geschrieben als on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (invertierte Präsenz)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (invertierte Präsenz)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy oder fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (4-zeiliger Block)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (invertierte Präsenz)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (invertierte Präsenz)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (invertierte Präsenz)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (invertierte Präsenz)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (Präsenz)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (invertierte Präsenz)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (invertierte Präsenz)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (beide Präsenz-Tokens)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (Präsenz)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (Präsenz)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (Präsenz)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (Präsenz)STATICALLY_VALIDATED
traffic.randomVehiclesAIMaxCountRandom Komponente 0int0..1000STATICALLY_VALIDATED (RV-005 zur Laufzeit)
traffic.humansAIMaxCountRandom Komponente 1int0..1000STATICALLY_VALIDATED (RV-005 zur Laufzeit)
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

Katalogeinträge, die existieren, aber nicht beschreibbar sind (abgelehnt mit OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (abgelöst durch advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Pfadbeschränkung#

presentation.splash.assets und internet-textures.profile werden durch Confined(package root, value) aufgelöst:

  1. Absolute Pfade (C:\...), Pfade, die mit \ beginnen, und jede Pfadkomponente, die .. entspricht, werden abgelehnt.
  2. Der vollständige Pfad wird berechnet und muss mit dem Paketverzeichnis beginnen.
  3. Jede existierende Komponente unterhalb des Paketstamms bis einschließlich des endgültigen Pfads wird auf das Attribut ReparsePoint geprüft. Eine Junction, ein symbolischer Verzeichnislink oder ein symbolischer Dateilink irgendwo auf diesem Pfad wird abgelehnt, ebenso eine Komponente, die sich nicht prüfen lässt (IOException / UnauthorizedAccessException).

Alle drei Fehler ergeben OL_E_SESSION_PROFILE_PATH_ESCAPE. Dieselbe Regel für Analysepunkte wird beim Aufbau der Sitzung auf .itx-Ziele unter Texture\ angewendet.

Rangfolge und Überschreibungskonflikte#

CliInput.BuildSpecAsync setzt die Spec in dieser Reihenfolge zusammen:

  1. Standardwerte (NEW_MAP, alles nicht gesetzt, Timeouts 180 s / 30 s).
  2. /spec:<file.json> ersetzt, falls angegeben, die Standardwerte vollständig.
  3. Installationsstammverzeichnis: Ein explizites Installationsargument hat Vorrang vor dem RootPath der Spec; . bedeutet das Verzeichnis, das die ausführbare Datei enthält.
  4. Profil (/predefined-profile + /predefined-profile-index): Das Paket wird geladen, und RejectProfileConflicts läuft gegen die rohen CLI-Argumente, bevor irgendetwas zusammengeführt wird. Anschließend wird der Weltblock der Ausgangsbasis auf eine leere WorldSpec des ausgewählten Modus zurückgesetzt (eine /spec-Welt wird verworfen, wenn ein Profil verwendet wird), und SessionProfileCompiler.Apply legt das Profil über die Ausgangsbasis: new (nur NEW_MAP), settings (über Environment.General der Ausgangsbasis zusammengeführt, das Profil gewinnt je Schlüssel) sowie presentation, internet-textures, behavior (jeweils ersetzen sie den Block der Ausgangsbasis nur, wenn die Voreinstellung ihn definiert).
  5. Übrige CLI-Argumente werden darübergelegt: /map, /entrypoint, /entrypoint-index, /date, /time, /year, Wetter-Flags, Fahrzeug-Flags, /set, Startbild-Flags, Internettextur-Flags, /startup-timeout, /shutdown-timeout. Timeouts aus der CLI gelten nur, wenn sie angegeben sind; andernfalls bleibt der Wert aus Spec/Profil/Standard bestehen.
  6. Kompatibilitätsprüfung für Modi außer NEW_MAP (ValidateCompatibility).

Ein CLI-Argument, das auf ein Feld zielt, das dem ausgewählten Profil gehört, ist ein Konflikt und wird mit OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT abgelehnt (Exitcode 2, Kategorie invalid_argument). Die Prüfung erfolgt pro Feld, nicht pro Wert: Auch die Wiederholung des profileigenen Werts ist ein Konflikt.

CLI-ArgumentKonflikt, wenn das Profil Folgendes definiertNur im Modus
/mapnew.mapNEW_MAP
/entrypoint oder /entrypoint-indexnew.entrypoint oder new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...denselben <key> in den settings der Voreinstellung (ohne Beachtung der Groß-/Kleinschreibung)jeder
/splash, /splash-language, /splash-assetspresentation (beliebig)jeder
/internet-textures, /internet-textures-profileinternet-textures (beliebig)jeder
/startup-timeout, /shutdown-timeoutbehavior (beliebig)jeder

Keine Konflikte sind: /set-Schlüssel, die die Voreinstellung nicht definiert (sie werden hinzugefügt), Fahrzeug-Flags (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; ein Profil kann kein Spielerfahrzeug definieren) und jedes Weltargument unter /saved (der new-Block wird dort nicht angewendet). /map, /entrypoint und /entrypoint-index sind zusammen mit /saved unabhängig von Profilen ungültig (OL_E_INVALID_ARGUMENT).

Fehlercodes#

CodeAusgelöst, wennCLI-Exitcode
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml nicht existiert2
OL_E_SESSION_PROFILE_PATH_ESCAPEid kein einfacher Verzeichnisname ist; assets / profile das Paket verlässt oder einen Analysepunkt durchläuft2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema nicht omsilaunch.session-profile/v1 ist2
OL_E_SESSION_PROFILE_INVALIDGrößenlimit, Dokumentform, Anker, unbekannter Schlüssel, fehlender erforderlicher Schlüssel, nicht skalarer Wert, ungültige Zahl/ungültiges Datum/ungültige Uhrzeit, id-Abweichung, Regeln für Anzahl/Index der Voreinstellungen, nicht unterstützte Moduswörter, nicht positives Timeout, presentation ohne splash, override ohne profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND/predefined-profile-index fehlt, außerhalb von 1..5 liegt oder es keine Voreinstellung mit diesem index gibt2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNein settings-Schlüssel nicht im Katalog steht2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEein settings-Schlüssel katalogisiert, aber schreibgeschützt ist2
OL_E_SESSION_PROFILE_ASSET_MISSINGdas assets-Verzeichnis oder die profile-Datei innerhalb des Pakets nicht existiert2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps nicht leer ist und die wirksame Karte nicht aufgeführt ist (oder sich nicht ableiten lässt)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTein explizites CLI-Argument auf ein profileigenes Feld zielt2

Alle diese Fehler werden ausgelöst, während die Befehlszeile kompiliert wird, also vor der Planung. Es handelt sich um SessionProfileException (bzw. ArgumentException für den Konflikt), und sie starten nie eine Sitzung. Der vollständige Katalog steht unter Fehler, die Exitcodes unter Exitcodes.

Wie ein Profil in der API erscheint#

Nach einem erfolgreichen Laden trägt die Spec einen SessionProfileMetadata-Datensatz in LaunchSpec.SessionProfile:

FeldQuelle
Idid
Namename
Versionversion
Authorauthor
PresetIdid der ausgewählten Voreinstellung
PresetIndexindex der ausgewählten Voreinstellung
PresetNamename der ausgewählten Voreinstellung
PackagePathabsolutes Paketverzeichnis

Der Planer fügt jedem SessionPlan, der aus einer solchen Spec erstellt wird, die informative Diagnose session_profile.selected hinzu, mit den Datenschlüsseln session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name und session_profile.path. Sie beeinflusst die Ausführbarkeit nicht. Integratoren, die die öffentliche API direkt verwenden, können SessionProfileCompiler.Load und SessionProfileCompiler.Apply aus OmsiLaunch.Core aufrufen; die YAML-Repräsentation gelangt nie in OmsiLaunch.Api.

Beispiele#

Beispiel 1: Profil nur mit Einstellungen, eine Voreinstellung#

<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

Ausführen: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. Karte und Einstiegspunkt stammen aus der Befehlszeile, weil das Profil keinen new-Block definiert; das Hinzufügen von /set:graphics.maxFPS=60 ist erlaubt, das Hinzufügen von /set:traffic.humans=10 ist ein Konflikt.

Beispiel 2: kartengebundenes Profil mit drei Voreinstellungen und mitgelieferten Assets#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, mit assets\splash\ENG.bmp, assets\splash\DEU.bmp und textures\offline.itx innerhalb des Pakets:

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

Ausführen: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. Mit /saved:situations\mytrip.osn wird der new-Block übersprungen, und die .osn muss auf maps\Grundorf\global.cfg verweisen.

Das mitgelieferte Beispiel#

Das Release liefert docs/examples/session-profiles/rmg-leste/profile.yaml aus (ansehen). Es ist syntaktisch gültig, entspricht dem Schema und würde ohne Fehler geladen. Zwei Eigenschaften verhindern, dass es in diesem Build unverändert eine Sitzung startet:

  1. Es setzt new.date, new.time und new.weather, wodurch der Plan nicht ausführbar wird (siehe Der new-Block).
  2. Seine Pfadwerte sind einfache Skalare mit doppelten Backslashes (maps\\RMG Leste\\global.cfg). YAML behält sie doppelt bei, und Kartenidentitäten werden textuell verglichen (nur nach der Normalisierung von / zu \), sodass new.map und compatibility.maps nicht mit der Katalogidentität maps\RMG Leste\global.cfg übereinstimmen würden (OL_E_MAP_NOT_FOUND bei der Planung). Der assets-Wert wird dennoch aufgelöst, weil die Windows-Pfadnormalisierung doppelte Trennzeichen zusammenfasst.

Die in diesem Build ausführbare Form lautet:

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