Capacidades

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.

Este es el inventario canónico de lo que OmsiLaunch 0.1.0-beta3 puede hacer, derivado de PublicCapabilityRegistry (src/OmsiLaunch.Api/PublicCapabilityRegistry.cs), de la implementación de runtime del plugin (src/OmsiLaunch.Plugin/CurrentRuntimeControl.cs y src/OmsiLaunch.Interop/OmsiRuntimeReaders.cs) y de OmsiLaunchService.GetCapabilitiesAsync. Para cada capacidad se indica la clasificación, el nivel de estabilidad que se usa en toda esta documentación, si requiere una sesión en estado Running, si modifica OMSI, los argumentos y las claves del resultado, los errores y la evidencia de validación en runtime. Cómo invocar una operación (rutas de la CLI, envelope de la API, timeouts, handles) se explica en control de runtime; la tabla de evidencias está en estado de la validación en runtime.

Clasificación y estabilidad#

PublicCapabilityClassification tiene cuatro valores. Se corresponden con el vocabulario de estabilidad de la siguiente manera, con rebajas de nivel donde la evidencia es incompleta:

ClasificaciónSignificadoEstabilidad
PublicStableBetaPública, dentro del contrato de la beta, validada en runtimeSTABLE_BETA (rebajada a PARTIAL donde se indica)
PublicExperimentalPública, puede cambiar, validada en runtime o validada estáticamenteEXPERIMENTAL (rebajada a PARTIAL donde se indica)
InternalOnlyPrimitiva de investigación; no accesible a través de la API pública ni de la CLIINTERNAL
UnsupportedReconocida para diagnósticos, rechazada o ausenteUNAVAILABLE

PublicCapabilityKind distingue Read, Write, Action y Event. Toda capacidad de runtime requiere una sesión en estado Running y el perfil exacto Omsi23004_692EBFBF (RequiresSession / RequiresExactProfile en el registro); las capacidades de sesión que crean una sesión requieren el perfil exacto, pero no una sesión.

Los resultados de runtime son diccionarios de cadenas. Las claves que empiezan por internal_ o terminan en _address, _pointer o _vmt se eliminan en el límite de la API (ScrubInternalValues) y no se enumeran aquí. Las claves de resultado de las tablas de operaciones siguientes son los conjuntos exactos de claves que devuelve el producto: se capturaron ejecutando cada operación pública en una sesión real (captura de documentación del cierre de runtime, sesión f51dcb59-a723-4570-b6c5-b61e628a7993, situations\Linie 5.osn; las filas de las listas se escriben como <row>.<n>.<field>).

Cómo se notifica el fallo de una operación (CurrentRuntimeControl.Execute):

FalloErrorCodeValues
Rechazo del registro (operación desconocida o internal.*, falta un argumento obligatorio)OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIREDninguno
Un rechazo deliberado del producto (weather.set)el código específico (OL_E_RUNTIME_SETTING_NOT_PERSISTENT)detail (frase)
Un fallo de D3Del código OL_E_D3D_* específicodetail, native_status
Cualquier otro fallo en el lado del plugin (handle obsoleto, nombre desconocido, valor fuera de rango, sin vehículo del jugador, ...)OL_E_RUNTIME_OPERATION_FAILEDdetail (empieza por el código específico, por ejemplo OL_E_RUNTIME_OBJECT_HANDLE_STALE o OL_E_RUNTIME_VALUE_OUT_OF_RANGE (Parameter 'minute')), exception (nombre del tipo .NET)
Un resultado que no cabe en el buzón de 64 KiBOL_E_RUNTIME_RESPONSE_TOO_LARGE (las listas acotadas se acortan en su lugar, consulta Horario, conductores, billetes)ninguno

La columna Errors de cada tabla nombra los códigos específicos; se leen en ErrorCode o en el primer token de Values.detail, como se ha indicado.

Capacidades de sesión#

CapacidadClasificaciónEstabilidadTipoRuta de la APIRuta de la CLIModificaValidación
session.planPublicStableBetaSTABLE_BETAActionPlanSessionAsync/plan, /validatenoRUNTIME_PASS (toda sesión validada empieza con un plan)
session.startPublicStableBetaSTABLE_BETAActionStartSessionAsyncflags de lanzamientosistema de archivos (transacción), procesoRUNTIME_PASS (NEW_MAP Grundorf, SAVED_SITUATION Berlin-Spandau)
session.statusPublicStableBetaSTABLE_BETAReadGetStatusAsyncsession statusnoRUNTIME_PASS
session.stopPublicStableBetaSTABLE_BETAActionStopAsync / CloseAsyncsession stop, bandeja, Ctrl+Cproceso (TerminateProcess), sistema de archivos (restauración)RUNTIME_PASS; cierre cooperativo no implementado
session.recoverPublicStableBetaSTABLE_BETAActionRecoverPendingAsync/recovery-status, /recoversistema de archivos (restauración)RUNTIME_PASS: recuperación tras salida temprana (RV-008), propietario terminado más recuperación temprana en el siguiente inicio (S05), restauración fallida y luego /recover (F01), rechazo bajo el lease, con un OMSI huérfano y en la ventana previa al PID (S04, S04b)
events.readPublicExperimentalEXPERIMENTALEventGetStatusAsync().RuntimeEvents, control session.eventsevents read, events watchnoRUNTIME_PASS; el slot de telemetría de último valor puede perder ráfagas

Capacidades de runtime (entradas del registro)#

CapacidadClasificaciónEstabilidadTipoOperacionesHandlesValidación
time.readPublicStableBetaSTABLE_BETAReadtime.readRUNTIME_PASS (sesión e5454061)
time.setPublicExperimentalEXPERIMENTALWritetime.setRUNTIME_PASS (escritura, SetTime, relectura)
weather.readPublicStableBetaSTABLE_BETAReadweather.readRUNTIME_PASS
weather.setUnsupportedUNAVAILABLEWriteweather.setRUNTIME_REJECTED: siempre OL_E_RUNTIME_SETTING_NOT_PERSISTENT (sesión 50a1f1ec)
weather.actual.readPublicExperimentalEXPERIMENTALReadweather.actual.readRUNTIME_PASS
map.readPublicStableBetaSTABLE_BETAReadmap.readRUNTIME_PASS: revalidada sobre el slot de mapa corregido (sesión 9dd62626-94c6-4cd7-bb6f-0288327696f4, Grundorf) y leída en Berlin-Spandau durante la captura de documentación
camera.readPublicStableBetaSTABLE_BETAReadcamera.readRUNTIME_PASS
camera.setPublicExperimentalEXPERIMENTALWritecamera.setRUNTIME_PASS (escritura del FOV y relectura)
camera.lockPublicExperimentalEXPERIMENTALActioncamera.lock, camera.unlockRUNTIME_PASS con un PlayerVehicle procedente de una situación guardada (cierre de runtime CAM01, familias 0, 2 y 1 con relectura y después desbloqueo). La propia cadena RuntimeValidation del registro sigue indicando STATICALLY_VALIDATED (autoinforme del producto, no actualizado en esta versión)
vehicles.listPublicStableBetaSTABLE_BETAReadroad-vehicles.listRoadVehicleRUNTIME_PASS
vehicles.getPublicStableBetaSTABLE_BETAReadroad-vehicle.readRoadVehicleRUNTIME_PASS; la detección de handles obsoletos tras la eliminación natural (RV-002) no tiene un productor seguro en runtime y está validada offline
vehicles.summaryPublicStableBetaSTABLE_BETAReadroad-vehicles.readRUNTIME_PASS
vehicles.spawnPublicExperimentalEXPERIMENTALActionroad-vehicles.spawnRoadVehicleRUNTIME_PASS RV-003 (sesión 5f641c8d, 2 -> 3, handle rv-000003)
vehicles.place-randomPublicExperimentalEXPERIMENTALActionroad-vehicles.place-randomRUNTIME_PASS (colección 2 -> 4)
player.readPublicStableBetaSTABLE_BETAReadplayer-vehicle.readRoadVehicleRUNTIME_PASS: present=false en un inicio headless, el snapshot completo con una situación guardada
humans.listPublicExperimentalEXPERIMENTALReadhumans.listHumanRUNTIME_PASS
humans.getPublicExperimentalEXPERIMENTALReadhuman.readHumanRUNTIME_PASS
humans.summaryPublicExperimentalEXPERIMENTALReadhumans.readRUNTIME_PASS
timetable.readPublicStableBetaSTABLE_BETAReadtimetable.read y la familia timetable.*.list / timetable.logs.readRUNTIME_PASS (entradas de trayecto: 91 registros en Grundorf)
scripts.numericPublicExperimentalEXPERIMENTALWritevehicle.variables.list, vehicle.variable.get, vehicle.variable.setRoadVehicleRUNTIME_PASS (Refresh_Strings 0 -> 1 -> 0)
scripts.string.readPublicExperimentalEXPERIMENTALReadvehicle.string-variables.list, vehicle.string-variable.getRoadVehicleRUNTIME_PASS (solo lectura; escrituras BI-004)
constantsPublicStableBetaSTABLE_BETAReadvehicle.constants.list, vehicle.constant.getRoadVehicleRUNTIME_PASS
curvesPublicStableBetaSTABLE_BETAReadvehicle.curves.list, vehicle.curve.evaluateRoadVehicleRUNTIME_PASS
hof.readPublicStableBetaSTABLE_BETAReadvehicle.hofs.readRoadVehicleRUNTIME_PASS
drivers.readPublicExperimentalEXPERIMENTALReaddrivers.readRUNTIME_PASS
tickets.readPublicExperimentalEXPERIMENTALReadtickets.readRUNTIME_PASS
d3d.texturePublicExperimentalEXPERIMENTALActiond3d.status, d3d.texture.create, d3d.texture.describe, d3d.texture.update, d3d.texture.releaseD3DTextureRUNTIME_PASS para create/describe/update/release, rechazo de handles liberados y obsoletos a través de nuevas creaciones y de sesiones (H02), y reset del dispositivo con invalidación de la generación (RV-007, D01; el estado lost en sí no se produjo)
internal.make-basicInternalOnlyINTERNALActioninternal.road-vehicles.make-basicNo pública. ExecuteRuntimeAsync la rechaza con OL_E_RUNTIME_OPERATION_UNKNOWN antes de buscar ninguna sesión; la CLI no tiene ruta para ella.
calendar.set-actual-date-timeUnsupportedUNAVAILABLEWriteningunaUNSUPPORTED (BI-002)
player.assign-headlessUnsupportedUNAVAILABLEActionningunaUNSUPPORTED (BI-007)

internal.road-vehicles.make-basic es INTERNAL: existe en el plugin con fines de investigación (devuelve una dirección nativa) y se rechaza en el límite de la API y en el plano de control local, que validan ambos primero el nombre de la operación contra PublicRuntimeOperationIds.

Operaciones de runtime públicas#

Esta es la lista exacta de ids de operación que un frontend público puede reenviar (PublicCapabilityRegistry.PublicRuntimeOperationIds). Todas requieren SessionState.Running; ninguna se registra en el diario ni se restaura. El registro comprueba los argumentos obligatorios antes de usar el buzón (OL_E_RUNTIME_ARGUMENT_REQUIRED); el plugin valida los argumentos opcionales. Códigos de error comunes a todas las operaciones: OL_E_RUNTIME_OPERATION_UNKNOWN (no está en esta lista), OL_E_SESSION_NOT_RUNNING, OL_E_RUNTIME_SESSION_MISMATCH, OL_E_RUNTIME_CHANNEL_BUSY, OL_E_RUNTIME_CHANNEL_CLOSED, OL_E_RUNTIME_REQUEST_TIMEOUT, OL_E_RUNTIME_REQUEST_ID_REUSED, OL_E_RUNTIME_RESPONSE_INVALID, OL_E_RUNTIME_RESPONSE_TOO_LARGE, OL_E_RUNTIME_OPERATION_UNAVAILABLE (el plugin no tiene implementación), OL_E_RUNTIME_OPERATION_FAILED (excepción inesperada dentro del proceso; valores detail y exception).

Hora#

OperaciónTipoArgumentosClaves del resultadoErrores
time.readReadningunohour, minute, second, day, month, year
time.setWriteopcionales hour (0..23), minute (0..59), second (0..59.999, decimal); al menos unolas claves de time.read después del SetTime perfiladoOL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_TIME_APPLY_FAILED

Meteorología#

OperaciónTipoArgumentosClaves del resultadoErrores
weather.readReadningunofog_density, lightness, primary_light_factor, secondary_light_factor, ambient_light_factor, cloud_type, cloud_transparency, precipitation_set, wet_ground, wind_speed, wind_direction, relative_humidity, absolute_humidity, temperature, dew_point, pressure, precipitation, precipitation_rate
weather.setWritecualquieraningunaSiempre OL_E_RUNTIME_SETTING_NOT_PERSISTENT (con argumentos vacíos: OL_E_RUNTIME_ARGUMENT_REQUIRED). OMSI sobrescribe los dos candidatos de viento perfilados en su siguiente tick meteorológico.
weather.actual.readReadningunoactive, icao, last_downloaded, invalid_icao, counter, process

Mapa#

OperaciónTipoArgumentosClaves del resultadoErrores
map.readReadningunoloaded, loaded_tiles, left_hand_traffic, name, filename, friendly_name, description, max_speed, year_start, year_end

Cámara#

OperaciónTipoArgumentosClaves del resultadoErrores
camera.readReadningunofamily (0 conductor, 1 pasajero, 2 exterior, 3 mapa), name, field_of_view, normal_field_of_view, distance
camera.setWriteopcionales family (0..3), field_of_view (10..170); al menos unolas claves de camera.readOL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE
camera.lockActionobligatorio family (0..3); opcional preset (0..255, solo con la familia 0 o 1)locked (true), family, preset, head_look (preserved), field_of_view (preserved)OL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_CAMERA_PRESET_FAMILY_UNSUPPORTED, OL_E_RUNTIME_PLAYER_VEHICLE_UNAVAILABLE. La política se vuelve a aplicar cada 100 ms hasta camera.unlock; si una reaplicación falla, se emite el evento camera.lock.degraded una vez por cada error distinto.
camera.unlockActionningunolocked (false)

Vehículos de carretera y jugador#

OperaciónTipoArgumentosClaves del resultadoErrores
road-vehicles.readReadningunocount, ai_collection, player_index (el índice bruto del vehículo del jugador de OMSI, tal como se lee; usa present de player-vehicle.read para saber si existe un vehículo del jugador)
road-vehicles.listReadningunocount, vehicle.<n>.handle (rv-NNNNNN)
road-vehicle.readReadobligatorio handlehandle, runtime_index, tile, marked_for_killing, traffic_type, position_x, position_y, position_z, rotation_x, rotation_y, rotation_z, rotation_w, steering, tacho, ground_speed, kilometres, throttle, brake, clutch, ai_enabled, ai_mode, ai_light, ai_interior_light, ai_indicator_left, ai_indicator_right, ai_brake_lightOL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE
player-vehicle.readReadningunopresent (false cuando OMSI no tiene vehículo del jugador); cuando es true: player_index más todas las claves de road-vehicle.read
road-vehicles.spawnActionobligatorio model (Vehicles\...\*.bus canónico, 240 caracteres como máximo, sin .., debe existir bajo la instalación)bus, created_handle, before_count, after_count, delta_count, raw_native_return, identity_validationOL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_BUS_IDENTITY_INVALID, OL_E_MAKEVEHICLE_BUS_NOT_FOUND, OL_E_MAKEVEHICLE_DELTA_ZERO, OL_E_MAKEVEHICLE_DELTA_MULTIPLE, OL_E_MAKEVEHICLE_NATIVE_FAILED, OL_E_RUNTIME_CREATED_OBJECT_INVALID, OL_E_RUNTIME_CREATED_OBJECT_NOT_IN_COLLECTION. No asigna el PlayerVehicle. Tarda varios segundos; usa el timeout de cliente de 30 s.
road-vehicles.place-randomActionopcionales ai_type (0..255, predeterminado 0), group (0..65535, predeterminado 1), type (-1..65535, predeterminado -1), scheduled (0..1, predeterminado 0), tour (0..65535, predeterminado 0), line (0..65535, predeterminado 0)raw_return, before_count, after_count, delta_count, identity_validation (native-placement-return-is-diagnostic-only)OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_PLACE_RANDOM_BUS_FAILED

Humanos#

OperaciónTipoArgumentosClaves del resultadoErrores
humans.readReadningunocount
humans.listReadningunocount, human.<n>.handle (hb-NNNNNN)
human.readReadobligatorio handlehandle, runtime_index, human_index, tile, marked_for_killing, collision_type, position_x, position_y, position_z, target_x, target_y, target_z, target_station, pre_target_station, departure, enter_bus_at, seat_bus, seat_station, ticket_type, ticket_index, ticket_ready, state, speed, bus_index, station, ai_mode, ai_mode_ex, ai_sub_mode, collision_stateOL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE

Horario, conductores, billetes#

Los resultados de las listas acotadas incluyen count (todos los registros en OMSI), returned_count (filas en esta respuesta) y truncated (true cuando se omitieron filas). Las filas son siempre los primeros returned_count registros, numerados desde 0. Los límites de filas son 128 para trayectos, viajes, líneas, archivos rv, paradas, enlaces entre estaciones, tours y perfiles, 256 para entradas de tour y 512 para entradas de trayecto; cuando las filas permitidas por ese límite siguen superando el buzón de 64 KiB (por ejemplo, las entradas de trayecto y de tour en Berlin-Spandau), el plugin descarta las últimas filas hasta que la respuesta cabe e informa del returned_count menor con truncated=true (auditoría de documentación BUG-05; antes de la corrección, estas dos listas fallaban con OL_E_RUNTIME_RESPONSE_TOO_LARGE). timetable.logs.read no es una lista acotada: devuelve todas las entradas del registro, y un registro de unos cientos de entradas supera el buzón y falla con OL_E_RUNTIME_RESPONSE_TOO_LARGE.

OperaciónTipoArgumentosClaves del resultadoErrores
timetable.readReadningunoinvalid (true/false) y los recuentos de registros tracks, trips, bus_stops, station_links, lines, rv_files
timetable.tracks.listReadningunocount, returned_count, truncated; track.<n>.filename, track.<n>.path, track.<n>.entries, track.<n>.length
timetable.trips.listReadningunocount, returned_count, truncated; trip.<n>.filename, trip.<n>.chrono_origin, trip.<n>.target, trip.<n>.line, trip.<n>.track_index, trip.<n>.track_name, trip.<n>.bus_stops, trip.<n>.profiles, trip.<n>.train_reverse, trip.<n>.invalid
timetable.lines.listReadningunocount, returned_count, truncated; line.<n>.name, line.<n>.chrono_origin, line.<n>.priority, line.<n>.tours, line.<n>.user_allowed
timetable.rv-files.listReadningunocount, returned_count, truncated; rv_file.<n>.line, rv_file.<n>.number_tours, rv_file.<n>.start_date_rel_2000, rv_file.<n>.end_date_rel_2000, rv_file.<n>.type_line_files, rv_file.<n>.type_line_probability, rv_file.<n>.type_tours
timetable.track-entries.listReadningunocount, returned_count, truncated; track_entry.<n>.track_index, track_entry.<n>.id, track_entry.<n>.path_index_on_object, track_entry.<n>.path_tile, track_entry.<n>.path_index, track_entry.<n>.relative_distance, track_entry.<n>.distance, track_entry.<n>.valid, track_entry.<n>.path_order_check, track_entry.<n>.allowed_fstrn, track_entry.<n>.chrono_origin, track_entry.<n>.bad_chronos
timetable.bus-stops.listReadningunocount, returned_count, truncated; bus_stop.<n>.name, bus_stop.<n>.supplement, bus_stop.<n>.tile, bus_stop.<n>.id, bus_stop.<n>.parent_id, bus_stop.<n>.preset_alighting, bus_stop.<n>.index, bus_stop.<n>.starting_links, bus_stop.<n>.ending_links, bus_stop.<n>.chrono_origin
timetable.station-links.listReadningunocount, returned_count, truncated; station_link.<n>.length, station_link.<n>.start_bus_stop_id, station_link.<n>.end_bus_stop_id, station_link.<n>.start_bus_stop, station_link.<n>.end_bus_stop, station_link.<n>.chrono_origin, station_link.<n>.valid, station_link.<n>.visible, station_link.<n>.track_entries, station_link.<n>.start_track_entry, station_link.<n>.end_track_entry
timetable.tours.listReadningunocount, returned_count, truncated; tour.<n>.line_index, tour.<n>.name, tour.<n>.ai_group, tour.<n>.ai_group_index, tour.<n>.ai_type, tour.<n>.completed_day, tour.<n>.entries, tour.<n>.has_normal_vehicle, tour.<n>.invalid, tour.<n>.vehicle_indices, tour.<n>.vehicle_reservations
timetable.profiles.listReadningunocount, returned_count, truncated; profile.<n>.trip_index, profile.<n>.name, profile.<n>.service_trip, profile.<n>.stop_times, profile.<n>.total_time, profile.<n>.track_entry_times
timetable.tour-entries.listReadningunocount, returned_count, truncated; tour_entry.<n>.line_index, tour_entry.<n>.tour_index, tour_entry.<n>.trip, tour_entry.<n>.trip_index, tour_entry.<n>.profile_index, tour_entry.<n>.start_time, tour_entry.<n>.end_time, tour_entry.<n>.smooth_transition
timetable.logs.readReadningunocount; log.<n>.bus_stop, log.<n>.estimated_arrival, log.<n>.estimated_departure, log.<n>.actual_arrival, log.<n>.actual_departure, log.<n>.arrival_ok, log.<n>.departure_ok (todas las entradas; no acotada)OL_E_RUNTIME_RESPONSE_TOO_LARGE para un registro largo
drivers.readReadningunocount, selected_index; driver.<n>.filename, driver.<n>.name, driver.<n>.gender, driver.<n>.bus_stops, driver.<n>.crashes, driver.<n>.passengers, driver.<n>.tickets, driver.<n>.cash
tickets.readReadningunofilename, voice_path, stamper_factor, buy_factor, chattiness, whinge_factor, count; ticket.<n>.name, ticket.<n>.display_name, ticket.<n>.value, ticket.<n>.maximum_stations, ticket.<n>.day_ticket

Scripts, constantes, curvas y HOF del vehículo (ligados a un handle)#

OperaciónTipoArgumentosClaves del resultadoErrores
vehicle.variables.listReadobligatorio handlehandle, count, returned_count, truncated (límite 512), name.<n>OL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE, OL_E_RUNTIME_SCRIPT_OBJECT_UNAVAILABLE
vehicle.variable.getReadobligatorios handle, namehandle, name, valueOL_E_RUNTIME_VARIABLE_NOT_FOUND, OL_E_RUNTIME_VARIABLE_UNAVAILABLE
vehicle.variable.setWriteobligatorios handle, name, value (float finito)handle, name, requested_value, value (releído)OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_RUNTIME_VARIABLE_NOT_FOUND
vehicle.string-variables.listReadobligatorio handlehandle, count, returned_count, truncated (límite 512), name.<n>OL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE, OL_E_RUNTIME_SCRIPT_OBJECT_UNAVAILABLE
vehicle.string-variable.getReadobligatorios handle, namehandle, name, valueOL_E_RUNTIME_STRING_VARIABLE_NOT_FOUND
vehicle.constants.listReadobligatorio handlehandle, count, name.<n>OL_E_RUNTIME_CONSTANTS_UNAVAILABLE
vehicle.constant.getReadobligatorios handle, namehandle, name, valueOL_E_RUNTIME_CONSTANT_NOT_FOUND
vehicle.curves.listReadobligatorio handlehandle, count, name.<n>
vehicle.curve.evaluateReadobligatorios handle, name, x (float finito; un x ausente o no numérico da OL_E_RUNTIME_ARGUMENT_REQUIRED)handle, name, x, value (interpolación lineal)OL_E_RUNTIME_CURVE_NOT_FOUND, OL_E_RUNTIME_CURVE_EMPTY, OL_E_RUNTIME_CURVE_INVALID, OL_E_RUNTIME_CURVE_DEGENERATE
vehicle.hofs.readReadobligatorio handlehandle, count, hof.<n>.name, hof.<n>.service_tripOL_E_RUNTIME_HOF_UNAVAILABLE

Direct3D 9#

Las operaciones D3D se ejecutan en el thread principal/de renderizado de OMSI a través del puente nativo. Los handles de textura tienen la forma d3dtex-<sessionId N>-<16 hex digits>.

OperaciónTipoArgumentosClaves del resultadoErrores
d3d.statusReadningunoavailable, native_status, query_interface_hresult, cooperative_level_hresult, execution_thread_id, owned_device_references, state (NOT_READY, READY, LOST, RESETTING, STOPPING, STOPPED), transition, generation, live_textures, reset_hook_installed, last_reset_thread_id, binding
d3d.texture.createActionobligatorios width (1..4096), height (1..4096), format (A8R8G8B8, X8R8G8B8, R5G6B5, X1R5G5B5, A1R5G5B5, A4R4G4B4, A8, L8, A8L8); opcional levels (0..16, predeterminado 1)handle, state (LIVE, RELEASED, STALE), device_state, generation, width, height, format, levels, level, level_width, level_height, hresult, execution_thread_idOL_E_D3D_INVALID_ARGUMENT, OL_E_D3D_INVALID_TEXTURE_FORMAT, OL_E_D3D_NOT_READY, OL_E_D3D_DEVICE_LOST, OL_E_D3D_RESET_IN_PROGRESS, OL_E_D3D_NATIVE_CALL_FAILED
d3d.texture.describeReadobligatorio handle; opcional level (0..15, predeterminado 0)las 13 claves de d3d.texture.create, para el nivel solicitadoOL_E_D3D_STALE_RESOURCE_HANDLE, OL_E_D3D_RESOURCE_RELEASED, más los errores de create
d3d.texture.updateActionobligatorios handle, width (1..4096), height (1..4096), pixels_base64 (48 KiB decodificados como máximo); opcionales level (0..15, predeterminado 0), x (0..4095, predeterminado 0), y (0..4095, predeterminado 0)las 13 claves de d3d.texture.create después de la actualizaciónOL_E_D3D_INVALID_PIXEL_BUFFER, más los errores de describe
d3d.texture.releaseActionobligatorio handlelas 13 claves de d3d.texture.create con state = RELEASEDOL_E_D3D_RESOURCE_RELEASED si se libera repetidamente, OL_E_D3D_STALE_RESOURCE_HANDLE

Las operaciones D3D fallidas devuelven los valores detail y native_status. Los métodos de extensión de D3DRuntimeApi (GetD3DStatusAsync, CreateD3DTextureAsync, DescribeD3DTextureAsync, UpdateD3DTextureAsync, ReleaseD3DTextureAsync) encapsulan estas operaciones para los consumidores de la API.

Nombres de GetCapabilitiesAsync#

IOmsiLaunch.GetCapabilitiesAsync(InstallationSpec) devuelve una lista estática de registros Capability(Name, Available, EvidenceState, Reason) que describen la visión que tiene el host de la instalación. Estos nombres son un vocabulario distinto y más general que los ids del registro anteriores; el registro es el contrato para las operaciones, y la lista de capacidades es un resumen legible por máquina para los integradores. La relación se indica en la última columna.

NombreDisponibleEvidenciaRelación
runtime.current-windows-x64depende de la plataformaSTATICALLY_VALIDATEDcompatibilidad
runtime.command-channeltrueSTATICALLY_VALIDATEDbuzón de runtime
runtime.time.read, runtime.time.writetrueRUNTIME_VALIDATEDtime.read, time.set
runtime.time.actual-date-time.writefalseRELEASE_IF_CLOSEDcalendar.set-actual-date-time
runtime.map.readtrueRUNTIME_VALIDATEDmap.read
runtime.weather.read, runtime.weather.actual.readtrueRUNTIME_VALIDATEDweather.read, weather.actual.read
runtime.weather.writefalseRUNTIME_PARTIALweather.set (rechazada)
runtime.camera.read, runtime.camera.writetrueRUNTIME_VALIDATEDcamera.read, camera.set
runtime.d3d.status, runtime.d3d.texture.create, runtime.d3d.texture.update, runtime.d3d.texture.describe, runtime.d3d.texture.releasetrueRUNTIME_VALIDATEDd3d.*
runtime.d3d.lifecycle.resettrueIMPLEMENTED_NOT_RUNTIME_VALIDATEDRV-007. La lista es un inventario fijo y autoinformado: esta entrada no se actualizó después de que la ronda de cierre de runtime observara las transiciones resetting/restored (D01); consulta estado de la validación en runtime para ver la evidencia
runtime.road-vehicles.read, runtime.road-vehicles.spawn, runtime.road-vehicles.place-randomtrueRUNTIME_VALIDATEDroad-vehicles.*
runtime.vehicle.variable.writetrueRUNTIME_VALIDATEDvehicle.variable.set
runtime.humans.read, runtime.timetable.read, runtime.timetable.track-entries.readtrueRUNTIME_VALIDATEDhumans.*, timetable.*
world.new-map, world.presented-entrypoint, world.saved-situationtrueRUNTIME_VALIDATEDmodos de mundo de session.start
world.entrypoint-identityfalseRUNTIME_PARTIALBI-001
world.last-map-statefalseUNSUPPORTED_FOR_CURRENT_PROFILELastMapState (/last)
world.date.explicit, world.date.system, world.time.explicit, world.time.systemfalseSTATICALLY_PARTIAL/date, /time, /year; solicitarlos hace que el plan no sea ejecutable
weather.preset, weather.icao, weather.real-currentfalseSTATICALLY_PARTIAL/weather*; solicitarlos hace que el plan no sea ejecutable
player-vehicle.model, player-vehicle.repaint, player-vehicle.hof, player-vehicle.fleet-number, player-vehicle.registrationfalseSTATICALLY_PARTIAL/vehicle y flags relacionados; solicitarlos hace que el plan no sea ejecutable
configuration.options.semantictrueSTATICALLY_VALIDATED/set, settings del perfil (runtime RV-005)
input.keyboard.patch, input.controller.active-ffscaletrueSTATICALLY_VALIDATEDexisten analizadores de documentos; una sesión no aplica InputSpec (BI-005)
input.controller.axis-buttonsfalseSTATICALLY_PARTIALBI-005
content.maps, content.situations, content.vehicles, content.repaints, content.hofs, content.fleet-registration-sourcestrueSTATICALLY_VALIDATEDDiscoverAsync, /list

El planificador informa además de las capacidades de cada plan en SessionPlan.RequiredCapabilities y SessionPlan.UnsupportedRequestedFeatures (runtime.current-windows-x64, transaction.exact-restore, omsi.profile.OMSI23004, world.new-map, world.presented-entrypoint, world.entrypoint-identity, world.saved-situation, boot.headless-start, internet-textures.disabled, world.explicit-date, world.explicit-time, world.explicit-year, weather, player-vehicle.*, input.keyboard, input.controller, content.*).

Limitaciones conocidas#

  • Los handles están ligados a la sesión; la reutilización de direcciones se detecta mediante una huella del objeto (VMT más puntero de definición para los vehículos, VMT más índice de humano para los humanos) y se notifica como OL_E_RUNTIME_OBJECT_HANDLE_STALE. Punto ciego residual: un objeto de la misma clase y la misma definición recreado en la misma dirección entre dos lecturas de lista no se distingue del original.
  • Los resultados están limitados al buzón de 64 KiB; las listas acotadas se truncan con truncated=true; timetable.logs.read no está acotada y puede fallar con OL_E_RUNTIME_RESPONSE_TOO_LARGE.
  • No hay reubicación de vehículos entre tiles, ni escritura de variables de cadena, ni escritura del calendario, ni escritura de la meteorología, ni asignación headless del PlayerVehicle. Consulta limitaciones conocidas.