# Aircraft Seats And Seatbelts This page outlines the *recommended* setup for seats and seatbelts in your aircraft, based on how things have been done within the aircraft that come with Microsoft Flight Simulator 2024. In the context of this document, *seats* are not modeled objects, but rather **logic objects**, which are simplified SimObjects used to generate other interactive elements within a complex SimObject. The general flow is going to be: - The aircraft is spawned. - The aircraft pilot / passenger navigation graph CFG (based on the common files, preset files, and/or attachments) will spawn a **seat logic object**. - The seat logic object is registered with the **interaction manager**, and contains a **tagged node** with *at least* one of the required tags. - The interaction manager spawns the seatbelt Simple SimObject (optional). The actual seats of the aircraft can be modeled as part of the interior cockpit or cabin, or they can be added as simple attached objects in the modular aircraft (see here for more information: [Modular SimObjects](../../../modular-simobjects/modular-simobjects/)). ### Aircraft Navigation Graphs The initial navigation graph files for the aircraft will depend on the missions and the seats required. They can contain multiple nodes related to free-flight and career missions, but here we'll only be listing the nodes that are required for the [Spawn Pilot (Transversal)](../spawn-pilot-transversal/) setup and for [Passenger](../../commercial-passengers/) setup, as those are the only ones directly related to seats and seatbelts. You can check the [Career Activities](../../career-activities/) documentation for other nodes that the navigation graph files require. The rest of this document is only concerned with the setup of the **seat logic objects** which specific navigation graph files will spawn, as these objects are what control the interactions between the pilot / copilot / passenger and the seats and seatbelts. ### Seat Logic Objects Since the seat logic objects are going to be spawned as part of the interaction system for the aircraft, they should be created in a separate folder, alongside the seatbelt objects (if you have created them, as described here: [Seats And Seatbelts](../../../../models-and-textures/modeling/aircraft/cockpit/seats-and-seatbelts/)). Each unique seat will require its own Simple SimObject, and you would normally have *one* for the pilot, *one* for the copilot, and *at least one* for the passengers, although you can have more if the seats require unique seatbelts, like in the DA62: {{< image-center src="images/5_Content_Config/Careers/Seatbelts/seats_1_folders.png" alt="Example Of The Seat Logic SimObject Folder Setup" >}} Each seat logic object is classed as a **Simple SimObject** , the folder containing the Simple SimObject files will be very basic, only requiring the following 4 things: - **A `model` folder** - This folder is required, as is the [`model.cfg`](../../../models/model.cfg/) file it contains. The file simply needs the following: ``` cpp [models] normal= ``` This file is only required so that the simulation will recognise the logic object as a Simple SimObject. However, if you wish to include a seat model as part of the SimObject then you would need this (and probably a `texture` folder) to be set up correctly as well.   - **A `navigation_graph` folder** - This folder will hold a [`navigation_graph_*.cfg`](../../../cfg-files/navigation_graph.cfg/) file containing a *single* node, which has a `tag` (the `tag` used will define what seat the logic object is being used for, one of `PILOT`, `COPILOT`, or `SIT`), as well as various `interactionFile` parameters. The file should have a unique name, as it will be referenced by the **interaction manager** in the `sim.cfg` file (explained below), for example: `navigation_graph_seat_pilot.cfg` or `navigation_graph_seat_pax_l1_2.cfg`. Within this file   - **A `sim.cfg` file** - This file is used to give the Simple SimObject a `title` (name), assign the navigation graph file to the **interaction manager**, and set the `category` to "SimpleObjectSim" (ie: [Simple SimObjects](../../../modular-simobjects/simobjects/simple-objects/)). It should look something like this: ``` cpp [version] major = 1 minor = 0   [fltsim.0] title = SEAT_DA62_Pax_R1_1 model = texture =   [interactionmgr.0] graph = navigation_graph_seat_pax_r1_1.cfg   [general] category = SimpleObjectSim ``` {{< image-center src="images/5_Content_Config/Careers/Seatbelts/seats_2_logicobject.png" alt="Example Of A Seat Logic Simple SimObject" >}} The title is what will be referenced in the `interactiveObject` parameter of the "parent" navigation graph (either the `navigation_graph_pilot.cfg` or `navigation_graph_passenger.cfg`), and this parameter is what will spawn the seat logic object. #### Default Seat Logic Objects It may be that you want to set up your aircraft quickly and without using any seatbelt models. In these cases you use the **default** seat logic objects instead of creating your own. These objects provide the necessary minimum interactions, and do not expect the aircraft to be set up with seatbelts. The default seat logic objects that you can spawn are as follows: - **Asobo_DEFAULT_Seat_Pilot** - *Title*: `SEAT_DEFAULT_Pilot` - *Animation*: Idle1_PosePropeller (similar to the [IDLES_Straight](#seating-animations) animation) - *Navigation Graph Tag*: `PILOT` - **Asobo_DEFAULT_Seat_Copilot** - *Title*: `SEAT_DEFAULT_Copilot` - *Animation*: Idle1_PosePropeller (similar to the [IDLES_Straight](#seating-animations) animation) - *Navigation Graph Tag*: `COPILOT` - **Asobo_DEFAULT_Seat_Pax** - *Title*: `SEAT_DEFAULT_Pax` - *Animation*: IDLES_LEANED - *Navigation Graph Tag*: `SIT`   Note that these objects are meant to help with aircraft being updated from previous versions of the simulation, or to help with the initial setup of new aircraft. However it is recommended that you make your own logic objects to suit your own aircraft to prevent problems with the animations clipping through seats or cabins, and other minor issues. ### Pilot / Copilot Seat Navigation Graph Setup Within the seat logic object, you will need to include a [navigation graph](../../../cfg-files/navigation_graph.cfg/) file. This file should have a unique name, and is used to define two things: the seat interactions and the node tag used to decide which objects can use the node. An example of this navigation graph for the pilot of the DA62 looks like this: ``` cpp [node.0] name = PILOT pos = 0, 0, 0 tag = PILOT interactionFile.0 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_enter #Param:INTERACTION_NAME:SIT_REMOTELY, VARIABLE_TRIGGER:ENTER_AIRCRAFT, ANIMATION_SIT:IDLES_Leaned, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n interactionFile.1 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_exit #Param:INTERACTION_NAME:EXIT_REMOTELY, VARIABLE_TRIGGER:EXIT_AIRCRAFT, TAG_TELEPORT:SPAWN_EXTERIOR, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n interactionFile.2 = FilePath: InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_Pilot_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_Pilot_Unfasten   [maingraph] nodes = PILOT ``` - ##### PILOT This node is where the pilot will be positioned so they can sit and interact with things, and the position should *always* be (0, 0, 0), as it will be created on the `PILOT_SEAT` node of the "parent" navigation graph. This node **must** be named `PILOT`, and will also need to setup certain **interactions**, as explained in the [Pilot Interactions](../aircraft-seats-and-seatbelts/#pilot-interaction) section below. If the seat logic object is for the copilot then this will be setup something like the following (also from the DA62): ``` cpp [node.0] name = COPILOT pos = 0, 0, 0 tag = COPILOT interactionFile.0 = FilePath:InteractionsPreset\Asobo\Seat\Seat_with_seatbelt #Param:ANIMATION_SIT:IDLES_Leaned interactionFile.1 = FilePath:InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_Copilot_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_Copilot_Unfasten   [maingraph] nodes = COPILOT ```   - ##### COPILOT This *optional* node marks where the copilot will be sitting in the aircraft. This node may or may not be used depending on the criteria of the career activity or chosen flight mode. As with the `PILOT` node, the position should *always* be (0, 0, 0), as it will be created on the `COPILOT_SEAT` node of the "parent" navigation graph. As long as a node with the `COPILOT` tag exists when a flight is started - and the `aircraft.cfg` has been setup correctly - then it will be detected and used (if appropriate for the flight/activity). For the `aircraft.cfg` you will need to set up the `[PILOT]` section as follows for this node to be used: ``` cpp [PILOT] cabin_service = CopilotService generated_copilot = Copilot copilot_behavior = COPILOT ``` For some careers this node can serve different purposes, since it can seat a passenger or some other kind of NPC. For this to be available to passengers the node should *also* have the `SIT` tag, and for other missions the appropriate tag for the mission (in the example below, it sits the Scientific Director during a [Scientific Research](../../scientific-research/) mission). It will also need to have the `sharedSeat` parameter set to `true`, eg: ``` cpp [Node.0] name = COPILOT pos = 0, 0, 0 tag = COPILOT, SIT, DIRECTOR sharedSeat = true ``` {{< callout context="note" title="NOTE" icon="outline/bulb" >}} You will also need to ensure that the [Passengers](../../commercial-passengers/) navigation graph is set up to use this node if you want NPC's other than the copilot to sit on it.This node will also need to setup certain **interactions** - as explained in the [Copilot Interactions](../aircraft-seats-and-seatbelts/#copilot-interaction) section below. {{< /callout >}} ### Passenger Seat Navigation Graph Setup Within the seat logic object for a passenger, you will need to include a [navigation graph](../../../cfg-files/navigation_graph.cfg/) file. This file should have a unique name, and is used to define two things: the seat interactions and the node tag used to decide which objects can use the node. An example of this navigation graph for a passenger of the DA62 looks like this: ``` cpp [Node.0] name = PAX_1 pos = 0, 0, 0 tag = SIT interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_with_seatbelt #Param:ANIMATION_SIT:IDLES_Leaned interactionFile.1 = FilePath: InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_PAX_1_1_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_PAX_1_1_Unfasten   [MainGraph] nodes = PAX_1 ``` - ##### SIT This node is where the passenger will be positioned so they can sit and interact with things, and the position should *always* be (0, 0, 0), as it will be created on the seat node of the "parent" navigation graph. This node **must** be named `SIT`, and will also need to setup certain **interactions**, as explained in the [Pilot Interactions](../#passenger-interaction) section below. For some careers this node can serve different purposes, since it can seat a passenger or some other kind of NPC. For this to be available to passengers the node must *always* have the `SIT` tag, but for other missions an additional tag - or tags - can be supplied. In the example below, the same node can sit a passenger or an Operator during a [Scientific Research](../../scientific-research/) mission: ``` cpp [Node.0] name = PAX_1 pos = 0, 0, 0 tag = SIT, OPERATOR ``` This node will also need to setup certain **interactions** - as explained in the [Passenger Interactions](../#copilot-interaction) section below. ### Pilot Interactions The `PILOT` node needs to deal with moving the pilot avatar inside/outside the aircraft and interacting with the door objects (where applicable and depending on the aircraft). In addition it defines which of the body animations should be used when sitting, and *optionally* to deal with the seatbelts if the aircraft has been setup with any.The simulation has several [Interaction Presets](../../../navigation-services/interaction-presets/) that can be used in the `interactionFile.n` parameter of the pilot navigation graph and we recommend that you use these presets to set up your own aircraft unless you require something particularly specialised. The setup for these interaction presets is as follows for entering / exiting the aircraft: - If the aircraft has **no animated doors** - use the presets [Seat_pilot_enter.xml / Seat_pilot_exit.xml](../../../navigation-services/interaction-presets/#seat_pilot_enterxml--seat_pilot_exitxml). The setup for the navigation graph `PILOT` node to use these interactions would be something like this: ``` cpp ; Entering the aircraft interaction with no door animations interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_pilot_enter #Param: INTERACTION_NAME:SIT_REMOTELY , VARIABLE_TRIGGER:ENTER_AIRCRAFT , ANIMATION_SIT:IDLES_Leaned   ; Exiting the aircraft interaction with no door animations interactionFile.1 = FilePath: InteractionsPreset\Asobo\Seat\Seat_pilot_exit #Param: INTERACTION_NAME:EXIT_REMOTELY , VARIABLE_TRIGGER:EXIT_AIRCRAFT , TAG_TELEPORT:SPAWN_EXTERIOR ``` Note that the `TAG_TELEPORT` parameter must be `SPAWN_EXTERIOR` and that [The Pilot Navigation Graph](../spawn-pilot-transversal/#pilot) *must have this node* otherwise the interaction will not work correctly.   - If the aircraft has **animated doors** - use the presets [Seat_pilot_open_enter.xml / Seat_pilot_open_exit.xml](../../../navigation-services/interaction-presets/#seat_pilot_open_enterxml--seat_pilot_open_exitxml). The setup for the navigation graph `PILOT` node to use these interactions would be something like this: ``` cpp ; Entering the aircraft interaction with door animations interactionFile.0 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_enter #Param:INTERACTION_NAME:SIT_REMOTELY, VARIABLE_TRIGGER:ENTER_AIRCRAFT, ANIMATION_SIT:IDLES_Leaned, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n   ; Exiting the aircraft interaction with no door animations interactionFile.1 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_exit #Param:INTERACTION_NAME:EXIT_REMOTELY, VARIABLE_TRIGGER:EXIT_AIRCRAFT, TAG_TELEPORT:SPAWN_EXTERIOR, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n ``` Note that the `TAG_TELEPORT` parameter must be `SPAWN_EXTERIOR` and that [The Pilot Navigation Graph](../spawn-pilot-transversal/#pilot) *must have this node* otherwise the interaction will not work correctly, and that the `INTERACTIVE POINT GOAL` parameter should be the name of the interactive point setup for the doors, as explained here: [Doors, Htaches, and Canopes - File Setup](../../../../models-and-textures/modeling/aircraft/airframe/doors-hatches-and-canopies/#file-setup). The interactive point must be enclosed in *single quotes* and be followed by `_n`.   If the aircraft has an *optional* exit node, then you will need to include an additional call to the [Seat_pilot_exit.xml](../../../navigation-services/interaction-presets/#seat_pilot_enterxml--seat_pilot_exitxml) or [Seat_pilot_open_exit.xml](../../../navigation-services/interaction-presets/#seat_pilot_open_enterxml--seat_pilot_open_exitxml) interaction file, for example: ``` cpp ; Entering the aircraft interaction with door animations interactionFile.0 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_enter #Param:INTERACTION_NAME:SIT_REMOTELY, VARIABLE_TRIGGER:ENTER_AIRCRAFT, ANIMATION_SIT:IDLES_Leaned, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n   ; Exiting the aircraft interaction with door animations (obligatory spawn point) interactionFile.1 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_exit #Param:INTERACTION_NAME:EXIT_REMOTELY, VARIABLE_TRIGGER:EXIT_AIRCRAFT, TAG_TELEPORT:SPAWN_EXTERIOR, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n   ; Exiting the aircraft interaction with door animations (optional spawn point) interactionfile.3 = FilePath:InteractionsPreset\Asobo\Seat\Seat_pilot_open_exit #Param:INTERACTION_NAME:EXIT_REMOTELY_SECOND, VARIABLE_TRIGGER:EXIT_AIRCRAFT_SECOND, TAG_TELEPORT:SPAWN_EXTERIOR_SECOND, ANIMATION_GET:INTERACTIVE POINT OPEN:'DoorFrontLeft'_n, ANIMATION_SET:INTERACTIVE POINT GOAL:'DoorFrontLeft'_n ``` The name of the `TAG_TELEPORT` parameter can be anything here, but it *must* match that which is defined in the `navigation_graph_pilot.cfg` file, normally formatted as `SPAWN_EXTERIOR_[something]`, for consistency. Further interactions for the seatbelts are explained in the [Seatbelt Interactions](#seatbelt-interactions) section, and the animations are explained in the [Seating Animations](#seating-animations) section. ### Copilot Interactions The `COPILOT` node needs to deal with having a copilot (or optional passenger) sit on the copilot seat. It can also *optionally* deal with the seatbelts if the aircraft has been setup with any. The simulation has several [Interaction Presets](../../../navigation-services/interaction-presets/) that can be used in the `interactionFile.n` parameter of the copilot navigation graph and we recommend that you use these presets to set up your own aircraft unless you require something particularly specialised. If the `COPILOT` node does not require seatbelts then the only interaction file you need to add is the following: - For the copilot to use a seat with no seatbelt you need the [Seat_without_seatbelt.xml](../../../navigation-services/interaction-presets/#seat) interaction file. The setup for the navigation graph `COPILOT` node to use this interaction would be something like this: ``` cpp ; setting copilot interactions with no seatbelts interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_without_seatbelt #Param: ANIMATION_SIT:IDLES_Leaned ``` Further interactions for the seatbelts are explained in the [Seatbelt Interactions](#seatbelt-interactions) section, and the animations are explained in the [Seating Animations](#seating-animations) section ### Passenger Interactions The `SIT` node needs to deal with having a passenger character sit on the passenger seat. It can also *optionally* deal with the seatbelts if the aircraft has been setup with any. The simulation has several [Interaction Presets](../../../navigation-services/interaction-presets/) that can be used in the `interactionFile.n` parameter of the passenger navigation graph and we recommend that you use these presets to set up your own aircraft unless you require something particularly specialised. If the `SIT` node does not require seatbelts then the only interaction file you need to add is the following: - For the copilot to use a seat with no seatbelt you need the [Seat_without_seatbelt.xml](../../../navigation-services/interaction-presets/#seat_without_seatbeltxml) interaction file. The setup for the navigation graph `SIT` node to use this interaction would be something like this: ``` cpp ; setting passenger interactions with no seatbelts interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_without_seatbelt #Param: ANIMATION_SIT:IDLES_Leaned ``` Further interactions for the seatbelts are explained in the [Seatbelt Interactions](#seatbelt-interactions) section, and the animations are explained in the [Seating Animations](#seating-animations) section ### Seatbelt Interactions The `PILOT`, `COPILOT`, and `SIT` nodes are used for seating the different generated characters (pilot, copilot, passengers, or any other character used by the mission). If the seats of the aircraft have seatbelts, then these nodes will need to have additional interactions defined in the `interactionFile.n` parameter for their node. We strongly recommend that you use the following included [Interaction Presets](../../../navigation-services/interaction-presets/) to set up the seatbelt interactions: - [Seat_with_seatbelt.xml](../../../navigation-services/interaction-presets/#seat_with_seatbeltxml) - This preset is used to set the animation to use while the character is on the seat. You can find a list of available poses in the [Seating Animations](#seating-animations) section, below. Note that the PILOT node does not need to use this interaction as the sitting animation is defined in the aircraft enter preset. - [Seatbelt.xml](../../../navigation-services/interaction-presets/#seatbeltxml) - This preset is used to spawn the seatbelt SimObjects that contain the seatbelt models along with the fasten/unfasten animations. {{< callout context="caution" title="IMPORTANT!" icon="outline/alert-triangle" >}} For seatbelts to work, they must have been setup as outlined on the [Seats And Seatbelts](../../../../models-and-textures/modeling/aircraft/cockpit/seats-and-seatbelts/) page, and **both** the above interaction presets need to be included on each of the nodes that require seatbelts, **except for the `PILOT` node**. {{< /callout >}}   Here is an example of a `PILOT` node which has been correctly setup to use seatbelts: ``` cpp ; The pilot seatbelt interaction interactionFile.0 = FilePath:InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_Pilot_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_Pilot_Unfasten ```   Here is an example of a `COPILOT` node which has been correctly setup to use seatbelts: ``` cpp ; The copilot seatbelt interaction interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_with_seatbelt #Param:ANIMATION_SIT:IDLES_Leaned interactionFile.1 = FilePath: InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_Copilot_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_Copilot_Unfasten ```   Here is an example of a `SIT` node which has been correctly setup to use seatbelts: ``` cpp ; The passenger seatbelt interaction interactionFile.0 = FilePath: InteractionsPreset\Asobo\Seat\Seat_with_seatbelt #Param:ANIMATION_SIT:IDLES_Leaned interactionFile.1 = FilePath: InteractionsPreset\Asobo\Seat\Seatbelt #Param:SEATBELT_FASTEN:SEATBELT_DA62_PAX_1_1_Fasten, SEATBELT_UNFASTEN:SEATBELT_DA62_PAX_1_1_Unfasten ```   In all cases, the `SEATBELT_FASTEN` and `SEATBELT_UNFASTEN` parameters should be set to the `title` of the seatbelt Simple SimObject, as defined in the [sim.cfg](../../../cfg-files/sim.cfg/) file (as explained here: [Seatbelt Files](../../../../models-and-textures/modeling/aircraft/cockpit/seats-and-seatbelts//#seatbelt-files)) ### Seating Animations Within the interaction file setup, you must also set which kind of sitting animation is used using the `ANIMATION_SIT` parameter. The animation pose used here should match one of the three body morphotype positions:   - `IDLES_Straight` - Used for very straight positioning of the character where there is adequate space, for example: airliner pilot seats, airliner passenger seats, business jet seats, etc...   - `IDLES_Leaned` - Used for tighter aircraft with a more inclined positioning of the pilot, for example: F18, E330, C172.   - `Idle_Lying_01` - Used for aircraft with very small cockpits with a nearly horizontal position of the pilot/passengers, also for gliders in general. {{< image-center src="images/5_Content_Config/Careers/Guidelines/career_seats_1.png" alt="Body Morphotype Examples For Seat Animations" >}} Which one you use will depend on the way the aircraft seat model was set up (see here for more information: [Seats And Seatbelts](../../../../models-and-textures/modeling/aircraft/cockpit/seats-and-seatbelts/)).