Capacités

Documentation de la version v0.1.0-beta.3Voir la source sur GitHub

Traduction de la page originale en anglais d’OmsiLaunch 0.1.0-beta3. La page anglaise fait foi : en cas de divergence, la page anglaise et le code prévalent.

Cette page constitue l'inventaire canonique de ce que OmsiLaunch 0.1.0-beta3 sait faire. Il est dérivé de PublicCapabilityRegistry (src/OmsiLaunch.Api/PublicCapabilityRegistry.cs), de l'implémentation runtime dans le plugin (src/OmsiLaunch.Plugin/CurrentRuntimeControl.cs et src/OmsiLaunch.Interop/OmsiRuntimeReaders.cs) et de OmsiLaunchService.GetCapabilitiesAsync. Pour chaque capacité, il indique la classification, le niveau de stabilité employé dans toute cette documentation, si une session Running est requise, si la capacité modifie OMSI, les arguments et les clés de résultat, les erreurs et les preuves de validation à l'exécution. La manière d'invoquer une opération (routes CLI, enveloppe de l'API, timeouts, handles) est décrite dans contrôle runtime ; le tableau des preuves se trouve dans état de la validation à l'exécution.

Classification et stabilité#

PublicCapabilityClassification possède quatre valeurs. Elles correspondent au vocabulaire de stabilité comme suit, avec des rétrogradations lorsque les preuves sont incomplètes :

ClassificationSignificationStabilité
PublicStableBetaPublique, dans le contrat de la bêta, validée à l'exécutionSTABLE_BETA (rétrogradée en PARTIAL là où c'est indiqué)
PublicExperimentalPublique, susceptible de changer, validée à l'exécution ou validée statiquementEXPERIMENTAL (rétrogradée en PARTIAL là où c'est indiqué)
InternalOnlyPrimitive de recherche ; inaccessible par l'API publique ou la CLIINTERNAL
UnsupportedReconnue à des fins de diagnostic, rejetée ou absenteUNAVAILABLE

PublicCapabilityKind distingue Read, Write, Action et Event. Chaque capacité runtime exige une session Running et le profil exact Omsi23004_692EBFBF (RequiresSession / RequiresExactProfile dans le registre) ; les capacités de session qui créent une session exigent le profil exact mais aucune session.

Les résultats runtime sont des dictionnaires de chaînes. Les clés qui commencent par internal_ ou se terminent par _address, _pointer ou _vmt sont supprimées à la frontière de l'API (ScrubInternalValues) et ne sont pas listées ici. Les clés de résultat des tableaux d'opérations ci-dessous sont les ensembles de clés exacts renvoyés par le produit : elles ont été capturées en exécutant chaque opération publique dans une session réelle (capture de documentation de la clôture runtime, session f51dcb59-a723-4570-b6c5-b61e628a7993, situations\Linie 5.osn ; les lignes de liste sont notées <row>.<n>.<field>).

Manière dont l'échec d'une opération est signalé (CurrentRuntimeControl.Execute) :

ÉchecErrorCodeValues
Rejet par le registre (opération inconnue ou internal.*, argument requis manquant)OL_E_RUNTIME_OPERATION_UNKNOWN, OL_E_RUNTIME_ARGUMENT_REQUIREDaucune
Rejet délibéré par le produit (weather.set)le code spécifique (OL_E_RUNTIME_SETTING_NOT_PERSISTENT)detail (phrase)
Échec D3Dle code OL_E_D3D_* spécifiquedetail, native_status
Tout autre échec côté plugin (handle obsolète, nom inconnu, valeur hors plage, aucun véhicule du joueur, ...)OL_E_RUNTIME_OPERATION_FAILEDdetail (commence par le code spécifique, par exemple OL_E_RUNTIME_OBJECT_HANDLE_STALE ou OL_E_RUNTIME_VALUE_OUT_OF_RANGE (Parameter 'minute')), exception (nom de type .NET)
Résultat qui ne tient pas dans la boîte aux lettres de 64 KiBOL_E_RUNTIME_RESPONSE_TOO_LARGE (les listes bornées sont raccourcies à la place, voir Horaires, conducteurs, billets)aucune

La colonne Errors de chaque tableau nomme les codes spécifiques ; lisez-les dans ErrorCode ou dans le premier jeton de Values.detail, comme ci-dessus.

Capacités de session#

CapacitéClassificationStabilitéTypeRoute APIRoute CLIModifieValidation
session.planPublicStableBetaSTABLE_BETAActionPlanSessionAsync/plan, /validatenonRUNTIME_PASS (chaque session validée commence par un plan)
session.startPublicStableBetaSTABLE_BETAActionStartSessionAsyncoptions de lancementsystème de fichiers (transaction), processusRUNTIME_PASS (NEW_MAP Grundorf, SAVED_SITUATION Berlin-Spandau)
session.statusPublicStableBetaSTABLE_BETAReadGetStatusAsyncsession statusnonRUNTIME_PASS
session.stopPublicStableBetaSTABLE_BETAActionStopAsync / CloseAsyncsession stop, zone de notification, Ctrl+Cprocessus (TerminateProcess), système de fichiers (restauration)RUNTIME_PASS ; arrêt coopératif non implémenté
session.recoverPublicStableBetaSTABLE_BETAActionRecoverPendingAsync/recovery-status, /recoversystème de fichiers (restauration)RUNTIME_PASS : récupération après sortie précoce (RV-008), propriétaire tué puis récupération précoce au démarrage suivant (S05), restauration échouée puis /recover (F01), refus sous le bail, avec un OMSI orphelin et dans la fenêtre précédant le PID (S04, S04b)
events.readPublicExperimentalEXPERIMENTALEventGetStatusAsync().RuntimeEvents, contrôle session.eventsevents read, events watchnonRUNTIME_PASS ; le slot de télémétrie à dernière valeur peut perdre des rafales

Capacités runtime (entrées du registre)#

CapacitéClassificationStabilitéTypeOpérationsHandlesValidation
time.readPublicStableBetaSTABLE_BETAReadtime.readRUNTIME_PASS (session e5454061)
time.setPublicExperimentalEXPERIMENTALWritetime.setRUNTIME_PASS (écriture, SetTime, relecture)
weather.readPublicStableBetaSTABLE_BETAReadweather.readRUNTIME_PASS
weather.setUnsupportedUNAVAILABLEWriteweather.setRUNTIME_REJECTED : toujours OL_E_RUNTIME_SETTING_NOT_PERSISTENT (session 50a1f1ec)
weather.actual.readPublicExperimentalEXPERIMENTALReadweather.actual.readRUNTIME_PASS
map.readPublicStableBetaSTABLE_BETAReadmap.readRUNTIME_PASS : revalidée sur le slot de carte corrigé (session 9dd62626-94c6-4cd7-bb6f-0288327696f4, Grundorf) et lue sur Berlin-Spandau lors de la capture de documentation
camera.readPublicStableBetaSTABLE_BETAReadcamera.readRUNTIME_PASS
camera.setPublicExperimentalEXPERIMENTALWritecamera.setRUNTIME_PASS (écriture du FOV et relecture)
camera.lockPublicExperimentalEXPERIMENTALActioncamera.lock, camera.unlockRUNTIME_PASS avec un PlayerVehicle issu d'une situation enregistrée (clôture runtime CAM01, familles 0, 2 et 1 avec relecture, puis déverrouillage). La chaîne RuntimeValidation du registre lui-même indique toujours STATICALLY_VALIDATED (auto-déclaration du produit, non mise à jour dans cette version)
vehicles.listPublicStableBetaSTABLE_BETAReadroad-vehicles.listRoadVehicleRUNTIME_PASS
vehicles.getPublicStableBetaSTABLE_BETAReadroad-vehicle.readRoadVehicleRUNTIME_PASS ; la détection des handles obsolètes après suppression naturelle (RV-002) n'a pas de producteur runtime sûr et est validée hors ligne
vehicles.summaryPublicStableBetaSTABLE_BETAReadroad-vehicles.readRUNTIME_PASS
vehicles.spawnPublicExperimentalEXPERIMENTALActionroad-vehicles.spawnRoadVehicleRUNTIME_PASS RV-003 (session 5f641c8d, 2 -> 3, handle rv-000003)
vehicles.place-randomPublicExperimentalEXPERIMENTALActionroad-vehicles.place-randomRUNTIME_PASS (collection 2 -> 4)
player.readPublicStableBetaSTABLE_BETAReadplayer-vehicle.readRoadVehicleRUNTIME_PASS : present=false lors d'un démarrage headless, l'instantané complet avec une situation enregistrée
humans.listPublicExperimentalEXPERIMENTALReadhumans.listHumanRUNTIME_PASS
humans.getPublicExperimentalEXPERIMENTALReadhuman.readHumanRUNTIME_PASS
humans.summaryPublicExperimentalEXPERIMENTALReadhumans.readRUNTIME_PASS
timetable.readPublicStableBetaSTABLE_BETAReadtimetable.read et la famille timetable.*.list / timetable.logs.readRUNTIME_PASS (entrées de trajet : 91 enregistrements sur 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 (lecture seule ; écritures 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 pour create/describe/update/release, rejet des handles libérés et obsolètes à travers les recréations et les sessions (H02), et réinitialisation du périphérique avec invalidation de génération (RV-007, D01 ; l'état lost lui-même n'a pas été produit)
internal.make-basicInternalOnlyINTERNALActioninternal.road-vehicles.make-basicNon publique. ExecuteRuntimeAsync la rejette avec OL_E_RUNTIME_OPERATION_UNKNOWN avant toute recherche de session ; la CLI n'a aucune route pour elle.
calendar.set-actual-date-timeUnsupportedUNAVAILABLEWriteaucuneUNSUPPORTED (BI-002)
player.assign-headlessUnsupportedUNAVAILABLEActionaucuneUNSUPPORTED (BI-007)

internal.road-vehicles.make-basic est INTERNAL : elle existe dans le plugin à des fins de recherche (elle renvoie une adresse native) et elle est rejetée à la frontière de l'API ainsi que par le plan de contrôle local, qui valident tous deux d'abord le nom de l'opération par rapport à PublicRuntimeOperationIds.

Opérations runtime publiques#

Voici la liste exacte des identifiants d'opération qu'un frontend public peut transmettre (PublicCapabilityRegistry.PublicRuntimeOperationIds). Chacune exige SessionState.Running ; aucune n'est journalisée ni restaurée. Les arguments requis sont contrôlés par le registre avant l'utilisation de la boîte aux lettres (OL_E_RUNTIME_ARGUMENT_REQUIRED) ; les arguments facultatifs sont validés par le plugin. Codes d'échec communs à toutes les opérations : OL_E_RUNTIME_OPERATION_UNKNOWN (absente de cette liste), 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 (le plugin n'a pas d'implémentation), OL_E_RUNTIME_OPERATION_FAILED (exception inattendue dans le processus ; valeurs detail et exception).

Heure#

OpérationTypeArgumentsClés de résultatErreurs
time.readReadaucunhour, minute, second, day, month, year
time.setWritehour (0..23), minute (0..59), second (0..59.999, décimal) facultatifs ; au moins unles clés de time.read après le SetTime profiléOL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_TIME_APPLY_FAILED

Météo#

OpérationTypeArgumentsClés de résultatErreurs
weather.readReadaucunfog_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.setWritequelconquesaucuneToujours OL_E_RUNTIME_SETTING_NOT_PERSISTENT (arguments vides : OL_E_RUNTIME_ARGUMENT_REQUIRED). OMSI écrase les deux candidats de vent profilés lors de son prochain tick météo.
weather.actual.readReadaucunactive, icao, last_downloaded, invalid_icao, counter, process

Carte#

OpérationTypeArgumentsClés de résultatErreurs
map.readReadaucunloaded, loaded_tiles, left_hand_traffic, name, filename, friendly_name, description, max_speed, year_start, year_end

Caméra#

OpérationTypeArgumentsClés de résultatErreurs
camera.readReadaucunfamily (0 conducteur, 1 passager, 2 extérieure, 3 carte), name, field_of_view, normal_field_of_view, distance
camera.setWritefamily (0..3), field_of_view (10..170) facultatifs ; au moins unles clés de camera.readOL_E_RUNTIME_ARGUMENT_REQUIRED, OL_E_RUNTIME_VALUE_OUT_OF_RANGE
camera.lockActionfamily (0..3) requis ; preset (0..255, uniquement avec la famille 0 ou 1) facultatiflocked (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 politique est réappliquée toutes les 100 ms jusqu'à camera.unlock ; une réapplication en échec émet l'événement camera.lock.degraded une fois par erreur distincte.
camera.unlockActionaucunlocked (false)

Véhicules routiers et joueur#

OpérationTypeArgumentsClés de résultatErreurs
road-vehicles.readReadaucuncount, ai_collection, player_index (l'index brut du véhicule du joueur dans OMSI, rapporté tel que lu ; utilisez present de player-vehicle.read pour savoir si un véhicule du joueur existe)
road-vehicles.listReadaucuncount, vehicle.<n>.handle (rv-NNNNNN)
road-vehicle.readReadhandle requishandle, 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.readReadaucunpresent (false lorsque OMSI n'a pas de véhicule du joueur) ; lorsque true : player_index plus chaque clé de road-vehicle.read
road-vehicles.spawnActionmodel requis (Vehicles\...\*.bus canonique, au plus 240 caractères, sans .., doit exister sous l'installation)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. N'attribue pas le PlayerVehicle. Prend plusieurs secondes ; utilisez le timeout client de 30 s.
road-vehicles.place-randomActionai_type (0..255, par défaut 0), group (0..65535, par défaut 1), type (-1..65535, par défaut -1), scheduled (0..1, par défaut 0), tour (0..65535, par défaut 0), line (0..65535, par défaut 0) facultatifsraw_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

Humains#

OpérationTypeArgumentsClés de résultatErreurs
humans.readReadaucuncount
humans.listReadaucuncount, human.<n>.handle (hb-NNNNNN)
human.readReadhandle requishandle, 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

Horaires, conducteurs, billets#

Les résultats de liste bornée comportent count (tous les enregistrements dans OMSI), returned_count (lignes de cette réponse) et truncated (true lorsque des lignes ont été omises). Les lignes sont toujours les returned_count premiers enregistrements, numérotés à partir de 0. Les limites de lignes sont de 128 pour les trajets (tracks), les courses (trips), les lignes de transport, les fichiers rv, les arrêts de bus, les liaisons entre arrêts, les services et les profils, de 256 pour les entrées de service et de 512 pour les entrées de trajet ; lorsque les lignes autorisées par cette limite dépassent encore la boîte aux lettres de 64 KiB (par exemple les entrées de trajet et de service sur Berlin-Spandau), le plugin supprime les dernières lignes jusqu'à ce que la réponse tienne et rapporte le returned_count réduit avec truncated=true (audit de documentation BUG-05 ; avant la correction, ces deux listes échouaient avec OL_E_RUNTIME_RESPONSE_TOO_LARGE). timetable.logs.read n'est pas une liste bornée : elle renvoie toutes les entrées du journal, et un journal de quelques centaines d'entrées dépasse la boîte aux lettres et échoue avec OL_E_RUNTIME_RESPONSE_TOO_LARGE.

OpérationTypeArgumentsClés de résultatErreurs
timetable.readReadaucuninvalid (true/false), ainsi que les nombres d'enregistrements tracks, trips, bus_stops, station_links, lines, rv_files
timetable.tracks.listReadaucuncount, returned_count, truncated ; track.<n>.filename, track.<n>.path, track.<n>.entries, track.<n>.length
timetable.trips.listReadaucuncount, 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.listReadaucuncount, returned_count, truncated ; line.<n>.name, line.<n>.chrono_origin, line.<n>.priority, line.<n>.tours, line.<n>.user_allowed
timetable.rv-files.listReadaucuncount, 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.listReadaucuncount, 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.listReadaucuncount, 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.listReadaucuncount, 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.listReadaucuncount, 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.listReadaucuncount, 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.listReadaucuncount, 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.readReadaucuncount ; 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 (toutes les entrées ; non bornée)OL_E_RUNTIME_RESPONSE_TOO_LARGE pour un journal long
drivers.readReadaucuncount, 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.readReadaucunfilename, 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, courbes et HOF du véhicule (portée d'un handle)#

OpérationTypeArgumentsClés de résultatErreurs
vehicle.variables.listReadhandle requishandle, count, returned_count, truncated (limite 512), name.<n>OL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE, OL_E_RUNTIME_SCRIPT_OBJECT_UNAVAILABLE
vehicle.variable.getReadhandle, name requishandle, name, valueOL_E_RUNTIME_VARIABLE_NOT_FOUND, OL_E_RUNTIME_VARIABLE_UNAVAILABLE
vehicle.variable.setWritehandle, name, value (flottant fini) requishandle, name, requested_value, value (relu)OL_E_RUNTIME_VALUE_OUT_OF_RANGE, OL_E_RUNTIME_VARIABLE_NOT_FOUND
vehicle.string-variables.listReadhandle requishandle, count, returned_count, truncated (limite 512), name.<n>OL_E_RUNTIME_OBJECT_HANDLE_REQUIRED, OL_E_RUNTIME_OBJECT_HANDLE_STALE, OL_E_RUNTIME_SCRIPT_OBJECT_UNAVAILABLE
vehicle.string-variable.getReadhandle, name requishandle, name, valueOL_E_RUNTIME_STRING_VARIABLE_NOT_FOUND
vehicle.constants.listReadhandle requishandle, count, name.<n>OL_E_RUNTIME_CONSTANTS_UNAVAILABLE
vehicle.constant.getReadhandle, name requishandle, name, valueOL_E_RUNTIME_CONSTANT_NOT_FOUND
vehicle.curves.listReadhandle requishandle, count, name.<n>
vehicle.curve.evaluateReadhandle, name, x (flottant fini ; un x manquant ou non numérique donne OL_E_RUNTIME_ARGUMENT_REQUIRED) requishandle, name, x, value (interpolation linéaire)OL_E_RUNTIME_CURVE_NOT_FOUND, OL_E_RUNTIME_CURVE_EMPTY, OL_E_RUNTIME_CURVE_INVALID, OL_E_RUNTIME_CURVE_DEGENERATE
vehicle.hofs.readReadhandle requishandle, count, hof.<n>.name, hof.<n>.service_tripOL_E_RUNTIME_HOF_UNAVAILABLE

Direct3D 9#

Les opérations D3D s'exécutent sur le thread principal/de rendu d'OMSI par l'intermédiaire du pont natif. Les handles de texture ont la forme d3dtex-<sessionId N>-<16 hex digits>.

OpérationTypeArgumentsClés de résultatErreurs
d3d.statusReadaucunavailable, 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.createActionwidth (1..4096), height (1..4096), format (A8R8G8B8, X8R8G8B8, R5G6B5, X1R5G5B5, A1R5G5B5, A4R4G4B4, A8, L8, A8L8) requis ; levels (0..16, par défaut 1) facultatifhandle, 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.describeReadhandle requis ; level (0..15, par défaut 0) facultatifles 13 clés de d3d.texture.create, pour le niveau demandéOL_E_D3D_STALE_RESOURCE_HANDLE, OL_E_D3D_RESOURCE_RELEASED, plus les erreurs de create
d3d.texture.updateActionhandle, width (1..4096), height (1..4096), pixels_base64 (au plus 48 KiB une fois décodé) requis ; level (0..15, par défaut 0), x (0..4095, par défaut 0), y (0..4095, par défaut 0) facultatifsles 13 clés de d3d.texture.create après la mise à jourOL_E_D3D_INVALID_PIXEL_BUFFER, plus les erreurs de describe
d3d.texture.releaseActionhandle requisles 13 clés de d3d.texture.create avec state = RELEASEDOL_E_D3D_RESOURCE_RELEASED en cas de libération répétée, OL_E_D3D_STALE_RESOURCE_HANDLE

Les opérations D3D en échec renvoient les valeurs detail et native_status. Les méthodes d'extension de D3DRuntimeApi (GetD3DStatusAsync, CreateD3DTextureAsync, DescribeD3DTextureAsync, UpdateD3DTextureAsync, ReleaseD3DTextureAsync) encapsulent ces opérations pour les consommateurs de l'API.

Noms de GetCapabilitiesAsync#

IOmsiLaunch.GetCapabilitiesAsync(InstallationSpec) renvoie une liste statique d'enregistrements Capability(Name, Available, EvidenceState, Reason) qui décrivent la vision que l'hôte a de l'installation. Ces noms forment un vocabulaire distinct et plus grossier que les identifiants du registre ci-dessus ; le registre est le contrat des opérations, la liste des capacités est un résumé lisible par machine destiné aux intégrateurs. La correspondance est donnée dans la dernière colonne.

NomDisponiblePreuvesCorrespondance
runtime.current-windows-x64dépend de la plateformeSTATICALLY_VALIDATEDcompatibilité
runtime.command-channeltrueSTATICALLY_VALIDATEDboîte aux lettres 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 (rejetée)
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 liste est un inventaire fixe et auto-déclaré : cette entrée n'a pas été mise à jour après que la série de clôture runtime a observé les transitions resetting/restored (D01) ; voir état de la validation à l'exécution pour les preuves
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_VALIDATEDmodes de monde 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 ; les demander rend le plan non exécutable
weather.preset, weather.icao, weather.real-currentfalseSTATICALLY_PARTIAL/weather* ; les demander rend le plan non exécutable
player-vehicle.model, player-vehicle.repaint, player-vehicle.hof, player-vehicle.fleet-number, player-vehicle.registrationfalseSTATICALLY_PARTIAL/vehicle et les options associées ; les demander rend le plan non exécutable
configuration.options.semantictrueSTATICALLY_VALIDATED/set, settings du profil (RV-005 à l'exécution)
input.keyboard.patch, input.controller.active-ffscaletrueSTATICALLY_VALIDATEDles analyseurs de documents existent ; InputSpec n'est pas appliqué par une session (BI-005)
input.controller.axis-buttonsfalseSTATICALLY_PARTIALBI-005
content.maps, content.situations, content.vehicles, content.repaints, content.hofs, content.fleet-registration-sourcestrueSTATICALLY_VALIDATEDDiscoverAsync, /list

Le planificateur rapporte en outre des capacités propres à chaque plan dans SessionPlan.RequiredCapabilities et 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.*).

Limitations connues#

  • Les handles ont la portée d'une session ; la réutilisation d'adresse est détectée par une empreinte d'objet (VMT plus pointeur de définition pour les véhicules, VMT plus index d'humain pour les humains) et signalée par OL_E_RUNTIME_OBJECT_HANDLE_STALE. Angle mort résiduel : un objet de la même classe et de la même définition recréé à la même adresse entre deux lectures de liste est impossible à distinguer de l'original.
  • Les résultats sont bornés à la boîte aux lettres de 64 KiB ; les listes bornées sont tronquées avec truncated=true ; timetable.logs.read n'est pas bornée et peut échouer avec OL_E_RUNTIME_RESPONSE_TOO_LARGE.
  • Pas de déplacement de véhicule d'une tuile à une autre, pas d'écriture de variables chaîne, pas d'écriture du calendrier, pas d'écriture de la météo, pas d'attribution headless du PlayerVehicle. Voir limitations connues.