Perfiles de sesión

Documentación de la versión v0.1.0-beta.3Ver 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 difieren, 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 de OmsiLaunch reproducible 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 pueden hacerlo 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; consulta el estado de la validación en runtime). Las claves new.date, new.time, new.year y new.weather son UNAVAILABLE en esta build (consulta 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)
RecursosCualquier archivo o directorio dentro del directorio del paquete, referenciado mediante ruta relativa desde presentation.splash.assets e internet-textures.profile
idDebe ser un nombre de directorio simple: no puede estar vacío ni contener solo espacios en blanco, no puede contener \, / ni : y no puede contener la secuencia ... Las infracciones producen OL_E_SESSION_PROFILE_PATH_ESCAPE. El valor id declarado dentro de profile.yaml debe ser igual al nombre del directorio byte a byte (distinguiendo mayúsculas de minúsculas); en caso 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 versiónEl paquete de la versión incluye un ejemplo en .omsilaunch\examples\session-profiles\rmg-leste\ (consulta empaquetado). Los ejemplos no son perfiles: copia un paquete en .omsilaunch\session-profiles\<id>\ para que se pueda seleccionar.

Un perfil lo instala y lo quita 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 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 distinguen mayúsculas de minúsculas (Schema: es una clave desconocida). El único mapeo abierto es settings, cuyas claves se validan en su lugar 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 de 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; usa las formas ISO yyyy-MM-dd y HH:mm[:ss]OL_E_SESSION_PROFILE_INVALID
Errores de sintaxis YAMLSe notifican con el mensaje del analizadorOL_E_SESSION_PROFILE_INVALID ("Invalid YAML: ...")
Contenido ejecutableEl YAML se analiza con YamlDotNet solo en un árbol de representación; no se admiten etiquetas, tipos personalizados ni ejecución de código

Las barras invertidas de los escalares simples (sin comillas) son caracteres literales. Escribe 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; consulta El ejemplo incluido en el paquete.

Referencia de claves#

Los contextos se nombran exactamente como los nombra el compilador. Se acepta toda clave que figure aquí; nada más.

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 notifica en SessionProfileMetadata.Name.
authorstringsíAutor; se notifica en SessionProfileMetadata.Author.
versionstringsíCadena de versión del paquete (formato libre, entre comillas: "1.0"); se notifica en SessionProfileMetadata.Version.
compatibilitymapeonoConsulta compatibility.
newmapeonoValores predeterminados de NEW_MAP. Consulta new.
presetssecuencia de mapeossíDe 1 a 5 entradas de preset. Cero, más de cinco o un valor que no sea una secuencia produce OL_E_SESSION_PROFILE_INVALID.

compatibility#

ClaveTipoObligatoriaDescripción
mapssecuencia de cadenasnoIdentidades 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 impone para WorldMode.NewMap (frente al new.map o /map efectivo) y para WorldMode.SavedSituation (frente al mapa referenciado por 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. Fallo: OL_E_SESSION_PROFILE_MAP_MISMATCH.

new#

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

ClaveTipoObligatoriaAplicadaDescripción
mapstringnosíIdentidad de mapa en la forma normalizada maps\<Map>\global.cfg (la planificación exige exactamente esta forma: empieza por maps\, termina en \global.cfg, sin ..). Establece WorldSpec.MapIdentity.
entrypoint-indexintegernosíÍndice de 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 en último lugar. La selección por identidad de punto de entrada es PARTIAL (BI-001): la planificación notifica world.entrypoint-identity como RUNTIME_PARTIAL y el plan no es ejecutable. Es preferible entrypoint-index.
datemapeonono (UNAVAILABLE)Consulta new.date.
timemapeonono (UNAVAILABLE)Consulta new.time.
yearintegernono (UNAVAILABLE)Año explícito.
weathermapeonono (UNAVAILABLE)Consulta new.weather.

date, time, year y weather se compilan en DateSpec, TimeSpec, YearSpec y WeatherSpec con DateTimeMode.Explicit / el WeatherMode seleccionado. A continuación, el planificador de sesiones (src/OmsiLaunch.Core/SessionPlanner.cs) notifica las capacidades world.explicit-date, world.explicit-time, world.explicit-year y weather como STATICALLY_PARTIAL, añade 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 esta build: un perfil que establece cualquiera de estas cuatro claves puede validarse con /plan, pero no puede iniciar una sesión (código de salida 1, OL_E_PLAN_NOT_RUNNABLE). Omítelas en los perfiles destinados a ejecutarse.

new.date#

ClaveTipoObligatoriaDescripción
modestringsíDebe ser explicit (sin distinguir mayúsculas de minúsculas). Cualquier otro valor produce 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 otro valor: OL_E_SESSION_PROFILE_INVALID ("Unsupported weather mode").
presetstringcon mode: presetNombre del preset meteorológico.
icaostringcon 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 intervalo: 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 notifica como SessionProfileMetadata.PresetId.
namestringsíNombre para mostrar del preset; se notifica como SessionProfileMetadata.PresetName.
settingsmapeononingunoAjustes semánticos de options.cfg; consulta Ajustes. Las claves se comparan con el catálogo sin distinguir mayúsculas de minúsculas.
presentationmapeonoheredadoPresentación del splash; consulta presentation. Cuando falta, el preset hereda la base (valor de /spec o el predeterminado de la CLI, Managed).
internet-texturesmapeonoheredadoConsulta internet-textures.
behaviormapeonoheredadoTimeouts; consulta behavior.

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

presentation#

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

presentation.splash#

ClaveTipoObligatoriaValor predeterminadoDescripción
modestringsímanaged instala los mapas de bits 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). Sin distinguir mayúsculas de minúsculas. Cualquier otro valor: 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.
assetsstringnorecursos incluidos en el 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. Cuando se omite, se usa .omsilaunch\assets\splash de la instalación (o los valores predeterminados incluidos en el paquete).

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

internet-textures#

ClaveTipoObligatoriaDescripción
modestringsínative (InternetTexturesMode.Native, OMSI se comporta con normalidad), disabled (Disabled, el descargador en proceso perfilado se suprime durante la sesión), override (Override, se instala un perfil .itx limitado a la sesión como Texture\standard.itx). Sin distinguir mayúsculas de minúsculas; cualquier otro valor: OL_E_SESSION_PROFILE_INVALID.
profilestringobligatoria 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:// (en caso 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 enumerados y Texture\standard.ipr pasan a ser eliminaciones de sesión (consulta 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 un valor de 1 a 600 en el inicio (en caso contrario, OL_E_START_SESSION). Se corresponde con LaunchBehaviorSpec.StartupTimeoutSeconds.
shutdown-timeoutinteger (segundos)no30Se corresponde con 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 sustituyen por completo el LaunchBehaviorSpec 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 se puede escribir (OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE). Los valores se almacenan como cadenas y se convierten en una modificación de options.cfg cuando la sesión construye sus overlays; por 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 en options.cfg; todos están limitados a la sesión y se restauran exactamente después de ella.

Formas de valor:

  • bool es true o false (sin distinguir mayúsculas de minúsculas). Para los tokens de presencia, el token se añade o se quita; para los tokens invertidos (no_*), true quita el token negativo.
  • int / decimal se validan frente al intervalo; los valores con divisor se almacenan divididos (por ejemplo, graphics.minObjectScreenPercent: 5 escribe 0.05).
  • string se escribe literalmente.
Clave del ajusteToken de options.cfgTipoIntervalo / 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.randomVehiclescomponente 0 de AIMaxCountRandomint0..1000STATICALLY_VALIDATED (RV-005 en runtime)
traffic.humanscomponente 1 de AIMaxCountRandomint0..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 se pueden escribir (se rechazan con OL_E_SESSION_PROFILE_SETTING_NOT_WRITABLE): advanced.multithreadingCalculate, advanced.multithreadingTextureLoad (sustituidas por advanced.reducedMultithreading), graphics.texture, graphics.textureFilter.

Confinamiento de rutas#

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

  1. Se rechazan las rutas con raíz (C:\...), las rutas que empiezan por \ y cualquier componente de ruta igual a ...
  2. Se calcula la ruta completa, que debe empezar por el directorio del paquete.
  3. Cada componente existente por debajo de la raíz del paquete, hasta la ruta final incluida, se inspecciona en busca del atributo ReparsePoint. Se rechaza una unión, 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 fallos producen 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 la especificación en este orden:

  1. Valores predeterminados (NEW_MAP, todo sin establecer, timeouts de 180 s / 30 s).
  2. /spec:<file.json>, si se indica, sustituye por completo los valores predeterminados.
  3. Raíz de la instalación: un argumento de instalación explícito prevalece sobre el RootPath de la especificación; . significa el directorio que contiene el ejecutable.
  4. Perfil (/predefined-profile + /predefined-profile-index): se carga el paquete y se ejecuta RejectProfileConflicts sobre los argumentos sin procesar de la CLI antes de combinar nada. Después, 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 a 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 sustituye el bloque de la semilla solo cuando el preset lo define).
  5. Argumentos restantes de la CLI: se superponen encima: /map, /entrypoint, /entrypoint-index, /date, /time, /year, flags meteorológicos, 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; en caso contrario se mantiene el valor de la especificación, del perfil o el predeterminado.
  6. Comprobación de compatibilidad para los modos distintos de NEW_MAP (ValidateCompatibility).

Un argumento de la CLI que afecta a un campo propiedad del 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 añaden), 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, con independencia de los perfiles (OL_E_INVALID_ARGUMENT).

Códigos de error#

CódigoSe produce 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, falta una clave obligatoria, valor no escalar, número/fecha/hora incorrectos, discrepancia de id, reglas de número o índice de presets, palabras de modo no admitidas, timeout no positivo, presentation sin splash, override sin profile2
OL_E_SESSION_PROFILE_PRESET_NOT_FOUNDfalta /predefined-profile-index, está fuera de 1..5 o no hay 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á en el catálogo 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 afecta a un campo propiedad del perfil2

Todos ellos se producen mientras se compila la línea de comandos, antes de la planificación. Son SessionProfileException (o ArgumentException para el 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#

Tras una carga correcta, la especificación incluye un registro 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 añade un diagnóstico informativo session_profile.selected a cada SessionPlan construido a partir de una especificación así, 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 a si el plan es ejecutable. 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 llega 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 proceden de la línea de comandos porque el perfil no define ningún bloque new; añadir /set:graphics.maxFPS=60 está permitido, añadir /set:traffic.humans=10 es un conflicto.

Ejemplo 2: perfil vinculado a un mapa con tres presets y recursos 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 referenciar maps\Grundorf\global.cfg.

El ejemplo incluido en el paquete#

La versión 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 cambios en esta build:

  1. Establece new.date, new.time y new.weather, que hacen que el plan no sea ejecutable (consulta 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 tras 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 reduce los separadores duplicados.

La forma ejecutable para esta 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