Perfiles de sesión

Documentación de la versión v0.1.0-beta.3Ver código fuente en GitHub

Traducción de la página original en inglés de OmsiLaunch 0.1.0-beta3. La página en inglés es la referencia normativa: si hay diferencias, prevalecen la página en inglés y el código.

Un perfil de sesión es un paquete YAML declarativo que un autor de contenido distribuye con un mapa o un complemento para que los usuarios finales puedan iniciar una sesión reproducible de OmsiLaunch con un solo comando (OmsiLaunch.exe /predefined-profile:<id> /predefined-profile-index:<1..5> /new). Esta página es la referencia normativa del formato omsilaunch.session-profile/v1 tal como lo implementa SessionProfileCompiler en src/OmsiLaunch.Core/SessionProfiles.cs, de las reglas de precedencia que aplica la CLI (CliInput.BuildSpecAsync y RejectProfileConflicts en tools/OmsiLaunch.Cli/Program.cs) y del catálogo de ajustes que un perfil puede escribir (ConfigurationCatalog). Todo lo que puede hacer un perfil también lo pueden hacer los flags de la CLI y el LaunchSpec; un perfil solo empaqueta esas elecciones.

Estabilidad: STABLE_BETA para el análisis, la validación, la detección de conflictos y los bloques settings / presentation / internet-textures / behavior (prueba offline session-profiles.strict-compiler; la ruta de overlay y restauración está validada en runtime por RV-005 y RV-006, consulte el estado de la validación en runtime). Las claves new.date, new.time, new.year y new.weather son UNAVAILABLE en este build (consulte El bloque new).

Ubicación y nombre del paquete#

ElementoRegla
Directorio del paquete<installation root>\.omsilaunch\session-profiles\<id>\
Archivo del perfil<package>\profile.yaml (nombre exacto, un solo archivo)
AssetsCualquier archivo o directorio dentro del directorio del paquete, referenciado mediante una ruta relativa desde presentation.splash.assets e internet-textures.profile
idDebe ser un nombre de directorio simple: no debe estar vacío ni contener solo espacios en blanco, no debe contener \, / ni : y no debe contener la secuencia ... Las infracciones son OL_E_SESSION_PROFILE_PATH_ESCAPE. El valor id declarado dentro de profile.yaml debe ser igual al nombre del directorio byte por byte (distingue mayúsculas de minúsculas); de lo contrario, OL_E_SESSION_PROFILE_INVALID.
Selección/predefined-profile:<id> junto con /predefined-profile-index:<n>. El índice es obligatorio: /predefined-profile sin /predefined-profile-index falla con OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
Paquete inexistenteOL_E_SESSION_PROFILE_NOT_FOUND
Estructura de la releaseEl paquete de release incluye un ejemplo en .omsilaunch\examples\session-profiles\rmg-leste\ (consulte empaquetado). Los ejemplos no son perfiles: copie un paquete a .omsilaunch\session-profiles\<id>\ para que se pueda seleccionar.

Un perfil lo instala y lo elimina el usuario o el autor del contenido. OmsiLaunch nunca escribe en un paquete, nunca lo copia y nunca lo elimina. El directorio del paquete no forma parte de ninguna transacción.

Reglas de análisis#

ReglaComportamientoError
Límite de tamañoprofile.yaml no debe superar 256 KiB (262,144 bytes)OL_E_SESSION_PROFILE_INVALID
Forma del documentoExactamente un documento YAML cuyo nodo raíz es un mapeoOL_E_SESSION_PROFILE_INVALID
Esquemaschema debe ser exactamente omsilaunch.session-profile/v1 (distingue mayúsculas de minúsculas)OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTED
Anclas y aliasCualquier nodo que lleve un ancla YAML (&name) en cualquier parte del documento se rechaza antes de la validación; por lo tanto, no pueden aparecer alias (*name)OL_E_SESSION_PROFILE_INVALID ("YAML anchors are not supported.")
Claves desconocidasTodos los mapeos son cerrados: una clave que no figura para su contexto en las tablas siguientes se rechaza ("Unknown property in <context>: <key>"). Las claves se comparan distinguiendo mayúsculas de minúsculas (Schema: es una clave desconocida). El único mapeo abierto es settings, cuyas claves se validan en cambio contra el catálogo de ajustes.OL_E_SESSION_PROFILE_INVALID
EscalaresTodo valor hoja debe ser un escalar; se rechazan secuencias y mapeos donde se espera un escalar ("<field> must be a scalar.")OL_E_SESSION_PROFILE_INVALID
NúmerosLos enteros se analizan con la referencia cultural invariable (1, 30); los decimales en settings usan . como separadorOL_E_SESSION_PROFILE_INVALID
Fechas y horasnew.date.value se analiza con DateOnly.Parse y new.time.value con TimeOnly.Parse, ambos con la referencia cultural invariable; use las formas ISO yyyy-MM-dd y HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
Errores de sintaxis YAMLSe informan con el mensaje del parserOL_E_SESSION_PROFILE_INVALID ("Invalid YAML: ...")
Contenido ejecutableEl YAML se analiza con YamlDotNet únicamente en un árbol de representación; no se admiten etiquetas, tipos personalizados ni ejecución de código

Las barras invertidas en escalares simples (sin comillas) son caracteres literales. Escriba las rutas de Windows con una sola barra invertida (maps\Grundorf\global.cfg). Una barra invertida duplicada en un escalar simple permanece duplicada en el valor; consulte El ejemplo incluido en el paquete.

Referencia de claves#

Los contextos se nombran exactamente como los nombra el compilador. Se acepta cada clave indicada aquí; ninguna otra.

profile (mapeo raíz)#

ClaveTipoObligatoriaDescripción
schemastringsíLiteral omsilaunch.session-profile/v1.
idstringsíIdentificador del paquete; debe ser igual al nombre del directorio.
namestringsíNombre para mostrar; se informa en SessionProfileMetadata.Name.
authorstringsíAutor; se informa en SessionProfileMetadata.Author.
versionstringsíCadena de versión del paquete (formato libre, póngala entre comillas: "1.0"); se informa en SessionProfileMetadata.Version.
compatibilitymapeonoConsulte compatibility.
newmapeonoValores predeterminados de NEW_MAP. Consulte new.
presetssecuencia de mapeossíDe 1 a 5 entradas de preset. Cero, más de cinco o un valor que no sea una secuencia es OL_E_SESSION_PROFILE_INVALID.

compatibility#

ClaveTipoObligatoriaDescripción
mapssecuencia de stringsnoIdentidades de mapa (maps\<Map>\global.cfg) para las que este perfil es válido. / se normaliza a \; la comparación no distingue mayúsculas de minúsculas. Una lista ausente o vacía significa "cualquier mapa". Cuando no está vacía, se exige para WorldMode.NewMap (frente al new.map efectivo o /map) y para WorldMode.SavedSituation (frente al mapa al que hace referencia el .osn seleccionado, resuelto mediante el catálogo de contenido). Para WorldMode.LastMapState no se puede derivar ningún mapa, por lo que una lista no vacía siempre falla. Error: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

El bloque se lee y se valida siempre que está presente, pero solo se aplica al spec cuando el modo de mundo seleccionado es NEW_MAP (/new, el valor predeterminado de la CLI). Con /saved:<file.osn> el bloque se ignora.

ClaveTipoObligatoriaSe aplicaDescripción
mapstringnosíIdentidad de mapa en la forma normalizada maps\<Map>\global.cfg (la planificación exige exactamente esta forma: empieza con maps\, termina con \global.cfg, sin ..). Establece WorldSpec.MapIdentity.
entrypoint-indexintegernosíÍndice del punto de entrada presentado (posición basada en 0 en la lista de puntos de entrada de OMSI). Establece PresentedEntrypointIndex y borra cualquier identidad de punto de entrada.
entrypointstringnosíIdentidad de punto de entrada sin procesar. Establece EntrypointIdentity y borra el índice presentado. Si están presentes tanto entrypoint-index como entrypoint, prevalece entrypoint porque se aplica al final. La selección por identidad de punto de entrada es PARTIAL (BI-001): la planificación informa world.entrypoint-identity como RUNTIME_PARTIAL y el plan no es ejecutable. Prefiera entrypoint-index.
datemapeonono (UNAVAILABLE)Consulte new.date.
timemapeonono (UNAVAILABLE)Consulte new.time.
yearintegernono (UNAVAILABLE)Año explícito.
weathermapeonono (UNAVAILABLE)Consulte new.weather.

date, time, year y weather se compilan en DateSpec, TimeSpec, YearSpec y WeatherSpec con DateTimeMode.Explicit / el WeatherMode seleccionado. El planificador de sesiones (src/OmsiLaunch.Core/SessionPlanner.cs) informa entonces las capacidades world.explicit-date, world.explicit-time, world.explicit-year y weather como STATICALLY_PARTIAL, agrega OL_E_CAPABILITY_UNAVAILABLE a los diagnósticos del plan y marca el plan como no ejecutable. Además, el plugin rechaza un handoff cuyo modo de fecha u hora no sea Unset (plugin.request.unsupported). Consecuencia para este build: un perfil que establece cualquiera de estas cuatro claves se puede validar con /plan, pero no puede iniciar una sesión (código de salida 1, OL_E_PLAN_NOT_RUNNABLE). Omítalas en los perfiles destinados a ejecutarse.

new.date#

ClaveTipoObligatoriaDescripción
modestringsíDebe ser explicit (sin distinguir mayúsculas de minúsculas). Cualquier otro valor es OL_E_SESSION_PROFILE_INVALID ("date must use explicit mode.").
valuestringsíyyyy-MM-dd.

new.time#

ClaveTipoObligatoriaDescripción
modestringsíDebe ser explicit.
valuestringsíHH:mm o HH:mm:ss.

new.weather#

ClaveTipoObligatoriaDescripción
modestringsípreset, icao o real (sin distinguir mayúsculas de minúsculas). Cualquier otra cosa: OL_E_SESSION_PROFILE_INVALID ("Unsupported weather mode").
presetstringcuando mode: presetNombre del preset de clima.
icaostringcuando mode: icaoCódigo ICAO de la estación.

preset (cada entrada de presets)#

ClaveTipoObligatoriaValor predeterminadoDescripción
indexintegersíDe 1 a 5, único dentro del perfil. Se selecciona con /predefined-profile-index. Duplicado o fuera de rango: OL_E_SESSION_PROFILE_INVALID; un índice que no existe en ninguna parte del perfil: OL_E_SESSION_PROFILE_PRESET_NOT_FOUND.
idstringsíIdentificador del preset; se informa como SessionProfileMetadata.PresetId.
namestringsíNombre para mostrar del preset; se informa como SessionProfileMetadata.PresetName.
settingsmapeononingunoAjustes semánticos de options.cfg; consulte Ajustes. Las claves se comparan con el catálogo sin distinguir mayúsculas de minúsculas.
presentationmapeonoheredadoPresentación del splash; consulte presentation. Si falta, el preset hereda la base (valor de /spec o el valor predeterminado de la CLI, Managed).
internet-texturesmapeonoheredadoConsulte internet-textures.
behaviormapeonoheredadoTimeouts; consulte behavior.

Solo se aplica el preset seleccionado. Aun así, todos los presets se analizan y se validan, por lo que un error en el preset 3 hace fallar una solicitud del preset 1.

presentation#

ClaveTipoObligatoriaDescripción
splashmapeosíObligatorio cuando presentation está presente ("Presentation requires splash."). Consulte presentation.splash.

presentation.splash#

ClaveTipoObligatoriaValor predeterminadoDescripción
modestringsímanaged instala los bitmaps de splash de OmsiLaunch durante la sesión (SplashMode.Managed). unset o native conserva los archivos de splash propios de OMSI (SplashMode.Unset; Native es un alias). No distingue mayúsculas de minúsculas. Cualquier otra cosa: OL_E_SESSION_PROFILE_INVALID.
languagestringnoENGIdioma del segundo destino de splash: PTB, ENG, DEU, FRA (alias PT-BR, EN, DE, FR; cualquier valor desconocido se resuelve a ENG al construir la sesión). Con mode: managed, la sesión aplica como overlay GUI\NewSplashscreen_ENG.bmp y GUI\NewSplashscreen_<language>.bmp.
assetsstringnoassets del paqueteDirectorio relativo al paquete que contiene ENG.bmp y, para un language distinto del inglés, <language>.bmp; cada uno debe ser un BMP de 640x480 y 24 bits. El directorio debe existir al cargar el perfil (OL_E_SESSION_PROFILE_ASSET_MISSING); los archivos se validan al iniciar la sesión (OL_E_SPLASH_ASSET_MISSING, OL_E_SPLASH_FORMAT_UNSUPPORTED). Se aplican las reglas de confinamiento de rutas. Si se omite, se usan el .omsilaunch\assets\splash de la instalación (o los valores predeterminados del paquete).

Un perfil no puede establecer SessionPresentationSpec.SuppressTrayIcon; permanece en false a menos que un /spec lo establezca.

internet-textures#

ClaveTipoObligatoriaDescripción
modestringsínative (InternetTexturesMode.Native, OMSI se comporta con normalidad), disabled (Disabled, el descargador interno del proceso perfilado se suprime durante la sesión), override (Override, un perfil .itx limitado a la sesión se instala como Texture\standard.itx). No distingue mayúsculas de minúsculas; cualquier otra cosa: OL_E_SESSION_PROFILE_INVALID.
profilestringobligatorio para overrideRuta relativa al paquete del archivo .itx. Clave ausente con override: OL_E_SESSION_PROFILE_INVALID; archivo inexistente: OL_E_SESSION_PROFILE_ASSET_MISSING. Se aplican las reglas de confinamiento de rutas. El archivo debe constar de pares de líneas URL / target con URL http:// o https:// (de lo contrario, OL_E_ITX_PROFILE_INVALID) y cada destino debe resolverse por debajo del directorio Texture\ de la instalación sin atravesar un punto de reanálisis (OL_E_ITX_TARGET_OUTSIDE_TEXTURE_PATH). Los destinos indicados y Texture\standard.ipr pasan a ser eliminaciones de la sesión (consulte transacciones y recuperación).

behavior#

ClaveTipoObligatoriaValor predeterminadoDescripción
startup-timeoutinteger (segundos)no180Tiempo permitido desde el inicio del proceso hasta Running. Debe ser positivo al cargar el perfil; además, la sesión exige de 1 a 600 al iniciar (de lo contrario, OL_E_START_SESSION). Se asigna a LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutinteger (segundos)no30Se asigna a LaunchBehaviorSpec.ShutdownTimeoutSeconds. ACCEPTED_FOR_COMPATIBILITY / CURRENTLY_NO_EFFECT: el supervisor termina OMSI directamente y nunca lee este valor.

Cuando el bloque behavior está presente, se establecen ambos timeouts (valor indicado o predeterminado) y reemplazan por completo el LaunchBehaviorSpec de base, incluidos RestoreConfiguration y SuppressStaleClosecheckWarning, que vuelven a sus valores predeterminados (true, true).

Ajustes#

Las claves de settings son los nombres semánticos de ConfigurationCatalog (src/OmsiLaunch.Configuration/ConfigurationCatalog.cs). El compilador acepta una clave solo si existe (OL_E_SESSION_PROFILE_SETTING_UNKNOWN) y es escribible (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Los valores se almacenan como cadenas y se convierten en un parche de options.cfg cuando la sesión construye sus overlays; por lo tanto, un valor no válido se detecta en StartSessionAsync, no al cargar el perfil, y hace fallar la sesión con OL_E_START_SESSION, cuyo mensaje incluye OL_E_INVALID_SETTING_VALUE: <key>. Todos los ajustes siguientes escriben options.cfg; todos están limitados a la sesión y se restauran de forma exacta después de ella.

Formas de los valores:

  • bool es true o false (sin distinguir mayúsculas de minúsculas). Para los tokens de presencia, el token se agrega o se quita; para los tokens invertidos (no_*), true quita el token negativo.
  • int / decimal se validan contra el rango; los valores con divisor se almacenan divididos (por ejemplo, graphics.minObjectScreenPercent: 5 escribe 0.05).
  • string se escribe textualmente.
Clave del ajusteToken de options.cfgTipoRango / valoresEvidencia
general.languagelanguagestringcualquieraSTATICALLY_VALIDATED
general.radioradiostringcualquieraSTATICALLY_VALIDATED
general.alternateViewaltViewbool (presencia)STATICALLY_VALIDATED
general.showOwnDriversee_own_driverbool (presencia)STATICALLY_VALIDATED
general.showErrorMessagesshowerrormessagesbool (presencia)STATICALLY_VALIDATED
general.autoSavenoAutoSavebool (presencia invertida)STATICALLY_VALIDATED
general.currentTimeuseActTimebool (presencia)STATICALLY_VALIDATED
general.currentDateuseActDatebool (presencia)STATICALLY_VALIDATED
general.currentYearuseActYearbool (presencia)STATICALLY_VALIDATED
graphics.screenRatioscreenratiostringcualquieraSTATICALLY_VALIDATED
graphics.maxFPSmaxFPSint10..200STATICALLY_VALIDATED
graphics.tileDistanceperformance_tiledistmaxint1..20STATICALLY_VALIDATED
graphics.maxObjectDistanceMetersperformance_maxObjDistint20..5000STATICALLY_VALIDATED
graphics.minObjectScreenPercentperformance_minObjSizedecimal0..10, se almacena /100STATICALLY_VALIDATED
graphics.minReflectionObjectScreenPercentperformance_minObjSizeRefldecimal0..50, se almacena /100STATICALLY_VALIDATED
graphics.maxObjectComplexitymaxcomplexityint0..3STATICALLY_VALIDATED
graphics.maxMapComplexitymaxcomplexity_mapint0..2STATICALLY_VALIDATED
graphics.sunGlowsunglowbool (presencia)STATICALLY_VALIDATED
graphics.loadAllTilesloadAllTilesbool (presencia)STATICALLY_VALIDATED
graphics.stencilBufferno_stencilbufferbool (presencia invertida)STATICALLY_VALIDATED
graphics.stencilShadowsshadow_stencilbool, se escribe como on / offSTATICALLY_VALIDATED
graphics.rainReflectionsno_rain_reflbool (presencia invertida)STATICALLY_VALIDATED
graphics.humansInRainReflectionsno_humans_on_rain_reflbool (presencia invertida)STATICALLY_VALIDATED
graphics.realTimeReflectionsperformance_realreflexionsstringeconomy o fullSTATICALLY_PARTIAL
graphics.particlessmokesystems (bloque de 4 líneas)enabled,maxPerEmitter,playerVehicleOnly,inReflections (bool,int>=0,bool,bool)STATICALLY_VALIDATED
simulation.collisionno_collisionbool (presencia invertida)STATICALLY_VALIDATED
simulation.collisionTerrainno_collision_terrainbool (presencia invertida)STATICALLY_VALIDATED
simulation.collisionVehiclesno_collision_vehToVehbool (presencia invertida)STATICALLY_VALIDATED
simulation.collisionPedestriansno_collision_pedastriansbool (presencia invertida)STATICALLY_VALIDATED
simulation.ticketSellingticketsellingint0..2STATICALLY_VALIDATED
simulation.maintenancewear_lifespanint0..4STATICALLY_VALIDATED
simulation.disableAutomaticScheduleAnalysisPopupno_schedAnaPopUpbool (presencia)STATICALLY_VALIDATED
simulation.ticketInfono_ticketinfo_visiblebool (presencia invertida)STATICALLY_VALIDATED
simulation.automaticClutchno_automaticClutchbool (presencia invertida)STATICALLY_VALIDATED
advanced.reducedMultithreadingno_multithreading_calculate + no_multithreading_texloadbool (ambos tokens de presencia)RUNTIME_PROVEN
view.driverSmoothdriverview_smoothbool (presencia)STATICALLY_VALIDATED
view.driverMovingdriverview_movingbool (presencia)STATICALLY_VALIDATED
controls.autoCenterautoCenterbool (presencia)STATICALLY_VALIDATED
controls.reducedSteeringSpeedredSteerSpdbool (presencia)STATICALLY_VALIDATED
traffic.randomVehiclesAIMaxCountRandom componente 0int0..1000STATICALLY_VALIDATED (RV-005 en runtime)
traffic.humansAIMaxCountRandom componente 1int0..1000STATICALLY_VALIDATED (RV-005 en runtime)
traffic.factorPercentAIUnschedFactorint1..300STATICALLY_VALIDATED
traffic.parkedVehiclesPercentAIMaxCountParkedint0..100STATICALLY_VALIDATED
traffic.scheduledVehiclesAIMaxCountScheduledint0..1000STATICALLY_VALIDATED
traffic.scheduledLinePriorityAIPriorityScheduledint1..4STATICALLY_VALIDATED
traffic.passengerFactorPercentAIPassFactorint0..200STATICALLY_VALIDATED
sound.stereosound_stereoint0..100STATICALLY_VALIDATED
sound.maxSimultaneousSoundssound_maxcountint5..1000STATICALLY_VALIDATED
sound.masterVolumesound_vol_masterdecimal0..1STATICALLY_VALIDATED

Entradas del catálogo que existen pero no son escribibles (se rechazan con OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (reemplazadas por advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Confinamiento de rutas#

presentation.splash.assets e internet-textures.profile se resuelven con Confined(package root, value):

  1. Se rechazan las rutas con raíz (C:\...), las rutas que empiezan con \ y cualquier componente de ruta igual a ...
  2. Se calcula la ruta completa, que debe empezar con el directorio del paquete.
  3. Se inspecciona el atributo ReparsePoint de cada componente existente por debajo de la raíz del paquete, hasta la ruta final inclusive. Se rechaza una junction, un enlace simbólico de directorio o un enlace simbólico de archivo en cualquier punto de esa ruta, así como un componente que no se pueda inspeccionar (IOException / UnauthorizedAccessException).

Los tres errores son OL_E_SESSION_PROFILE_PATH_ESCAPE. La misma regla de puntos de reanálisis se aplica a los destinos .itx bajo Texture\ al construir la sesión.

Precedencia y conflictos de sobrescritura#

CliInput.BuildSpecAsync compone el spec en este orden:

  1. Valores predeterminados (NEW_MAP, todo sin establecer, timeouts 180 s / 30 s).
  2. /spec:<file.json>, si se indica, reemplaza por completo los valores predeterminados.
  3. Raíz de la instalación: un argumento de instalación explícito prevalece sobre el RootPath del spec; . significa el directorio que contiene el archivo ejecutable.
  4. Perfil (/predefined-profile + /predefined-profile-index): se carga el paquete y RejectProfileConflicts se ejecuta contra los argumentos sin procesar de la CLI antes de combinar nada. Luego, el bloque de mundo de la semilla se restablece a un WorldSpec vacío del modo seleccionado (el mundo de un /spec se descarta cuando se usa un perfil) y SessionProfileCompiler.Apply superpone el perfil sobre la semilla: new (solo NEW_MAP), settings (combinado sobre el Environment.General de la semilla; el perfil prevalece por clave) y presentation, internet-textures, behavior (cada uno reemplaza el bloque de la semilla solo cuando el preset lo define).
  5. Los argumentos restantes de la CLI se superponen encima: /map, /entrypoint, /entrypoint-index, /date, /time, /year, flags de clima, flags de vehículo, /set, flags de splash, flags de texturas de Internet, /startup-timeout, /shutdown-timeout. Los timeouts de la CLI solo se aplican cuando se indican; de lo contrario, se mantiene el valor del spec, del perfil o el predeterminado.
  6. Comprobación de compatibilidad para los modos distintos de NEW_MAP (ValidateCompatibility).

Un argumento de la CLI que apunta a un campo que pertenece al perfil seleccionado es un conflicto y se rechaza con OL_E_SESSION_PROFILE_OVERRIDE_CONFLICT (código de salida 2, categoría invalid_argument). La comprobación es por campo, no por valor: repetir el mismo valor del perfil sigue siendo un conflicto.

Argumento de la CLIEntra en conflicto cuando el perfil defineSolo en el modo
/mapnew.mapNEW_MAP
/entrypoint o /entrypoint-indexnew.entrypoint o new.entrypoint-indexNEW_MAP
/datenew.dateNEW_MAP
/timenew.timeNEW_MAP
/yearnew.yearNEW_MAP
/weather, /weather-icao, /weather-realnew.weatherNEW_MAP
/set:<key>=...la misma <key> en los settings del preset (sin distinguir mayúsculas de minúsculas)cualquiera
/splash, /splash-language, /splash-assetspresentation (cualquiera)cualquiera
/internet-textures, /internet-textures-profileinternet-textures (cualquiera)cualquiera
/startup-timeout, /shutdown-timeoutbehavior (cualquiera)cualquiera

No son conflictos: las claves de /set que el preset no define (se agregan), los flags de vehículo (/vehicle, /repaint, /hof, /fleet, /registration, /no-vehicle; un perfil no puede definir un vehículo del jugador) y cualquier argumento de mundo con /saved (allí no se aplica el bloque new). /map, /entrypoint y /entrypoint-index no son válidos junto con /saved, independientemente de los perfiles (OL_E_INVALID_ARGUMENT).

Códigos de error#

CódigoSe genera cuandoSalida de la CLI
OL_E_SESSION_PROFILE_NOT_FOUND<root>\.omsilaunch\session-profiles\<id>\profile.yaml no existe2
OL_E_SESSION_PROFILE_PATH_ESCAPEid no es un nombre de directorio simple; assets / profile sale del paquete o atraviesa un punto de reanálisis2
OL_E_SESSION_PROFILE_SCHEMA_UNSUPPORTEDschema no es omsilaunch.session-profile/v12
OL_E_SESSION_PROFILE_INVALIDlímite de tamaño, forma del documento, anclas, clave desconocida, clave obligatoria ausente, valor no escalar, número/fecha/hora incorrectos, discrepancia de id, reglas de cantidad/índice de presets, palabras de modo no admitidas, timeout no positivo, presentation sin splash, override sin profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUND/predefined-profile-index ausente, fuera de 1..5 o sin ningún preset con ese index2
OL_E_SESSION_PROFILE_SETTING_UNKNOWNuna clave de settings no está en el catálogo2
OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLEuna clave de settings está catalogada pero es de solo lectura2
OL_E_SESSION_PROFILE_ASSET_MISSINGel directorio assets o el archivo profile no existe dentro del paquete2
OL_E_SESSION_PROFILE_MAP_MISMATCHcompatibility.maps no está vacío y el mapa efectivo no figura en la lista (o no se puede derivar)2
OL_E_SESSION_PROFILE_OVERRIDE_CONFLICTun argumento explícito de la CLI apunta a un campo que pertenece al perfil2

Todos ellos se generan mientras se compila la línea de comandos, antes de la planificación. Son SessionProfileException (o ArgumentException en el caso del conflicto) y nunca inician una sesión. El catálogo completo está en errores; los códigos de salida, en códigos de salida.

Cómo aparece un perfil en la API#

Después de una carga correcta, el spec incluye un record SessionProfileMetadata en LaunchSpec.SessionProfile:

CampoOrigen
Idid
Namename
Versionversion
Authorauthor
PresetIdid del preset seleccionado
PresetIndexindex del preset seleccionado
PresetNamename del preset seleccionado
PackagePathdirectorio absoluto del paquete

El planificador agrega un diagnóstico informativo session_profile.selected a cada SessionPlan construido a partir de un spec de este tipo, con las claves de datos session_profile.id, session_profile.name, session_profile.version, session_profile.author, session_profile.preset_id, session_profile.preset_index, session_profile.preset_name y session_profile.path. No afecta la ejecutabilidad del plan. Los integradores que usan directamente la API pública pueden llamar a SessionProfileCompiler.Load y SessionProfileCompiler.Apply desde OmsiLaunch.Core; la representación YAML nunca pasa a OmsiLaunch.Api.

Ejemplos#

Ejemplo 1: perfil solo con ajustes, un preset#

<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

Ejecución: OmsiLaunch.exe /predefined-profile:quiet-evening /predefined-profile-index:1 /new /map:maps\Grundorf\global.cfg /entrypoint-index:0. El mapa y el punto de entrada provienen de la línea de comandos porque el perfil no define ningún bloque new; agregar /set:graphics.maxFPS=60 está permitido, agregar /set:traffic.humans=10 es un conflicto.

Ejemplo 2: perfil vinculado a un mapa con tres presets y assets incluidos en el paquete#

<root>\.omsilaunch\session-profiles\grundorf-tour\profile.yaml, con assets\splash\ENG.bmp, assets\splash\DEU.bmp y textures\offline.itx dentro del paquete:

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

Ejecución: OmsiLaunch.exe /predefined-profile:grundorf-tour /predefined-profile-index:2 /new. Con /saved:situations\mytrip.osn, el bloque new se omite y el .osn debe hacer referencia a maps\Grundorf\global.cfg.

El ejemplo incluido en el paquete#

La release incluye docs/examples/session-profiles/rmg-leste/profile.yaml (ver). Es sintácticamente válido, cumple el esquema y se cargaría sin errores. Dos propiedades impiden que inicie una sesión sin modificaciones en este build:

  1. Establece new.date, new.time y new.weather, que hacen que el plan no sea ejecutable (consulte El bloque new).
  2. Sus valores de ruta son escalares simples con barras invertidas duplicadas (maps\\RMG Leste\\global.cfg). YAML las mantiene duplicadas y las identidades de mapa se comparan textualmente (solo después de normalizar / a \), por lo que new.map y compatibility.maps no coincidirían con la identidad del catálogo maps\RMG Leste\global.cfg (OL_E_MAP_NOT_FOUND durante la planificación). El valor de assets sí se resuelve porque la normalización de rutas de Windows colapsa los separadores duplicados.

La forma ejecutable para este build es:

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