https://wiki.flightgear.org/w/api.php?action=feedcontributions&user=Richard+H&feedformat=atomFlightGear wiki - User contributions [en]2024-03-29T09:34:23ZUser contributionsMediaWiki 1.39.6https://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=138914User talk:Richard H2023-12-29T23:14:33Z<p>Richard H: /* FlightGear todo list */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make Emesary C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-15 Emesary changes - mainly just liveries.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{done}} Fix F-14 external and internal lights for Rembrandt, ALS and ensure compatible with Compositor.<br />
# {{Pending}} Rework F-14 external and internal lights for Compositor and remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{done}} F-15 MP Emesary (OPRF) (Thanks to Nikolai)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Core: Add support for geneva drive to animations<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have <br />
# {{abandoned}} Fix Nasal threaded GC (removed for now)<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)<br />
<br />
== The Property Key Handler ==<br />
That seems to be quite a nice tool. Touched up the article a little and linked to it from various other articles, hopefully making it easier to find.<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 12:42, 9 December 2023 (UTC)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=138913User talk:Richard H2023-12-29T23:14:02Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make Emesary C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-15 Emesary changes - mainly just liveries.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{done}} Fix F-14 external and internal lights for Rembrandt, ALS and ensure compatible with Compositor.<br />
# {{Pending}} Rework F-14 external and internal lights for Compositor and remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} Core: Add support for geneva drive to animations<br />
# {{done}} F-15 MP Emesary (OPRF) (Thanks to Nikolai)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have <br />
# {{abandoned}} Fix Nasal threaded GC (removed for now)<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)<br />
<br />
== The Property Key Handler ==<br />
That seems to be quite a nice tool. Touched up the article a little and linked to it from various other articles, hopefully making it easier to find.<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 12:42, 9 December 2023 (UTC)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Property_Key_Handler&diff=138754Property Key Handler2023-12-09T11:56:04Z<p>Richard H: /* Property Key Handler */</p>
<hr />
<div>== Property Key Handler ==<br />
This is an extension mainly targeted at developers it is designed to make debugging properties much easier. It can be used to quickly open the property browser or to help find matching properties; or quickly assign new values to properties. <br />
<br />
To use this feature open the Menu->Debug->Configure Development Extensions dialog and ensure that the Enable '/'-key property handler (see $FG_ROOT/Nasal/prop_key_handler.nas) is ticked.<br />
<br />
When active you can simply press the '/'-key and then type a property path (using the <TAB> key to<br />
complete property path elements if possible), or a search string <br />
=== Commands ===<br />
{| class="wikitable"<br />
|+ Commands<br />
|-<br />
! Enter !! action !! result<br />
|-<br />
| valid property path || {{key press|equals}} ''new value'' {{key press|ENTER}} || set property to value<br />
|-<br />
| valid property path || {{key press|ENTER}} || print property and value to screen and terminal<br />
|-<br />
| valid property path || {{key press|*}} || print property and all children to terminal<br />
|-<br />
| valid property path || {{key press|!}} || add property to display list<br />
|-<br />
| valid property path || {{key press|/|!|chain=}} || remove property from display list<br />
|-<br />
| valid property path || {{key press|:}} || open property browser in this property's directory<br />
|-<br />
| match string || {{key press|?}} || print all properties whose path or value contains the match string<br />
|-<br />
| path or partial path || {{key press|#}} || add listener for property and all child properties (cancel all listeners with /#)<br />
|-<br />
| path or partial path || {{key press|/|#|chain=}} || cancel matching listeners <br />
|-<br />
|}<br />
<br />
=== Key bindings ===<br />
{| class="wikitable"<br />
|+ Key bindings<br />
|-<br />
! Key !! action <br />
|-<br />
| {{key press|ENTER}} || Confirm certain operations <br />
|-<br />
| {{key press|TAB}} || complete property path element (if possible), or cycle through available elements<br />
|-<br />
| {{key press|Shift|TAB}} || same as <TAB> but backwards <br />
|-<br />
| {{key press|Up}} || previous element in the history<br />
|-<br />
| {{key press|Down}} || next element in the history<br />
|-<br />
| {{key press|Escape}} || Cancel the operation<br />
|-<br />
| {{key press|Backspace}} || Delete last character typed<br />
|-<br />
| {{key press|Shift|Backspace}} || Remove the current path element (to the previous /)<br />
|}<br />
<br />
==== Colors ====<br />
{| class="wikitable"<br />
|+ Colors<br />
|-<br />
! Color !! Meaning <br />
|-<br />
| white || syntactically correct path to not yet existing property<br />
|-<br />
| green || path to existing property<br />
|-<br />
| red || bad syntax in path syntax (e.g. in /foo*bar the * ist allowed)<br />
|-<br />
| yellow || while typing in value for a valid property path<br />
|-<br />
| magenta || while typing search string (except when first character is '/')<br />
|}<br />
<br />
=== Example usage ===<br />
# Type {{key press|/}} sim / mo{{key press|TAB}} and the display will show /sim/mode. Then type {{key press|:}} to open the property browser at this point.<br />
# Type {{key press|/}} flols/cut {{key press|?}} and on the console will be printed all matching properties<br />
<br />
=== See Also ===<br />
Implementation via {{fg root file|path=Nasal/prop_key_handler.nas}}</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Property_browser&diff=138753Property browser2023-12-09T11:53:27Z<p>Richard H: /* Property Key Handler */</p>
<hr />
<div>[[File:Property_Browser.jpg|thumb|270px|The property browser window]]<br />
{{PropertyTree}}<br />
<br />
The [[FlightGear]] '''property browser''' is a dialog used to browse, in-simulator, through all properties. Properties are internal, runtime state variables in FlightGear. The property browser cannot only be used to inspect all sorts of internal variables at runtime, but it can also be used to change the values of most properties easily (some being conceputally read-only, i.e. because they're exclusively written-to by a certain subsystem such as the FDM). For instance, you cannot change your frame rate by changing the frame counter obviously. <br />
<br />
== Opening the property browser ==<br />
The property browser can be opened while FlightGear is running either:<br />
* By pressing the {{key press|/}} key (forward slash)<br />
* Through the main [[menubar|menu]]: <tt>Debug > Browse Internal Properties</tt> (in older version: <tt>File > Browse Internal Properties</tt>).<br />
<br />
Browse around to see the different data fields that are available. Just about everything interesting/useful is published in the property system. The browser allows you to inspect and even change values in the live running copy of FG.<br />
<br />
=== Property Key Handler ===<br />
<br />
The property key handler provides a better experience for developers when using the property tree and is suited to keyboard operations. See [[Property Key Handler]] for more information.<br />
<br />
== Tied properties ==<br />
{{Note|The origin of tied properties was largely to address<br />
"hypothetical" performance concerns in the early days. Coders could<br />
continue to use native compiled variables and simultaneously expose them to<br />
the property system. Early property system skepticism included issues like<br />
performance and use of global structures. Those have largely not proven<br />
out to be actual issues. So without looking deep into how much<br />
effort/change/impact this would require, I think for the most part the<br />
whole tied property aspect of the api could go away and the property system<br />
api would simplify quite a bit.<ref>https://sourceforge.net/p/flightgear/mailman/message/37280934/</ref><br />
}}<br />
Some properties are so called ''tied'' properties which are directly mapped to internal C++ variables and they cannot be modified using the property browser, we are currently trying to get rid of tied properties, see [[Howto:Use_Property_Tree_Objects]] for details.<br />
<br />
In addition, even some non-tied properties cannot be modified because they are by default constantly written/modified by another subsystem (in C++/Nasal space), possibly updating properties at frame rate, this applies for example to the frame rate counter, which is constantly updated by C++ code - so trying to set it from Nasal would be kind of pointless.<br />
<br />
Also certain properties are only read/applied during initialization/re-initialization (startup/reset) of the sim, while others require the corresponding subsystems to be reinitialized.<br />
<br />
== Tips and tricks ==<br />
Apart from setting a property by clicking it and using the text field and Set button, there is many things that can be done through the property browser:<br />
<br />
* To ''toggle boolean values'' (like true/false), ctrl-click a boolean property.<br />
* To ''display a property'' in the top left corner of the screen, shift-click the property in the property bowser. To ''remove the property'' ctrl-shift-click another property.<br />
* To ''clone the property browser window'' click the square in the ''left'' top of the window. The ''right'' square closes the current browser.<br />
* To ''go to the root'' ctrl-click an "<tt>..</tt>" entry.<br />
* To toggle ''verbose/developer mode'' ctrl-click an "<tt>.</tt>" entry.<br />
<br />
== Verbose mode ==<br />
In verbose mode, toggled by ctrl-clicking an "<tt>.</tt>" entry or toggling <code>/sim/gui/dialogs/property-browser/show-flags</code>, some additional information is shown as flags like this<br />
<br />
<code>foo = '123.456' (double; AT)</code>. <br />
<br />
{| class="wikitable" border="1" cellspacing="0" <br />
! Flag<br />
! Meaning<br />
! Comment<br />
|-<br />
| r || Read protected || Showing that a property can not be read.<br />
|-<br />
| w || Write protected || Showing that a property can not be written to.<br />
|-<br />
| R || Trace read operations || rowspan="2" | In <code>--log-level=info</code> create log line with TRACE prefix on write/read operation; set with <code><foo trace-write="y"></code>.<br />
|-<br />
| W || Trace write operations<br />
|-<br />
| A || Archive bit set || Makes writeProperties() also save this property in restricted mode ("save flight"), while all others are only saved in full mode.<br />
|-<br />
| U || User archive bit set || Saved into ~/.fgfs/autosave.xml, and restored next time. <!-- When FlightGear starts? --><br />
|-<br />
| T || Tied property || Only the C/C++ code that owns a tied property can write to it. Also, listeners will not be triggered.<br />
|-<br />
| L<N> || Number of listeners<br />
|-<br />
|}<br />
<br />
{{FGCquote<br />
|1= <pre>props.globals.getNode("/sim/aircraft").getAttribute("references")<br />
<br />
does now return the reference counter -- the number of co-owners<br />
of the shared pointer. This is really only useful for debugging.<br />
And here's again a summary of all the attribute names:<br />
<br />
children ... returns number of children (faster than size(n.getChildren()!)<br />
listeners ... return number of attached listeners<br />
references ... returns number of co-owners (+ 2 for own consumption)<br />
tied ... returns whether a node is "tied" (in which case listeners<br />
might not get triggered)<br />
alias ... whether the node is an alias to another node<br />
read ... whether the node is read-protected<br />
write ... whether the node is write-protected<br />
archive ... whether the "archive" flag is set, which makes the<br />
node saved with "Save Flight" in the menu<br />
trace-read ... whether the node is being traced for read operations<br />
trace-write ... whether the node is being traced for write operations<br />
userarchive ... whether the node will be saved to ~/.fgfs/autosave.xml<br />
on exit<br />
</pre><br />
|2= {{cite web<br />
| url = http://sourceforge.net/p/flightgear/mailman/message/15645291/<br />
| title = <nowiki>Re: [Flightgear-devel] FlightGear/Plib periodic stutter notes</nowiki><br />
| author = <nowiki>Melchior FRANZ</nowiki><br />
| date = Oct 21st, 2007<br />
| added = Oct 21st, 2007<br />
| script_version = 0.25<br />
}}<br />
}}<br />
<br />
== Other ways to open the property browser ==<br />
=== Forcing open the browser on startup ===<br />
You can force the browser to open on startup, through the following command:<br />
--prop:browser=/sim/path/that/you/want/to/show<br />
<br />
More than one property browser can be opened like this.<br />
--prop:browser=position --prop:browser[1]=orientation<br />
<br />
=== Opening the property browser through nasal ===<br />
Calling <code>gui.property_browser(<path>)</code> opens a property browser for <path>. While it can be called more than once, though all the dialogues will be drawn on top of each other in the centre of the screen. Example:<br />
<br />
<syntaxhighlight lang="nasal"><br />
settimer(func {<br />
gui.property_browser("/position");<br />
gui.property_browser("/orientation");<br />
}, 0);<br />
</syntaxhighlight><br />
<br />
=== Displaying On-Screen property values through nasal ===<br />
Create a file (let's call it display-props.nas) with instructions such below<br />
<br />
<syntaxhighlight lang="nasal"><br />
# On-screen displays<br />
var enableOSD = func {<br />
var left = screen.display.new(20, 10);<br />
var right = screen.display.new(-300, 10);<br />
<br />
left.add("/orientation/heading-deg");<br />
left.add("/environment/wind-from-heading-deg");<br />
left.add("/environment/wind-speed-kt");<br />
right.add("/controls/flight/rudder");<br />
}<br />
enableOSD();<br />
</syntaxhighlight><br />
<br />
Add the path/to/display-props.nas in your aircraft -set.xml,<br />
<br />
or in your $FG_HOME/ inside a Nasal/ folder.<br />
<br />
== Related content ==<br />
=== Source code ===<br />
* {{fgdata source|path=gui/dialogs/property-browser.xml}}<br />
[[Category:Menubar]]<br />
[[Category:Property Tree]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Property_Key_Handler&diff=138752Property Key Handler2023-12-09T11:49:30Z<p>Richard H: </p>
<hr />
<div>== Property Key Handler ==<br />
This is an extension mainly targeted at developers it is designed to make debugging properties much easier. It can be used to quickly open the property browser or to help find matching properties; or quickly assign new values to properties. <br />
<br />
To use this feature open the Menu->Debug->Configure Development Extensions dialog and ensure that the Enable '/'-key property handler (see $FG_ROOT/Nasal/prop_key_handler.nas) is ticked.<br />
<br />
When active you can simply press the '/'-key and then type a property path (using the <TAB> key to<br />
complete property path elements if possible), or a search string <br />
=== Commands ===<br />
{| class="wikitable"<br />
|+ Commands<br />
|-<br />
! Enter !! action !! result<br />
|-<br />
| valid property path || {{key press|equals}} ''new value'' {{key press|ENTER}} || set property to value<br />
|-<br />
| valid property path || {{key press|ENTER}} || print property and value to screen and terminal<br />
|-<br />
| valid property path || {{key press|*}} || print property and all children to terminal<br />
|-<br />
| valid property path || {{key press|!}} || add property to display list (reset list with /!)<br />
|-<br />
| valid property path || {{key press|:}} || open property browser in this property's directory<br />
|-<br />
| match string || {{key press|?}} || print all properties whose path or value contains the match string<br />
|-<br />
| path or partial path || {{key press|#}} || add listener for property and all child properties (cancel all listeners with /#)<br />
|-<br />
| path or partial path || {{key press|/|#|chain=}} || cancel matching listeners <br />
|-<br />
|}<br />
<br />
=== Key bindings ===<br />
{| class="wikitable"<br />
|+ Key bindings<br />
|-<br />
! Key !! action <br />
|-<br />
| {{key press|ENTER}} || Confirm certain operations <br />
|-<br />
| {{key press|TAB}} || complete property path element (if possible), or cycle through available elements<br />
|-<br />
| {{key press|Shift|TAB}} || same as <TAB> but backwards <br />
|-<br />
| {{key press|Up}} || previous element in the history<br />
|-<br />
| {{key press|Down}} || next element in the history<br />
|-<br />
| {{key press|Escape}} || Cancel the operation<br />
|-<br />
| {{key press|Backspace}} || Delete last character typed<br />
|-<br />
| {{key press|Shift|Backspace}} || Remove the current path element (to the previous /)<br />
|}<br />
<br />
==== Colors ====<br />
{| class="wikitable"<br />
|+ Colors<br />
|-<br />
! Color !! Meaning <br />
|-<br />
| white || syntactically correct path to not yet existing property<br />
|-<br />
| green || path to existing property<br />
|-<br />
| red || bad syntax in path syntax (e.g. in /foo*bar the * ist allowed)<br />
|-<br />
| yellow || while typing in value for a valid property path<br />
|-<br />
| magenta || while typing search string (except when first character is '/')<br />
|}<br />
<br />
=== Example usage ===<br />
# Type {{key press|/}} sim / mo{{key press|TAB}} and the display will show /sim/mode. Then type {{key press|:}} to open the property browser at this point.<br />
# Type {{key press|/}} flols/cut {{key press|?}} and on the console will be printed all matching properties<br />
<br />
=== See Also ===<br />
Implementation via {{fg root file|path=Nasal/prop_key_handler.nas}}</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Property_browser&diff=138751Property browser2023-12-09T11:46:21Z<p>Richard H: /* Opening the property browser */</p>
<hr />
<div>[[File:Property_Browser.jpg|thumb|270px|The property browser window]]<br />
{{PropertyTree}}<br />
<br />
The [[FlightGear]] '''property browser''' is a dialog used to browse, in-simulator, through all properties. Properties are internal, runtime state variables in FlightGear. The property browser cannot only be used to inspect all sorts of internal variables at runtime, but it can also be used to change the values of most properties easily (some being conceputally read-only, i.e. because they're exclusively written-to by a certain subsystem such as the FDM). For instance, you cannot change your frame rate by changing the frame counter obviously. <br />
<br />
== Opening the property browser ==<br />
The property browser can be opened while FlightGear is running either:<br />
* By pressing the {{key press|/}} key (forward slash)<br />
* Through the main [[menubar|menu]]: <tt>Debug > Browse Internal Properties</tt> (in older version: <tt>File > Browse Internal Properties</tt>).<br />
<br />
Browse around to see the different data fields that are available. Just about everything interesting/useful is published in the property system. The browser allows you to inspect and even change values in the live running copy of FG.<br />
<br />
=== Property Key Handler ===<br />
<br />
Alternatively, if you have enabled the corresponding "development extension" (see the menu item in the Debug menu), after typing {{key press|/}} you can type in a path (e.g. <tt>/fdm/jsbsim</tt>) and type {{key press|:}} to open the property browser at that path or {{key press|!}} to display it in the list of properties. This method also features tab-completion similar to bash: it will cycle through a list of existing properties that match what has been typed already. See [[Property Key Handler]] for more information.<br />
<br />
== Tied properties ==<br />
{{Note|The origin of tied properties was largely to address<br />
"hypothetical" performance concerns in the early days. Coders could<br />
continue to use native compiled variables and simultaneously expose them to<br />
the property system. Early property system skepticism included issues like<br />
performance and use of global structures. Those have largely not proven<br />
out to be actual issues. So without looking deep into how much<br />
effort/change/impact this would require, I think for the most part the<br />
whole tied property aspect of the api could go away and the property system<br />
api would simplify quite a bit.<ref>https://sourceforge.net/p/flightgear/mailman/message/37280934/</ref><br />
}}<br />
Some properties are so called ''tied'' properties which are directly mapped to internal C++ variables and they cannot be modified using the property browser, we are currently trying to get rid of tied properties, see [[Howto:Use_Property_Tree_Objects]] for details.<br />
<br />
In addition, even some non-tied properties cannot be modified because they are by default constantly written/modified by another subsystem (in C++/Nasal space), possibly updating properties at frame rate, this applies for example to the frame rate counter, which is constantly updated by C++ code - so trying to set it from Nasal would be kind of pointless.<br />
<br />
Also certain properties are only read/applied during initialization/re-initialization (startup/reset) of the sim, while others require the corresponding subsystems to be reinitialized.<br />
<br />
== Tips and tricks ==<br />
Apart from setting a property by clicking it and using the text field and Set button, there is many things that can be done through the property browser:<br />
<br />
* To ''toggle boolean values'' (like true/false), ctrl-click a boolean property.<br />
* To ''display a property'' in the top left corner of the screen, shift-click the property in the property bowser. To ''remove the property'' ctrl-shift-click another property.<br />
* To ''clone the property browser window'' click the square in the ''left'' top of the window. The ''right'' square closes the current browser.<br />
* To ''go to the root'' ctrl-click an "<tt>..</tt>" entry.<br />
* To toggle ''verbose/developer mode'' ctrl-click an "<tt>.</tt>" entry.<br />
<br />
== Verbose mode ==<br />
In verbose mode, toggled by ctrl-clicking an "<tt>.</tt>" entry or toggling <code>/sim/gui/dialogs/property-browser/show-flags</code>, some additional information is shown as flags like this<br />
<br />
<code>foo = '123.456' (double; AT)</code>. <br />
<br />
{| class="wikitable" border="1" cellspacing="0" <br />
! Flag<br />
! Meaning<br />
! Comment<br />
|-<br />
| r || Read protected || Showing that a property can not be read.<br />
|-<br />
| w || Write protected || Showing that a property can not be written to.<br />
|-<br />
| R || Trace read operations || rowspan="2" | In <code>--log-level=info</code> create log line with TRACE prefix on write/read operation; set with <code><foo trace-write="y"></code>.<br />
|-<br />
| W || Trace write operations<br />
|-<br />
| A || Archive bit set || Makes writeProperties() also save this property in restricted mode ("save flight"), while all others are only saved in full mode.<br />
|-<br />
| U || User archive bit set || Saved into ~/.fgfs/autosave.xml, and restored next time. <!-- When FlightGear starts? --><br />
|-<br />
| T || Tied property || Only the C/C++ code that owns a tied property can write to it. Also, listeners will not be triggered.<br />
|-<br />
| L<N> || Number of listeners<br />
|-<br />
|}<br />
<br />
{{FGCquote<br />
|1= <pre>props.globals.getNode("/sim/aircraft").getAttribute("references")<br />
<br />
does now return the reference counter -- the number of co-owners<br />
of the shared pointer. This is really only useful for debugging.<br />
And here's again a summary of all the attribute names:<br />
<br />
children ... returns number of children (faster than size(n.getChildren()!)<br />
listeners ... return number of attached listeners<br />
references ... returns number of co-owners (+ 2 for own consumption)<br />
tied ... returns whether a node is "tied" (in which case listeners<br />
might not get triggered)<br />
alias ... whether the node is an alias to another node<br />
read ... whether the node is read-protected<br />
write ... whether the node is write-protected<br />
archive ... whether the "archive" flag is set, which makes the<br />
node saved with "Save Flight" in the menu<br />
trace-read ... whether the node is being traced for read operations<br />
trace-write ... whether the node is being traced for write operations<br />
userarchive ... whether the node will be saved to ~/.fgfs/autosave.xml<br />
on exit<br />
</pre><br />
|2= {{cite web<br />
| url = http://sourceforge.net/p/flightgear/mailman/message/15645291/<br />
| title = <nowiki>Re: [Flightgear-devel] FlightGear/Plib periodic stutter notes</nowiki><br />
| author = <nowiki>Melchior FRANZ</nowiki><br />
| date = Oct 21st, 2007<br />
| added = Oct 21st, 2007<br />
| script_version = 0.25<br />
}}<br />
}}<br />
<br />
== Other ways to open the property browser ==<br />
=== Forcing open the browser on startup ===<br />
You can force the browser to open on startup, through the following command:<br />
--prop:browser=/sim/path/that/you/want/to/show<br />
<br />
More than one property browser can be opened like this.<br />
--prop:browser=position --prop:browser[1]=orientation<br />
<br />
=== Opening the property browser through nasal ===<br />
Calling <code>gui.property_browser(<path>)</code> opens a property browser for <path>. While it can be called more than once, though all the dialogues will be drawn on top of each other in the centre of the screen. Example:<br />
<br />
<syntaxhighlight lang="nasal"><br />
settimer(func {<br />
gui.property_browser("/position");<br />
gui.property_browser("/orientation");<br />
}, 0);<br />
</syntaxhighlight><br />
<br />
=== Displaying On-Screen property values through nasal ===<br />
Create a file (let's call it display-props.nas) with instructions such below<br />
<br />
<syntaxhighlight lang="nasal"><br />
# On-screen displays<br />
var enableOSD = func {<br />
var left = screen.display.new(20, 10);<br />
var right = screen.display.new(-300, 10);<br />
<br />
left.add("/orientation/heading-deg");<br />
left.add("/environment/wind-from-heading-deg");<br />
left.add("/environment/wind-speed-kt");<br />
right.add("/controls/flight/rudder");<br />
}<br />
enableOSD();<br />
</syntaxhighlight><br />
<br />
Add the path/to/display-props.nas in your aircraft -set.xml,<br />
<br />
or in your $FG_HOME/ inside a Nasal/ folder.<br />
<br />
== Related content ==<br />
=== Source code ===<br />
* {{fgdata source|path=gui/dialogs/property-browser.xml}}<br />
[[Category:Menubar]]<br />
[[Category:Property Tree]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Property_Key_Handler&diff=138750Property Key Handler2023-12-09T11:44:49Z<p>Richard H: Describe operation of the property key handler</p>
<hr />
<div>== Property Key Handler ==<br />
<br />
This is an extension mainly targeted at developers it is designed to make debugging properties much easier. It can be used to quickly open the property browser or to help find matching properties; or quickly assign new values to properties. <br />
<br />
To use this feature open the Menu->Debug->Configure Development Extensions dialog and ensure that the Enable '/'-key property handler (see $FG_ROOT/Nasal/prop_key_handler.nas) is ticked.<br />
<br />
When active you can simply press the '/'-key and then type a property path (using the <TAB> key to<br />
complete property path elements if possible), or a search string <br />
<br />
=== Commands ===<br />
<br />
{| class="wikitable"<br />
|+ Commands<br />
|-<br />
! Enter !! action !! result<br />
|-<br />
| valid property path || {{key press|equals}} ''new value'' {{key press|ENTER}} || set property to value<br />
|-<br />
| valid property path || {{key press|ENTER}} || print property and value to screen and terminal<br />
|-<br />
| valid property path || {{key press|*}} || print property and all children to terminal<br />
|-<br />
| valid property path || {{key press|!}} || add property to display list (reset list with /!)<br />
|-<br />
| valid property path || {{key press|:}} || open property browser in this property's directory<br />
|-<br />
| match string || {{key press|?}} || print all properties whose path or value contains the match string<br />
|-<br />
| path or partial path || {{key press|#}} || add listener for property and all child properties (cancel all listeners with /#)<br />
|-<br />
| path or partial path || {{key press|/|#|chain=}} || cancel matching listeners <br />
|-<br />
|}<br />
<br />
<br />
=== Key bindings ===<br />
<br />
{| class="wikitable"<br />
|+ Key bindings<br />
|-<br />
! Key !! action <br />
|-<br />
| {{key press|ENTER}} || Confirm certain operations <br />
|-<br />
| {{key press|TAB}} || complete property path element (if possible), or cycle through available elements<br />
|-<br />
| {{key press|Shift|TAB}} || same as <TAB> but backwards <br />
|-<br />
| {{key press|Up}} || previous element in the history<br />
|-<br />
| {{key press|Down}} || next element in the history<br />
|-<br />
| {{key press|Escape}} || Cancel the operation<br />
|-<br />
| {{key press|Backspace}} || Delete last character typed<br />
|-<br />
| {{key press|Shift|Backspace}} || Remove the current path element (to the previous /)<br />
|}<br />
<br />
==== Colors ====<br />
<br />
{| class="wikitable"<br />
|+ Colors<br />
|-<br />
! Color !! Meaning <br />
|-<br />
| white || syntactically correct path to not yet existing property<br />
|-<br />
| green || path to existing property<br />
|-<br />
| red || bad syntax in path syntax (e.g. in /foo*bar the * ist allowed)<br />
|-<br />
| yellow || while typing in value for a valid property path<br />
|-<br />
| magenta || while typing search string (except when first character is '/')<br />
|}<br />
<br />
=== Example usage ===<br />
<br />
# Type {{key press|/}} sim / mo{{key press|TAB}} and the display will show /sim/mode. Then type {{key press|:}} to open the property browser at this point.<br />
# Type {{key press|/}} flols/cut {{key press|?}} and on the console will be printed all matching properties</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Howto:Animate_models&diff=137673Howto:Animate models2023-05-12T07:32:39Z<p>Richard H: rewrite the 2020.4 axis animation object explanation because my last attempt was terrible.</p>
<hr />
<div>The real world is full of motion. To simulate this in [[FlightGear]], '''models must be animated'''.<br />
<br />
FlightGear allows you to animate models in response to property changes: for example, the propellers can spin when the engine is on and the elevators can move up and down with your controller. There is no fixed limit on what parts can be animated: the only requirements are that the part is named in the 3D model file, and that there is a property in the main tree that you can use to get the positioning information. <br />
<br />
This document provides basic information for all kind of animations. When animating your model, it is very helpful to find an aircraft with parts similar to yours and use it as an example. Cut and paste the code into your wrapper file and then edit to suit.<br />
<br />
== Notes ==<br />
=== File name of main model and animation XML file ===<br />
{{main article|Aircraft-set.xml#Not used for loading multiplayer aircraft}}<br />
The file name of the main model and animation XML file, or the .ac file if there is no XML file, (in essence the property <code>/sim/model/path</code>) will be the name of the aircraft that is transmitted when using [[multiplayer]] and will also be used for loading multiplayer aircraft.<br />
<br />
There is also a mechanism to substitute a full aircraft model with a simpler AI aircraft model if one is available at the same file path (including for example <code>Models/Boeing-797-800.xml</code>), but in <code>[[$FG_ROOT]]/'''AI'''/Aircraft/</code> instead of <code>$FG_ROOT/Aircraft/</code>.<br />
<br />
=== .ac files ===<br />
{{Main article|AC files: Understanding and changing .ac code#Identifying an object}}<br />
<br />
When referring to an .ac file in your xml animation, it is important that the <code><object-name></code> exactly matches the object named in the .ac file (this includes cases!). <br />
<br />
'''Note for SketchUp users:''' The spatial reference X/Y/Z used in animation to locate an object or a point are different from the ones in AC3D ie X values are the same in both but Y in animation must be matched to AC3D's -Z (Z value but opposite sign) and Z value in animation must be matched to AC3D's Y value. <br />
<br />
'''Note for SketchUp users:''' when exporting to AC3D in Sketchup, the .ac file will name the objects in your model to "blah" by default. You need to amend the relevant object names in your .ac file using text edit, so that the xml will work.<br />
<br />
=== Animation order ===<br />
Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s). Wrong ordering of animations might cause [[Howto:Animate models#Timed|timed]] animations (used to create flashing lights) to not work. For further details see this [https://sourceforge.net/p/flightgear/mailman/message/37090714/ thread] on the development mailing list. Updated [https://scenery.flightgear.org/app.php?c=Models&a=browse&shared=18 shared Effects models] will be available very soon.<br />
<br />
Similar problems can be encountered with the dist-scale instead of the timed animation.<br />
== Tags used in most animations ==<br />
=== Name ===<br />
With a name animation, you can group multiple objects. <br />
<br />
<source><br />
<animation><br />
<name>Collection1</name><br />
<object-name>Object1</object-name><br />
<object-name>Object2</object-name><br />
<object-name>Object3</object-name><br />
</animation><br />
</source><br />
<br />
The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:<br />
<br />
<source><br />
<object-name>Collection1</object-name><br />
</source><br />
<br />
=== Object-name ===<br />
These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.<br />
<br />
=== Property ===<br />
Each animation must be associated with exactly one property from the main FlightGear property tree (remember that the properties in the wrapper file are not part of the main tree), using <code><property></code> to provide the property path:<br />
<br />
<source><br />
<animation><br />
<type>rotate</type><br />
<object-name>Rudder</object-name><br />
<property>controls/rudder</property><br />
</animation><br />
</source><br />
<br />
Note the omission of the leading slash '/' when referring to the property. This assures that when the model is used for AI or multiplayer traffic the animations will follow that of the AI controller instead of that of the user.<br />
<br />
=== Axis ===<br />
An axis part is required in every animation that involves a rotating or moving thing.<br />
<br />
<source><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:<br />
* In rotation animations, the axis part defines around what axis the object rotates. Negative/positive values make the difference between counterclockwise and clockwise rotations.<br />
* In translate animations, the part defines along what axis the object moves. If the x-axis is poiting backwards, an x-value of -1 will result in forward motion.<br />
<br />
You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a [[#Center|<nowiki><center></nowiki>]] tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).<br />
<br />
<source><br />
<axis> <br />
<x1-m> 4.9</x1-m><br />
<y1-m> 7.1</y1-m><br />
<z1-m>-1.0</z1-m><br />
<x2-m> 5.9</x2-m><br />
<y2-m>11.2</y2-m><br />
<z2-m>-0.5</z2-m><br />
</axis><br />
</source><br />
<br />
=== Center ===<br />
Various animations ([[#Rotate|rotate]], [[#Spin|spin]], [[#Scale|scale]]) move around a center point.<br />
<br />
<source><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.<br />
<br />
=== Using a geometry object for axis and centre (2017.2) ===<br />
<br />
Added in V2017.2 is support to allow a geometry object (a line segment with two vertices) that is used to define both the centre and the axis for an animation. This will work with rotate, spin, translate and knob animations.<br />
<br />
{{Note|Since SimGear commit 6ca9141083e62be1161d0ca2d1e3b918494dd6ad on next, this feature can also be used for slider (usage equivalent to that for a translate animation) and for any of the <*-center> / <*-axis> tags of a locked-track animation.}}<br />
<br />
When used for translate animations, the axis line should be normalized (i.e. be 1 meter long) as its length acts as a factor for the translation distance.<br />
<br />
The XML syntax for this is:<br />
<br />
<source><br />
<axis><br />
<object-name>some-object</object-name><br />
</axis><br />
</source><br />
<br />
If the <code><axis>...</axis></code> section is omitted entirely, <code>{object-name}-axis</code> will be used by default, where <code>{object-name}</code> is the name of the object being animated (if we are animating more than one object, the first object is used). In the earlier example this would be <code>Rudder-axis</code>.<br />
<br />
==== Vertex Ordering ==== <br />
<br />
With FG <= 2023.3 the order of the points in the vertex will be sorted based on their X coordinate and when the X coordinate is equal the order will be that of the vertices in the model. <br />
<br />
This has been improved in 2020.4 by adding some new tags that can be used in the <axis> section.<br />
<br />
# <order-by-xyz/> - use the new sorting rules<br />
# <order-by-x/> - use the 2020.3 sorting rules<br />
# <swap-axis-direction/> - when the animation goes the wrong way this is an elegant way to fix it.<br />
<br />
There is also a new top level tag <defaults> that can have either <axis-animation-vertex-order-xyz/> or <axis-animation-vertex-order-x/>. These defaults will affect all animations in the .xml and also any included models unless the included model also has a <defaults> section.<br />
<br />
So for modelers that want to use the new definitive vertex sorting rules adding the following to the main model is sufficient.<br />
<source><br />
<defaults><br />
<axis-animation-vertex-order-xyz/><br />
</defaults><br />
</source><br />
<br />
==== Adding the axis animation 3d object to a model ==== <br />
<br />
In the '''.ac''' file, specify a SURF with type (bottom 4 bits, 0=polygon, 1=closedline, 2=line) set to 2, and two vertices that define the axis. For example:<br />
<br />
OBJECT poly<br />
name "aileron.l-axis"<br />
numvert 2<br />
3.2077502191170844 0.18160835055097943 4.055616960642423<br />
2.6758650763079 0.28024033462188946 6.477876098622225<br />
numsurf 1<br />
SURF 0x12<br />
mat 0<br />
refs 2<br />
0 0 0<br />
1 0 0<br />
kids 0<br />
<br />
Once the object-name used for the axis has been processed the geometry object will be hidden. This also allows a visual check for any axis objects that are not yet assigned.<br />
<br />
It is possible to reuse the same object definition multiple times within a single XML file. <br />
<br />
[[File:Canopy-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for a canopy]]<br />
<br />
[[File:Gauges-knobs-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for cockpit elements]]<br />
<br />
== Additional tags that can be used in most animations ==<br />
=== Conditions ===<br />
Multiple animations can make use of a conditional. Check <tt>$FGDATA/Docs/README.conditions</tt> for some more details.<br />
<br />
* '''equals:''' property value (or second property) is equal to value/(first)property.<br />
* '''greater-than:''' property value (or second property) is larger than value/(first)property.<br />
* '''greater-than-equals:''' property value (or second property) is greater than or equal to value/(first)property.<br />
* '''less-than:''' property value (or second property) is smaller than value/(first)property.<br />
* '''less-than-equals:''' property value (or second property) is smaller than or equal to value/(first)property.<br />
<br />
The example below is true when n1 has a value greater than 25.<br />
<source><br />
<condition><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</source><br />
<br />
Then there are some special tags:<br />
<br />
* '''and:'''<br />
* '''not:'''<br />
* '''or:'''<br />
<br />
In the example below, the condition is true when either n1 is greater than 25% or equal to 0%.<br />
<source><br />
<condition><br />
<or><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
<equals><br />
<property>engines/engine[1]/n1</property><br />
<value>0</value><br />
</equals><br />
</or><br />
</condition><br />
</source><br />
<br />
An example of implementation into an animation looks as follows:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<condition><br />
<greater-than><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<value>10</value><br />
</greater-than><br />
</condition><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Interpolation ===<br />
For non-fixed factors, an interpolation "table" can be created. <br />
<br />
<source><br />
<interpolation><br />
<entry><br />
<ind> 0.0</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 0.667</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 1.0</ind><br />
<dep> 0.5</dep><br />
</entry><br />
</interpolation><br />
</source><br />
<br />
The lines above represent the following table:<br />
<br />
{|<br />
!Input<br />
!Output<br />
|-<br />
|0.0<br />
|0.0<br />
|-<br />
|0.667<br />
|0.0<br />
|-<br />
|1.0<br />
|0.5<br />
|}<br />
<br />
You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).<br />
<br />
=== Expressions ===<br />
For some animations it is possible to define complex animations by using [[Expressions|Expressions]]. This even allows to drive the animation from multiple properties without the need for additional Nasal scripts. Here is an example for a translate animation depending on two properties and the cosine function:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>translate</type><br />
<expression><br />
<product><br />
<property>/my/factor-property</property><br />
<cos><br />
<deg2rad><br />
<property>/my/angular-property</property><br />
</deg2rad><br />
</cos><br />
</product><br />
</expression><br />
[..]more elements[..]<br />
</animation><br />
</syntaxhighlight><br />
<br />
Animations which can utilize [[Expressions|Expressions]] are: <br />
* [[Howto:Animate_models#Translate|Translate]]<br />
* [[Howto:Animate_models#Rotate|Rotate]]<br />
* [[Howto:Animate_models#Scale|Scale]]<br />
* [[Howto:Animate_models#Range|Range]]<br />
* [[Howto:Animate_models#Blend|Blend]]<br />
* [[Howto:Animate_models#Material animation|Material]]<br />
<br />
See more detailed info at [[Expressions|Expressions]]<br />
<br />
== Lights ==<br />
As of January 2021 FlightGear supports multiple light sources just like Project Rembrandt has always done.<br />
[[Compositor#Lights|Adding lights to a model]]<br />
<br />
== Object animations ==<br />
=== Alpha-test ===<br />
<source><br />
<animation><br />
<type>alpha-test</type><br />
<object-name>Object</object-name><br />
<alpha-factor>0.01</alpha-factor><br />
</animation><br />
</source><br />
This "animation" is a way to set an alpha test on a model branch. The effect is to avoid depth buffer writing of pixel that are not seen because they are transparent. This is particulary useful when modeling a metallic structure or a tree with a billboard. The threshold of transparency is set with the <alpha-factor> element. See also [[Pixel testing in effects]].<br />
<br />
=== Blend ===<br />
Blends an object with the surrounding. Comparable to a translucency animation. A value of 0 corresponds to no transparency, i.e. and ordinary solid object, and a value of 1 makes the object fully transparent, i.e., not visible at all.<br />
<br />
<source><br />
<animation><br />
<type>blend</type><br />
<property>/velocities/airspeed-kt</property><br />
<factor>0.00025</factor><br />
<min>0.2</min><br />
<max>0.7</max><br />
</animation><br />
</source><br />
<br />
* '''property:'''<br />
* '''factor:'''<br />
* '''min:'''<br />
* '''max:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
Note that when using the Project Rembrandt renderer, all transparent and translucent objects must be registered to display properly. [[Project_Rembrandt#Registering_all_translucent_surfaces|More information here.]]<br />
<br />
=== Billboard ===<br />
This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.<br />
<br />
<source><br />
<animation><br />
<type>billboard</type><br />
<object-name>Object</object-name><br />
<spherical type="bool">true</spherical><br />
</animation><br />
</source><br />
<br />
* '''spherical:'''<br />
<br />
=== Dist-scale ===<br />
Used to scale an object, based on the distance to the viewer. <code><nowiki><ind></nowiki></code> and <code><nowiki><dep></nowiki></code> (independent and dependent) are the distance in meters and the scale at that distance.<br />
<br />
<source><br />
<animation><br />
<type>dist-scale</type><br />
<object-name>Object</object-name><br />
<interpolation><br />
<entry><br />
<ind>0</ind><br />
<dep>1</dep><br />
</entry><br />
<entry><br />
<ind>300</ind><br />
<dep>4</dep><br />
</entry><br />
<entry><br />
<ind>1500</ind><br />
<dep>8</dep><br />
</entry><br />
</interpolation><br />
</animation><br />
</source><br />
<br />
You can optionally add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
<br />
=== Flash ===<br />
<br />
Used to scale an object based on the cosine of the angle between the axis provided in the animation and the view vector.<br />
<br />
<source><br />
<animation><br />
<type>flash</type><br />
<object-name>Object</object-name><br />
<offset>0.0</offset><br />
<factor>1.0</factor><br />
<power>2</power><br />
<two-sides type="bool">false</two-sides><br />
<min>0.0</min><br />
<max>1.0</max><br />
<center><br />
<x-m>0.0</x-m><br />
<y-m>0.0</y-m><br />
<z-m>0.0</z-m><br />
</center><br />
<axis><br />
<x>0.0</x><br />
<y>-1</y><br />
<z>0.1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''offset:'''<br />
* '''factor:'''<br />
* '''power:'''<br />
* '''two-sides:''' if false, nothing is drawn if the cosine is negative.<br />
* '''min:'''<br />
* '''max:'''<br />
<br />
scale = factor * pow( cosine, power ) + offset<br />
<br />
scale is then clamped between min and max.<br />
<br />
and this scale factor is applied to the object, from the center specified. It works best if scale is less than 1. Otherwise, there will be clipping issues.<br />
<br />
=== Noshadow ===<br />
This animation is used to make sure an object will cast no shadow.<br />
<br />
<source><br />
<animation><br />
<type>noshadow</type><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
=== Range ===<br />
: ''See also [[Modeling - Getting Started#Level of Detail (LOD)]].''<br />
<br />
To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used. <br />
<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-m>30</max-m><br />
</animation><br />
</syntaxhighlight><br />
<br />
* '''min-m:''' the shortest distance (in meters) from the object center at which it is visible.<br />
* '''max-m:''' the largest distance (in meters) from the object center at which it is visible.<br />
<br />
You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers: <br />
{| class="wikitable"<br />
! Property<br />
! Description<br />
! Default value<br />
|-<br />
|<tt>/sim/rendering/static-lod/bare</tt><br />
| only a rough exterior model<br />
| 30,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/rough</tt> <br />
| most should be visible<br />
| 9,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/detailed</tt> <br />
| all details should be visible<br />
| 1,500 m<br />
|}<br />
<br />
The animation code will look like this:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-property>sim/rendering/static-lod/bare</max-property><br />
</animation><br />
</syntaxhighlight><br />
<br />
You can have both ranges (max and min) bound to a property, or just one of them.<br />
* '''min-property:''' <br />
* '''max-property:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Rotate ===<br />
One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>surface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
* '''offset-deg:''' is optional. Offset in degrees.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Scale ===<br />
A scale animation scales (resizes) an object. This can be either property-value dependant (first example) or a fixed scale (second example).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<object-name>Object</object-name><br />
<property>sim/time/sun-angle-rad</property><br />
<x-min>1.0</x-min><br />
<y-min>1.0</y-min><br />
<z-min>1.0</z-min><br />
<x-factor>1.4</x-factor><br />
<y-factor>1.4</y-factor><br />
<z-factor>2.0</z-factor><br />
</animation><br />
</source><br />
<br />
* ?-min: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.<br />
* ?-factor: the scale factor for each axis (factor*property=scale factor).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<x-offset>0.5</x-offset><br />
<y-offset>0.5</y-offset><br />
<z-offset>0.5</z-offset><br />
</animation><br />
</source><br />
<br />
* x.offset: the scale factor.<br />
* Add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
* '''You can optionally use an [[Howto:Animate_models#Expressions|expression]] in the <factor> or <offset> inputs.''' For more details see [[Expressions|Expressions]]<br />
<br />
=== Select ===<br />
This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 25%.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>select</type><br />
<condition><br />
<greater-than><br />
<property>engines/engine[0]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</animation><br />
</source><br />
<br />
=== Shader ===<br />
<source><br />
<animation><br />
<type>shader</type><br />
<shader>chrome</shader><br />
<texture>chrome2.png</texture><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
* '''shader:''' <br />
* '''texture:''' path to the texture used by the shader.<br />
<br />
=== Spin ===<br />
Very similar to [[#Rotate|rotate]], but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>spin</type><br />
<property>engines/engine[0]/n1</property><br />
<factor>25</factor><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
<br />
=== Timed ===<br />
Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.<br />
<br />
<source><br />
<animation><br />
<type>timed</type><br />
<object-name>BacklightOn</object-name><br />
<object-name>BacklightOff</object-name><br />
<use-personality type="bool">true</use-personality><br />
<branch-duration-sec>0.8</branch-duration-sec><br />
<branch-duration-sec>0.2</branch-duration-sec><br />
</animation><br />
</source><br />
<br />
=== Tracking ===<br />
A ''locked-track animation'' can do exactly the same thing as the [https://docs.blender.org/manual/en/latest/animation/constraints/tracking/locked_track.html Locked Track constraint] available in Blender and can also be used to simulate simple inverse kinematic systems consisting of two bones connected with a revolute joint (aka hinge). For details see: [[Howto:Animate gear scissors using the tracking animation]]<br />
<br />
=== Translate ===<br />
This animation moves an object along an axis (not to be confused with the <code>textranslate</code> animation which only moves the texture on the UV map, not the geometry). The example below will move an object in the Y direction:<br />
<br />
{| class="wikitable" border="0" cellspacing="0" <br />
!Property value<br />
!Output<br />
|-<br />
| -1<br />
| -2.5<br />
|-<br />
| 0<br />
| 2.5<br />
|-<br />
| 1<br />
| 7.5<br />
|}<br />
<br />
<source><br />
<animation><br />
<type>translate</type><br />
<object-name>Object</object-name><br />
<property>controls/seat/pilot/position-norm</property><br />
<factor>5</factor><br />
<offset-m>2.5</offset-m><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
When using interpolation tables such as:<br />
<source><br />
<interpolation><br />
<entry><ind>0.0</ind><dep> 0</dep></entry><br />
<entry><ind>0.666</ind><dep>0.18</dep></entry><br />
<entry><ind>1.0</ind><dep>0.27</dep></entry><br />
</interpolation><br />
</source><br />
The first figure (<code><ind></code>) refers to the value of the property associated with the object and the second figure (<code><dep></code>) refers to the amount that the object moves in metres. For example, in this case, the object moves 18cm when the value reads 0.66 and 27cm when the value is 1.<br />
<br />
'''IF used WTIHOUT property''' : The object is placed at some (Value of Offset) meters away from its original position, along the virtual axis formed by said original position and the point with coordinates x/y/z defined in the <axis> tag.<br />
Mathematically, assuming the Object to translate is (in the model space) placed at point A (x1, y1, z1) and you want to relocate it to point B (x2, y2, z2) then x2,y2,z2 are the values in the <axis> tag of the Translate animation and <offset> can be computed as SQRT((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)<br />
<br />
<br />
* '''factor:''' is optional.<br />
* '''offset-m:''' is optional. Offset in meters.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
== Material animation ==<br />
Animate the material properties of an object, such as it's texture, shininess or color.<br />
<br />
<source lang="xml"><br />
<animation> <br />
<type>material</type> <br />
<object-name>Object</object-name><br />
<property-base>sim/model/c172p/material</property-base><br />
...<br />
lines as mentioned below<br />
...<br />
</animation><br />
</source><br />
<br />
'''Optional:'''<br />
* '''property-base:''' All other properties of this animation will be relative to this property node.<br />
<br />
'''Notes:'''<br />
* Numbers are clamped to 0.0 - 1.0, except <code>shininess</code>, which is clamped to 0 - 128.<br />
* By appending <tt>-prop</tt> each of the material properties can read its value from another property.<br />
* '''New since SimGear commit <code>51149bf</code>''': For each of the color components (<code>ambient</code>, <code>diffuse</code>, <code>emission</code> and <code>specular</code>), the <code>red</code>, <code>green</code>, <code>blue</code>, <code>factor</code> and <code>offset</code> tags can each contain an [[Expressions|expression]] instead of a value.<br />
<br />
=== Ambient ===<br />
<source><br />
<ambient><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</ambient><br />
</source><br />
<br />
=== Diffuse ===<br />
<source><br />
<diffuse><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</diffuse><br />
</source><br />
<br />
=== Emission ===<br />
{{Main article|Howto: Illuminate faces}}<br />
<source><br />
<emission><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
<factor-prop>controls/lighting/panel-norm</factor-prop><br />
</emission><br />
</source><br />
<br />
Emission colors are multiplied by the factor-prop value. 1 is maximum color intensity, while 0 is the minimum. Colors are calculated according to the [http://en.wikipedia.org/wiki/RGB_color_model RGB color model].<br />
<br />
=== Specular ===<br />
<source><br />
<specular><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</specular><br />
</source><br />
<br />
=== Transparency ===<br />
<source><br />
<transparency><br />
<alpha-prop>rotors/tail/rpm</alpha-prop><br />
<factor>-0.0015</factor><br />
<offset>1</offset><br />
</transparency><br />
</source><br />
<br />
=== Shininess ===<br />
Shininess is clamped to 0-128.<br />
<source><br />
<shininess>105</shininess><br />
</source><br />
<br />
=== Threshold ===<br />
<source><br />
<threshold>0.001</threshold><br />
</source><br />
<br />
=== Texture ===<br />
Used for the [[Livery over MP]] system.<br />
<br />
<source><br />
<property-base>sim/model/livery</property-base> <br />
<texture-prop>engine</texture-prop> <br />
<texture>KLM.png</texture> <br />
</source><br />
<br />
== Texture Animations ==<br />
Applying different matrix transformations to the textures of an object.<br />
<br />
=== Textranslate ===<br />
A very important animation for cockpits! This animation moves textures over a surface.<br />
<br />
<source><br />
<animation><br />
<type>textranslate</type><br />
<object-name>Object</object-name><br />
<property>autopilot/settings/target-speed-kt</property><br />
<bias>0.0001</bias><br />
<factor>0.001</factor><br />
<step>100</step><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''bias:''' Adds an offset to the property before factor/step. A small value is needed to compensate for [http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems floating point accuracy].<br />
* '''factor:''' property * factor * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.<br />
* '''step:''' the step size at which the texture is translated. If this is set to 0.1, the texture will only be translated at 0.1, 0.2, 0.3 etc.<br />
* '''axis:''' the direction in which the texture is translated. Y is up/down, while X is left/right.<br />
<br />
=== Texrotate ===<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>texrotate</type><br />
<property>some/property/path</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x>0.5</x><br />
<y>0.5</y><br />
<z>0</z><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>0</y><br />
<z>1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Textrapezoid ===<br />
<br />
<source><br />
<animation><br />
<type>textrapezoid</type><br />
<object-name>HUD.l.canvas</object-name><br />
<property>/hud/trapezoid-correction</property><br />
<side>bottom</side><br />
</animation><br />
</source><br />
<br />
* '''side''': side of quad which should be scaled (''top'' (default)/''right''/''bottom''/''left'')<br />
<br />
=== Texmultiple ===<br />
<br />
Only one texture matrix can be applied to each object. With ''textmultiple'' multiple texture animations can be combined into a single matrix, applied to the specified object.<br />
<br />
<source><br />
<animation><br />
<type>texmultiple</type><br />
<object-name>HUD.l.canvas</object-name><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-x</property><br />
<axis><br />
<x>1</x><br />
<y>0</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-y</property><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textrapezoid</subtype><br />
<property>/hud/trapezoid-correction</property><br />
</transform><br />
</animation><br />
</source><br />
<br />
== Object interaction animations ==<br />
=== Enable-hot ===<br />
Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<enable-hot type="bool">false</enable-hot><br />
</animation><br />
</source><br />
<br />
* '''enable-hot:''' can be either true or false. Remember that objects are automatically solid, so it should not be necessary to set this at all when wanting solidness.<br />
<br />
=== Interactions ===<br />
<source><br />
<animation> <br />
<type>interaction</type> <br />
<object-name>Object</object-name> <br />
<interaction-type>carrier-wire</interaction-type> <br />
</animation> <br />
</source><br />
<br />
* '''interaction-type:''' can have the following values:<br />
**'''carrier-catapult:'''<br />
** '''carrier-wire:''' makes the object act as an arresting wire, as used on [[aircraft carrier]]s.<br />
<br />
== Direct manipulation animations ==<br />
=== Knob / slider (v. 2.11-) ===<br />
{{Main article|Knob / slider animation}}<br />
<br />
=== Pick ===<br />
{{Main article|Howto: Make a clickable panel#Pick}}<br />
<br />
=== Touch ===<br />
<br />
The touch animation provides the normalized coordinates of a touch (or click) event on a 2d surface. The coordinates are passed in the argument and can be accessed using cmdarg() in Nasal.<br />
<br />
* Touch animation is designed to work with a quad that is being used as a Canvas placement (display).<br />
* The touch animation must not be combined with a pick animation on the same object.<br />
* More info here: [[Touch Animation]]<br />
<br />
==== touch example ====<br />
<br />
<animation><br />
<type>touch</type><br />
<visible>true</visible><br />
<object-name>CanvasPlacement</object-name><br />
<action><br />
<touch>0</touch><br />
<repeatable>false</repeatable><br />
<binding><br />
<command>nasal</command><br />
<script>print("touch input (",cmdarg().getNode("x").getValue(),",",cmdarg().getNode("y").getValue())</script><br />
</binding><br />
</action><br />
</animation><br />
<br />
== Shadow Handling ==<br />
There exist several possibilites for handling of shadows. <br /><br />
See '''[[ALS_technical_notes|ALS Technical Notes]]''' and more specific '''[[ALS_technical_notes#ALS_fuselage_shadow_effect|Fuselage Shadow Effect with ALS]]''' for a relatively simple shadow handling.<br /><br />
See '''[[Project Rembrandt]]''' which - amongst other functionality - implements a very realistic shadow mapping.<br />
As of January 2021 Project Rembrandt was replaced by the '''[[Compositor]]''' renderer which combines both Project Rembrandt and ALS in a single rendering engine. This also means that the Fuselage Shadow Effect with ALS is now deprecated.<br />
<br />
== References ==<br />
{{Appendix|all|<br />
* {{cite web |url=http://www.opensubscriber.com/message/flightgear-devel@flightgear.org/958955.html |title="material" animation (and the bo105 as an example) |first=Melchior |last=Franz |date=22 March 2005 |work=FlightGear-devel mailinglist }}<br />
* {{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg01546.html |title=flash animation |first=Frederic |last=Bouvier |date=22 Feb 2006 |work=FlightGear-devel mailinglist }}<br />
}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[MP Fallback models]]<br />
* [[Howto:Animate gear scissors]]<br />
* [[Howto:Animate helicopters]]<br />
* [[Howto:Creating 3D instruments]]<br />
<br />
=== Forum topics ===<br />
* {{forum link|t=37353|title=3d models, how to produce them in an understandable way}} (April 2020-) - Touches on the subject of not using LOD range animations in scenery models.<br />
* {{forum link|t=36545|title=speedo Drum settings}} (November 2019) - Animating a mechanical multi-digit drum counter<br />
<br />
[[Category:Aircraft enhancement|Animate models]]<br />
[[Category:Howto|Animate models]]<br />
[[Category:Modeling|Animate models]]<br />
[[Category:Scenery enhancement|Animate models]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Howto:Animate_models&diff=137672Howto:Animate models2023-05-12T07:21:02Z<p>Richard H: documented 2020.4 tags for axis objects</p>
<hr />
<div>The real world is full of motion. To simulate this in [[FlightGear]], '''models must be animated'''.<br />
<br />
FlightGear allows you to animate models in response to property changes: for example, the propellers can spin when the engine is on and the elevators can move up and down with your controller. There is no fixed limit on what parts can be animated: the only requirements are that the part is named in the 3D model file, and that there is a property in the main tree that you can use to get the positioning information. <br />
<br />
This document provides basic information for all kind of animations. When animating your model, it is very helpful to find an aircraft with parts similar to yours and use it as an example. Cut and paste the code into your wrapper file and then edit to suit.<br />
<br />
== Notes ==<br />
=== File name of main model and animation XML file ===<br />
{{main article|Aircraft-set.xml#Not used for loading multiplayer aircraft}}<br />
The file name of the main model and animation XML file, or the .ac file if there is no XML file, (in essence the property <code>/sim/model/path</code>) will be the name of the aircraft that is transmitted when using [[multiplayer]] and will also be used for loading multiplayer aircraft.<br />
<br />
There is also a mechanism to substitute a full aircraft model with a simpler AI aircraft model if one is available at the same file path (including for example <code>Models/Boeing-797-800.xml</code>), but in <code>[[$FG_ROOT]]/'''AI'''/Aircraft/</code> instead of <code>$FG_ROOT/Aircraft/</code>.<br />
<br />
=== .ac files ===<br />
{{Main article|AC files: Understanding and changing .ac code#Identifying an object}}<br />
<br />
When referring to an .ac file in your xml animation, it is important that the <code><object-name></code> exactly matches the object named in the .ac file (this includes cases!). <br />
<br />
'''Note for SketchUp users:''' The spatial reference X/Y/Z used in animation to locate an object or a point are different from the ones in AC3D ie X values are the same in both but Y in animation must be matched to AC3D's -Z (Z value but opposite sign) and Z value in animation must be matched to AC3D's Y value. <br />
<br />
'''Note for SketchUp users:''' when exporting to AC3D in Sketchup, the .ac file will name the objects in your model to "blah" by default. You need to amend the relevant object names in your .ac file using text edit, so that the xml will work.<br />
<br />
=== Animation order ===<br />
Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s). Wrong ordering of animations might cause [[Howto:Animate models#Timed|timed]] animations (used to create flashing lights) to not work. For further details see this [https://sourceforge.net/p/flightgear/mailman/message/37090714/ thread] on the development mailing list. Updated [https://scenery.flightgear.org/app.php?c=Models&a=browse&shared=18 shared Effects models] will be available very soon.<br />
<br />
Similar problems can be encountered with the dist-scale instead of the timed animation.<br />
== Tags used in most animations ==<br />
=== Name ===<br />
With a name animation, you can group multiple objects. <br />
<br />
<source><br />
<animation><br />
<name>Collection1</name><br />
<object-name>Object1</object-name><br />
<object-name>Object2</object-name><br />
<object-name>Object3</object-name><br />
</animation><br />
</source><br />
<br />
The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:<br />
<br />
<source><br />
<object-name>Collection1</object-name><br />
</source><br />
<br />
=== Object-name ===<br />
These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.<br />
<br />
=== Property ===<br />
Each animation must be associated with exactly one property from the main FlightGear property tree (remember that the properties in the wrapper file are not part of the main tree), using <code><property></code> to provide the property path:<br />
<br />
<source><br />
<animation><br />
<type>rotate</type><br />
<object-name>Rudder</object-name><br />
<property>controls/rudder</property><br />
</animation><br />
</source><br />
<br />
Note the omission of the leading slash '/' when referring to the property. This assures that when the model is used for AI or multiplayer traffic the animations will follow that of the AI controller instead of that of the user.<br />
<br />
=== Axis ===<br />
An axis part is required in every animation that involves a rotating or moving thing.<br />
<br />
<source><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:<br />
* In rotation animations, the axis part defines around what axis the object rotates. Negative/positive values make the difference between counterclockwise and clockwise rotations.<br />
* In translate animations, the part defines along what axis the object moves. If the x-axis is poiting backwards, an x-value of -1 will result in forward motion.<br />
<br />
You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a [[#Center|<nowiki><center></nowiki>]] tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).<br />
<br />
<source><br />
<axis> <br />
<x1-m> 4.9</x1-m><br />
<y1-m> 7.1</y1-m><br />
<z1-m>-1.0</z1-m><br />
<x2-m> 5.9</x2-m><br />
<y2-m>11.2</y2-m><br />
<z2-m>-0.5</z2-m><br />
</axis><br />
</source><br />
<br />
=== Center ===<br />
Various animations ([[#Rotate|rotate]], [[#Spin|spin]], [[#Scale|scale]]) move around a center point.<br />
<br />
<source><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.<br />
<br />
=== Using a geometry object for axis and centre (2017.2) ===<br />
<br />
Added in V2017.2 is support to allow a geometry object (a line segment with two vertices) that is used to define both the centre and the axis for an animation. This will work with rotate, spin, translate and knob animations.<br />
<br />
{{Note|Since SimGear commit 6ca9141083e62be1161d0ca2d1e3b918494dd6ad on next, this feature can also be used for slider (usage equivalent to that for a translate animation) and for any of the <*-center> / <*-axis> tags of a locked-track animation.}}<br />
<br />
When used for translate animations, the axis line should be normalized (i.e. be 1 meter long) as its length acts as a factor for the translation distance.<br />
<br />
The XML syntax for this is:<br />
<br />
<source><br />
<axis><br />
<object-name>some-object</object-name><br />
</axis><br />
</source><br />
<br />
If the <code><axis>...</axis></code> section is omitted entirely, <code>{object-name}-axis</code> will be used by default, where <code>{object-name}</code> is the name of the object being animated (if we are animating more than one object, the first object is used). In the earlier example this would be <code>Rudder-axis</code>.<br />
<br />
With FG <= 2023.3 the order of the points in the vertex will be sorted based on their X coordinate and when the X coordinate is equal the order will be that of the vertices in the model. Since 2020.4 it has been possible to add the tag <code><order-by-xyz/></code> to the <code><axis></code> element to specify that all axes are used to sort which produces consistent results. This behaviour can be specified for an entire model by including the tag<br />
<code><axis-animation-vertex-order-xyz/></code> usually in the top level model.xml; although it can be specified in any model XML and will affect that XML and any children that don't explicitly set the order. Generally I would consider it better practice to only set this once. It is also possible to use the tag <code><axis-animation-vertex-order-x/></code> and this might be useful where a particular model requires this.<br />
<br />
In the '''.ac''' file, specify a SURF with type (bottom 4 bits, 0=polygon, 1=closedline, 2=line) set to 2, and two vertices that define the axis. For example:<br />
<br />
OBJECT poly<br />
name "aileron.l-axis"<br />
numvert 2<br />
3.2077502191170844 0.18160835055097943 4.055616960642423<br />
2.6758650763079 0.28024033462188946 6.477876098622225<br />
numsurf 1<br />
SURF 0x12<br />
mat 0<br />
refs 2<br />
0 0 0<br />
1 0 0<br />
kids 0<br />
<br />
Once the object-name used for the axis has been processed the geometry object will be hidden. This also allows a visual check for any axis objects that are not yet assigned.<br />
<br />
It is possible to reuse the same object definition multiple times within a single XML file. <br />
<br />
[[File:Canopy-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for a canopy]]<br />
<br />
[[File:Gauges-knobs-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for cockpit elements]]<br />
<br />
== Additional tags that can be used in most animations ==<br />
=== Conditions ===<br />
Multiple animations can make use of a conditional. Check <tt>$FGDATA/Docs/README.conditions</tt> for some more details.<br />
<br />
* '''equals:''' property value (or second property) is equal to value/(first)property.<br />
* '''greater-than:''' property value (or second property) is larger than value/(first)property.<br />
* '''greater-than-equals:''' property value (or second property) is greater than or equal to value/(first)property.<br />
* '''less-than:''' property value (or second property) is smaller than value/(first)property.<br />
* '''less-than-equals:''' property value (or second property) is smaller than or equal to value/(first)property.<br />
<br />
The example below is true when n1 has a value greater than 25.<br />
<source><br />
<condition><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</source><br />
<br />
Then there are some special tags:<br />
<br />
* '''and:'''<br />
* '''not:'''<br />
* '''or:'''<br />
<br />
In the example below, the condition is true when either n1 is greater than 25% or equal to 0%.<br />
<source><br />
<condition><br />
<or><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
<equals><br />
<property>engines/engine[1]/n1</property><br />
<value>0</value><br />
</equals><br />
</or><br />
</condition><br />
</source><br />
<br />
An example of implementation into an animation looks as follows:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<condition><br />
<greater-than><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<value>10</value><br />
</greater-than><br />
</condition><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Interpolation ===<br />
For non-fixed factors, an interpolation "table" can be created. <br />
<br />
<source><br />
<interpolation><br />
<entry><br />
<ind> 0.0</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 0.667</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 1.0</ind><br />
<dep> 0.5</dep><br />
</entry><br />
</interpolation><br />
</source><br />
<br />
The lines above represent the following table:<br />
<br />
{|<br />
!Input<br />
!Output<br />
|-<br />
|0.0<br />
|0.0<br />
|-<br />
|0.667<br />
|0.0<br />
|-<br />
|1.0<br />
|0.5<br />
|}<br />
<br />
You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).<br />
<br />
=== Expressions ===<br />
For some animations it is possible to define complex animations by using [[Expressions|Expressions]]. This even allows to drive the animation from multiple properties without the need for additional Nasal scripts. Here is an example for a translate animation depending on two properties and the cosine function:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>translate</type><br />
<expression><br />
<product><br />
<property>/my/factor-property</property><br />
<cos><br />
<deg2rad><br />
<property>/my/angular-property</property><br />
</deg2rad><br />
</cos><br />
</product><br />
</expression><br />
[..]more elements[..]<br />
</animation><br />
</syntaxhighlight><br />
<br />
Animations which can utilize [[Expressions|Expressions]] are: <br />
* [[Howto:Animate_models#Translate|Translate]]<br />
* [[Howto:Animate_models#Rotate|Rotate]]<br />
* [[Howto:Animate_models#Scale|Scale]]<br />
* [[Howto:Animate_models#Range|Range]]<br />
* [[Howto:Animate_models#Blend|Blend]]<br />
* [[Howto:Animate_models#Material animation|Material]]<br />
<br />
See more detailed info at [[Expressions|Expressions]]<br />
<br />
== Lights ==<br />
As of January 2021 FlightGear supports multiple light sources just like Project Rembrandt has always done.<br />
[[Compositor#Lights|Adding lights to a model]]<br />
<br />
== Object animations ==<br />
=== Alpha-test ===<br />
<source><br />
<animation><br />
<type>alpha-test</type><br />
<object-name>Object</object-name><br />
<alpha-factor>0.01</alpha-factor><br />
</animation><br />
</source><br />
This "animation" is a way to set an alpha test on a model branch. The effect is to avoid depth buffer writing of pixel that are not seen because they are transparent. This is particulary useful when modeling a metallic structure or a tree with a billboard. The threshold of transparency is set with the <alpha-factor> element. See also [[Pixel testing in effects]].<br />
<br />
=== Blend ===<br />
Blends an object with the surrounding. Comparable to a translucency animation. A value of 0 corresponds to no transparency, i.e. and ordinary solid object, and a value of 1 makes the object fully transparent, i.e., not visible at all.<br />
<br />
<source><br />
<animation><br />
<type>blend</type><br />
<property>/velocities/airspeed-kt</property><br />
<factor>0.00025</factor><br />
<min>0.2</min><br />
<max>0.7</max><br />
</animation><br />
</source><br />
<br />
* '''property:'''<br />
* '''factor:'''<br />
* '''min:'''<br />
* '''max:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
Note that when using the Project Rembrandt renderer, all transparent and translucent objects must be registered to display properly. [[Project_Rembrandt#Registering_all_translucent_surfaces|More information here.]]<br />
<br />
=== Billboard ===<br />
This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.<br />
<br />
<source><br />
<animation><br />
<type>billboard</type><br />
<object-name>Object</object-name><br />
<spherical type="bool">true</spherical><br />
</animation><br />
</source><br />
<br />
* '''spherical:'''<br />
<br />
=== Dist-scale ===<br />
Used to scale an object, based on the distance to the viewer. <code><nowiki><ind></nowiki></code> and <code><nowiki><dep></nowiki></code> (independent and dependent) are the distance in meters and the scale at that distance.<br />
<br />
<source><br />
<animation><br />
<type>dist-scale</type><br />
<object-name>Object</object-name><br />
<interpolation><br />
<entry><br />
<ind>0</ind><br />
<dep>1</dep><br />
</entry><br />
<entry><br />
<ind>300</ind><br />
<dep>4</dep><br />
</entry><br />
<entry><br />
<ind>1500</ind><br />
<dep>8</dep><br />
</entry><br />
</interpolation><br />
</animation><br />
</source><br />
<br />
You can optionally add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
<br />
=== Flash ===<br />
<br />
Used to scale an object based on the cosine of the angle between the axis provided in the animation and the view vector.<br />
<br />
<source><br />
<animation><br />
<type>flash</type><br />
<object-name>Object</object-name><br />
<offset>0.0</offset><br />
<factor>1.0</factor><br />
<power>2</power><br />
<two-sides type="bool">false</two-sides><br />
<min>0.0</min><br />
<max>1.0</max><br />
<center><br />
<x-m>0.0</x-m><br />
<y-m>0.0</y-m><br />
<z-m>0.0</z-m><br />
</center><br />
<axis><br />
<x>0.0</x><br />
<y>-1</y><br />
<z>0.1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''offset:'''<br />
* '''factor:'''<br />
* '''power:'''<br />
* '''two-sides:''' if false, nothing is drawn if the cosine is negative.<br />
* '''min:'''<br />
* '''max:'''<br />
<br />
scale = factor * pow( cosine, power ) + offset<br />
<br />
scale is then clamped between min and max.<br />
<br />
and this scale factor is applied to the object, from the center specified. It works best if scale is less than 1. Otherwise, there will be clipping issues.<br />
<br />
=== Noshadow ===<br />
This animation is used to make sure an object will cast no shadow.<br />
<br />
<source><br />
<animation><br />
<type>noshadow</type><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
=== Range ===<br />
: ''See also [[Modeling - Getting Started#Level of Detail (LOD)]].''<br />
<br />
To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used. <br />
<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-m>30</max-m><br />
</animation><br />
</syntaxhighlight><br />
<br />
* '''min-m:''' the shortest distance (in meters) from the object center at which it is visible.<br />
* '''max-m:''' the largest distance (in meters) from the object center at which it is visible.<br />
<br />
You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers: <br />
{| class="wikitable"<br />
! Property<br />
! Description<br />
! Default value<br />
|-<br />
|<tt>/sim/rendering/static-lod/bare</tt><br />
| only a rough exterior model<br />
| 30,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/rough</tt> <br />
| most should be visible<br />
| 9,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/detailed</tt> <br />
| all details should be visible<br />
| 1,500 m<br />
|}<br />
<br />
The animation code will look like this:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-property>sim/rendering/static-lod/bare</max-property><br />
</animation><br />
</syntaxhighlight><br />
<br />
You can have both ranges (max and min) bound to a property, or just one of them.<br />
* '''min-property:''' <br />
* '''max-property:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Rotate ===<br />
One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>surface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
* '''offset-deg:''' is optional. Offset in degrees.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Scale ===<br />
A scale animation scales (resizes) an object. This can be either property-value dependant (first example) or a fixed scale (second example).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<object-name>Object</object-name><br />
<property>sim/time/sun-angle-rad</property><br />
<x-min>1.0</x-min><br />
<y-min>1.0</y-min><br />
<z-min>1.0</z-min><br />
<x-factor>1.4</x-factor><br />
<y-factor>1.4</y-factor><br />
<z-factor>2.0</z-factor><br />
</animation><br />
</source><br />
<br />
* ?-min: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.<br />
* ?-factor: the scale factor for each axis (factor*property=scale factor).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<x-offset>0.5</x-offset><br />
<y-offset>0.5</y-offset><br />
<z-offset>0.5</z-offset><br />
</animation><br />
</source><br />
<br />
* x.offset: the scale factor.<br />
* Add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
* '''You can optionally use an [[Howto:Animate_models#Expressions|expression]] in the <factor> or <offset> inputs.''' For more details see [[Expressions|Expressions]]<br />
<br />
=== Select ===<br />
This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 25%.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>select</type><br />
<condition><br />
<greater-than><br />
<property>engines/engine[0]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</animation><br />
</source><br />
<br />
=== Shader ===<br />
<source><br />
<animation><br />
<type>shader</type><br />
<shader>chrome</shader><br />
<texture>chrome2.png</texture><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
* '''shader:''' <br />
* '''texture:''' path to the texture used by the shader.<br />
<br />
=== Spin ===<br />
Very similar to [[#Rotate|rotate]], but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>spin</type><br />
<property>engines/engine[0]/n1</property><br />
<factor>25</factor><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
<br />
=== Timed ===<br />
Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.<br />
<br />
<source><br />
<animation><br />
<type>timed</type><br />
<object-name>BacklightOn</object-name><br />
<object-name>BacklightOff</object-name><br />
<use-personality type="bool">true</use-personality><br />
<branch-duration-sec>0.8</branch-duration-sec><br />
<branch-duration-sec>0.2</branch-duration-sec><br />
</animation><br />
</source><br />
<br />
=== Tracking ===<br />
A ''locked-track animation'' can do exactly the same thing as the [https://docs.blender.org/manual/en/latest/animation/constraints/tracking/locked_track.html Locked Track constraint] available in Blender and can also be used to simulate simple inverse kinematic systems consisting of two bones connected with a revolute joint (aka hinge). For details see: [[Howto:Animate gear scissors using the tracking animation]]<br />
<br />
=== Translate ===<br />
This animation moves an object along an axis (not to be confused with the <code>textranslate</code> animation which only moves the texture on the UV map, not the geometry). The example below will move an object in the Y direction:<br />
<br />
{| class="wikitable" border="0" cellspacing="0" <br />
!Property value<br />
!Output<br />
|-<br />
| -1<br />
| -2.5<br />
|-<br />
| 0<br />
| 2.5<br />
|-<br />
| 1<br />
| 7.5<br />
|}<br />
<br />
<source><br />
<animation><br />
<type>translate</type><br />
<object-name>Object</object-name><br />
<property>controls/seat/pilot/position-norm</property><br />
<factor>5</factor><br />
<offset-m>2.5</offset-m><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
When using interpolation tables such as:<br />
<source><br />
<interpolation><br />
<entry><ind>0.0</ind><dep> 0</dep></entry><br />
<entry><ind>0.666</ind><dep>0.18</dep></entry><br />
<entry><ind>1.0</ind><dep>0.27</dep></entry><br />
</interpolation><br />
</source><br />
The first figure (<code><ind></code>) refers to the value of the property associated with the object and the second figure (<code><dep></code>) refers to the amount that the object moves in metres. For example, in this case, the object moves 18cm when the value reads 0.66 and 27cm when the value is 1.<br />
<br />
'''IF used WTIHOUT property''' : The object is placed at some (Value of Offset) meters away from its original position, along the virtual axis formed by said original position and the point with coordinates x/y/z defined in the <axis> tag.<br />
Mathematically, assuming the Object to translate is (in the model space) placed at point A (x1, y1, z1) and you want to relocate it to point B (x2, y2, z2) then x2,y2,z2 are the values in the <axis> tag of the Translate animation and <offset> can be computed as SQRT((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)<br />
<br />
<br />
* '''factor:''' is optional.<br />
* '''offset-m:''' is optional. Offset in meters.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
== Material animation ==<br />
Animate the material properties of an object, such as it's texture, shininess or color.<br />
<br />
<source lang="xml"><br />
<animation> <br />
<type>material</type> <br />
<object-name>Object</object-name><br />
<property-base>sim/model/c172p/material</property-base><br />
...<br />
lines as mentioned below<br />
...<br />
</animation><br />
</source><br />
<br />
'''Optional:'''<br />
* '''property-base:''' All other properties of this animation will be relative to this property node.<br />
<br />
'''Notes:'''<br />
* Numbers are clamped to 0.0 - 1.0, except <code>shininess</code>, which is clamped to 0 - 128.<br />
* By appending <tt>-prop</tt> each of the material properties can read its value from another property.<br />
* '''New since SimGear commit <code>51149bf</code>''': For each of the color components (<code>ambient</code>, <code>diffuse</code>, <code>emission</code> and <code>specular</code>), the <code>red</code>, <code>green</code>, <code>blue</code>, <code>factor</code> and <code>offset</code> tags can each contain an [[Expressions|expression]] instead of a value.<br />
<br />
=== Ambient ===<br />
<source><br />
<ambient><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</ambient><br />
</source><br />
<br />
=== Diffuse ===<br />
<source><br />
<diffuse><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</diffuse><br />
</source><br />
<br />
=== Emission ===<br />
{{Main article|Howto: Illuminate faces}}<br />
<source><br />
<emission><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
<factor-prop>controls/lighting/panel-norm</factor-prop><br />
</emission><br />
</source><br />
<br />
Emission colors are multiplied by the factor-prop value. 1 is maximum color intensity, while 0 is the minimum. Colors are calculated according to the [http://en.wikipedia.org/wiki/RGB_color_model RGB color model].<br />
<br />
=== Specular ===<br />
<source><br />
<specular><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</specular><br />
</source><br />
<br />
=== Transparency ===<br />
<source><br />
<transparency><br />
<alpha-prop>rotors/tail/rpm</alpha-prop><br />
<factor>-0.0015</factor><br />
<offset>1</offset><br />
</transparency><br />
</source><br />
<br />
=== Shininess ===<br />
Shininess is clamped to 0-128.<br />
<source><br />
<shininess>105</shininess><br />
</source><br />
<br />
=== Threshold ===<br />
<source><br />
<threshold>0.001</threshold><br />
</source><br />
<br />
=== Texture ===<br />
Used for the [[Livery over MP]] system.<br />
<br />
<source><br />
<property-base>sim/model/livery</property-base> <br />
<texture-prop>engine</texture-prop> <br />
<texture>KLM.png</texture> <br />
</source><br />
<br />
== Texture Animations ==<br />
Applying different matrix transformations to the textures of an object.<br />
<br />
=== Textranslate ===<br />
A very important animation for cockpits! This animation moves textures over a surface.<br />
<br />
<source><br />
<animation><br />
<type>textranslate</type><br />
<object-name>Object</object-name><br />
<property>autopilot/settings/target-speed-kt</property><br />
<bias>0.0001</bias><br />
<factor>0.001</factor><br />
<step>100</step><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''bias:''' Adds an offset to the property before factor/step. A small value is needed to compensate for [http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems floating point accuracy].<br />
* '''factor:''' property * factor * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.<br />
* '''step:''' the step size at which the texture is translated. If this is set to 0.1, the texture will only be translated at 0.1, 0.2, 0.3 etc.<br />
* '''axis:''' the direction in which the texture is translated. Y is up/down, while X is left/right.<br />
<br />
=== Texrotate ===<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>texrotate</type><br />
<property>some/property/path</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x>0.5</x><br />
<y>0.5</y><br />
<z>0</z><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>0</y><br />
<z>1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Textrapezoid ===<br />
<br />
<source><br />
<animation><br />
<type>textrapezoid</type><br />
<object-name>HUD.l.canvas</object-name><br />
<property>/hud/trapezoid-correction</property><br />
<side>bottom</side><br />
</animation><br />
</source><br />
<br />
* '''side''': side of quad which should be scaled (''top'' (default)/''right''/''bottom''/''left'')<br />
<br />
=== Texmultiple ===<br />
<br />
Only one texture matrix can be applied to each object. With ''textmultiple'' multiple texture animations can be combined into a single matrix, applied to the specified object.<br />
<br />
<source><br />
<animation><br />
<type>texmultiple</type><br />
<object-name>HUD.l.canvas</object-name><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-x</property><br />
<axis><br />
<x>1</x><br />
<y>0</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-y</property><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textrapezoid</subtype><br />
<property>/hud/trapezoid-correction</property><br />
</transform><br />
</animation><br />
</source><br />
<br />
== Object interaction animations ==<br />
=== Enable-hot ===<br />
Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<enable-hot type="bool">false</enable-hot><br />
</animation><br />
</source><br />
<br />
* '''enable-hot:''' can be either true or false. Remember that objects are automatically solid, so it should not be necessary to set this at all when wanting solidness.<br />
<br />
=== Interactions ===<br />
<source><br />
<animation> <br />
<type>interaction</type> <br />
<object-name>Object</object-name> <br />
<interaction-type>carrier-wire</interaction-type> <br />
</animation> <br />
</source><br />
<br />
* '''interaction-type:''' can have the following values:<br />
**'''carrier-catapult:'''<br />
** '''carrier-wire:''' makes the object act as an arresting wire, as used on [[aircraft carrier]]s.<br />
<br />
== Direct manipulation animations ==<br />
=== Knob / slider (v. 2.11-) ===<br />
{{Main article|Knob / slider animation}}<br />
<br />
=== Pick ===<br />
{{Main article|Howto: Make a clickable panel#Pick}}<br />
<br />
=== Touch ===<br />
<br />
The touch animation provides the normalized coordinates of a touch (or click) event on a 2d surface. The coordinates are passed in the argument and can be accessed using cmdarg() in Nasal.<br />
<br />
* Touch animation is designed to work with a quad that is being used as a Canvas placement (display).<br />
* The touch animation must not be combined with a pick animation on the same object.<br />
* More info here: [[Touch Animation]]<br />
<br />
==== touch example ====<br />
<br />
<animation><br />
<type>touch</type><br />
<visible>true</visible><br />
<object-name>CanvasPlacement</object-name><br />
<action><br />
<touch>0</touch><br />
<repeatable>false</repeatable><br />
<binding><br />
<command>nasal</command><br />
<script>print("touch input (",cmdarg().getNode("x").getValue(),",",cmdarg().getNode("y").getValue())</script><br />
</binding><br />
</action><br />
</animation><br />
<br />
== Shadow Handling ==<br />
There exist several possibilites for handling of shadows. <br /><br />
See '''[[ALS_technical_notes|ALS Technical Notes]]''' and more specific '''[[ALS_technical_notes#ALS_fuselage_shadow_effect|Fuselage Shadow Effect with ALS]]''' for a relatively simple shadow handling.<br /><br />
See '''[[Project Rembrandt]]''' which - amongst other functionality - implements a very realistic shadow mapping.<br />
As of January 2021 Project Rembrandt was replaced by the '''[[Compositor]]''' renderer which combines both Project Rembrandt and ALS in a single rendering engine. This also means that the Fuselage Shadow Effect with ALS is now deprecated.<br />
<br />
== References ==<br />
{{Appendix|all|<br />
* {{cite web |url=http://www.opensubscriber.com/message/flightgear-devel@flightgear.org/958955.html |title="material" animation (and the bo105 as an example) |first=Melchior |last=Franz |date=22 March 2005 |work=FlightGear-devel mailinglist }}<br />
* {{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg01546.html |title=flash animation |first=Frederic |last=Bouvier |date=22 Feb 2006 |work=FlightGear-devel mailinglist }}<br />
}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[MP Fallback models]]<br />
* [[Howto:Animate gear scissors]]<br />
* [[Howto:Animate helicopters]]<br />
* [[Howto:Creating 3D instruments]]<br />
<br />
=== Forum topics ===<br />
* {{forum link|t=37353|title=3d models, how to produce them in an understandable way}} (April 2020-) - Touches on the subject of not using LOD range animations in scenery models.<br />
* {{forum link|t=36545|title=speedo Drum settings}} (November 2019) - Animating a mechanical multi-digit drum counter<br />
<br />
[[Category:Aircraft enhancement|Animate models]]<br />
[[Category:Howto|Animate models]]<br />
[[Category:Modeling|Animate models]]<br />
[[Category:Scenery enhancement|Animate models]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=137408Nasal optimisation2023-03-08T09:28:04Z<p>Richard H: added explanation about using the built in performance monitor</p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each [[Nasal]] frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== Using the built in performance monitor ==<br />
You can do this from the debug menu '''Monitor System Performance''' and currently the GUI only shows the top level.<br />
<br />
When the performance monitor is active either by having the GUI on display or because <code>/sim/performance-monitor/enabled</code>is true overruns will be logged.at ALRT level. An overrun is defined as exceeding<code>/sim/performance-monitor/max-time-per-frame-ms</code>). <br />
<br />
Setting <code>/sim/performance-monitor/dump-stats</code> to non-zero will cause detailed performance info will be output to the log.<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== Nasal Profiling ==<br />
<br />
As yet there isn't a profiler available so instead there is an OperationTimer that is ships as part of emexec (2020.3 or later released after Aprial 2022).<br />
<br />
This makes it easy to output (via logprint) information about how much time a module is taking. <br />
<br />
To create an instance of a timer there are two parameters, the first is the ident and the second the log level (3=info, 2=debug)<br />
<code>var ot = emexec.OperationTimer.new("VSD",2);</code><br />
The output is a cumulative number of milliseconds since the OperationTimer was reset.<br />
<code>ot.reset();<br />
ot.log("Start");<br />
<some code to time><br />
ot.log("1");<br />
<more code><br />
ot.log("ed");</code><br />
<br />
== Emesary real time executive ==<br />
<br />
Starting from 2020.3 released after April 2022 FGdata includes the emexec module which provides an easy to use object scheduler that uses Emesary to do most of the work. <br />
<br />
By default it is recommended to use the built in scheduler <code>emexec.ExecModule</code><br />
<br />
The scheduler will adjust the frequency from 50hz right down to 4hz. <br />
<br />
Any object that wishes to be invoked simply needs to provide an <code>update(notification)</code> method and register itself via ExecModule.register method.<br />
<br />
The register method takes the following arguments<br />
<br />
# ident - text to identify this object registration<br />
# properties_to_monitor : a key value pair hash of properties to include in the notification. This helps to optimise property tree access (see FrameNotification below for the format)<br />
# object : an instance of an objec that has an update(notification) method<br />
# rate : frame skip rate (1/rate is the effective rate)<br />
# frame_offset : frame skip offset. Must be less than rate and when used with rate it can allow interleaving of modules (usually for performance)<br />
<br />
During development it would be usual to set the overrun detection active emexec.ExecModule.transmitter.OverrunDetection(9) for a warning (log leve info) of any frame that exceeds 9 ms<br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
<syntaxhighlight lang="nasal"><br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
</syntaxhighlight><br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
# new : func(_name, _size, _timestamp=nil)<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
# process : func (object, data, init_method, process_method, complete_method)<br />
<br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
process individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=135764Multiplayer protocol2022-11-01T14:20:59Z<p>Richard H: /* 2017.2 encoding */ revised documentation of bool size usage</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified. The size is the size of the encoding and the size of the index will be added to this so an int will take 6 bytes<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|Deprecated and retained for compatibility with the following properties<br />
<br />
* sim/hitches/aerotow/tow/connected-to-property-node<br />
* sim/hitches/aerotow/is-slave<br />
* sim/hitches/aerotow/open<br />
<br />
Generic bools are packed as 31 into 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to {{flightgear file|src/MultiPlayer/mpmessages.hxx|l=48}} for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID!! Property!! Type!!Transmit As!! Protocol Ident<br />
|-<br />
||10||sim/multiplay/protocol-version||INT||TT_SHORTINT||V2_PROP_ID_PROTOCOL||<br />
|-<br />
||100||surface-positions/left-aileron-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||101||surface-positions/right-aileron-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||102||surface-positions/elevator-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||103||surface-positions/rudder-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||104||surface-positions/flap-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||105||surface-positions/speedbrake-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||106||gear/tailhook/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||107||gear/launchbar/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||108||gear/launchbar/state||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||109||gear/launchbar/holdback-position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||110||canopy/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||111||surface-positions/wing-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||112||surface-positions/wing-fold-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||120||gear/launchbar/state-value||INT||TT_NOSEND||V1_1_2_PROP_ID||<br />
|-<br />
||200||gear/gear[0]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||201||gear/gear[0]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||210||gear/gear[1]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||211||gear/gear[1]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||220||gear/gear[2]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||221||gear/gear[2]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||230||gear/gear[3]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||231||gear/gear[3]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||240||gear/gear[4]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||241||gear/gear[4]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||300||engines/engine[0]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||301||engines/engine[0]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||302||engines/engine[0]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||310||engines/engine[1]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||311||engines/engine[1]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||312||engines/engine[1]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||320||engines/engine[2]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||321||engines/engine[2]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||322||engines/engine[2]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||330||engines/engine[3]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||331||engines/engine[3]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||332||engines/engine[3]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||340||engines/engine[4]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||341||engines/engine[4]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||342||engines/engine[4]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||350||engines/engine[5]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||351||engines/engine[5]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||352||engines/engine[5]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||360||engines/engine[6]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||361||engines/engine[6]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||362||engines/engine[6]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||370||engines/engine[7]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||371||engines/engine[7]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||372||engines/engine[7]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||380||engines/engine[8]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||381||engines/engine[8]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||382||engines/engine[8]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||390||engines/engine[9]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||391||engines/engine[9]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||392||engines/engine[9]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||800||rotors/main/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||801||rotors/tail/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||810||rotors/main/blade[0]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||811||rotors/main/blade[1]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||812||rotors/main/blade[2]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||813||rotors/main/blade[3]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||820||rotors/main/blade[0]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||821||rotors/main/blade[1]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||822||rotors/main/blade[2]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||823||rotors/main/blade[3]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||830||rotors/tail/blade[0]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||831||rotors/tail/blade[1]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||900||sim/hitches/aerotow/tow/length||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||903||sim/hitches/aerotow/tow/dist||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||906||sim/hitches/aerotow/tow/brake-force||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||907||sim/hitches/aerotow/tow/end-force-x||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||908||sim/hitches/aerotow/tow/end-force-y||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||909||sim/hitches/aerotow/tow/end-force-z||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||930||sim/hitches/aerotow/is-slave||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||932||sim/hitches/aerotow/open||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||933||sim/hitches/aerotow/local-pos-x||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||934||sim/hitches/aerotow/local-pos-y||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||935||sim/hitches/aerotow/local-pos-z||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1001||controls/flight/slats||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1002||controls/flight/speedbrake||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1003||controls/flight/spoilers||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1004||controls/gear/gear-down||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1005||controls/lighting/nav-lights||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||1006||controls/armament/station[0]/jettison-all||BOOL||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1100||sim/model/variant||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1101||sim/model/livery/file||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1200||environment/wildfire/data||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1201||environment/contrail||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1300||tanker||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1400||scenery/events||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1500||instrumentation/transponder/transmitted-id||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1501||instrumentation/transponder/altitude||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1502||instrumentation/transponder/ident||BOOL||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1503||instrumentation/transponder/inputs/mode||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1504||instrumentation/transponder/ground-bit||BOOL||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||1505||instrumentation/transponder/airspeed-kt||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10001||sim/multiplay/transmission-freq-hz||STRING||TT_NOSEND||V1_1_2_PROP_ID||<br />
|-<br />
||10002||sim/multiplay/chat||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10100||sim/multiplay/generic/string[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10101||sim/multiplay/generic/string[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10102||sim/multiplay/generic/string[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10103||sim/multiplay/generic/string[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10104||sim/multiplay/generic/string[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10105||sim/multiplay/generic/string[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10106||sim/multiplay/generic/string[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10107||sim/multiplay/generic/string[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10108||sim/multiplay/generic/string[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10109||sim/multiplay/generic/string[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10110||sim/multiplay/generic/string[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10111||sim/multiplay/generic/string[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10112||sim/multiplay/generic/string[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10113||sim/multiplay/generic/string[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10114||sim/multiplay/generic/string[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10115||sim/multiplay/generic/string[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10116||sim/multiplay/generic/string[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10117||sim/multiplay/generic/string[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10118||sim/multiplay/generic/string[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10119||sim/multiplay/generic/string[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10200||sim/multiplay/generic/float[0]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10201||sim/multiplay/generic/float[1]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10202||sim/multiplay/generic/float[2]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10203||sim/multiplay/generic/float[3]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10204||sim/multiplay/generic/float[4]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10205||sim/multiplay/generic/float[5]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10206||sim/multiplay/generic/float[6]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10207||sim/multiplay/generic/float[7]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10208||sim/multiplay/generic/float[8]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10209||sim/multiplay/generic/float[9]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10210||sim/multiplay/generic/float[10]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10211||sim/multiplay/generic/float[11]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10212||sim/multiplay/generic/float[12]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10213||sim/multiplay/generic/float[13]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10214||sim/multiplay/generic/float[14]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10215||sim/multiplay/generic/float[15]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10216||sim/multiplay/generic/float[16]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10217||sim/multiplay/generic/float[17]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10218||sim/multiplay/generic/float[18]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10219||sim/multiplay/generic/float[19]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10220||sim/multiplay/generic/float[20]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10221||sim/multiplay/generic/float[21]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10222||sim/multiplay/generic/float[22]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10223||sim/multiplay/generic/float[23]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10224||sim/multiplay/generic/float[24]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10225||sim/multiplay/generic/float[25]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10226||sim/multiplay/generic/float[26]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10227||sim/multiplay/generic/float[27]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10228||sim/multiplay/generic/float[28]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10229||sim/multiplay/generic/float[29]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10230||sim/multiplay/generic/float[30]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10231||sim/multiplay/generic/float[31]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10232||sim/multiplay/generic/float[32]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10233||sim/multiplay/generic/float[33]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10234||sim/multiplay/generic/float[34]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10235||sim/multiplay/generic/float[35]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10236||sim/multiplay/generic/float[36]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10237||sim/multiplay/generic/float[37]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10238||sim/multiplay/generic/float[38]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10239||sim/multiplay/generic/float[39]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10300||sim/multiplay/generic/int[0]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10301||sim/multiplay/generic/int[1]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10302||sim/multiplay/generic/int[2]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10303||sim/multiplay/generic/int[3]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10304||sim/multiplay/generic/int[4]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10305||sim/multiplay/generic/int[5]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10306||sim/multiplay/generic/int[6]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10307||sim/multiplay/generic/int[7]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10308||sim/multiplay/generic/int[8]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10309||sim/multiplay/generic/int[9]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10310||sim/multiplay/generic/int[10]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10311||sim/multiplay/generic/int[11]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10312||sim/multiplay/generic/int[12]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10313||sim/multiplay/generic/int[13]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10314||sim/multiplay/generic/int[14]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10315||sim/multiplay/generic/int[15]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10316||sim/multiplay/generic/int[16]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10317||sim/multiplay/generic/int[17]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10318||sim/multiplay/generic/int[18]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10319||sim/multiplay/generic/int[19]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10500||sim/multiplay/generic/short[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10501||sim/multiplay/generic/short[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10502||sim/multiplay/generic/short[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10503||sim/multiplay/generic/short[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10504||sim/multiplay/generic/short[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10505||sim/multiplay/generic/short[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10506||sim/multiplay/generic/short[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10507||sim/multiplay/generic/short[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10508||sim/multiplay/generic/short[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10509||sim/multiplay/generic/short[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10510||sim/multiplay/generic/short[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10511||sim/multiplay/generic/short[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10512||sim/multiplay/generic/short[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10513||sim/multiplay/generic/short[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10514||sim/multiplay/generic/short[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10515||sim/multiplay/generic/short[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10516||sim/multiplay/generic/short[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10517||sim/multiplay/generic/short[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10518||sim/multiplay/generic/short[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10519||sim/multiplay/generic/short[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10520||sim/multiplay/generic/short[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10521||sim/multiplay/generic/short[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10522||sim/multiplay/generic/short[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10523||sim/multiplay/generic/short[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10524||sim/multiplay/generic/short[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10525||sim/multiplay/generic/short[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10526||sim/multiplay/generic/short[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10527||sim/multiplay/generic/short[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10528||sim/multiplay/generic/short[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10529||sim/multiplay/generic/short[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10530||sim/multiplay/generic/short[30]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10531||sim/multiplay/generic/short[31]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10532||sim/multiplay/generic/short[32]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10533||sim/multiplay/generic/short[33]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10534||sim/multiplay/generic/short[34]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10535||sim/multiplay/generic/short[35]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10536||sim/multiplay/generic/short[36]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10537||sim/multiplay/generic/short[37]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10538||sim/multiplay/generic/short[38]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10539||sim/multiplay/generic/short[39]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10540||sim/multiplay/generic/short[40]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10541||sim/multiplay/generic/short[41]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10542||sim/multiplay/generic/short[42]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10543||sim/multiplay/generic/short[43]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10544||sim/multiplay/generic/short[44]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10545||sim/multiplay/generic/short[45]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10546||sim/multiplay/generic/short[46]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10547||sim/multiplay/generic/short[47]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10548||sim/multiplay/generic/short[48]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10549||sim/multiplay/generic/short[49]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10550||sim/multiplay/generic/short[50]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10551||sim/multiplay/generic/short[51]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10552||sim/multiplay/generic/short[52]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10553||sim/multiplay/generic/short[53]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10554||sim/multiplay/generic/short[54]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10555||sim/multiplay/generic/short[55]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10556||sim/multiplay/generic/short[56]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10557||sim/multiplay/generic/short[57]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10558||sim/multiplay/generic/short[58]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10559||sim/multiplay/generic/short[59]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10560||sim/multiplay/generic/short[60]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10561||sim/multiplay/generic/short[61]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10562||sim/multiplay/generic/short[62]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10563||sim/multiplay/generic/short[63]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10564||sim/multiplay/generic/short[64]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10565||sim/multiplay/generic/short[65]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10566||sim/multiplay/generic/short[66]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10567||sim/multiplay/generic/short[67]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10568||sim/multiplay/generic/short[68]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10569||sim/multiplay/generic/short[69]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10570||sim/multiplay/generic/short[70]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10571||sim/multiplay/generic/short[71]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10572||sim/multiplay/generic/short[72]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10573||sim/multiplay/generic/short[73]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10574||sim/multiplay/generic/short[74]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10575||sim/multiplay/generic/short[75]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10576||sim/multiplay/generic/short[76]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10577||sim/multiplay/generic/short[77]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10578||sim/multiplay/generic/short[78]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10579||sim/multiplay/generic/short[79]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11051||sim/multiplay/generic/bool[91]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11091||sim/multiplay/generic/bool[92]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM||V1_1_2_PROP_ID||<br />
|}<br />
<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
* [[Real Time manual]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Howto:Transmit_properties_over_MP&diff=135763Howto:Transmit properties over MP2022-11-01T13:35:34Z<p>Richard H: expanded to cover new (2017.1) properties.</p>
<hr />
<div>{{stub}}<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit! Your idea of sending properties in a round-robin fashion is good IMHO but good MP debugging tools are necessary for aircraft developers.<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
This wiki article will teach you '''how to transmit properties over a network'''.<br />
<br />
Certain [[Property Tree|properties]] (eg. rudder deflection, flaps setting and gear position) are transmitted by default over the [[Howto: Multiplayer|multiplayer network]]. However there are still lots of (mostly [[aircraft]] specific) properties that are not. Due to this limitation, certain animations (eg. opening of a door or landing lights) won't be visible for a pilot's virtual-colleagues. <br />
<br />
The number of properties that can be sent over MP is limited. If you have properties that do not need to be sent frequently (e.g. only when a certain event happens) these can be sent more efficiently using mp_broadcast.nas in $FG_ROOT/Nasal, please see [[Howto:Using mp_broadcast.nas]], or using the time-sharing (TDM) or bit-packed components (SwitchEncoder/Decoder) for booleans in Aircraft/Generic/DualControl/dual-control-tools.nas.<br />
<br />
The method described here will send the properties in question in every multiplayer packet. This is appropriate for parts that need continuous animation but wasteful for many other uses. On the other hand, the method described here is easy to use so if you only have a small number of properties to share it may still be preferable.<br />
<br />
== -set.xml ==<br />
<syntaxhighlight lang="xml"><br />
<multiplay><br />
<generic><br />
<bool n="0" alias="/controls/lighting/landing-light-l"/><br />
<bool n="1" alias="/controls/lighting/landing-light-r"/><br />
<int n="0" alias="/consumables/fuel/total-fuel-lbs"/><br />
<float n="0" alias="/controls/flight/flaps"/><br />
<short n="0" alias="/instrumentation/airspeed-indicator/indicated-speed-kt" /><br />
<string n="0" alias="/sim/model/livery/texture"/><br />
</generic><br />
</multiplay><br />
</syntaxhighlight><br />
<br />
There are three types of properties that could be used:<br />
* '''bool[0..90]:''' on/off, true false<br />
* '''float[0..39]:''' decimal numbers (0.12, 5.01 ...).<br />
* '''int[0..19]:''' whole/natural numbers (... -1, 0, 1, 2 ...), range +/- 2,147,483,647<br />
* '''short[0..79]:''' whole/natural numbers (... -1, 0, 1, 2 ...), range +/- 32767<br />
*'''string[0..19]:''' alphanumeric values (PH-TST, EH01 ...).<br />
'''Notes:''' <br />
<br />
# Each type is separately numbered; you can have an int n="0" beside a float n="0"<br />
# Always use bools to represent on/off values. These are the most efficient with all 90 bools taking only 24bytes of MP packet.<br />
# Prefer to use shorts instead of ints and floats because they use half the space (4bytes) of an int or float (8bytes)<br />
# Avoid using strings wherever possible as a string will take 4bytes + length of string.<br />
<br />
The value behind alias= is the (local) path to the property that has to be transmitted. Make sure that the local property has the same type as the generic MP enabled one (note that bools are automatically converted to integers so you can map an MP enabled int to a local bool). It is important to remember to not explicitly define the property type in an alias property.<br />
<br />
== In the 3d model XML file ==<br />
<br />
If the MP enabled properties are to be used in animations it is preferable to create aliases for them on the remote systems so that the animations can be written using the logical properties rather than the "sim/multiplay/generic/..." ones. The example below creates the "fdm/jsbsim/propulsion/engine[x]/pitch-angle-rad" properties in the AI/MP aircraft property subtree as aliases for the MP properties. In that way the relevant animations can use the more meaningful property name "fdm/jsbsim/propulsion/engine[x]/pitch-angle-rad" instead of "sim/multiplay/generic/float[x]".<br />
<br />
'''NOTE:''' it is nicer to other players to avoid having any timers inside the model XML as this can have a performance impact when there are a lot of MP aircraft.<br />
<syntaxhighlight lang="xml"><br />
<nasal><br />
<load><br />
##############################################################################<br />
# The on-load Nasal is not executed when this file is loaded as the user<br />
# aircraft.<br />
##############################################################################<br />
var rplayer = cmdarg();<br />
# Set up property aliases for animations.<br />
rplayer.getNode("fdm/jsbsim/propulsion/engine[0]/pitch-angle-rad", 1).<br />
alias(rplayer.getNode("sim/multiplay/generic/float[0]"));<br />
rplayer.getNode("fdm/jsbsim/propulsion/engine[1]/pitch-angle-rad", 1).<br />
alias(rplayer.getNode("sim/multiplay/generic/float[1]"));<br />
rplayer.getNode("fdm/jsbsim/propulsion/engine[2]/pitch-angle-rad", 1).<br />
alias(rplayer.getNode("sim/multiplay/generic/float[2]"));<br />
##############################################################################<br />
</load><br />
</nasal><br />
</syntaxhighlight><br />
<br />
Alternatively this can be done without using nasal. Again in the model xml file:<br />
<syntaxhighlight lang="xml+myghty"><br />
<params><br />
<lighting><br />
<landing-light-l><br />
<property>sim/multiplay/generic/bool[0]</property><br />
</landing-light-l><br />
</lighting><br />
</params><br />
</syntaxhighlight><br />
<br />
Then in the animation use:<br />
<br />
<property alias="../../params/lighting/landing-light-l/property"/><br />
<br />
== Related content ==<br />
* [[Aircraft-set.xml]]<br />
* [[Aircraft properties reference]]<br />
* [[Multiplayer protocol]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
* [[Livery_over_MP]]<br />
<br />
[[Category:Aircraft enhancement]]<br />
[[Category:Nasal howto]]<br />
[[Category:Multiplayer]]<br />
[[Category:Property Tree]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=134906Nasal optimisation2022-04-04T20:06:19Z<p>Richard H: /* Emesary real time executive */</p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each [[Nasal]] frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== Nasal Profiling ==<br />
<br />
As yet there isn't a profiler available so instead there is an OperationTimer that is ships as part of emexec (2020.3 or later released after Aprial 2022).<br />
<br />
This makes it easy to output (via logprint) information about how much time a module is taking. <br />
<br />
To create an instance of a timer there are two parameters, the first is the ident and the second the log level (3=info, 2=debug)<br />
<code>var ot = emexec.OperationTimer.new("VSD",2);</code><br />
The output is a cumulative number of milliseconds since the OperationTimer was reset.<br />
<code>ot.reset();<br />
ot.log("Start");<br />
<some code to time><br />
ot.log("1");<br />
<more code><br />
ot.log("ed");</code><br />
<br />
== Emesary real time executive ==<br />
<br />
Starting from 2020.3 released after April 2022 FGdata includes the emexec module which provides an easy to use object scheduler that uses Emesary to do most of the work. <br />
<br />
By default it is recommended to use the built in scheduler <code>emexec.ExecModule</code><br />
<br />
The scheduler will adjust the frequency from 50hz right down to 4hz. <br />
<br />
Any object that wishes to be invoked simply needs to provide an <code>update(notification)</code> method and register itself via ExecModule.register method.<br />
<br />
The register method takes the following arguments<br />
<br />
# ident - text to identify this object registration<br />
# properties_to_monitor : a key value pair hash of properties to include in the notification. This helps to optimise property tree access (see FrameNotification below for the format)<br />
# object : an instance of an objec that has an update(notification) method<br />
# rate : frame skip rate (1/rate is the effective rate)<br />
# frame_offset : frame skip offset. Must be less than rate and when used with rate it can allow interleaving of modules (usually for performance)<br />
<br />
During development it would be usual to set the overrun detection active emexec.ExecModule.transmitter.OverrunDetection(9) for a warning (log leve info) of any frame that exceeds 9 ms<br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
<syntaxhighlight lang="nasal"><br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
</syntaxhighlight><br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
process individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=134784User talk:Richard H2022-03-13T21:13:30Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make Emesary C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-15 Emesary changes - mainly just liveries.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{done}} F-15 MP Emesary (OPRF) (Thanks to Nikolai)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have <br />
# {{abandoned}} Fix Nasal threaded GC (removed for now)<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=134783User talk:Richard H2022-03-13T21:12:53Z<p>Richard H: /* Core */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make Emesary C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-15 Emesary changes - mainly just liveries.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have <br />
# {{abandoned}} Fix Nasal threaded GC (removed for now)<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Force_feedback&diff=133564Force feedback2021-10-18T09:23:39Z<p>Richard H: Revised to reflect current status</p>
<hr />
<div>Development of '''force feedback''' (also called haptic) support for [[FlightGear]] started in 2009 with the SourceForge project [https://sourceforge.net/projects/hapticsforfg/ Haptics for FlightGear] however all of the modules should be considered as probably best suited to being a development project.<br />
<br />
The lack of commercially available (and affordable) force feedback devices has hampered development somewhat.<br />
<br />
==Overview==<br />
The SDL library provides a generic interface to haptic devices. Generally there are a number of different things that can be provided as feedback via the input device; however for flight simulation it is really only the control loading and vibration (rumble) to simulate buffet. There is a lot of difference between aircraft types as to what is relevant for the different types of feedback. <br />
<br />
* Light aircraft almost always have a direct connection between the controls and the surfaces, usually using wires or rods; sometimes the control surfaces are balanced. These type of controls usually have increasing amount of force required as airspeed increases. <br />
* Certain (usually older) transport aircraft (e.g. DC3) also have direct linkages between the controls and the surfaces; and almost always have balanced controls or a mechanical advantage because otherwise the forces required at higher airspeeds would make control movement difficult.<br />
* Modern airliners (pre FBW) tend to have hydraulically assisted controls, and often these are setup to provide a fairly linear response throughout the airspeed range<br />
* Modern airlines (with FBW) and side stick (typically AirBus) will still have a feedback to the side stick but typically this is to provide the feel that the pilot expects and is fairly linear. Modern airlines with central controls and FBW (Boeing) tend to also be more linear but with more feel than side stick.<br />
* Old fighter aircraft (WWII, first generation jets) will either have direct connection between controls and surfaces or a degree of hydraulic assistance. The feedback is generally more linear but can be progressively stronger with airspeed or deflection angle.<br />
* Some modern fighter aircraft (without FBW) with hydraulic assistance will have a linear feedback (e.g. F-15)<br />
* FBW fighters (generally sidestick) often have very little feedback at the controls<br />
<br />
The only general simulation we can provide is often something that feels right rather than the accurate simulation by aircraft type, e.g. progressively more difficult based on surface loading or vibration/rumble at higher angles of attack. <br />
<br />
==Code==<br />
Current [https://github.com/viktorradnai/fg-haptic git hub development repository] was last updated in 2016 by Viktor Radnai and is a fork of the original development respository was {{gitorious source|proj=fg-haptic|repo=fg-haptic|text=FG-Haptic on Gitorious}} and was tested only on Linux, as the author (Zan) has no build environment on Windows. No built modules yet available. Only source code and nasal/xml scripts. Requires SDL 2.0 to function (might also work with 1.3 or later, but is tested with 2.0).<br />
<br />
There is an alternative project that currently is implemented in the core for yasim only and as a set of revised python scripts for JSBSim . This can be found here [[sourceforge:projects/hapticsforfg/|hapticsforfg]] (SourceForge).<br />
<br />
==FG Haptics installation and how to use==<br />
===Building===<br />
# You need to have SDL 2.0 development libraries installed<br />
# Edit Makefile for the library paths if necessary<br />
# Type '''make''' and it should build<br />
# Done<br />
<br />
===Installation===<br />
# Copy '''ff-protocol.xml''' to '''Protocols/''' in FG data directory.<br />
# Copy '''force-feedback.nas''' to '''Nasal/''' in FG data directory.<br />
# Copy '''force-feedback.xml''' to '''gui/dialogs/''' in FG data directory.<br />
<br />
===Using===<br />
# Run '''fg-haptic''' or '''fg-haptic.exe'''<br />
# Launch flightgear with following command line: '''fgfs --telnet=5401 --generic=socket,out,20,localhost,5402,tcp,ff-protocol'''<br />
# If menu bar is not visible, press '''F10'''<br />
# In flightgear's '''Help->Force feedback options''' you can configure force settings<br />
# Enjoy<br />
<br />
==Features==<br />
[[File:Fgfs-haptic-settings.png|thumb|270px|The options dialog.]]<br />
===General features===<br />
* In-sim options dialog<br />
* Support for multiple devices simultaneously<br />
* Devices do not need to be the same ones that are used as inputs<br />
* Devices can have different effects applied on them<br />
* Add-on, can be installed on older FlightGear versions too<br />
<br />
===Effects===<br />
* Stick shaker when about to stall<br />
* Stick pusher<br />
* Control surface forces ([[JSBSim]] support, no [[YASim]] or others yet, but to be done)<br />
* Pilot G forces<br />
<br />
==Technical details==<br />
===System description===<br />
Fg-haptic uses two communication methods with FG; telnet and general protocol. Telnet is used to send force-feedback device info to FG during intialisation, and later on it is used to fetch device configuration. General protocol is used to send force details from FG (one way communication). Telnet is quite slow, update of device configuration may take up to 10 seconds, while general protocol sends data currently 20 times per second.<br />
<br />
All properties used by fg-haptic currently reside under '''/haptic/'''. All effects are directly under that (like '''stick-force/''') and each device is below '''/haptic/device[X]/''', showing device info and configuration. <br />
<br />
Generic protocol, '''ff-protocol''', uses following format:<br />
<nowiki>reconfigure_request|aileron|elevator|rudder|pilot_x|pilot_y|pilot_z|stick_shaker_trigger|ground_rumble_period</nowiki><br />
<br />
===Force calculations===<br />
Stick forces are based on the following equation, which represents force caused by air flowing towards a surface:<br /><br />
'''F=0.5*airspeed^2*density*area*Cd''', where Cd is drag coefficient and area is perpendicular to airflow.<br />
<br />
Since the surfaces can turn, the effective area is:<br /><br />
'''effective_area=area*sin(angle)''', where angle is the deflection angle, and it should take angle of attack into account:<br /><br />
'''angle=deflection_angle-AoA''', since that is the real direction of air flow with relation to the surface. For rudder, we use slip angle instead of AoA.<br />
<br />
Also slip may be taken into account, if the air flows from side, it has less effect on the surface, thus giving:<br /><br />
'''effective_area_2=effective_area*(1-sin(slip_angle))'''.<br />
<br />
Another thing we take into account is stall and deep stall. If AoA is over the stall limit, or over deep stall limit, forces acting on elevator and aileron are quickly ramped to zero, representing separated airflow.<br />
<br />
In this implementation, multiplication by 0.5, Cd and area are combined to a single coefficient for aileron, elevator and rudder, that are aircraft specific. Coefficients should be set so that the force does not exceed 1.0 (maximum value) in normal operation, and they can also be set to 0 or other value to represent fly-by-wire systems. Also slip coefficients can be defined to fine tune the stick feeling. A good starting value to try for each coefficient is:<br /><br />
'''coeff=1.0/((Vne^2)*sin(max_deflection)*0.00257)''', where Vne is the maximum (never exceed) speed in knots, max deflection is the maximum deflection of the control surface and 0.00257 is standard air density (slugs/ft3). This value can then be fine tuned.<br />
<br />
<br />
===Force feedback===<br />
TBD<br />
<br />
== External links ==<br />
* {{gitorious source|proj=fg-haptic|repo=fg-haptic|text=Official FG-Haptic repository}} (Gitorious)<br />
* [https://github.com/viktorradnai/fg-haptic git hub development repository]<br />
* [http://sourceforge.net/projects/hapticsforfg/ hapticsforfg] (SourceForge)<br />
<br />
[[Category:Hardware]]<br />
[[Category:Joysticks and Yokes]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=132288User talk:Richard H2021-06-11T07:39:26Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make Emesary C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-15 Emesary changes - mainly just liveries.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Post_FlightGear_2020.2_LTS_changes&diff=131653Post FlightGear 2020.2 LTS changes2021-05-09T12:40:05Z<p>Richard H: /* Carriers and AI */</p>
<hr />
<div>== Current status ==<br />
{{Mergeto|Building using CMake}}<br />
<br />
'''06/2020''':<br />
<br />
James has pushed some configuration changes to next (SG+FG) to raise various required versions of things.<br />
<br />
If you’re developing on ‘something fairly recent’, you shouldn’t see any difference except it would be a wise time to wipe your build dirs and re-CMake from clean. If you’re on a ‘somewhat older’ Linux, the baselines being Ubuntu 18.04 (their previous LTS) and CentOS 7 (which our Jenkins runs), you should also be fine except for GCC, where you will need a version supporting C++14: in practice this means GCC 5.x or higher. (Or use Clang…) For both of these distros there are officially supported ways to get newer GCCs (we’re actually using GCC 9 on Jenkins now..), so I don’t expect this to be a problem.<br />
<br />
As part of this we now require CMake 3.10<ref>https://sourceforge.net/p/flightgear/mailman/message/37094732/</ref>, Qt 5.9 and OSG 3.4.1, and James started removing various legacy pieces from next around this. There are plenty more cleanups that can be done based on this : especially on the CMake and C++ sides. Things like Boost -> Std stuff, Cmake targets-as-objects support (eg, target_compile_features can be used now).<br />
<br />
Windows and macOS should be unaffected BTW - because on those platforms you're always running something you downloaded which is fairly up to date. If you choose to go and download an ancient version of CMake or Qt, on either platform that’s your problem to fix - but you’ll get a configuration error at least.<br />
<br />
The idea of doing this /now/ is that the build deps won’t change again during the next two years, barring any surprises.<br />
<br />
None of this affects the release branches of course: they continue to work with OSG 3.2, GCC 4.x, Qt 5.4 and CMake 3.0. And you shouldn’t see any behavioural changes because of this either.<br />
<br />
Let’s see if reality corresponds to all the theory above :)<ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
<br />
'''08/2020''':<br />
James pushed a large overhaul of the Cmake build files for FlightGear:<br />
<br />
* we now use modern Cmake style nearly everywhere, i.e targets-as-objects for an OOP-style build system<br />
* transitive dependencies are handled automatically (or at least, that’s the idea…), which simplifies things in many places (eg, audio library handling)<br />
* system vs built-in dependencies is handled vis ALIAS targets, so most other code doesn’t care. We link to a target which is an alias for either our built-in version or the system one (via an IMPORTED target)<br />
* we should have better isolation from system headers / versions of things. <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
<br />
== Changes that are already on next ==<br />
{{Mergeto|Changelog 2020.1#Replay_.2F_Flight_Recorder}}<br />
<br />
=== Record/replay ===<br />
<br />
* Include multiplayer aircraft in recordings.<br />
* Continuous recording to file without any loss of detail.<br />
* Periodic generation of a recovery snapshot, allowing resumption after a flightgear crash.<br />
* Record/replay extra information in Continuous recordings (pushed to next on 2021-2-13):<br />
** Main window size<br />
** Main window position<br />
** Main window view<br />
* Continuous replay aircraft override:<br />
** When loading a Continuous recording at startup, we now override the aircraft and starting airport to match what is in the recording.<br />
* Replay of Continuous recordings from URL:<br />
** Extends the '''--load-tape command-line''' option, for example: '''--load-tape=<nowiki>http://foo.com/bar.fgtape</nowiki>'''<br />
<br />
<br />
<br />
See new '''File''' - '''Flight Recorder Control''' dialogue.<br />
<br />
==== Details ====<br />
<br />
* Continuous recording to file is uncompressed to simplify replay; e.g. 100MB for an hour's recording near EDDF.<br />
<br />
* A recovery snapshot is actually a single-frame continuous recording, and will be called '''<aircraft-type>-recovery.fgtape'''. Load in the usual way using the '''Flight Recorder Control''' dialogue or on the command line with '''--load-tape=<aircraft-type>-recovery'''. Then do '''Ctrl-R''' to see replay dialogue and click on '''My Controls'''. Some aircraft may have no or limited support for '''My Controls''' though.<br />
<br />
* "Continuous replay aircraft override" and "Replay from URL" were pushed to next on 2021-2-19.<br />
* Replay of Continuous recordings from URL:<br />
** Downloads to local file in the background while replaying.<br />
** Reuses local file if present, appending to it in the background if it was a partial download.<br />
<br />
== Code clean-ups and changes ==<br />
{{Mergeto|2022.X Release Plan}}<br />
<br />
Collecting what's going to change : this will also be used to work out what manual or automatic migrations are required to keep aircraft working. It's expected that for the first few months of 'next', there will be higher than usual breakage, i.e regular might not be possible.<br />
<br />
As a general guideline, the minimum system to develop / build the code on will be Ubuntu 18.04 LTS (Bionic) : the versions below correspond to what is available in a stock Bionic install.<br />
<br />
# Make C++14 (possibly C++17 to facilitate {{Abbr|VSG|Vulkan Scene Graph}} [[Vulkan Scene Graph|migration]]? <ref>https://sourceforge.net/p/flightgear/mailman/message/37041706/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/37042499/</ref>) the minimum required version (will make it easier to continue [[Deboosting FlightGear|replacing Boost]] items with std:: ones) <ref>https://sourceforge.net/p/flightgear/mailman/message/36988831/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/36984349/</ref><br />
# Make CMake 3.6 the minimum required version: this will allow simplifying a bunch of compatibility logic in the build files <ref>https://sourceforge.net/p/flightgear/mailman/message/37020794/</ref> {{Progressbar|70}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
## Blocked by: [[OSGText Issues]]<br />
# Use CMake OBJECT_LIBRARY to improve how we collect sources together when building each sub-dir {{Progressbar|10}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37042800/</ref><br />
# Make Qt 5.9 the minimum for the launcher {{Done}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
# Drop 32-bit windows support <ref>https://sourceforge.net/p/flightgear/mailman/message/34899704/</ref><br />
# Drop the pre-2017.x MultiPlayer message format - this will fix warnings from some aircraft about MP packet overflows <ref>https://sourceforge.net/p/flightgear/mailman/message/36300829/</ref><br />
# Drop the KLN-89 code, since it's unused and not maintained for a long time: Canvas and the regular GPS code can easily implement a working KLN-89 or similar equipment now <ref>https://sourceforge.net/p/flightgear/mailman/message/36327950/</ref><br />
# Switch to Compositor mode as the only rendering option {{Progressbar|90}} <ref>https://sourceforge.net/p/flightgear/mailman/message/36606242/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37039397/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37040359/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37148477/</ref><br />
# Drop [[Rembrandt]] support from C++ (really part of the above) <ref>https://sourceforge.net/p/flightgear/mailman/message/36340736/</ref><br />
# Drop the C++ [[NavDisplay]]: the Canvas version replaces it <ref>https://sourceforge.net/p/flightgear/mailman/message/36975265/</ref><br />
<br />
== Carriers and AI ==<br />
<br />
Ricbhard has been working on carriers since April 2020; originally the intention was to release as part of the 2020.2 LTS however the changes have grown into a set of new features rather than bugfixes and are therefore more suited to a longer development and review process.<ref>https://sourceforge.net/p/flightgear/mailman/flightgear-devel/thread/aaa9a3ee-ca18-e3af-1538-0cd59ae7a752%40zaretto.com/#msg37038519</ref><br />
<br />
* {{done}} Improved view support - so that the nearest tower will include carriers<br />
* {{done}} Changes to core code to support moving towers.<br />
* {{Progressbar|80}} Multiple (tower) views - permit selection of LSO, PLAT and Tower as part of the "Tower view"; selection mechanism TDB. Consider revisions to the existing view system to better support this.<br />
* {{done}} Extend XML to include definitions for FLOLS touchdown position, LSO view position, Tower View position, deck angle.<br />
* {{Progressbar|80}} Improve 3d models for IFLOLS to ensure that a ball call can be made.<br />
* {{Progressbar|80}} Improve logic for IFLOLS lights; not quite an LSO simulation more of an approximation of the definitive cases (e.g. waveoff)<br />
* {{pending}} Animate the lineup lights on the stern (of Nimitz class).<br />
* {{Progressbar|100}} Improved support for Precision Approach Landing System (PALS) (AN/SPN-46); to support lineup deviation as well as glideslope (ball) deviation.<br />
* {{Progressbar|70}} Change approach deviations to use new aircraft reference point rather than eyepoint; it is probably more correct to use the eyepoint when in the cockpit view - but for external views this can be slightly inaccurate when outside the aircraft to completely wrong when in tower/LSO view. The reference point is taken as the aircraft position with an optional model defined x,y,z offset. This allows ball tuning on a per aircraft basis.<br />
* {{Pending}} Improved support for AI logic to permit XML definition of e.g. LSO logic. Possibly a version of the autopilot / state machine that can be included as "logic blocks"<br />
* {{Pending}} Review 3d model usage for all Nimitz class and either add LOD selection (low, medium, high)<br />
* {{Pending}} Review and include Marsdolphin contributions for MP Carrier (i.e. MP trumman)<br />
*{{Progressbar|20}} Possible extra visual aids for Case 1 and Case 2 recovery training (e.g. a set of markers to fly through)<br />
* {{Pending}} Better integration of carriers with JSBSim to permit catapult hookup<br />
* {{Pending}} Simulate carrier operations Flight Deck Personnel, e.g. yellow shirts.<br />
* {{Pending}} Animation of arrestor wires<br />
* {{Pending}} Add some sort of trap grading (approach/touchdown plot)<br />
<br />
see https://www.cnatra.navy.mil/local/docs/pat-pubs/P-816.pdf for T-45 carrier operations<br />
<br />
== Possible additional items ==<br />
{{Main article|2022.X Release Plan}}<br />
<br />
=== osgText ===<br />
{{Main article|OSGText Issues}}<br />
<br />
===2D Panels ===<br />
The idea is to remove all 'raw' OpenGL or OpenSceneGraph code from the panel code, it should be 100% done with Canvas elements. Eg use the Canvas Transform to compute the matrices<ref>https://sourceforge.net/p/flightgear/flightgear/merge-requests/217/#a8d5</ref><br />
* [[Canvas_News#2D_Panels|Remove the 2D panel code in favour of Canvas]] (this requires completing some work to load 2D panel elements as Canvas, from XML) <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref> (as of 06/2020, Gaétan Allaert is still working on the replacement of the 2D panel by canvas <ref>https://sourceforge.net/p/flightgear/mailman/message/37042351/</ref>) {{Progressbar|80}}<ref>https://sourceforge.net/u/gallaert/flightgear/ci/789f5bdbce10637222ffa25206938947fec4bc64/</ref><br />
<br />
=== Canvas ===<br />
{{See also|Unifying the 2D rendering backend via canvas}}<br />
* Note that the canvas currently assumes render-to-texture, but for the GUI I'm not sure that's actually desirable - simply a separate camera per GUI window may be sufficient. Since the camera already arranges everything beneath the RTT camera this should be fairly minor change, if it's desirable.(Saves some memory, makes re-sizing GUI windows a little easier, might make clipping or other state management less efficient in the main GUI camera ... but probably not)<ref>https://sourceforge.net/p/flightgear/mailman/message/29608899/</ref><br />
* Remove the C++ HUD in favour of Canvas-based version: this requires some kind of migration script or framework, so we have at least the default UFO HUD available <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref><br />
* Review Tim's original suggestion<ref>https://sourceforge.net/p/flightgear/mailman/message/36659646/</ref>: Another [Canvas] optimization is to use a pre-render camera that isn't in the scene graph to do the Canvas rendering. '''Otherwise the Canvas textures are rendered at least twice, in the near and far cameras'''. <ref>https://sourceforge.net/p/flightgear/mailman/message/36352621/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37042457/</ref> Tim Moore’s canvas-rendering-on-a-pre-camera fix, again should give us a nice perf win for Canvas-intensive acft<ref>https://sourceforge.net/p/flightgear/mailman/message/36355833/</ref>, since within each camera pass (far camera, near camera), all the passes of a technique are run.<ref>https://sourceforge.net/p/flightgear/mailman/message/29563353/</ref> Also, Mathias stated once: that it would be good to be able to specify a completely different scenegraph in some subcameras, i.e. for having panel like instruments on an additional screen/display for example.<ref>https://sourceforge.net/p/flightgear/mailman/message/19718354/</ref><br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Canvas/FGCanvasSystemAdapter.cxx#l70<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_compositor.cxx#l927 (compositor renderer)<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_legacy.cxx#l1842 (legacy renderer)<br />
* <del>As per James' comments: Investigate adapting the [[Canvas Popout Windows|WindowBuilder to allow OSG windows to be created dynamically]] for features like Stuart's [[FG1000]] to be shown in a separate window (canvas placement)</del> <ref>https://sourceforge.net/p/flightgear/mailman/message/37058207/</ref> (this is basically now possible thanks to Jules' CompositeViewer work)<br />
* Review/integrate experimental C++ patches for new Canvas elements floating around on the forum, namely:<br />
** [[Canvas View Camera Element#Proof of Concept|view manager support]]<br />
** [[Howto:Extending Canvas to support rendering 3D models|3d model support]]<br />
<br />
== fgdata clean-ups ==<br />
=== /Nasal ===<br />
2do: list outdated / deprecated functions for removal (I remember one comment saying: remove after FG 3.0 or something)<br />
* Clean up the GPS code with respect to FG_210_COMPAT :<br />
<br />
== Property tree clean-up ==<br />
remove /yasim/* "new" path is /fdm/yasim (since version 201x.?)<br />
<br />
== References ==<br />
{{Appendix}}<br />
<br />
[[Category:Core development]]<br />
<br />
[[Category:Release plans]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Post_FlightGear_2020.2_LTS_changes&diff=131410Post FlightGear 2020.2 LTS changes2021-04-27T05:50:24Z<p>Richard H: /* Carriers and AI */</p>
<hr />
<div>== Current status ==<br />
{{Mergeto|Building using CMake}}<br />
<br />
'''06/2020''':<br />
<br />
James has pushed some configuration changes to next (SG+FG) to raise various required versions of things.<br />
<br />
If you’re developing on ‘something fairly recent’, you shouldn’t see any difference except it would be a wise time to wipe your build dirs and re-CMake from clean. If you’re on a ‘somewhat older’ Linux, the baselines being Ubuntu 18.04 (their previous LTS) and CentOS 7 (which our Jenkins runs), you should also be fine except for GCC, where you will need a version supporting C++14: in practice this means GCC 5.x or higher. (Or use Clang…) For both of these distros there are officially supported ways to get newer GCCs (we’re actually using GCC 9 on Jenkins now..), so I don’t expect this to be a problem.<br />
<br />
As part of this we now require CMake 3.10<ref>https://sourceforge.net/p/flightgear/mailman/message/37094732/</ref>, Qt 5.9 and OSG 3.4.1, and James started removing various legacy pieces from next around this. There are plenty more cleanups that can be done based on this : especially on the CMake and C++ sides. Things like Boost -> Std stuff, Cmake targets-as-objects support (eg, target_compile_features can be used now).<br />
<br />
Windows and macOS should be unaffected BTW - because on those platforms you're always running something you downloaded which is fairly up to date. If you choose to go and download an ancient version of CMake or Qt, on either platform that’s your problem to fix - but you’ll get a configuration error at least.<br />
<br />
The idea of doing this /now/ is that the build deps won’t change again during the next two years, barring any surprises.<br />
<br />
None of this affects the release branches of course: they continue to work with OSG 3.2, GCC 4.x, Qt 5.4 and CMake 3.0. And you shouldn’t see any behavioural changes because of this either.<br />
<br />
Let’s see if reality corresponds to all the theory above :)<ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
<br />
'''08/2020''':<br />
James pushed a large overhaul of the Cmake build files for FlightGear:<br />
<br />
* we now use modern Cmake style nearly everywhere, i.e targets-as-objects for an OOP-style build system<br />
* transitive dependencies are handled automatically (or at least, that’s the idea…), which simplifies things in many places (eg, audio library handling)<br />
* system vs built-in dependencies is handled vis ALIAS targets, so most other code doesn’t care. We link to a target which is an alias for either our built-in version or the system one (via an IMPORTED target)<br />
* we should have better isolation from system headers / versions of things. <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
<br />
== Changes that are already on next ==<br />
{{Mergeto|Changelog 2020.1#Replay_.2F_Flight_Recorder}}<br />
<br />
=== Record/replay ===<br />
<br />
* Include multiplayer aircraft in recordings.<br />
* Continuous recording to file without any loss of detail.<br />
* Periodic generation of a recovery snapshot, allowing resumption after a flightgear crash.<br />
* Record/replay extra information in Continuous recordings (pushed to next on 2021-2-13):<br />
** Main window size<br />
** Main window position<br />
** Main window view<br />
* Continuous replay aircraft override:<br />
** When loading a Continuous recording at startup, we now override the aircraft and starting airport to match what is in the recording.<br />
* Replay of Continuous recordings from URL:<br />
** Extends the '''--load-tape command-line''' option, for example: '''--load-tape=<nowiki>http://foo.com/bar.fgtape</nowiki>'''<br />
<br />
<br />
<br />
See new '''File''' - '''Flight Recorder Control''' dialogue.<br />
<br />
==== Details ====<br />
<br />
* Continuous recording to file is uncompressed to simplify replay; e.g. 100MB for an hour's recording near EDDF.<br />
<br />
* A recovery snapshot is actually a single-frame continuous recording, and will be called '''<aircraft-type>-recovery.fgtape'''. Load in the usual way using the '''Flight Recorder Control''' dialogue or on the command line with '''--load-tape=<aircraft-type>-recovery'''. Then do '''Ctrl-R''' to see replay dialogue and click on '''My Controls'''. Some aircraft may have no or limited support for '''My Controls''' though.<br />
<br />
* "Continuous replay aircraft override" and "Replay from URL" were pushed to next on 2021-2-19.<br />
* Replay of Continuous recordings from URL:<br />
** Downloads to local file in the background while replaying.<br />
** Reuses local file if present, appending to it in the background if it was a partial download.<br />
<br />
== Code clean-ups and changes ==<br />
{{Mergeto|2022.X Release Plan}}<br />
<br />
Collecting what's going to change : this will also be used to work out what manual or automatic migrations are required to keep aircraft working. It's expected that for the first few months of 'next', there will be higher than usual breakage, i.e regular might not be possible.<br />
<br />
As a general guideline, the minimum system to develop / build the code on will be Ubuntu 18.04 LTS (Bionic) : the versions below correspond to what is available in a stock Bionic install.<br />
<br />
# Make C++14 (possibly C++17 to facilitate {{Abbr|VSG|Vulkan Scene Graph}} [[Vulkan Scene Graph|migration]]? <ref>https://sourceforge.net/p/flightgear/mailman/message/37041706/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/37042499/</ref>) the minimum required version (will make it easier to continue [[Deboosting FlightGear|replacing Boost]] items with std:: ones) <ref>https://sourceforge.net/p/flightgear/mailman/message/36988831/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/36984349/</ref><br />
# Make CMake 3.6 the minimum required version: this will allow simplifying a bunch of compatibility logic in the build files <ref>https://sourceforge.net/p/flightgear/mailman/message/37020794/</ref> {{Progressbar|70}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
## Blocked by: [[OSGText Issues]]<br />
# Use CMake OBJECT_LIBRARY to improve how we collect sources together when building each sub-dir {{Progressbar|10}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37042800/</ref><br />
# Make Qt 5.9 the minimum for the launcher {{Done}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
# Drop 32-bit windows support <ref>https://sourceforge.net/p/flightgear/mailman/message/34899704/</ref><br />
# Drop the pre-2017.x MultiPlayer message format - this will fix warnings from some aircraft about MP packet overflows <ref>https://sourceforge.net/p/flightgear/mailman/message/36300829/</ref><br />
# Drop the KLN-89 code, since it's unused and not maintained for a long time: Canvas and the regular GPS code can easily implement a working KLN-89 or similar equipment now <ref>https://sourceforge.net/p/flightgear/mailman/message/36327950/</ref><br />
# Switch to Compositor mode as the only rendering option {{Progressbar|90}} <ref>https://sourceforge.net/p/flightgear/mailman/message/36606242/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37039397/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37040359/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37148477/</ref><br />
# Drop [[Rembrandt]] support from C++ (really part of the above) <ref>https://sourceforge.net/p/flightgear/mailman/message/36340736/</ref><br />
# Drop the C++ [[NavDisplay]]: the Canvas version replaces it <ref>https://sourceforge.net/p/flightgear/mailman/message/36975265/</ref><br />
<br />
== Carriers and AI ==<br />
<br />
Ricbhard has been working on carriers since April 2020; originally the intention was to release as part of the 2020.2 LTS however the changes have grown into a set of new features rather than bugfixes and are therefore more suited to a longer development and review process.<ref>https://sourceforge.net/p/flightgear/mailman/flightgear-devel/thread/aaa9a3ee-ca18-e3af-1538-0cd59ae7a752%40zaretto.com/#msg37038519</ref><br />
<br />
* {{done}} Improved view support - so that the nearest tower will include carriers<br />
* {{done}} Changes to core code to support moving towers.<br />
* {{Progressbar|80}} Multiple (tower) views - permit selection of LSO, PLAT and Tower as part of the "Tower view"; selection mechanism TDB. Consider revisions to the existing view system to better support this.<br />
* {{done}} Extend XML to include definitions for FLOLS touchdown position, LSO view position, Tower View position, deck angle.<br />
* {{Progressbar|80}} Improve 3d models for IFLOLS to ensure that a ball call can be made.<br />
* {{Progressbar|80}} Improve logic for IFLOLS lights; not quite an LSO simulation more of an approximation of the definitive cases (e.g. waveoff)<br />
* {{pending}} Animate the lineup lights on the stern (of Nimitz class).<br />
* {{Progressbar|100}} Improved support for Precision Approach Landing System (PALS) (AN/SPN-46); to support lineup deviation as well as glideslope (ball) deviation.<br />
* {{Progressbar|70}} Change approach deviations to use new aircraft reference point rather than eyepoint; it is probably more correct to use the eyepoint when in the cockpit view - but for external views this can be slightly inaccurate when outside the aircraft to completely wrong when in tower/LSO view. The reference point is taken as the aircraft position with an optional model defined x,y,z offset. This allows ball tuning on a per aircraft basis.<br />
* {{Pending}} Improved support for AI logic to permit XML definition of e.g. LSO logic. Possibly a version of the autopilot / state machine that can be included as "logic blocks"<br />
* {{Pending}} Review 3d model usage for all Nimitz class and either add LOD selection (low, medium, high)<br />
*{{Progressbar|20}} Possible extra visual aids for Case 1 and Case 2 recovery training (e.g. a set of markers to fly through)<br />
* {{Pending}} Better integration of carriers with JSBSim to permit catapult hookup<br />
* {{Pending}} Simulate carrier operations Flight Deck Personnel, e.g. yellow shirts.<br />
* {{Pending}} Animation of arrestor wires<br />
* {{Pending}} Add some sort of trap grading (approach/touchdown plot)<br />
<br />
see https://www.cnatra.navy.mil/local/docs/pat-pubs/P-816.pdf for T-45 carrier operations<br />
<br />
== Possible additional items ==<br />
{{Main article|2022.X Release Plan}}<br />
<br />
=== osgText ===<br />
{{Main article|OSGText Issues}}<br />
<br />
===2D Panels ===<br />
The idea is to remove all 'raw' OpenGL or OpenSceneGraph code from the panel code, it should be 100% done with Canvas elements. Eg use the Canvas Transform to compute the matrices<ref>https://sourceforge.net/p/flightgear/flightgear/merge-requests/217/#a8d5</ref><br />
* [[Canvas_News#2D_Panels|Remove the 2D panel code in favour of Canvas]] (this requires completing some work to load 2D panel elements as Canvas, from XML) <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref> (as of 06/2020, Gaétan Allaert is still working on the replacement of the 2D panel by canvas <ref>https://sourceforge.net/p/flightgear/mailman/message/37042351/</ref>) {{Progressbar|80}}<ref>https://sourceforge.net/u/gallaert/flightgear/ci/789f5bdbce10637222ffa25206938947fec4bc64/</ref><br />
<br />
=== Canvas ===<br />
{{See also|Unifying the 2D rendering backend via canvas}}<br />
* Note that the canvas currently assumes render-to-texture, but for the GUI I'm not sure that's actually desirable - simply a separate camera per GUI window may be sufficient. Since the camera already arranges everything beneath the RTT camera this should be fairly minor change, if it's desirable.(Saves some memory, makes re-sizing GUI windows a little easier, might make clipping or other state management less efficient in the main GUI camera ... but probably not)<ref>https://sourceforge.net/p/flightgear/mailman/message/29608899/</ref><br />
* Remove the C++ HUD in favour of Canvas-based version: this requires some kind of migration script or framework, so we have at least the default UFO HUD available <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref><br />
* Review Tim's original suggestion<ref>https://sourceforge.net/p/flightgear/mailman/message/36659646/</ref>: Another [Canvas] optimization is to use a pre-render camera that isn't in the scene graph to do the Canvas rendering. '''Otherwise the Canvas textures are rendered at least twice, in the near and far cameras'''. <ref>https://sourceforge.net/p/flightgear/mailman/message/36352621/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37042457/</ref> Tim Moore’s canvas-rendering-on-a-pre-camera fix, again should give us a nice perf win for Canvas-intensive acft<ref>https://sourceforge.net/p/flightgear/mailman/message/36355833/</ref>, since within each camera pass (far camera, near camera), all the passes of a technique are run.<ref>https://sourceforge.net/p/flightgear/mailman/message/29563353/</ref> Also, Mathias stated once: that it would be good to be able to specify a completely different scenegraph in some subcameras, i.e. for having panel like instruments on an additional screen/display for example.<ref>https://sourceforge.net/p/flightgear/mailman/message/19718354/</ref><br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Canvas/FGCanvasSystemAdapter.cxx#l70<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_compositor.cxx#l927 (compositor renderer)<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_legacy.cxx#l1842 (legacy renderer)<br />
* <del>As per James' comments: Investigate adapting the [[Canvas Popout Windows|WindowBuilder to allow OSG windows to be created dynamically]] for features like Stuart's [[FG1000]] to be shown in a separate window (canvas placement)</del> <ref>https://sourceforge.net/p/flightgear/mailman/message/37058207/</ref> (this is basically now possible thanks to Jules' CompositeViewer work)<br />
* Review/integrate experimental C++ patches for new Canvas elements floating around on the forum, namely:<br />
** [[Canvas View Camera Element#Proof of Concept|view manager support]]<br />
** [[Howto:Extending Canvas to support rendering 3D models|3d model support]]<br />
<br />
== fgdata clean-ups ==<br />
=== /Nasal ===<br />
2do: list outdated / deprecated functions for removal (I remember one comment saying: remove after FG 3.0 or something)<br />
* Clean up the GPS code with respect to FG_210_COMPAT :<br />
<br />
== Property tree clean-up ==<br />
remove /yasim/* "new" path is /fdm/yasim (since version 201x.?)<br />
<br />
== References ==<br />
{{Appendix}}<br />
<br />
[[Category:Core development]]<br />
<br />
[[Category:Release plans]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Post_FlightGear_2020.2_LTS_changes&diff=131404Post FlightGear 2020.2 LTS changes2021-04-26T20:41:22Z<p>Richard H: /* Carriers and AI */</p>
<hr />
<div>== Current status ==<br />
{{Mergeto|Building using CMake}}<br />
<br />
'''06/2020''':<br />
<br />
James has pushed some configuration changes to next (SG+FG) to raise various required versions of things.<br />
<br />
If you’re developing on ‘something fairly recent’, you shouldn’t see any difference except it would be a wise time to wipe your build dirs and re-CMake from clean. If you’re on a ‘somewhat older’ Linux, the baselines being Ubuntu 18.04 (their previous LTS) and CentOS 7 (which our Jenkins runs), you should also be fine except for GCC, where you will need a version supporting C++14: in practice this means GCC 5.x or higher. (Or use Clang…) For both of these distros there are officially supported ways to get newer GCCs (we’re actually using GCC 9 on Jenkins now..), so I don’t expect this to be a problem.<br />
<br />
As part of this we now require CMake 3.10<ref>https://sourceforge.net/p/flightgear/mailman/message/37094732/</ref>, Qt 5.9 and OSG 3.4.1, and James started removing various legacy pieces from next around this. There are plenty more cleanups that can be done based on this : especially on the CMake and C++ sides. Things like Boost -> Std stuff, Cmake targets-as-objects support (eg, target_compile_features can be used now).<br />
<br />
Windows and macOS should be unaffected BTW - because on those platforms you're always running something you downloaded which is fairly up to date. If you choose to go and download an ancient version of CMake or Qt, on either platform that’s your problem to fix - but you’ll get a configuration error at least.<br />
<br />
The idea of doing this /now/ is that the build deps won’t change again during the next two years, barring any surprises.<br />
<br />
None of this affects the release branches of course: they continue to work with OSG 3.2, GCC 4.x, Qt 5.4 and CMake 3.0. And you shouldn’t see any behavioural changes because of this either.<br />
<br />
Let’s see if reality corresponds to all the theory above :)<ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
<br />
'''08/2020''':<br />
James pushed a large overhaul of the Cmake build files for FlightGear:<br />
<br />
* we now use modern Cmake style nearly everywhere, i.e targets-as-objects for an OOP-style build system<br />
* transitive dependencies are handled automatically (or at least, that’s the idea…), which simplifies things in many places (eg, audio library handling)<br />
* system vs built-in dependencies is handled vis ALIAS targets, so most other code doesn’t care. We link to a target which is an alias for either our built-in version or the system one (via an IMPORTED target)<br />
* we should have better isolation from system headers / versions of things. <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
<br />
== Changes that are already on next ==<br />
{{Mergeto|Changelog 2020.1#Replay_.2F_Flight_Recorder}}<br />
<br />
=== Record/replay ===<br />
<br />
* Include multiplayer aircraft in recordings.<br />
* Continuous recording to file without any loss of detail.<br />
* Periodic generation of a recovery snapshot, allowing resumption after a flightgear crash.<br />
* Record/replay extra information in Continuous recordings (pushed to next on 2021-2-13):<br />
** Main window size<br />
** Main window position<br />
** Main window view<br />
* Continuous replay aircraft override:<br />
** When loading a Continuous recording at startup, we now override the aircraft and starting airport to match what is in the recording.<br />
* Replay of Continuous recordings from URL:<br />
** Extends the '''--load-tape command-line''' option, for example: '''--load-tape=<nowiki>http://foo.com/bar.fgtape</nowiki>'''<br />
<br />
<br />
<br />
See new '''File''' - '''Flight Recorder Control''' dialogue.<br />
<br />
==== Details ====<br />
<br />
* Continuous recording to file is uncompressed to simplify replay; e.g. 100MB for an hour's recording near EDDF.<br />
<br />
* A recovery snapshot is actually a single-frame continuous recording, and will be called '''<aircraft-type>-recovery.fgtape'''. Load in the usual way using the '''Flight Recorder Control''' dialogue or on the command line with '''--load-tape=<aircraft-type>-recovery'''. Then do '''Ctrl-R''' to see replay dialogue and click on '''My Controls'''. Some aircraft may have no or limited support for '''My Controls''' though.<br />
<br />
* "Continuous replay aircraft override" and "Replay from URL" were pushed to next on 2021-2-19.<br />
* Replay of Continuous recordings from URL:<br />
** Downloads to local file in the background while replaying.<br />
** Reuses local file if present, appending to it in the background if it was a partial download.<br />
<br />
== Code clean-ups and changes ==<br />
{{Mergeto|2022.X Release Plan}}<br />
<br />
Collecting what's going to change : this will also be used to work out what manual or automatic migrations are required to keep aircraft working. It's expected that for the first few months of 'next', there will be higher than usual breakage, i.e regular might not be possible.<br />
<br />
As a general guideline, the minimum system to develop / build the code on will be Ubuntu 18.04 LTS (Bionic) : the versions below correspond to what is available in a stock Bionic install.<br />
<br />
# Make C++14 (possibly C++17 to facilitate {{Abbr|VSG|Vulkan Scene Graph}} [[Vulkan Scene Graph|migration]]? <ref>https://sourceforge.net/p/flightgear/mailman/message/37041706/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/37042499/</ref>) the minimum required version (will make it easier to continue [[Deboosting FlightGear|replacing Boost]] items with std:: ones) <ref>https://sourceforge.net/p/flightgear/mailman/message/36988831/</ref> <ref>https://sourceforge.net/p/flightgear/mailman/message/36984349/</ref><br />
# Make CMake 3.6 the minimum required version: this will allow simplifying a bunch of compatibility logic in the build files <ref>https://sourceforge.net/p/flightgear/mailman/message/37020794/</ref> {{Progressbar|70}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37091728/</ref><br />
## Blocked by: [[OSGText Issues]]<br />
# Use CMake OBJECT_LIBRARY to improve how we collect sources together when building each sub-dir {{Progressbar|10}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37042800/</ref><br />
# Make Qt 5.9 the minimum for the launcher {{Done}} <ref>https://sourceforge.net/p/flightgear/mailman/message/37041064/</ref><br />
# Drop 32-bit windows support <ref>https://sourceforge.net/p/flightgear/mailman/message/34899704/</ref><br />
# Drop the pre-2017.x MultiPlayer message format - this will fix warnings from some aircraft about MP packet overflows <ref>https://sourceforge.net/p/flightgear/mailman/message/36300829/</ref><br />
# Drop the KLN-89 code, since it's unused and not maintained for a long time: Canvas and the regular GPS code can easily implement a working KLN-89 or similar equipment now <ref>https://sourceforge.net/p/flightgear/mailman/message/36327950/</ref><br />
# Switch to Compositor mode as the only rendering option {{Progressbar|90}} <ref>https://sourceforge.net/p/flightgear/mailman/message/36606242/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37039397/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37040359/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37148477/</ref><br />
# Drop [[Rembrandt]] support from C++ (really part of the above) <ref>https://sourceforge.net/p/flightgear/mailman/message/36340736/</ref><br />
# Drop the C++ [[NavDisplay]]: the Canvas version replaces it <ref>https://sourceforge.net/p/flightgear/mailman/message/36975265/</ref><br />
<br />
== Carriers and AI ==<br />
<br />
Ricbhard has been working on carriers since April 2020; originally the intention was to release as part of the 2020.2 LTS however the changes have grown into a set of new features rather than bugfixes and are therefore more suited to a longer development and review process.<ref>https://sourceforge.net/p/flightgear/mailman/flightgear-devel/thread/aaa9a3ee-ca18-e3af-1538-0cd59ae7a752%40zaretto.com/#msg37038519</ref><br />
<br />
* {{done}} Improved view support - so that the nearest tower will include carriers<br />
* {{done}} Changes to core code to support moving towers.<br />
* {{Progressbar|75}} Multiple (tower) views - permit selection of LSO, PLAT and Tower as part of the "Tower view"; selection mechanism TDB. Consider revisions to the existing view system to better support this.<br />
* {{done}} Extend XML to include definitions for FLOLS touchdown position, LSO view position, Tower View position, deck angle.<br />
* {{Progressbar|75}} Improve 3d models for IFLOLS to ensure that a ball call can be made.<br />
* {{Progressbar|80}} Improve logic for IFLOLS lights; not quite an LSO simulation more of an approximation of the definitive cases (e.g. waveoff)<br />
* {{pending}} Animate the lineup lights on the stern (of Nimitz class).<br />
* {{Progressbar|100}} Improved support for Precision Approach Landing System (PALS) (AN/SPN-46); to support lineup deviation as well as glideslope (ball) deviation.<br />
* {{Progressbar|70}} Change approach deviations to use new aircraft reference point rather than eyepoint; it is probably more correct to use the eyepoint when in the cockpit view - but for external views this can be slightly inaccurate when outside the aircraft to completely wrong when in tower/LSO view. The reference point is taken as the aircraft position with an optional model defined x,y,z offset. This allows ball tuning on a per aircraft basis.<br />
* {{Pending}} Improved support for AI logic to permit XML definition of e.g. LSO logic. Possibly a version of the autopilot / state machine that can be included as "logic blocks"<br />
* {{Pending}} Review 3d model usage for all Nimitz class and either add LOD selection (low, medium, high)<br />
*{{Progressbar|20}} Possible extra visual aids for Case 1 and Case 2 recovery training (e.g. a set of markers to fly through)<br />
* {{Pending}} Better integration of carriers with JSBSim to permit catapult hookup<br />
* {{Pending}} Simulate carrier operations Flight Deck Personnel, e.g. yellow shirts.<br />
* {{Pending}} Animation of arrestor wires<br />
* {{Pending}} Add some sort of trap grading (approach/touchdown plot)<br />
<br />
see https://www.cnatra.navy.mil/local/docs/pat-pubs/P-816.pdf for T-45 carrier operations<br />
<br />
== Possible additional items ==<br />
{{Main article|2022.X Release Plan}}<br />
<br />
=== osgText ===<br />
{{Main article|OSGText Issues}}<br />
<br />
===2D Panels ===<br />
The idea is to remove all 'raw' OpenGL or OpenSceneGraph code from the panel code, it should be 100% done with Canvas elements. Eg use the Canvas Transform to compute the matrices<ref>https://sourceforge.net/p/flightgear/flightgear/merge-requests/217/#a8d5</ref><br />
* [[Canvas_News#2D_Panels|Remove the 2D panel code in favour of Canvas]] (this requires completing some work to load 2D panel elements as Canvas, from XML) <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref> (as of 06/2020, Gaétan Allaert is still working on the replacement of the 2D panel by canvas <ref>https://sourceforge.net/p/flightgear/mailman/message/37042351/</ref>) {{Progressbar|80}}<ref>https://sourceforge.net/u/gallaert/flightgear/ci/789f5bdbce10637222ffa25206938947fec4bc64/</ref><br />
<br />
=== Canvas ===<br />
{{See also|Unifying the 2D rendering backend via canvas}}<br />
* Note that the canvas currently assumes render-to-texture, but for the GUI I'm not sure that's actually desirable - simply a separate camera per GUI window may be sufficient. Since the camera already arranges everything beneath the RTT camera this should be fairly minor change, if it's desirable.(Saves some memory, makes re-sizing GUI windows a little easier, might make clipping or other state management less efficient in the main GUI camera ... but probably not)<ref>https://sourceforge.net/p/flightgear/mailman/message/29608899/</ref><br />
* Remove the C++ HUD in favour of Canvas-based version: this requires some kind of migration script or framework, so we have at least the default UFO HUD available <ref>https://sourceforge.net/p/flightgear/mailman/message/36973988/</ref><br />
* Review Tim's original suggestion<ref>https://sourceforge.net/p/flightgear/mailman/message/36659646/</ref>: Another [Canvas] optimization is to use a pre-render camera that isn't in the scene graph to do the Canvas rendering. '''Otherwise the Canvas textures are rendered at least twice, in the near and far cameras'''. <ref>https://sourceforge.net/p/flightgear/mailman/message/36352621/</ref><ref>https://sourceforge.net/p/flightgear/mailman/message/37042457/</ref> Tim Moore’s canvas-rendering-on-a-pre-camera fix, again should give us a nice perf win for Canvas-intensive acft<ref>https://sourceforge.net/p/flightgear/mailman/message/36355833/</ref>, since within each camera pass (far camera, near camera), all the passes of a technique are run.<ref>https://sourceforge.net/p/flightgear/mailman/message/29563353/</ref> Also, Mathias stated once: that it would be good to be able to specify a completely different scenegraph in some subcameras, i.e. for having panel like instruments on an additional screen/display for example.<ref>https://sourceforge.net/p/flightgear/mailman/message/19718354/</ref><br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Canvas/FGCanvasSystemAdapter.cxx#l70<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_compositor.cxx#l927 (compositor renderer)<br />
** https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Viewer/renderer_legacy.cxx#l1842 (legacy renderer)<br />
* <del>As per James' comments: Investigate adapting the [[Canvas Popout Windows|WindowBuilder to allow OSG windows to be created dynamically]] for features like Stuart's [[FG1000]] to be shown in a separate window (canvas placement)</del> <ref>https://sourceforge.net/p/flightgear/mailman/message/37058207/</ref> (this is basically now possible thanks to Jules' CompositeViewer work)<br />
* Review/integrate experimental C++ patches for new Canvas elements floating around on the forum, namely:<br />
** [[Canvas View Camera Element#Proof of Concept|view manager support]]<br />
** [[Howto:Extending Canvas to support rendering 3D models|3d model support]]<br />
<br />
== fgdata clean-ups ==<br />
=== /Nasal ===<br />
2do: list outdated / deprecated functions for removal (I remember one comment saying: remove after FG 3.0 or something)<br />
* Clean up the GPS code with respect to FG_210_COMPAT :<br />
<br />
== Property tree clean-up ==<br />
remove /yasim/* "new" path is /fdm/yasim (since version 201x.?)<br />
<br />
== References ==<br />
{{Appendix}}<br />
<br />
[[Category:Core development]]<br />
<br />
[[Category:Release plans]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=131291User talk:Richard H2021-04-16T19:56:29Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{done}} Make C++ thread safe and lockfree.<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=130332User talk:Richard H2021-02-15T18:26:59Z<p>Richard H: /* Core */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Progressbar|20}} Core Support for OpenTrack<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=130331User talk:Richard H2021-02-15T18:25:23Z<p>Richard H: /* Core */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{Pending}} Support for aircraft configurable joystick bindings.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=130235User talk:Richard H2021-02-10T20:00:56Z<p>Richard H: /* FlightGear todo list */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{done}} [https://github.com/Zaretto/fg-aircraft/issues/59 F-14: Revise low speed aerodata]; improve FCS to match NASA TM X-81833. <br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS. This is to work with the core changes as detailed below.<br />
# {{Progressbar|30}} Rework F-14 external and internal lights for next (Compositor); remove Rembrandt support.<br />
# {{Pending}} F-15 fix post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} F-15 MP Emesary (OPRF)<br />
# {{Pending}} OPRF Release of F-14 and F-15<br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|70}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=129377Nasal optimisation2020-12-05T09:51:08Z<p>Richard H: /* Emesary real time executive */</p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each [[Nasal]] frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== Emesary real time executive ==<br />
<br />
The following code can be used to provide a basic and yet sophisticated way to run Nasal code in a scheduled (per frame or at a suitable rate) and in a managed way (i.e. something knows which modules are registered)<br />
<br />
Each module that wish to be executes needs to implement itself as a receiver or have a receiver wrapper (as follows). Generally I prefer to use a receiver wrapper as it helps to isolate the code that does the work from the code that interfaces to the scheduler.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var ModuleRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.Object = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.Object == nil)<br />
new_class.Object = ModuleObject.new();<br />
<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.Object.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
<br />
emesary.GlobalTransmitter.Register(ModuleRecipient.new("MODULE-NAME"));<br />
</syntaxhighlight><br />
<br />
This is the code that is used in the F-15 (Nasal/M_exec.nas) that provides the simple real time frame based executive.<br />
<br />
<syntaxhighlight lang="nasal"><br />
#---------------------------------------------------------------------------<br />
#<br />
# Title : Emesary based real time executive<br />
#<br />
# File Type : Implementation File<br />
#<br />
# Description : Uses emesary notifications to permit nasal subsystems to<br />
# : be invoked in a controlled manner.<br />
#<br />
# Author : Richard Harrison (richard@zaretto.com)<br />
#<br />
# Creation Date : 4 June 2018<br />
#<br />
# Version : 1.0<br />
#<br />
# Copyright (C) 2018 Richard Harrison Released under GPL V2<br />
#<br />
#---------------------------------------------------------------------------*/<br />
<br />
# to add properties to the FrameNotification simply send a FrameNotificationAddProperty<br />
# to the global transmitter. This will be received by the frameNotifcation object and<br />
# included in the update.<br />
#emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("MODULE", "wow","gear/gear[0]/wow"));<br />
#emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("MODULE", "engine_n2", "engines/engine[0]/n2"));<br />
# <br />
<br />
<br />
#<br />
# real time exec loop.<br />
var frame_inc = 0;<br />
var cur_frame_inc = 0.03;<br />
<br />
var rtExec_loop = func<br />
{<br />
# <br />
notifications.frameNotification.fetchvars();<br />
<br />
if (!notifications.frameNotification.running){<br />
return;<br />
}<br />
notifications.frameNotification.dT = notifications.frameNotification.elapsed_seconds - notifications.frameNotification.curT;<br />
<br />
if (notifications.frameNotification.dT > 1.0) <br />
notifications.frameNotification.curT = notifications.frameNotification.elapsed_seconds;<br />
<br />
if (notifications.frameNotification.FrameCount >= 16) {<br />
notifications.frameNotification.FrameCount = 0;<br />
}<br />
emesary.GlobalTransmitter.NotifyAll(notifications.frameNotification);<br />
# <br />
<br />
notifications.frameNotification.FrameCount = notifications.frameNotification.FrameCount + 1;<br />
<br />
# adjust exec rate based on frame rate.<br />
if (notifications.frameNotification.frame_rate_worst < 5) {<br />
frame_inc = 0.25;#4 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 10) {<br />
frame_inc = 0.125;#8 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 15) {<br />
frame_inc = 0.10;#10 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 20) {<br />
frame_inc = 0.075;#13.3 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 25) {<br />
frame_inc = 0.05;#20 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 40) {<br />
frame_inc = 0.0333;#30 Hz<br />
} else {<br />
frame_inc = 0.02;#50 Hz<br />
}<br />
if (frame_inc != cur_frame_inc) {<br />
cur_frame_inc = frame_inc;<br />
}<br />
execTimer.restart(cur_frame_inc);<br />
}<br />
<br />
# setup the properties to monitor for this system<br />
input = {<br />
frame_rate : "/sim/frame-rate",<br />
frame_rate_worst : "/sim/frame-rate-worst",<br />
elapsed_seconds : "/sim/time/elapsed-sec",<br />
};<br />
<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("EXEC", name, input[name]));<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", func {<br />
notifications.frameNotification.running = 1;<br />
});<br />
<br />
notifications.frameNotification.running = 0;<br />
notifications.frameNotification.dT = 0; # seconds<br />
notifications.frameNotification.curT = 0;<br />
<br />
var execTimer = maketimer(cur_frame_inc, rtExec_loop);<br />
execTimer.simulatedTime = 1;<br />
setlistener("/sim/signals/fdm-initialized", func {<br />
print("M_exec: starting");<br />
execTimer.start()<br />
});<br />
<br />
#<br />
# Turn on the automatic overrun detection - this will notify on the console<br />
# if any recipient takes more than the allocated (9ms) amount of time<br />
emesary.GlobalTransmitter.OverrunDetection(9); # warn at 9ms<br />
</syntaxhighlight><br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
<syntaxhighlight lang="nasal"><br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
</syntaxhighlight><br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
proces individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=129376Nasal optimisation2020-12-05T09:49:49Z<p>Richard H: /* FrameNotification */</p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each [[Nasal]] frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== Emesary real time executive ==<br />
<br />
The following code can be used to provide a basic and yet sophisticated way to run Nasal code in a scheduled (per frame or at a suitable rate) and in a managed way (i.e. something knows which modules are registered)<br />
<br />
Each module that wish to be executes needs to implement itself as a receiver or have a receiver wrapper (as follows). Generally I prefer to use a receiver wrapper as it helps to isolate the code that does the work from the code that interfaces to the scheduler.<br />
<br />
var ModuleRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.Object = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.Object == nil)<br />
new_class.Object = ModuleObject.new();<br />
<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.Object.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
<br />
emesary.GlobalTransmitter.Register(ModuleRecipient.new("MODULE-NAME"));<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="nasal"><br />
#---------------------------------------------------------------------------<br />
#<br />
# Title : Emesary based real time executive<br />
#<br />
# File Type : Implementation File<br />
#<br />
# Description : Uses emesary notifications to permit nasal subsystems to<br />
# : be invoked in a controlled manner.<br />
#<br />
# Author : Richard Harrison (richard@zaretto.com)<br />
#<br />
# Creation Date : 4 June 2018<br />
#<br />
# Version : 1.0<br />
#<br />
# Copyright (C) 2018 Richard Harrison Released under GPL V2<br />
#<br />
#---------------------------------------------------------------------------*/<br />
<br />
<br />
<br />
# to add properties to the FrameNotification simply send a FrameNotificationAddProperty<br />
# to the global transmitter. This will be received by the frameNotifcation object and<br />
# included in the update.<br />
#emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("MODULE", "wow","gear/gear[0]/wow"));<br />
#emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("MODULE", "engine_n2", "engines/engine[0]/n2"));<br />
# <br />
<br />
<br />
#<br />
# real time exec loop.<br />
var frame_inc = 0;<br />
var cur_frame_inc = 0.03;<br />
<br />
var rtExec_loop = func<br />
{<br />
# <br />
notifications.frameNotification.fetchvars();<br />
<br />
if (!notifications.frameNotification.running){<br />
return;<br />
}<br />
notifications.frameNotification.dT = notifications.frameNotification.elapsed_seconds - notifications.frameNotification.curT;<br />
<br />
if (notifications.frameNotification.dT > 1.0) <br />
notifications.frameNotification.curT = notifications.frameNotification.elapsed_seconds;<br />
<br />
if (notifications.frameNotification.FrameCount >= 16) {<br />
notifications.frameNotification.FrameCount = 0;<br />
}<br />
emesary.GlobalTransmitter.NotifyAll(notifications.frameNotification);<br />
# <br />
<br />
notifications.frameNotification.FrameCount = notifications.frameNotification.FrameCount + 1;<br />
<br />
# adjust exec rate based on frame rate.<br />
if (notifications.frameNotification.frame_rate_worst < 5) {<br />
frame_inc = 0.25;#4 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 10) {<br />
frame_inc = 0.125;#8 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 15) {<br />
frame_inc = 0.10;#10 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 20) {<br />
frame_inc = 0.075;#13.3 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 25) {<br />
frame_inc = 0.05;#20 Hz<br />
} elsif (notifications.frameNotification.frame_rate_worst < 40) {<br />
frame_inc = 0.0333;#30 Hz<br />
} else {<br />
frame_inc = 0.02;#50 Hz<br />
}<br />
if (frame_inc != cur_frame_inc) {<br />
cur_frame_inc = frame_inc;<br />
}<br />
execTimer.restart(cur_frame_inc);<br />
}<br />
<br />
# setup the properties to monitor for this system<br />
input = {<br />
frame_rate : "/sim/frame-rate",<br />
frame_rate_worst : "/sim/frame-rate-worst",<br />
elapsed_seconds : "/sim/time/elapsed-sec",<br />
};<br />
<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("EXEC", name, input[name]));<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", func {<br />
notifications.frameNotification.running = 1;<br />
});<br />
<br />
notifications.frameNotification.running = 0;<br />
notifications.frameNotification.dT = 0; # seconds<br />
notifications.frameNotification.curT = 0;<br />
<br />
var execTimer = maketimer(cur_frame_inc, rtExec_loop);<br />
execTimer.simulatedTime = 1;<br />
setlistener("/sim/signals/fdm-initialized", func {<br />
print("M_exec: starting");<br />
execTimer.start()<br />
});<br />
<br />
#<br />
# Turn on the automatic overrun detection - this will notify on the console<br />
# if any recipient takes more than the allocated (9ms) amount of time<br />
emesary.GlobalTransmitter.OverrunDetection(9); # warn at 9ms<br />
</syntaxhighlight><br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
<syntaxhighlight lang="nasal"><br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
</syntaxhighlight><br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
proces individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_Loops&diff=129375Nasal Loops2020-12-05T09:39:22Z<p>Richard H: </p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
Nasal has several ways to implement an iteration.<br />
<br />
A polling loop is akin to somebody permanently running to a room to check if the lights are on - a listener is like somebody being INSIDE the room SLEEPING and only WAKING up once the lights are turned on (there is no active workload involved here, other than basically "watching" the switch).<br />
<br />
The {{func link|setlistener()}} API is intended to catch rare events. Avoid complex loops if you don't have to.<br />
<br />
In general, "loops" are not bad or expensive, it really depends on what you're doing inside the loop.<br />
A loop will be executed within a single frame normally - so a long-running loop will add up to the frame spacing (the time needed to create a single frame).<br />
<br />
There's nothing magic about timers or listeners - they can just as well inflate your frame spacing.<br />
<br />
It doesn't matter if the code/callback is run inside a loop, timer or a listener - what does matter is the complexity of the code that runs.<br />
<br />
Timers or listeners are only really preferable over loops when it comes to checking for some condition, because polling is called "busy-waiting", i.e. more expensive, see the previous analogy.<br />
<br />
A listener or timer "waiting" is not resource-hungry, it's not even busy - it's not doing anything until it is "fired".<br />
Regarding {{func link|setprop()}}/{{func link|getprop()}} - they're not as bad as we used to think - in fact, Thorsten has shown that they're preferable over most [[Nasal library/props|props.nas APIs]], this may however change once the whole thing is replaced with [[Nasal/CppBind|cppbind bindings]].<br />
<br />
Thus, loops aren't bad necessarily: they can be used in a less-than-optimal manner, but there are often times where they make a lot of sense. Some pros and cons of both:<br />
<br />
Listeners: Pros:<br />
* Can be used to receive instant "notifications" (events), avoiding unnecessary gets,<br />
* Really useful for Updating another property based on changes in one - like a mirror that scales by a factor, or something. (It's kinda a pity we can't just redirect read/writes... That's something I haven't explored enough, since it's various parts of C++)<br />
<br />
Listeners: Cons:<br />
* Each event is run in the same code as the event that triggers it (aka the setting-a-property code calls the event), so each event is run in the same thread and has the possibility to block the parent - which is probably not a good idea, so listeners should generally run as little code as possible. Note however that, depending on the property, it's all going to get run inside the main loop anyway - so it's no different than loops (roughly speaking).<br />
* May be run several times per frame.<br />
* Little more abstract and prone to danger than loops; you do not always know what listeners are registered where, and any listener that writes to a different property has the potential to infinitely call each other and thus segfault. (Unless you make guards on your listener against this... which is possible, but requires some work.)<br />
<br />
Loops: Pros:<br />
* Very useful for running loop-like tasks - e.g. something that updates regularly, particularly if it looks at many properties, or if it changes even if the dependent-upon property(s) are not updated.<br />
* Run once a frame at max – which is the fastest the user will see the changes anyway.<br />
<br />
Loops: Cons:<br />
* However, they are run at the end (IIRC) of the frame, so if you need instant reaction (i.e. interaction back and forth with another subsystem via properties), loops won't be quick enough, and thus listeners would be required.<br />
<br />
{{Note|Splitting processing across frames can be easily performed using the [[Nasal_Optimisation#PartitionProcessor|PartitionProcessor]]}}<br />
<br />
To optimize things in Nasal space, you need to understand where things really ARE slow - for starters, you can use "debug.benchmark()" for this - which is wrapper for two {{func link|systime()}} calls to capture the overhead of the callback.<br />
<br />
Philosopher has some more sophisticated stuff doing this sort of thing, but it's more difficult to set up and not yet ready for "prime-time" - overall, discussions like these make it obvious that we could greatly benefit from having support for runtime benchmarking/profiling and debugging of Nasal code running within the FG main loop.<br />
Given Philosopher's progress in 2013, I think we're at least half-way there already - but it's not a trivial problem, and it needs still some more work.<br />
We're hoping to look into this again this year - anybody interested in helping with this, should check out Philosopher's "Nasal internals" document in $FG_ROOT/Docs.<br />
<br />
Nasal loops are 'worse' than C++ loops since the former tend to trigger garbage collection more often, which leads in the worst case to an artificially prolonged frame. Some people claim to have had serious issues with Nasal GC.<br />
<br />
It is entirely true that ANY Nasal code, including loops, may end up triggering the GC - even due to code unrelated to the loop itself, what we commonly referred to as "GC pressure", i.e. due to certain coding constructs being more likely to add to the "GC pressure".<br />
<br />
C++ loops should normally not trigger the Nasal GC at all, unless the C++ code happens to call back into Nasal space.<br />
Normally, there's a vector of subsystems that's iterated in the FG main loop, each subsystem's update() method is then called, including the update() method of the Nasal subsystem.<br />
However, most Nasal code is not directly called via Nasal::update(), but instead via callbacks by other C++ subsystems, such as events (for timers) or the property tree code (for listeners), but also the AI traffic system, scenery system - or even the GUI system, whenever Nasal hooks are supported by the system, the corresponding system needs to reach back into Nasal space, which may end up triggering the GC.<br />
<br />
regarding callbacks invoked via timers and listeners, I would also suggest to always maintain a counter to see how many instances of each loop are running - i.e. initialize the counter with 0, and then use +=1 and -=1 at the end of the callback.<br />
<br />
you can then easily dump all counters to the console via print<br />
In the meantime what you could do is keep taking things out until you find some things that slow FG down. Start with the 3D model (eg replace with UFO) then take out various parts of Nasal, particularly those that have timers, listeners, or other callbacks. From there you can narrow it down by checking individual call times via systime(), like my framework does (on a large scale), or maybe debug.benchmark when I provide a small patch...<br />
<br />
<br />
== for, while, foreach, and forindex loops ==<br />
Nasal's looping constructs are mostly C-like:<br />
<br />
<br />
<syntaxhighlight lang="nasal"><br />
for( preloop_initialization; # will be run prior to the first invocation of the loop, usually to initialize a loop counter<br />
condition_during_loop; # will be run prior to each iteration, usually to check the loop counter and cancel the loop if false<br />
post_iteration_expression # will be run after each iteration, usually to increment a loop counter<br />
) <br />
{<br />
# loop body<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<syntaxhighlight lang="nasal"><br />
for (var i=0; i < 3; i = i+1) {<br />
# loop body<br />
}<br />
<br />
while (condition) {<br />
# loop body<br />
}<br />
</syntaxhighlight><br />
<br />
The differences are that there is no <tt>do{}while()</tt>; construct, and there is a foreach/forindex, which takes a local variable name as its first argument and a vector as its second:<br />
<br />
<syntaxhighlight lang="nasal"><br />
foreach(elem; list1) { doSomething(elem); } # NOTE: the delimiter is a SEMICOLON ;<br />
</syntaxhighlight><br />
<br />
In other words, even though foreach or forindex look like function calls, they work differently and they have braces after the parentheses.<br />
<br />
The hash/vector index expression (one that uses brackets) is an lvalue that can be assigned as well as inspected:<br />
<br />
<syntaxhighlight lang="nasal"><br />
foreach(light; lights) { lightNodes[light] = propertyPath; }<br />
</syntaxhighlight><br />
<br />
To walk through all elements of a hash, use a foreach loop on the keys of they hash. Then you call pull up the values of the hash using the key. Example:<br />
<br />
<syntaxhighlight lang="nasal"><br />
myhash = {first: 1000, second: 250, third: 25.2 };<br />
foreach (var i; keys (myhash)) {<br />
#multiply each value by 2:<br />
myhash[i] *= 2; <br />
#print the key and new value:<br />
print (i, ": ", myhash[i]);<br />
}<br />
# this will print in some order:<br />
#first: 2000<br />
#second: 250<br />
#thid: 25.2<br />
</syntaxhighlight><br />
<br />
There is also a "forindex", which is like foreach except that it assigns the ''index'' of each element, instead of the value, to the loop variable.<br />
<br />
<syntaxhighlight lang="nasal"><br />
forindex(i; list1) { doSomething(list1[i]); }<br />
</syntaxhighlight><br />
<br />
Also, braceless blocks work for loops equally well:<br />
<br />
<syntaxhighlight lang="nasal"><br />
var c = 0;<br />
while( c < 5 )<br />
print( c += 1 );<br />
print("end of loop\n");<br />
</syntaxhighlight><br />
<br />
== skip or exit loops prematurely ==<br />
If you want to skip a single loop use "continue" or to exit a loop prematurely use "break".<br />
<br />
<syntaxhighlight lang="nasal"><br />
for (var i=0; i < 10; i+=1) {<br />
# loop body<br />
<br />
# don't do loop for i == 3<br />
if ( i == 3 ) continue;<br />
<br />
# exit for other reason<br />
if ( want_to_quit ) break;<br />
}<br />
</syntaxhighlight><br />
<br />
== settimer loops ==<br />
{{Callback Disclaimer}}<br />
<br />
{{warning|settimer loops are deprecated as of FlightGear 2.11, see the [[#maketimer]] section at the end of this document}}<br />
<br />
Loops using <tt>while</tt>, <tt>for</tt>, <tt>foreach</tt>, and <tt>forindex</tt> block all of FlightGear's subsystems that run in the main thread for the duration of the loop body, and can, thus, only be used for instantaneous operations that don't take too long. <br />
<br />
For operations that should continue over a longer period, one needs a non-blocking solution. This is done by letting functions call themselves after a timed delay: <br />
<br />
<syntaxhighlight lang="nasal"><br />
var loop = func {<br />
print("this line appears once every two seconds");<br />
settimer(loop, 2);<br />
}<br />
<br />
loop(); # start loop<br />
</syntaxhighlight><br />
<br />
Note that the {{func link|settimer()}} function expects a ''function object'' (<tt>loop</tt>), not a function call (<tt>loop()</tt>) (though it is possible to make a function call return a function object--an advanced functional programming technique that you won't need to worry about if you're just getting started with Nasal). <br />
<br />
The fewer code FlightGear has to execute, the better, so it is desirable to run loops only when they are needed. But how does one stop a loop? A once triggered timer function can't be revoked. But one can let the loop function check an outside variable and refuse calling itself, which makes the loop chain die off:<br />
<br />
{{warning|settimer loops are deprecated as of FlightGear 2.11, see the [[#maketimer]] section at the end of this document}}<br />
<syntaxhighlight lang="nasal"><br />
var running = 1;<br />
var loop = func {<br />
if (running) {<br />
print("this line appears once every two seconds");<br />
settimer(loop, 2);<br />
}<br />
}<br />
<br />
loop(); # start loop ...<br />
...<br />
running = 0; # ... and let it die<br />
</syntaxhighlight><br />
<br />
=== Loop Identifiers ===<br />
<br />
The example above has a fundamental problem; which is that it isn't possible to manage the timer as it will always fire (which is why it is better to use [[#maketimer]]). However the problem can also be solved by using a loop identifier. This is simply a variable that lives at the outer scope of the module and is used to identify the currently active timer loop. Using this technique when the loop identifier is incremented the currently waiting timers will exit when it is their turn to run and the timer chain will be broken. <br />
<br />
To do this we provide each loop chain with a ''loop identifier'' and let the loop chain function will terminate itself at the start if the id doesn't match the loop-id from the outer loop. To facilitate this also requires a delegate in the settimer call that will pass in the current loop id (that was passed into the loop chain function). <br />
<br />
==== Example of using the loop indentifier technique ====<br />
<br />
{{warning|settimer loops are deprecated as of FlightGear 2.11, see the [[#maketimer]] section at the end of this document}}<br />
<br />
<syntaxhighlight lang="nasal"><br />
var loopid = 0;<br />
var loop = func(id) {<br />
id == loopid or return; # stop here if the id doesn't match the global loop-id<br />
...<br />
settimer(func { loop(id) }, 2); # call self with own loop id<br />
}<br />
<br />
loop(loopid); # start loop<br />
...<br />
loopid += 1; # this kills off all pending loops, as none can have this new identifier yet<br />
...<br />
loop(loopid); # start new chain; this can also be abbreviated to: loop(loopid += 1);<br />
</syntaxhighlight><br />
<br />
== Starting timers from a fdm initialized listener ==<br />
<br />
{{caution|Be carfeul when using settimer from a listener on fdm-initialized as this can easily create a new timer each time the aircraft is repositioned}}<br />
<br />
The correct way to use settimer from a listener on fdm-initialized is as follows:<br />
<br />
{{warning|settimer loops are deprecated as of FlightGear 2.11, see the [[#maketimer]] section at the end of this document}}<br />
<syntaxhighlight lang="nasal"><br />
good_loop_init = 0;<br />
<br />
good_loop = func{<br />
# logic<br />
settimer(good_loop, 1);<br />
};<br />
<br />
setlistener("sim/signals/fdm-initialized", func {<br />
if (!good_loop_init){<br />
good_loop_init = 1;<br />
good_loop();<br />
}<br />
});<br />
</syntaxhighlight><br />
<br />
== maketimer ==<br />
<br />
Beginning with FlightGear 2.11+ you should consider using the {{func link|maketimer()}} API instead.<br />
<br />
This is because maketimer creates an object that can be managed, rather than settimer which once called will irrevocably call the method once the duration has elapsed. For this reason settimer is considered to be unmanageable and has been deprecated.<br />
<br />
=== maketimer example ===<br />
<br />
<syntaxhighlight lang="nasal"><br />
var mt_loop_example = func {<br />
<br />
if (some_condition)<br />
mt_loop_exampleTimer.restart(0.1); # adjust the timer frequency (ms)<br />
<br />
if (finished)<br />
mt_loop_exampleTimer.stop(); #cancel the timer. Timer can be started again later.<br />
}<br />
<br />
mt_loop_exampleTimer = maketimer(0.25, mt_loop_example);<br />
mt_loop_exampleTimer.simulatedTime = 1; # use simulated time, as maketimer defaults to using wallclock time and continues during pause.<br />
mt_loop_exampleTimer.start();<br />
</syntaxhighlight><br />
<br />
=== maketimer from FDM Initialized ===<br />
<br />
<syntaxhighlight lang="nasal"><br />
<br />
var timer_loop = func{<br />
# logic<br />
};<br />
<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
setlistener("sim/signals/fdm-initialized", func {<br />
timer_loopTimer.start();<br />
});<br />
</syntaxhighlight><br />
<br />
See also {{func link|maketimer()}} {{func link|settimer()}}</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=129374Nasal optimisation2020-12-05T09:36:25Z<p>Richard H: </p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each [[Nasal]] frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
proces individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Nasal_optimisation&diff=129373Nasal optimisation2020-12-05T09:35:19Z<p>Richard H: Created page with "{{Nasal Navigation}} = Introduction to writing Nasal for optimum performance = Writing optimal performing code in a real time system (in any language) is usually related to..."</p>
<hr />
<div>{{Nasal Navigation}}<br />
<br />
= Introduction to writing Nasal for optimum performance =<br />
<br />
Writing optimal performing code in a real time system (in any language) is usually related to minmising the per frame impact of any given set of code; which may end up with slightly slower code but the point is to ensure that the real time frame rate does not degrade.<br />
<br />
The basic techniques are as follows;<br />
<br />
# Measure and locate (profile) code.<br />
# Do less<br />
# Cache more<br />
# Spread out workload<br />
# Avoid garbage collection<br />
<br />
Inside each Nasal frame the programmer needs to ensure that the minimum necessary work is performed; ideally a predictable workload to ensure that Nasal processing per frame is constant - because otherwise there can be frame pauses - which is where an occasional frame will take much longer than usual.<br />
<br />
Splitting any given task across frames is the normal way of ensuring that performance remains good; unfortunately a lot of Nasal doesn't do this and instead will process everything each frame. This is what the PartitionProcessor is designed to help with<br />
<br />
Do not use getprop or setprop - these are very slow; instead use the props.nas module to refer to the property tree. <br />
<br />
All property tree access is much slower than using native Nasal variables; and it is therefore wise to only read each property from the tree once per frame. This is what the FrameNotification is designed to help with.<br />
<br />
Writing data to Canvas displays can be considered to be a slow operation; so only write values that are changed. props.UpdateManager can help with this.<br />
<br />
Generally using props.UpdateManager (with the FrameNotification hash) can be generally used to perform OnChange processing that is more efficient than the property listeners - however property listeners should still be used to perform occasional actions (rather than per frame actions)<br />
<br />
== fdm-initialized listener == <br />
It is important to realise that sim/fdm-initialized will be set to true every time the model is repositioned; i.e. it does not fire just once. When sim/fdm-initialized is set to false the model should clean up all previously initialised listeners, threads, timers etc.<br />
<br />
Generally it is much better to set timers, listeners (etc) at module level scope inside any Nasal file; as these will be executed only once. Using the Emesary FrameNotification can further simplify per frame processing because there is no need to use a timer per module and instead any modules can register themselves for frame processing simply by using GlobalNotifier.Register and all of the details are abstracted away and all that needs to happen is to handle the received notifications.<br />
<br />
This is an example of acquiring and releasing listeners and timers.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = nil;<br />
var timer_loopTimer = nil;<br />
var fdm_init = func(v) {<br />
<br />
# always clean up values that aren't nil - this is safe<br />
if (l1 != nil)<br />
removelistener(l1);<br />
l1 = nil;<br />
<br />
if (timer_loopTimer != nil)<br />
timer_loopTimer.stop();<br />
timer_loopTimer = nil;<br />
<br />
# then acquire new values<br />
if (v.getValue()){<br />
print("Initializing Systems");<br />
l1 = setlistener("/some-prop", listener_func);<br />
timer_loopTimer = maketimer(0.25, timer_loop);<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
# now perform any other cleanup.<br />
print("Cleaning up");<br />
}<br />
}<br />
<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
However the above can be better written as follows;<br />
<br />
<syntaxhighlight lang="nasal"><br />
var l1 = setlistener("/some-prop", listener_func);<br />
var timer_loopTimer = maketimer(0.25, timer_loop);<br />
<br />
var fdm_init = func(v) {<br />
if (v.getValue()){<br />
timer_loopTimer.start();<br />
}<br />
else {<br />
timer_loopTimer.stop();<br />
}<br />
}<br />
setlistener("sim/signals/fdm-initialized", fdm_init);<br />
</syntaxhighlight><br />
<br />
== Nasal threads ==<br />
<br />
Nasal threads are of limited use because most of the time it is property tree access and other API calls that are slow and a lot of the API library (including properties) are not thread safe and should not be called from outside the main loop.<br />
<br />
= Optimisation techniques = <br />
<br />
The F-15 I think is the reference implementation of my three main Nasal optimisation techniques; <br />
<br />
== FrameNotification ==<br />
<br />
The FrameNotification is a notification sent out at defined intervals that contains a hash with property values.<br />
<br />
Use the FrameNotificationAddProperty to request that certain properties are contained within the FrameNotification.<br />
<br />
notifications.FrameNotificationAddProperty.new("F15-HUD", **[HASH-Name]**, **[property-string]**)<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", "AirspeedIndicatorIndicatedMach", "instrumentation/airspeed-indicator/indicated-mach"));`<br />
</syntaxhighlight><br />
<br />
although more typically used by having a hash that contains the keys and properties that you want to monitor and then using a loop to send out the FrameNotificationAddProperty; e.g.:<br />
<br />
<syntaxhighlight lang="nasal"><br />
input = {<br />
AirspeedIndicatorIndicatedMach : "instrumentation/airspeed-indicator/indicated-mach",<br />
Alpha : "orientation/alpha-indicated-deg",<br />
AltimeterIndicatedAltitudeFt : "instrumentation/altimeter/indicated-altitude-ft",<br />
ArmamentAgmCount : "sim/model/f15/systems/armament/agm/count",<br />
ArmamentAim120Count : "sim/model/f15/systems/armament/aim120/count",<br />
ArmamentAim7Count : "sim/model/f15/systems/armament/aim7/count",<br />
ArmamentAim9Count : "sim/model/f15/systems/armament/aim9/count",<br />
ArmamentRounds : "sim/model/f15/systems/gun/rounds",<br />
AutopilotRouteManagerActive : "autopilot/route-manager/active",<br />
AutopilotRouteManagerWpDist : "autopilot/route-manager/wp/dist",<br />
AutopilotRouteManagerWpEtaSeconds : "autopilot/route-manager/wp/eta-seconds",<br />
CadcOwsMaximumG : "fdm/jsbsim/systems/cadc/ows-maximum-g",<br />
ControlsArmamentMasterArmSwitch : "sim/model/f15/controls/armament/master-arm-switch",<br />
ControlsArmamentWeaponSelector : "sim/model/f15/controls/armament/weapon-selector",<br />
ControlsGearBrakeParking : "controls/gear/brake-parking",<br />
ControlsGearGearDown : "controls/gear/gear-down",<br />
ControlsHudBrightness : "sim/model/f15/controls/HUD/brightness",<br />
ControlsHudSymRej : "sim/model/f15/controls/HUD/sym-rej",<br />
ElectricsAcLeftMainBus : "fdm/jsbsim/systems/electrics/ac-left-main-bus",<br />
HudNavRangeDisplay : "sim/model/f15/instrumentation/hud/nav-range-display",<br />
HudNavRangeETA : "sim/model/f15/instrumentation/hud/nav-range-eta",<br />
OrientationHeadingDeg : "orientation/heading-deg",<br />
OrientationPitchDeg : "orientation/pitch-deg",<br />
OrientationRollDeg : "orientation/roll-deg",<br />
OrientationSideSlipDeg : "orientation/side-slip-deg",<br />
RadarActiveTargetAvailable : "sim/model/f15/instrumentation/radar-awg-9/active-target-available",<br />
RadarActiveTargetCallsign : "sim/model/f15/instrumentation/radar-awg-9/active-target-callsign",<br />
RadarActiveTargetClosure : "sim/model/f15/instrumentation/radar-awg-9/active-target-closure",<br />
RadarActiveTargetDisplay : "sim/model/f15/instrumentation/radar-awg-9/active-target-display",<br />
RadarActiveTargetRange : "sim/model/f15/instrumentation/radar-awg-9/active-target-range",<br />
RadarActiveTargetType : "sim/model/f15/instrumentation/radar-awg-9/active-target-type",<br />
InstrumentedG : "instrumentation/g-meter/instrumented-g",<br />
VelocitiesAirspeedKt : "velocities/airspeed-kt",<br />
};<br />
foreach (var name; keys(input)) {<br />
emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("F15-HUD", name, input[name]));<br />
}<br />
</syntaxhighlight><br />
<br />
The idea of the FrameNotification is that it provides an easy way to run your update logic; simply by registering with the GlobalTransmitter and then processing the FrameNotification you can call your update logic in an efficient manner;<br />
<br />
e.g.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var HUDRecipient =<br />
{<br />
new: func(_ident)<br />
{<br />
var new_class = emesary.Recipient.new(_ident);<br />
new_class.MainHUD = nil;<br />
new_class.Receive = func(notification)<br />
{<br />
if (notification.NotificationType == "FrameNotification")<br />
{<br />
if (new_class.MainHUD == nil)<br />
new_class.MainHUD = F15HUD.new("Nasal/HUD/HUD.svg", "HUDImage1");<br />
if (!math.mod(notifications.frameNotification.FrameCount,2)){<br />
new_class.MainHUD.update(notification);<br />
}<br />
return emesary.Transmitter.ReceiptStatus_OK;<br />
}<br />
return emesary.Transmitter.ReceiptStatus_NotProcessed;<br />
};<br />
return new_class;<br />
},<br />
};<br />
</syntaxhighlight><br />
and then register that function with the Emesary Global transmitter.<br />
<br />
<syntaxhighlight lang="nasal"><br />
emesary.GlobalTransmitter.Register(HUDRecipient.new("F15-HUD"));<br />
</syntaxhighlight><br />
<br />
------<br />
== props.UpdateManager ==<br />
<br />
This will monitor one or more property, or values from a hash and call a function (or inline function) when the value or a value changes more than a defined amount.<br />
<br />
e.g. <br />
<syntaxhighlight lang="nasal"><br />
obj.update_items = [<br />
props.UpdateManager.FromHashList(["ElectricsAcLeftMainBus","ControlsHudBrightness"] , 0.01, func(val)<br />
{<br />
if (val.ElectricsAcLeftMainBus <= 0 <br />
or val.ControlsHudBrightness <= 0) {<br />
obj.svg.setVisible(0);<br />
} else {<br />
obj.svg.setVisible(1);<br />
}<br />
}),<br />
props.UpdateManager.FromHashValue("AltimeterIndicatedAltitudeFt", 1, func(val)<br />
{<br />
obj.alt_range.setTranslation(0, val * alt_range_factor);<br />
}),<br />
<br />
props.UpdateManager.FromHashValue("VelocitiesAirspeedKt", 0.1, func(val)<br />
{<br />
obj.ias_range.setTranslation(0, val * ias_range_factor);<br />
}),<br />
props.UpdateManager.FromHashValue("ControlsHudSymRej", 0.1, func(val)<br />
{<br />
obj.symbol_reject = val;<br />
}),<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
and then in the update method <br />
<syntaxhighlight lang="nasal"><br />
foreach(var update_item; me.update_items)<br />
{<br />
update_item.update(notification);<br />
}<br />
</syntaxhighlight><br />
As you can see above the update method is called from the recipient of the frame notification.<br />
<br />
== PartitionProcessor ==<br />
<br />
When working with lists (arrays) of data that can get quite long (e.g. targets from radar) the partition processor is an easy way to only process a part of that list each frame.<br />
<br />
What it does is to manage the processing of data in a manner suitable for real time operations. Given a data array [0..size] this will process a number of array elements each time it is called This allows for a simple way to split up intensive processing across multiple frames.<br />
<br />
The limit is the number of elements to process per frame (invocation of .process method) or to limit the processing to a specified amount of time using a Nasal timestamp to measure the amount (in usec)<br />
<br />
<br />
example usage (object);<br />
<br />
<syntaxhighlight lang="nasal"><br />
var VSD_Device =<br />
{<br />
new : func(designation, model_element, target_module_id, root_node)<br />
{<br />
...<br />
obj.process_targets = PartitionProcessor.new("VSD-targets", 20, nil);<br />
obj.process_targets.set_max_time_usec(500);<br />
...<br />
me.process_targets.set_timestamp(notification.Timestamp);<br />
</syntaxhighlight><br />
<br />
then invoke.<br />
<br />
<syntaxhighlight lang="nasal"><br />
me.process_targets.process(me, awg_9.tgts_list, <br />
func(pp, obj, data){<br />
initialisation; called before processing element[0]<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
}<br />
,<br />
func(pp, obj, element){<br />
proces individual element; <br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
element is the element data[pp.data_index]<br />
return 0 to stop processing any more elements and call the completed method<br />
return 1 to continue processing.<br />
},<br />
func(pp, obj, data)<br />
{<br />
completed; called after the last element processed<br />
params<br />
pp is the partition processor that called this<br />
obj is the reference object (first argument in the .process)<br />
data is the entire data array.<br />
});<br />
</syntaxhighlight></div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=ALS_technical_notes&diff=129193ALS technical notes2020-11-25T08:44:49Z<p>Richard H: syntax highlight XML</p>
<hr />
<div>== Quality level mapping ==<br />
The rendering quality of ALS effects is controlled by two main sliders, the landmass effects and transition effects. The transition effects slider regulates the quality of overlaid textured, while the landmass effects slider regulates all other aspects of procedural texturing, such as pixel color post-processing (dust, snow or wet terrain effects) and apparent terrain roughness (bump and parallax mapping).<br />
<br />
In addition, specific effects for certain terrain types (water, urban, forest, agriculture, etc.) and models in the scene can be switched on separately. In some cases, this may be needed for a consistent visual impression. For example, if a dust effect is used on the terrain, the water needs to be rendered using a separate water shader, otherwise it will appear dusty as well. Likewise, if the Rayleigh haze is used in the highest quality terrain effect, then the highest quality water effect needs to be used to see the same Rayleigh scattering effect on the water.<br />
<br />
For technical reasons (landmass and transition control the same shader code) the settings are sometimes mutually dependent, e.g., if the transition quality is set to level 6, it won't have any effect until the landmass quality is also set to level 6.<br />
<br />
=== Transition ===<br />
The mapping of quality to visuals of the transition slider is as follows:<br />
<br />
{| class="wikitable"<br />
! Level !! Comments<br />
|-<br />
! scope="row" | 1<br />
| Base texture scheme<br />
|-<br />
! scope="row" | 2<br />
| Alternative hires airport keep effect<br />
|-<br />
! scope="row" | 3<br />
|<br />
* Base and overlay texture, runway effect (if landmass is above level 4)<br />
* Secondary lights on runway and airport keep<br />
|-<br />
! scope="row" | 4<br />
| Base, overlay and hires texture<br />
|-<br />
! scope="row" | 5<br />
| Base, overlay, hires, detail, grain, dot and rock texture (if landmass is level 6)<br />
|}<br />
<br />
=== Landmass ===<br />
{{Note|Quality levels 1 and 2 are reserved to represent fixed pipeline rendering and the "default renderer" in an eventually merged rendering GUI. However, ALS is currently switched on per checkbox and not by quality level, and so they do not have a function.}}<br />
<br />
{| class="wikitable"<br />
! Level !! Comments<br />
|-<br />
! scope="row" | 1<br />
| ''See note above''<br />
|-<br />
! scope="row" | 2<br />
| ''See note above''<br />
|-<br />
! scope="row" | 3<br />
| ALS-rendered position-differential haze and light, moonlight<br />
|-<br />
! scope="row" | 4<br />
| <br />
* Procedural snow cover on terrain<br />
* Procedural dust and vegetation effects<br />
* Wet terrain effect with approximate reflection half vector<br />
* Patchy fog distribution<br />
|-<br />
! scope="row" | 5<br />
| Noise bump-mapping and parallax mapping of terrain<br />
|-<br />
! scope="row" | 6<br />
| (''Requires transition effect level 6'')<br />
* Wet terrain effect with correct reflection half vector<br />
* Hires bump mapping and snow patchiness<br />
* Variable upper haze layer surface<br />
* Rayleigh haze<br />
* Secondary lights on all terrain types<br />
* Slope line and strata effects<br />
|}<br />
<br />
== ALS secondary lights ==<br />
The ALS framework supports a generic implementation of landing lights and a searchlight which are based on a framerate-friendly computation in screen coordinates, i.e., the lights project correctly ''only if the light is close to the viewer'' (typically, that would be from cockpit view). In other words, this is not a full (and rather expensive) computation of light volumes as in Rembrandt, but a much faster test of illuminated screen areas.<br />
<br />
[[File:Landing light03.jpg|400px|Cessna 172P using generic ALS landing lights]]<br />
<br />
Two landing lights and a searchlight are supported. The landing lights have a fixed position with respect to the aircraft axis (technically, with respect to the default view axis as defined in the respective view), whereas the searchlight follows any offset of the view axis in view mode, i.e., when using the mouse to look around, the searchlight will follow the motion, the landing lights will not. The lights require ALS to run above basic quality level and work on runway and airport keep above transition setting 3 and everywhere else only at highest quality setting. All lights are controlled via properties in <code>/sim/rendering/als-secondary-lights/</code>.<br />
<br />
The names of the properties should be self-explanatory, if for instance if <code>/sim/rendering/als-secondary-lights/use-searchlight</code> is set to true, then the searchlight (which always follows the current view axis) is used. <br />
<br />
The properties <code>/sim/rendering/als-secondary-lights/landing-light1-offset-deg</code> and <code>/sim/rendering/als-secondary-lights/landing-light2-offset-deg</code> allow to specify angular offsets for the landing light which are then not centered on the view axis. This can be used to simulate one or two landing lights set in the wings.<br />
<br />
[[File:Offsetv2.jpg|400px|Secondary lights vertical offset demo]]<br />
<br />
A third offset <code>/sim/rendering/als-secondary-lights/landing-light3-offset-deg</code> is available which allows for a vertical offset. This is especially useful for tail dagger aircraft.<br />
<br />
[[File:Offsetv.jpg|400px|Secondary lights vertical offset settings]]<br />
<br />
The lights can be switched on and off from the [[Property Browser]] for any aircraft without any modifications to the aircraft definition. Implementing them correctly aircraft side thus just involves linking the landing light switches to the ALS control properties and setting the correct angular offsets. Additionally, it is recommended to switch the lights off unless in a cockpit view, as they don't project correctly for any external view.<br />
<br />
Range, color, light cone opening angle or intensity of the lights can currently not be configured, and there are no plans to support such a feature in the near future.<br />
<br />
All three lights will illuminate fog (if dense enough) and precipitation.<br />
<br />
[[File:Als secondary light fog.jpg|400px|ALS generic lights illuminating dense fog]]<br />
<br />
== ALS specific features of the model effect ==<br />
<br />
In addition to the features supported by the model-combined-deferred effect in all three renderers (normal, light, specular, environment reflection and dirt map), ALS also supports a couple of unique effects (which, if configured, will not have any effect in other renderers.<br />
<br />
=== The grain texture ===<br />
<br />
ALS supports a grain texture for models. This is a semi-transparent overlay texture that works just as [[Procedural Texturing#The grain texture|its equivalent for terrain texturing]] and provides the option of generating centimeter-scale details such as rust or discoloration on a surface without having to use huge textures. An example of a surface rendered with grain texture is the image of the USS Vinson flightdeck below:<br />
<br />
[[File:Grain rain01.jpg|700px|Grain and rain effects on Vinson's flightdeck]]<br />
<br />
This is done using the following effect declaration inheriting from '''model-combined-deferred.eff''' as<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<br />
<PropertyList><br />
<br />
<name>flightdeck</name><br />
<inherits-from>Effects/model-combined-deferred</inherits-from><br />
<parameters><br />
<grain-texture-enabled type="int">2</grain-texture-enabled><br />
<grain-magnification type="float">0.1</grain-magnification><br />
<rain-enabled type="int">2</rain-enabled><br />
<texture n="7"><br />
<image>Models/Geometry/Nimitz/rust_texture.png</image><br />
<type>2d</type><br />
<filter>linear-mipmap-linear</filter> <br />
<wrap-s>repeat</wrap-s><br />
<wrap-t>repeat</wrap-t><br />
<internal-format>normalized</internal-format><br />
</texture><br />
</parameters><br />
<br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
The grain texture has the number 7 and needs to be enabled by<br />
<syntaxhighlight lang="xml"><br />
<grain-texture-enabled type="int">2</grain-texture-enabled><br />
</syntaxhighlight><br />
<br />
If the value is set to 1, the grain texture uses the uv-mapping of the underlying surface. If that is very irregular (as in the case of the Vinson flightdeck), alternatively the grain can be mapped in xy-model coordinates if the parameter is set to 2, the uv-mapping of the base texture layer is then discarded.<br />
<br />
The resolution of the grain texture with respect to the base coordinate layer is specified by<br />
<syntaxhighlight lang="xml"><br />
<grain-magnification type="float">0.1</grain-magnification><br />
</syntaxhighlight><br />
<br />
If the number is less than 0, the grain resolution is lower than the base layer. If the parameter is greater than 0, it is higher (note that in the above case, the grain is mapped to (xy) rather than (uv), hence the base size is 1 m, so the grain texture is mapped on a 10x10 m patch on the flightdeck, for which a 1024x1024 pixel texture provides ~1 cm sized details).<br />
<br />
=== The rain effect ===<br />
<br />
Any number greater than 0 passed to<br />
<syntaxhighlight lang="xml"><br />
<rain-enabled type="int">2</rain-enabled><br />
</syntaxhighlight><br />
<br />
enables the splash effect of raindrops on the surface if it points upward. The surface does not have to be flat for this to work, the effect checks for the surface normal automatically, see the rain enabled for the Citation Bravo.<br />
<br />
Thorsten noted about rain splashes: "Works fine here - runway needs to get really wet though before you see them (put the environment slider to max to achieve this quickly, it will take some waiting with just rain on)."<br />
<br />
[[File:Grain rain02.jpg|700px|Rain effect on the Citation Bravo]]<br />
<br />
<br />
=== Glossy surfaces ===<br />
<br />
To better treat the environment reflections on a glossy surface, ALS contains two options not present in the other renderers.<br />
<br />
<br />
<syntaxhighlight lang="xml"><br />
<reflection-type type="int">1</reflection-type><br />
</syntaxhighlight><br />
<br />
This parameter can currently be set to 1 or 2 and regulates how the color of the environment reflection is merged with the color of the glossy surface. If set to 1, the shader uses a color mixing as in the other two renderers, if set to 2 it uses a technique called 'grain merge' which gives different weight to the color channels. The reason for introducing type 2 was a grey tint which changed the reflected color in a unrealistic way. With FlightGear 2017.2.0 this will be fixed and type set to 2 should be obsolete then.<br />
<br />
<syntaxhighlight lang="xml"><br />
<reflection-fresnel-factor type="float">0.0</reflection-fresnel-factor><br />
</syntaxhighlight><br />
<br />
This parameter regulates how strong the Fresnel term of a glossy surface is. Many smooth surfaces reflect much more under shallow angles such that an environment reflection is not very prominent when looking under 90 degrees but dominates the visuals when looking under a grazing angle. The parameter sets the relative strength of a Fresnel reflection with respect to the basic reflection definition which is assumed to hold for vertical viewing (i.e. setting the parameter to 0.8 gives you extra glossiness under shallow angles).<br />
<br />
The following comparison shows the default color mixing (upper left) for a reflecting white livery and for grain merge (upper right). In addition, note the enhanced Fresnel reflectivity at the tail and the cowling on the pictures. The lower row shows (left) full reflection with default color mixing and (right) for grain merge. Default color mixing is more physically correct, while grain merge is less correct but preserves white color much better.<br />
<br />
[[File:Reflect Model default2.jpg|400px|Effect of color mixing in a reflection]]<br />
[[File:Reflect Grain merge2.jpg|400px|Effect of grain merge in reflection]]<br />
<br />
[[File:Reflect Model Default Full.jpg|400px|Full reflection with default ]]<br />
[[File:Reflect Grain Merge Full.jpg|400px|Full reflection with grain merge]]<br />
<br />
== The exhaust flame effect ==<br />
<br />
Rendering proper flames of e.g. afterburners or rocket thrusters with diffuse edges is notoriously difficult - all solutions based on textured models tend to have unnaturally sharp edges. Usually the particle system is used in such cases, however at high velocities this has other issues - particles become easily separated, making flames look disrupted and detached from the exhaust.<br />
<br />
ALS includes a dedicated procedural effect in which the flame is rendered by numerically integrating a 3-dim distribution of glowing emitters inside a bounding box (i.e. re-creates the process by which a real flame would be seen). The function which determines the emitter distribution is partially user-controlled so that a wide range of shapes can be generated.<br />
<br />
To use the effect, first the bounding box has to be defined. Note that the shape and alignment of the bounding box needs to be standardized for the effect to work, i.e. you need to use either the default bounding box under Aircraft/Generic/Effects/Thruster/ or make a custom one which fits inside the default box at the same location in model coordinates.<br />
<br />
To change position, size and orientation of the bounding box to match with the airplane model, translate, scale and rotate animations or model offsets can later be used.<br />
<br />
=== Model definition for effect ===<br />
This is a standard XML model definition that needs to specify the geometry, all animations and the effect to use. For the geometry you can use the standard ''Aircraft/Generic/Effects/Thruster/thrust_flame.ac'' or make your own. The F-15 uses a slightly different 3D model to allow for the nozzles. The 3D model needs to be big enough to contain the flame, bearing in mind that the flame is drawn as a cylinder.<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0"?><br />
<PropertyList><br />
<br />
<path>Aircraft/Generic/Effects/Thruster/thrust_flame.ac</path><br />
<nopreview/><br />
<animation><br />
<type>scale</type><br />
<property alias="/params/augmentation-alight"/><br />
<x-min>0.2</x-min><br />
<y-min>0.3</y-min><br />
<z-min>0.3</z-min><br />
<y-max>1</y-max><br />
<z-max>1</z-max><br />
<x-factor>0.472</x-factor><br />
<y-factor>0.6</y-factor><br />
<z-factor>0.6</z-factor><br />
</animation><br />
<!-- on the F-15 we have a property available that controls the ignition of the afterburner. If you do not wish to implement this<br />
remove the following animation tag --><br />
<animation><br />
<type>select</type><br />
<object-name>Bounding_box</object-name><br />
<condition><br />
<greater-than><br />
<property alias="/params/augmentation-ignition"/><br />
<value>0.8</value><br />
</greater-than><br />
</condition><br />
</animation><br />
<br />
<effect><br />
<inherits-from>Aircraft/MyAircraft/Models/Effects/my-flame</inherits-from><br />
<object-name>Bounding_box</object-name><br />
</effect><br />
<br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
=== Effect definition for model ===<br />
To define the effect to apply to the model (as referenced in the ''effect'' section in the model XML) you need to create ''my-flame.eff'' as below. The ''.eff'' file defines the parameters that are passed into the shader and it is these that control how the flame looks.<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<PropertyList><br />
<name>AB-flame</name><br />
<inherits-from>Effects/thrust-flame</inherits-from><br />
<parameters><br />
<base_flame_b type="float">0.8</base_flame_b><br />
<base_flame_density type="float">0.6</base_flame_density><br />
<base_flame_g type="float">0.9</base_flame_g><br />
<base_flame_r type="float">0.9</base_flame_r><br />
<deflection_coeff type="float">0</deflection_coeff><br />
<flame_color_high_b type="float">0.8</flame_color_high_b><br />
<flame_color_high_g type="float">0.85</flame_color_high_g><br />
<flame_color_high_r type="float">0.9</flame_color_high_r><br />
<flame_color_low_b type="float">0.07</flame_color_low_b><br />
<flame_color_low_g type="float">0.15</flame_color_low_g><br />
<flame_color_low_r type="float">0.35</flame_color_low_r><br />
<flame_radius_fraction type="float">0.8</flame_radius_fraction><br />
<noise_scale type="float">0.3</noise_scale><br />
<noise_strength type="float">0.2</noise_strength><br />
<thrust_collimation type="float">0.1</thrust_collimation><br />
<thrust_density type="float">0.7</thrust_density><br />
<use_noise type="int">1</use_noise><br />
<use_shocks type="int">1</use_shocks><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
There is also a detailed version (utilizing 3d noise and a higher sampling resolution) available. This has to be explicitly requested in a derived effect by overriding the default shader choice with the detailed version, i.e. bu inserting<br />
<br />
<syntaxhighlight lang="xml"><br />
<technique n="4"><br />
<pass><br />
<program><br />
<fragment-shader n="0">Shaders/thrustflame-ALS-detailed.frag</fragment-shader><br />
</program><br />
</pass><br />
</technique><br />
</syntaxhighlight><br />
<br />
below the parameter section.<br />
<br />
{{Note|The detailed shader uses four times as much performance at least - only use it if you really need it!}}<br />
<br />
=== F-15 Afterburner example image === <br />
The F-15 afterburner flame shown below (at different ambient lighting based on time) uses the parameters above. The main parameters of importance, and therefore to tune, for an aircraft jet engine are the colors, the two densities, the flame radius fraction. The base density is at the start of the flame and this. The F-15 overlays a billboarded image to achieve the diamonds that are interleaved with the ALS drawn flame. <br />
<br />
<br />
[[File:F-15 afterburner using ALS Thrust Effect.jpg|700px|This shows the F-15 afterburner at different ambient light.]]<br />
<br />
The meaning of the parameters are as follows:<br />
<br />
<syntaxhighlight lang="xml"><br />
<use_shocks type="int">1</use_shocks><br />
<use_noise type="int">1</use_noise><br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="xml" inline><use_shocks></syntaxhighlight> and <syntaxhighlight lang="xml" inline><use_noise></syntaxhighlight> are the parameters that control the random noise and the shock diamonds. Both are modestly computationally expensive, i.e. if these effects are not required it is better to switch them off by setting these values to zero.<br />
<br />
<syntaxhighlight lang="xml"><br />
<flame_color_low_r type="float">0.95</flame_color_low_r><br />
<flame_color_high_r type="float">1.0</flame_color_high_r><br />
<base_flame_r type="float">0.8</base_flame_r><br />
</syntaxhighlight><br />
<br />
(same for the (g,b) channels) set the color. base_flame refers to the part of the flame which is directly attached to the thruster and usually brightest. flame_color_high refers to the high density part of the flame, flame_color_low refers to the low density parts of the flame. (rgb) values always need to be [0:1]<br />
<br />
<syntaxhighlight lang="xml"><br />
<thrust_density type="float">1.0</thrust_density><br />
<base_flame_density type="float">0.1</base_flame_density><br />
</syntaxhighlight><br />
<br />
determine the overall emitter density in the flame and in the base directly at the thruster respectively. There's no formal upper limit for the parameters, but a flame with density 1 already appears fairly opaque.<br />
<br />
<syntaxhighlight lang="xml"><br />
<flame_radius_fraction type="float">0.8</flame_radius_fraction><br />
</syntaxhighlight><br />
<br />
governs how much of the bounding box the flame radius at the exhaust nozzle fills. If the flame needs to expand (as for the plume of a thruster operating in vacuum) or needs to bend (as for a flame deflected by the airstream) this parameter needs to be small, if the flame is essentially cylindrical the paramater can be chosen close to 1 to minimize clipping errors. Note that this determines the size of the flame relative to the bounding box - the overall size of the flame should be adjusted by using a scale animation on the bounding box<br />
<br />
<syntaxhighlight lang="xml"><br />
<noise_strength type="float">0.2</noise_strength><br />
<noise_scale type="float">0.3</noise_scale><br />
</syntaxhighlight><br />
<br />
determined how turbulent the flame looks. noise_strength [0:1] determines how prominently the noise influences the flame and noise_scale (in meters relative to the original bounding box) determines how large the visible patches of turbulence are (given that the original bounding box is not larger than 5 m in the longest direction, the parameter should probably kept between 0.1 and 5).<br />
<br />
<syntaxhighlight lang="xml"><br />
<shock_frequency>1.0</shock_frequency><br />
</syntaxhighlight><br />
<br />
influences at what distance shock diamonds appear in the flame. Useful values are perhaps between 0.2 and 5.<br />
<br />
<syntaxhighlight lang="xml"><br />
<thrust_collimation type="float">0.1</thrust_collimation> <br />
</syntaxhighlight><br />
<br />
should take a value of between 0 and 1 and determines how collimated the flame is. For values > 0, the flame is widened - note that this requires a sufficiently small flame radius fraction to avoid clipping errors. For widened flames, the density is automatically lowered and shock diamonds are removed.<br />
<br />
<syntaxhighlight lang="xml"><br />
<deflection_coeff type="float">0.</deflection_coeff><br />
</syntaxhighlight><br />
<br />
should be somewhere between 0 and 0.06 and gives a lateral deflection (such as by an airstream) to the flame. Note that this re-positions the origin of the flame in the bounding box to better utilize the bounding box volume, i.e. if you need a dynamical deflection, you also need a translate animation for the bounding box.<br />
<br />
Any of those parameters can be adjusted runtime by replacing the value with <syntaxhighlight lang="xml" inline><use>/my-property</use></syntaxhighlight>. Dependent on how <code>/my-property</code> is created it might be tied though (in particular JSBSim-computed properties are) in which case it is not picked up by the effect framework - you need to copy it via property rule to an untied property then. This allows to render dynamical changes of the flame.<br />
<br />
For instance the [[SpaceShuttle - Project Overview|Space Shuttle]] main engines use<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<br />
<PropertyList><br />
<name>ssme-flame</name><br />
<inherits-from>Effects/thrust-flame</inherits-from><br />
<parameters><br />
<flame_color_low_r>0.9</flame_color_low_r><br />
<flame_color_low_g>0.7</flame_color_low_g><br />
<flame_color_low_b>0.5</flame_color_low_b><br />
<flame_color_high_r>0.7</flame_color_high_r><br />
<flame_color_high_g>0.7</flame_color_high_g><br />
<flame_color_high_b>1.0</flame_color_high_b><br />
<base_flame_r type="float">0.8</base_flame_r><br />
<base_flame_g type="float">1.0</base_flame_g><br />
<base_flame_b type="float">1.0</base_flame_b><br />
<use_shocks type="int">1</use_shocks><br />
<use_noise type="int">1</use_noise><br />
<thrust_collimation><use>/sim/systems/various/ssme-flame-collimation</use></thrust_collimation> <br />
<thrust_density><use>/sim/systems/various/ssme-flame-density</use></thrust_density><br />
<base_flame_density type="float">1.0</base_flame_density><br />
<shock_frequency>1.0</shock_frequency><br />
<noise_strength>0.3</noise_strength><br />
<noise_scale>0.1</noise_scale><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
to simulate the change of flame geometry in the thin upper atmosphere during ascent:<br />
<br />
[[File:Shuttle flame05.jpg|400px|Space Shuttle main engine flames during early ascent]]<br />
[[File:Shuttle flame06.jpg|400px|Space Shuttle main engine flames during late ascent]]<br />
<br />
Using the deflection parameter, the curved SRB separation motor flames are rendered using<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<br />
<PropertyList><br />
<name>SRBsep-flame</name><br />
<inherits-from>Effects/thrust-flame</inherits-from><br />
<parameters><br />
<flame_color_low_r type="float">0.95</flame_color_low_r><br />
<flame_color_low_g type="float">0.55</flame_color_low_g><br />
<flame_color_low_b type="float">0.1</flame_color_low_b><br />
<flame_color_high_r type="float">1.0</flame_color_high_r><br />
<flame_color_high_g type="float">1.0</flame_color_high_g><br />
<flame_color_high_b type="float">1.0</flame_color_high_b><br />
<use_shocks type="int">0</use_shocks><br />
<use_noise type="int">1</use_noise><br />
<thrust_collimation type="float">0.4</thrust_collimation> <br />
<thrust_density type="float">1.0</thrust_density><br />
<base_flame_density type="float">0.0</base_flame_density><br />
<noise_strength type="float">0.7</noise_strength><br />
<noise_scale type="float">0.4</noise_scale><br />
<deflection_coeff type="float">-0.06</deflection_coeff><br />
<flame_radius_fraction type="float">0.1</flame_radius_fraction><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
<br />
[[File:Flame_sep.jpg|700px|Space Shuttle SRB separation motor flames]]<br />
<br />
Application of the effect is not limited to flames, it can also do heat blur (think a very transparent, high-noise dark emitter distribution) or vapour trails and other smoke.<br />
<br />
By itself, the effect does however not compute ambient and diffuse light channels, i.e. for non-emissive distributions lighting is the responsibility of the user. One quick way of obtaining a correct fading of color with light in the scene is to create an untied property based on<br />
<br />
<code>/rendering/scene/diffuse/red</code><br />
<br />
and used this to scale all color values.<br />
<br />
{{note|Do not use the full (rgb) information in the property tree for ALS, it will produce pronounced color mismatches with the rest of the scene as ALS determines light inside the shader and never uses the properties.}}<br />
<br />
<br />
== Rotor wash ==<br />
<br />
ALS provides an interface to render rotor wash on various terrain types - currently this is implemented for the volumetric grass as well as procedural water. This interface needs to be written aircraft-side for the effect to be rendered.<br />
<br />
[[File:Rotor wash.jpg|600px|Rotor wash rendered on volumetric grass]]<br />
[[File:EC135 Heer.jpeg|600px|Rotor wash rendered on volumetric grass]]<br />
[[File:EC135 Rescue.jpeg|600px|Rotor wash rendered on water]]<br />
<br />
Aircraft maintainers need to set three parameters in <b>/environment/aircraft-effects/</b>.<br />
<br />
The position of the downwash column needs to be specified in <i>eye-relative</i> coordinates by setting <b>/environment/aircraft-effects/wash-x</b> and <b>/environment/aircraft-effects/wash-y</b>. If these are zero, the air column is assumed to be right underneath the eye point, any non-zero values displace the center northward or eastward from the eye point. To work in external views, the displacement needs to be computed by e.g. a Nasal script or property rules, the same is true if the rotor is not close to the eye point.<br />
<br />
The strength of the downwash column <i>on the ground</i> is set by <b>/environment/aircraft-effects/wash-strength</b>. The parameter influences both the radius in which the effect is visible as well as the overall strength (up to a maximum). Aircraft maintainers need to adjust strength based on parameters like altitude AGL, rotor RPM, rotor radius and whatever else might influence the downwash.<br />
<br />
== Chute animation effect ==<br />
<br />
The chute animation effect is designed to provide a natural appearance of the deformation and the fluttering motion of a piece of cloth under changing stress.<br />
<br />
[[File:Chute seq01.jpg|400px|Drag chute separation sequence 1]] [[File:Chute seq03.jpg|400px|Drag chute separation sequence 2]]<br />
<br />
<br />
=== Coordinate system ===<br />
<br />
The shader assumes that the 3d mesh of the chute is oriented in a particular coordinate system. The z-axis (upward) should extend from the zero point where the various ropes come together to the canopy above through the center of the model. The canopy of the chute should therefore roughly be in the xy plane.<br />
<br />
To position the chute correctly with the aircraft, you then need to use appropriate offsets and rotations when loading.<br />
<br />
=== Effect definition for model ===<br />
<br />
To define the effect to apply to the model (as referenced in the ''effect'' section in the model XML) you need to create ''mychute.eff'' as below. The ''.eff'' file defines the parameters that are passed into the shader and it is these that control the behavior.<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<PropertyList><br />
<name>mychute</name><br />
<inherits-from>Effects/chute</inherits-from><br />
<parameters><br />
<chute_force><use>Aircraft/MyAircraft/myforce</use></chute_force><br />
<chute_projection_z>0.0</chute_projection_z><br />
<chute_fold>0.0</chute_fold><br />
<chute_bend>0.0</chute_bend><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
<br />
The meaning of these parameters is as follows:<br />
<br />
<syntaxhighlight lang="xml"><br />
<chute_projection_z>0.0</chute_projection_z><br />
</syntaxhighlight><br />
<br />
This is the distance of the branching point of the various lines leading to the canopy (at model coordinate zero) to the edge of the canopy. All transformations affecting the shape of the canopy (in particular the collapse of the canopy if the force is gone) will be applied with respect to this reference plane.<br />
<br />
<syntaxhighlight lang="xml"><br />
<chute_force><use>Aircraft/MyAircraft/myforce</use></chute_force><br />
</syntaxhighlight><br />
<br />
This is a normalized force applied to the canopy. The chute should be modeled with a deformation corresponding to a force parameter of 1 - any higher value will narrow the chute's radius, deepen the chute's deformation along the z-axis and increase the motion, any lower value will widen chute radius (compare screenshots above) and lessen its depth and slow down motion. The normal parameter range should be from [0:2], any higher or lower may look odd.<br />
<br />
<syntaxhighlight lang="xml"><br />
<chute_fold>0.0</chute_fold><br />
<chute_bend>0.0</chute_bend><br />
</syntaxhighlight><br />
<br />
These are deformation modes used to animate a chute after jettison when it is no longer pulled into shape and can flutter through the air. The first one [0:1] is a general collapse into the projection plane with random deformations around, the second one [-1:1] is a gross bending mode of the projection plane itself. Before jettison, these parameters should default to 0.<br />
<br />
=== Jettison animation ===<br />
<br />
A complete animated jettison sequence is quite complex and would usually require a Nasal sequence taking the chute through a deceleration trajectory (utilizing translation and rotation animations), bending ad folding oscillations and finally some unfolding as it sinks through the air. The Space Shuttle chute uses the following control loop for 10 seconds of jettison dynamics:<br />
<br />
<syntaxhighlight lang="nasal"><br />
var drag_chute_jettison_animation = func (time) {<br />
<br />
var dt = getprop("/sim/time/delta-sec");<br />
time = time + dt;<br />
<br />
# horizontal motion<br />
<br />
var x = 0.0;<br />
<br />
if (time > 2.0)<br />
{x = -16.0 + 20.0 * time;}<br />
else<br />
{x = 2.0 * time + 5.0 * time * time;}<br />
<br />
<br />
setprop("/controls/shuttle/drag-chute-dist",x);<br />
<br />
# vertical motion<br />
<br />
var y = 0.0;<br />
if (time > 5.0)<br />
{<br />
y = -2.5 + 0.6 * (time-5.0) * (time-5.0);<br />
}<br />
else <br />
{<br />
y = -0.2 * time;<br />
}<br />
if (y > 12.5) {y=12.5;}<br />
<br />
setprop("/controls/shuttle/drag-chute-down",y);<br />
<br />
# fold<br />
<br />
var f = 0.5 * time;<br />
if (f> 1.0) {f = 1.0;}<br />
if (time > 9.5)<br />
{f = 0.25 + 1.5 + (time-9.5);}<br />
if (time > 6.0)<br />
{<br />
f = f -0.3* (time-7.0); <br />
if (f<0.1) {f=0.1;}<br />
}<br />
setprop("/controls/shuttle/drag-chute-fold", f);<br />
<br />
# rotate<br />
<br />
var r = (time - 2.0) * 18.0;<br />
if (r>90.0) {r=90.0;}<br />
if (r<0.0) {r=0.0;}<br />
setprop("/controls/shuttle/drag-chute-slant", r);<br />
<br />
# bend<br />
<br />
var b = 0;<br />
if (time > 7.5)<br />
{b = 0;}<br />
else if (time >6.0)<br />
{b = 0.75 - 0.5 * (time - 6.0);} <br />
else if (time > 4.5) <br />
{b = (time - 4.5) * 0.5;}<br />
else {b=0;} <br />
<br />
setprop("/controls/shuttle/drag-chute-bend", b);<br />
<br />
if (time > 10.0) <br />
{<br />
print("Exiting...");<br />
settimer (func { setprop("/controls/shuttle/drag-chute-deploy-timer", 0); }, 0.5);<br />
return;<br />
}<br />
<br />
setprop("/test/timer", time);<br />
<br />
settimer( func{ drag_chute_jettison_animation (time); }, 0);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
== ALS glass effect ==<br />
<br />
As of FlightGear version 3.5, ALS supports a glass effect with dynamic response to the environment which can render, for instance, the splashes of raindrops on the canopy, frost or fogging.<br />
<br />
[[File:Glass01.jpg|400px|Frost effect]]<br />
[[File:Glass07.jpg|400px|Raindrop splashes]]<br />
<br />
The base effect properties are controlled via inheritance and the environment response run-time via properties residing in <b>/environment/aircraft-effects</b>. Derived effects should inherit from <b>Effects/glass</b>. Any surface using the glass effect will automatically register itself as transparent for use in [[Project Rembrandt| Rembrandt]]. <br />
<br />
The glass effect is primarily intended for interior views. In particular, no external fog or haze is rendered for the glass, i.e. if the effect is used in an outside view, it is the responsibility of the aircraft modeler to take care (e.g. with LOD settings or range animations) that no problems in bad visibility occur.<br />
<br />
=== Why a separate effect for glass seen from inside? ===<br />
<br />
Basically because the two situations are rather different. Slight dirt on the glass against the background of the sky from inside is rather prominent, against the background of the cockpit seen from outside it is not. Visuals from inside are dominated by Mie forward scattering of light, leading to a bright glare effect when looking at dirt, frost, fog or scratches close to the sun. From outside, reflected light rather than transmitted light is dominant. The reflection of any external object on the outside of the glass changes as the aircraft moves, this is not the case for the reflection of the cockpit in the glass seen from the inside. <br />
<br />
The viewing situation is also different. From the inside, we usually do not focus the eyes on the plane of the glass but look through it, from the outside the focus of the eyes is often close to the glass surface. For something half a meter before the eye, we also need to apply a lot more resolution and details than for an object typically seen from 10+ meters from the outside.<br />
<br />
Add to this that atmospheric fog is never relevant for glass seen from inside but for glass seen from outside, and it suddenly makes sense to use a different effect.<br />
<br />
The recommended effect for glass surfaces seen from outside is model-combined-transparent.eff.<br />
<br />
<br />
=== Rain ===<br />
Rain splashes will render automatically when the weather system reports rain via environment/rain-norm. In addition, the user can set rain splashes to render via <code>environment/aircraft-effects/ground-splash-norm</code> (this is intended to allow splashes to be rendered e.g., for water landings of aircraft equipped with floats).<br />
<br />
By default, the rain splashes impact from above (more precisely the +z direction in model coordinates). This may be inadequate if the aircraft is moving. However, the shader can not know what the airstream at the glass will be, so the impact vector of rain splashes has to be modeled aircraft-side and set via <code>environment/aircraft-effects/splash-vector-x</code> (<code>splash-vector-y</code>, <code>splash-vector-z</code>). These are likewise in model coordinates.<br />
<br />
As long as the length of the splash vector is less than 1, just the impact angle will change, as the length of the vector increases to 2, droplets will also be visibly moving. This allows fine control of the visuals dependent on any number of factors desired. A simple Nasal snipped varying the splash vector with airspeed for the F-16 is given below (but ''do not mindlessly copy and expect to work for any aircraft — it won't!''). This example is for normals pointing outwards, if the normals are pointing inwards the vector needs to be inverted.<br />
<br />
<syntaxhighlight lang="nasal"><br />
var splash_vec_loop = func(){<br />
var airspeed = getprop("/velocities/airspeed-kt");<br />
<br />
# f16<br />
var airspeed_max = 120;<br />
<br />
if (airspeed > airspeed_max) {<br />
airspeed = airspeed_max;<br />
}<br />
<br />
airspeed = math.sqrt(airspeed / airspeed_max);<br />
<br />
var splash_x = -0.1 - 2 * airspeed;<br />
var splash_y = 0.0;<br />
var splash_z = 1.0 - 1.35 * airspeed;<br />
<br />
setprop("/environment/aircraft-effects/splash-vector-x", splash_x);<br />
setprop("/environment/aircraft-effects/splash-vector-y", splash_y);<br />
setprop("/environment/aircraft-effects/splash-vector-z", splash_z);<br />
<br />
settimer(func(){<br />
splash_vec_loop();<br />
}, 1);<br />
}<br />
</syntaxhighlight><br />
<br />
Note the timing constant of the loop — running the update per-frame leads to a spurious movement of the coordinate system in which rain is rendered and spoils the effect.<br />
<br />
<br />
Another method when using JSBSIM would be to use a combination of FCS Functions and Filters.<br />
<br />
<syntaxhighlight lang="xml"><br />
<system name="c172p-glass-effects"><br />
<channel name="rain"><br />
<fcs_function name="glass-effects/splashx"><br />
<function><br />
<difference><br />
<value>-0.1</value><br />
<product><br />
<value>2.0</value><br />
<sqrt><br />
<quotient><br />
<min><br />
<property>/velocities/airspeed-kt</property><br />
<value>40</value><br />
</min><br />
<value>40</value><br />
</quotient><br />
</sqrt><br />
</product><br />
</difference><br />
</function><br />
</fcs_function><br />
<fcs_function name="glass-effects/splashz"><br />
<function><br />
<difference><br />
<value>1.0</value><br />
<product><br />
<value>1.35</value><br />
<sqrt><br />
<quotient><br />
<min><br />
<property>/velocities/airspeed-kt</property><br />
<value>40</value><br />
</min><br />
<value>40</value><br />
</quotient><br />
</sqrt><br />
</product><br />
</difference><br />
</function><br />
</fcs_function><br />
</channel><br />
</system><br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<PropertyList><br />
<filter><br />
<name>splashX</name><br />
<type>gain</type><br />
<input><br />
<property>/fdm/jsbsim/glass-effects/splashx</property><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-x</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splashY</name><br />
<type>gain</type><br />
<input><br />
<value>0.0</value><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-y</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splashZ</name><br />
<type>gain</type><br />
<input><br />
<property>/fdm/jsbsim/glass-effects/splashz</property><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-z</property><br />
</output><br />
</filter><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
You could reduce the above method and eliminate the "filters" by doing the following.<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0"?><br />
<system name="c172p-glass-effects"><br />
<channel name="rain"><br />
<fcs_function name="glass-effects/airspeed-clamped-sqrt"><br />
<function> <br />
<sqrt><br />
<quotient><br />
<min><br />
<property>/velocities/airspeed-kt</property><br />
<value>40</value><br />
</min><br />
<value>40</value><br />
</quotient><br />
</sqrt><br />
</function><br />
</fcs_function><br />
<fcs_function name="glass-effects/splashx"><br />
<function><br />
<difference><br />
<value>-0.1</value><br />
<product><br />
<value>2.0</value><br />
<property>/fdm/jsbsim/glass-effects/airspeed-clamped-sqrt</property><br />
</product><br />
</difference><br />
</function><br />
<output>/environment/aircraft-effects/splash-vector-x</output><br />
</fcs_function><br />
<fcs_function name="glass-effects/splashy"><br />
<function><br />
<value>0.0</value><br />
</function><br />
<output>/environment/aircraft-effects/splash-vector-y</output><br />
</fcs_function><br />
<fcs_function name="glass-effects/splashz"><br />
<function><br />
<difference><br />
<value>1.0</value><br />
<product><br />
<value>1.35</value><br />
<property>/fdm/jsbsim/glass-effects/airspeed-clamped-sqrt</property><br />
</product><br />
</difference><br />
</function><br />
<output>/environment/aircraft-effects/splash-vector-z</output><br />
</fcs_function><br />
</channel><br />
</system><br />
</syntaxhighlight><br />
<br />
Yet another method (currently used in the c172p) limits movement to a range of table entries. This gives the developer the ability to control the behavior even more.<br />
<syntaxhighlight lang="xml"><br />
<PropertyList><br />
<filter><br />
<name>splash-xa</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<expression><br />
<table><br />
<property>/velocities/airspeed-kt</property><br />
<entry><ind> 0 </ind><dep> -0.33 </dep></entry><br />
<entry><ind> 4 </ind><dep> -0.33 </dep></entry><br />
<entry><ind> 5 </ind><dep> -1.7 </dep></entry><br />
<entry><ind> 50 </ind><dep> -2.1 </dep></entry><br />
</table><br />
</expression><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-xa</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-za</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<expression><br />
<table><br />
<property>/velocities/airspeed-kt</property><br />
<entry><ind> 0 </ind><dep> 0.82 </dep></entry><br />
<entry><ind> 4 </ind><dep> 0.82 </dep></entry><br />
<entry><ind> 5 </ind><dep> -0.17 </dep></entry><br />
<entry><ind> 50 </ind><dep> -0.35 </dep></entry><br />
</table><br />
</expression><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-za</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-xr</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<expression><br />
<table><br />
<property>/engines/active-engine/rpm</property><br />
<entry><ind> 0 </ind><dep> -0.33 </dep></entry><br />
<entry><ind> 600 </ind><dep> -0.33 </dep></entry><br />
<entry><ind> 601 </ind><dep> -1.3 </dep></entry><br />
<entry><ind> 1500 </ind><dep> -1.9 </dep></entry><br />
</table><br />
</expression><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-xr</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-zr</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<expression><br />
<table><br />
<property>/engines/active-engine/rpm</property><br />
<entry><ind> 0 </ind><dep> 0.82 </dep></entry><br />
<entry><ind> 600 </ind><dep> 0.82 </dep></entry><br />
<entry><ind> 601 </ind><dep> 0.127 </dep></entry><br />
<entry><ind> 1500 </ind><dep> -0.29 </dep></entry><br />
</table>0<br />
</expression><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-zr</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-x</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<condition><br />
<greater-than-equals><br />
<property>/velocities/airspeed-kt</property><br />
<value>5</value><br />
</greater-than-equals><br />
</condition><br />
<property>/environment/aircraft-effects/splash-xa</property><br />
</input><br />
<input><br />
<condition><br />
<less-than><br />
<property>/velocities/airspeed-kt</property><br />
<value>5</value><br />
</less-than><br />
</condition><br />
<property>/environment/aircraft-effects/splash-xr</property><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-x</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-y</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<value>0.0</value><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-y</property><br />
</output><br />
</filter><br />
<filter><br />
<name>splash-z</name><br />
<update-interval-secs type="double">0.1</update-interval-secs><br />
<type>gain</type><br />
<gain>1.0</gain><br />
<input><br />
<condition><br />
<greater-than-equals><br />
<property>/velocities/airspeed-kt</property><br />
<value>5</value><br />
</greater-than-equals><br />
</condition><br />
<property>/environment/aircraft-effects/splash-za</property><br />
</input><br />
<input><br />
<condition><br />
<less-than><br />
<property>/velocities/airspeed-kt</property><br />
<value>5</value><br />
</less-than><br />
</condition><br />
<property>/environment/aircraft-effects/splash-zr</property><br />
</input><br />
<output><br />
<property>/environment/aircraft-effects/splash-vector-z</property><br />
</output><br />
</filter><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
=== Frost and fogging ===<br />
<br />
Frost on the canopy is rendered when environment/aircraft-effects/frost-level is set in the range from 0 to 1. Again, it is up to the aircraft developer to decide at what exterior conditions frosting should happen and whether the aircraft is equipped with heating to remove the frost again.<br />
<br />
Fogging is controlled by environment/aircraft-effects/fog-level in the range 0 to 1. Unless a mask is used, fogging is homogeneous across the whole surface (it is really intended to be used with a mask).<br />
<br />
=== Tint ===<br />
<br />
Tinted glass can be easily created by changing <br />
<br />
<syntaxhighlight lang="xml"><br />
<glass-tint type="vec4d" n="0"> 1.0 1.0 1.0 1.0</glass-tint><br />
</syntaxhighlight><br />
<br />
to any value desired. This will affect all effects assumed outside of the glass layer (frost and rain splashes) but not fogging inside the glass. Use primarily for development and quick tests, don't misuse the alpha value available here, it has odd side effects.<br />
<br />
=== Functional masks ===<br />
<br />
If the glass surface is uv-mapped and textured, it is possible to switch on a mask functionality in the inheritance via<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="2"><br />
<image>my_mask.png</image><br />
<type>2d</type><br />
<filter>linear-mipmap-linear</filter><br />
<wrap-s>clamp</wrap-s><br />
<wrap-t>clamp</wrap-t><br />
<internal-format>normalized</internal-format><br />
</texture><br />
<use-mask type="int">1</use-mask><br />
<overlay-color type="vec3d" n="0">1.0 1.0 1.0</overlay-color><br />
</syntaxhighlight><br />
<br />
The red channel in my_mask.png controls the strength of fogging, full red corresponds to maximal fogging, no red to zero fogging. This allows to selectively model the position of heaters in the cockpit. Use <b>/environment/aircraft-effects/fog-level</b> to adjust the actual amount of fog runtime.<br />
<br />
The green channel of my_mask.png is the amount of reduction of rain in an area. This is intended for airplanes equipped with windshield wipers to partially clear the wiped area of the rain. Whether the windshield wiper is actually on or not is controlled runtime via <b>/environent/aircraft-effects/use-wipers</b> (1 sets wipers to on).<br />
<br />
The blue channel of my_mask.png is reserved for an overlay pattern which will be drawn in an optionally specified <overlay-color> vector (white in the example xml above) - the primary function is to render damage on the glass, but with a different color, also dirt or an alternative more finely controlled frost pattern can be used. The strength of the pattern can be adjusted runtime via <b>/environment/aircraft-effects/overlay-alpha</b>, allowing dynamical accumulation of dirt or sudden appearance of damage.<br />
<br />
Examples for the result of a fog mask and a damage mask are shown below:<br />
<br />
[[File:Glass12.jpg|400px|Crack pattern using a damage mask]]<br />
[[File:Glass11.jpg|400px|Partial fogging using a mask texture]]<br />
<br />
<b>Note that by default all the runtime switches for the mask are off / set to zero! Remember to to switch them on when testing the effect!</b><br />
<br />
=== Mie scattering ===<br />
<br />
Most glass effects show prominent Mie forward scattering as in reality, i.e. frost patterns or fogging will appear much more prominent when looking almost towards the sun than under any other angle. While the frost pattern is normally not very prominent and one is able to look through unhindered, this changes substantially when looking into the sun, at which point it almost obscures the view.<br />
<br />
[[File:Glass08.jpg|400px|Mie scattering of low light on frost]]<br />
[[File:Glass13.jpg|400px|Morning sun Mie scattering on fog]]<br />
<br />
For frost and fog, the strength of the effect is set automatically, but for the damage/dirt layer it is under user control at effect design time. Changing the parameter<br />
<br />
<syntaxhighlight lang="xml"><br />
<overlay-glare type="float">0.5</overlay-glare><br />
</syntaxhighlight><br />
<br />
from its default value allows to adjust the strength of the glare when looking through the overlay layer close to the sun.<br />
<br />
=== Internal cockpit reflection ===<br />
<br />
There is support for a reflection of the cockpit interior.<br />
<br />
[[File:Reflect.jpg|640px|Internal glass cube map reflection]]<br />
<br />
<br />
This needs to be provided as a cubemap specific for the airplane and switched on via the flag <use-reflection> set to 1. The relative strength of the reflection can be optionally via <reflection-strength>. The strength of the reflection in the cockpit is dynamically adjusted for a number of factors, among them balance of direct to indirect light, the approximate amount of light falling on the surface seen in the reflection and the amount of direct sunlight falling into the eye.<br />
<br />
If the six cubemap faces are called my_cube_map_??.png, then using an effect file called c172p-reflect.eff the inheritance looks like this:<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<br />
<PropertyList><br />
<name>c172-reflect</name><br />
<inherits-from>Effects/glass</inherits-from><br />
<parameters><br />
<texture n="3"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>my_cube_map_px.png</positive-x><br />
<negative-x>my_cube_map_nx.png</negative-x><br />
<positive-y>my_cube_map_py.png</positive-y><br />
<negative-y>my_cube_map_ny.png</negative-y><br />
<positive-z>my_cube_map_pz.png</positive-z><br />
<negative-z>my_cube_map_nz.png</negative-z><br />
</images><br />
</texture><br />
<use-reflection type="int">1</use-reflection><br />
<reflection-strength type="float">1.0</reflection-strength><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
The inheritance call includes all surface objects that use the effect.<br />
<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Aircraft/c172p/Models/Effects/c172p-reflect</inherits-from><br />
<object-name>glas</object-name><br />
<object-name>rightwindow</object-name><br />
<object-name>leftwindow</object-name><br />
</effect><br />
</syntaxhighlight><br />
<br />
<br />
See below (Interior shading), for details on cube_map creation and orientation.<br />
<br />
=== Lightmaps for internal cockpit reflection ===<br />
<br />
If the cockpit is illuminated at night, the reflection map will not show this change by default. However,the glass effect supports a lightmap for the reflection, which can be used in parallel with the lightmap for the panels to show the reflection of a lit panel at night.<br />
<br />
Since the reflection map is a cube map, the lightmap for it has to be as well, the syntax is hence<br />
<br />
<syntaxhighlight lang="xml"><br />
<use-reflection-lightmap type="int">1</use-reflection-lightmap><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Models/Effects/interior/reflection/light-px.png</positive-x> <br />
<negative-x>Models/Effects/interior/reflection/light-nx.png</negative-x> <br />
<positive-y>Models/Effects/interior/reflection/light-py.png</positive-y> <br />
<negative-y>Models/Effects/interior/reflection/light-ny.png</negative-y> <br />
<positive-z>Models/Effects/interior/reflection/light-pz.png</positive-z> <br />
<negative-z>Models/Effects/interior/reflection/light-nz.png</negative-z> <br />
</images><br />
</texture><br />
</syntaxhighlight><br />
<br />
The control parameters of the lightmap otherwise parallel those of the [[Model-combined_effect]] or the model interior effect described below, i.e. up to four channels can be independently specified on the lightmap.<br />
<br />
=== Troubleshooting ===<br />
<br />
By default, rain and frost are mapped to the shape of the canopy using coordinate systems that adapts to the splash vector and the canopy shape. This requires no particular action aircraft-side except to provide the bare geometry of a canopy/windshield, but may not be satisfactory in all instances - in particular for near vertical cockpit side windows the scheme does poorly.<br />
<br />
There are two alternative coordinate maps available in this case, controlled by the parameter<br />
<br />
<syntaxhighlight lang="xml"><br />
<surface-mapping-scheme type="int">0</surface-mapping-scheme><br />
</syntaxhighlight><br />
<br />
If the parameter is changed to 1, the uv-mapping of the surface is used (it has to exist of course). For this to work properly, the uv-mapping needs to be sufficiently regular and roughly preserve the mapped area.<br />
<br />
If the parameter is changed to 2, a local orthonormal system based on the normals of the surface is constructed. This no longer takes the splash vector consistently into account and works poorly for surfaces which are flat in the (xy)-plane, but gives decent result for side windows.<br />
<br />
== The HUD effect ==<br />
<br />
The HUD effect is a variant of the glass effect designed to render the visuals of a head-up display (HUD) closer to real life. This only works if the HUD is custom-created via [[Canvas]], not via the native FG HUD mechanism as the latter by-passes the effect framework.<br />
<br />
The effect takes the same configuration options as the glass effect (i.e. it can render frost, damage, scratches, glare,...) but in addition it runs a blur over the HUD image and alters the color distribution of the projected symbols to de-saturate the bright parts in the center. The result looks less monochromatic and more like light projected onto a surface (left: bare canvas right: HUD effect)<br />
<br />
[[File:HUD effect.jpg|800px|Comparison between a bare canvas HUD (left) and the ALS HUD shader run over it (right)]]<br />
<br />
<br />
=== Usage ===<br />
<br />
The effect is used from the model file by assigning it to the surface that also carries the canvas texture of the HUD via<br />
<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Effects/hud</inherits-from><br />
<object-name>HUDImage</object-name><br />
</effect><br />
</syntaxhighlight><br />
<br />
This should usually work out of the box, but if the HUD brightness should be changeable or the glass properties adjusted, a derived effect needs to be created.<br />
<br />
=== Parameters ===<br />
<br />
In addition to the parameters supported by the glass shader (which, for instance in the case of rain splashes, may or may not be appropriate for a HUD, this is left at user's discretion), the HUD effect takes the following special parameters:<br />
<br />
<syntaxhighlight lang="xml"><br />
<brightness>1.0</brightness><br />
<sample-res>0.0006</sample-res><br />
<sample-far>2.5</sample-far><br />
</syntaxhighlight><br />
<br />
The first one is the relative brightness setting of the HUD (which should equal the alpha value assigned to the canvas image of the symbols). This parameter is used to de-saturate colors in the symbol centers.<br />
<br />
Remaining two parameters represent the size and shape of the blur Kernel being used. The sample resolution (sample-res) determines the overall size of the blur region, the farthest sample (sample-far) how far out the tails of the blur region extend.<br />
<br />
Note: The number of sampling steps is not computed adaptive to these parameters, if the steps get too coarse, then multiple image echoes instead of a proper blur will be generated - adjust these parameters with care (if at all).<br />
<br />
<br />
<br />
== The display effect ==<br />
<br />
Like the HUD effect, the display effect augments the visuals of a canvas, but in this case it simulates the effects on a multi-function display in cockpit, i.e. emissive light from a dark background.<br />
<br />
For that reason, the effect takes the same set of configuration parameters as the [[#The ALS interior model effect|interior model effect]], i.e. it can be supplied for instance with an opacity map.<br />
<br />
The expected and tested structure of the effect is that the display content is rendered on a canvas with transparent background color which in turn is above a different, dark-colored surface which stands for the display background. The best visuals are achieved when aircraft-internal shadows are rendered via opacity map on the dark surface and the corresponding contrast effects to the transparent canvas.<br />
<br />
Currently the effect does three major things:<br />
<br />
* at low light, it can make overly bright displays look slightly blurry and difficult to read as well as de-saturate the colors. This simulates the effects of a too-bright display on the eye and should prompt the user to dim the display.<br />
<br />
[[File:Display effect03.jpg|640px|Display effect: blur at low light (left)]]<br />
<br />
* at strong direct light, the effect can extinct the display content if it is set too dim. This should prompt the user to increase display brightness<br />
<br />
[[File:Display effect04.jpg|640px|Display effect: extinction at strong illumination]]<br />
<br />
* finally, if glancing light falls onto the display, the effect can render dust. Note that unlike normal diffuse lighting, the dust appears really strongest when the light almost hits the display from the side.<br />
<br />
[[File:Display shader dust.jpg|640px|Display effect: dust]]<br />
<br />
* in addition to that, the effect contains the same grain map the interior model effect offers. This can be used e.g. to superimpose a pixel raster (to simulate a CRT screen) or to dim the edges of the display as compared to the center as desired.<br />
<br />
=== Usage ===<br />
<br />
The effect is used from the model file by assigning it to the surface that also carries the canvas texture of the display via<br />
<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Effects/model-interior-display</inherits-from><br />
<object-name>DisplayImage</object-name><br />
</effect><br />
</syntaxhighlight><br />
<br />
If brightness changes of the display need to be simulated, the aircraft needs to pass parameters to the effect, so usually a derived effect would be created and assigned instead of the base effect in the example above.<br />
<br />
=== Parameters ===<br />
<br />
The effect can be configured with all the parameters of the model interior effect, most useful of those is likely the opacity map.<br />
<br />
As specifically new parameters, the following set is used:<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="5"><br />
<type>2d</type><br />
<filter>linear-mipmap-linear</filter><br />
<wrap-s>clamp</wrap-s><br />
<wrap-t>clamp</wrap-t><br />
<internal-format>normalized</internal-format><br />
<image>Aircraft/Generic/Effects/dust-effect-overlay.png</image><br />
</texture><br />
<sample-res>0.0007</sample-res><br />
<dirt-factor>3.0</dirt-factor><br />
<contrast>1.0</contrast><br />
</syntaxhighlight><br />
<br />
The supplied texture is the image of the dust layer that is shown. The default image is reasonable to show a dirty screen, but it can be changed into a user-supplied image.<br />
<br />
The first parameter is the sampling scale of the blur kernel (see the HUD effect). It describes how blurry the display will appear when overbright in a dark scene. For too large values, the finite number of samples will become very apparent, so this needs to be adjusted with care.<br />
<br />
The second parameter describes how pronounced the dirt layer appears - it is a multiplier to the alpha value of the dust texture. For the default texture, values in the range [0:3] are appropriate.<br />
<br />
The contrast parameter finally needs to be set by a model of the current mean light level in the cockpit (this is not just the ambient scene light, as there may be cockpit lights, instrument lights etc.) A contrast value of 0 means that the display is on the dim side with respect to the overall light level, a value of 2 means that it is set much to bright and will appear blurry and discolored.<br />
<br />
Conversely, a very low contrast value leads to display content extinction if direct light falls onto the display (this needs an opacity map for best effect and queries the texel color values, so the screen brightness should be set up by changing the surface emissivity for this to work correctly).<br />
<br />
Dependent on how the lighting inside the cockpit is modeled, it's the aircraft maintainer's responsibility to determine a good contrast value, FG does not have a good model of light inside a cockpit and eye adaption level.<br />
<br />
== The ALS interior model effect ==<br />
<br />
Since the interior of a cockpit is a large part of what a pilot gets to see in-flight, but this interior represents a rather special situation (light is reduced as it falls through windows, it may have artificial light, there is never any fog or haze,...) ALS offers a separate effect to specifically render the interior of a plane.<br />
<br />
This effect also includes optional features which will be available at higher quality settings of the model shader.<br />
<br />
=== Interior shadows and tinted glass effect ===<br />
<br />
With FlightGear version 3.5 and above, ALS now supports interior shading; i.e. the sun shining through the windows and casting shadows on the panel.<br />
<br />
[[File:interior01.jpg|640px|Interior shading effect]]<br />
<br />
This effect is based on an opacity map - a cube map of textures which tells the renderer where the cockpit is transparent and where not. The opacity map has to be created beforehand, which allows to make it quite detailed. In this map, white stands for a completely transparent surface, black for an opaque surface, colors for tinted glass which will create a colored light spot in the cockpit, grey hues for partial shadowing allowing to paint dirt effects onto the windows, and caustics can be drawn using the alpha channel: (1-alpha) will be used as an enhancement of the light at a certain spot.<br />
<br />
The effect is typically declared as derived by inheritance using an effect file such as c172-interior.eff which looks like this<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<br />
<PropertyList><br />
<name>c172-interior-glass</name><br />
<inherits-from>Effects/model-interior</inherits-from><br />
<parameters><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Models/Effects/interior/clr_px.png</positive-x><br />
<negative-x>Models/Effects/interior/clr_nx.png</negative-x><br />
<positive-y>Models/Effects/interior/clr_py.png</positive-y><br />
<negative-y>Models/Effects/interior/clr_ny.png</negative-y><br />
<positive-z>Models/Effects/interior/clr_pz.png</positive-z><br />
<negative-z>Models/Effects/interior/clr_nz.png</negative-z><br />
</images><br />
</texture><br />
<opacity-cube-center type="vec3d" n="0"> 0.5 0.0 0.3</opacity-cube-center><br />
<opacity-cube-scale type="vec3d" n="0"> 1.5 0.5 0.7</opacity-cube-scale><br />
<opacity-cube-angle type="float">0.0</opacity-cube-angle><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
which is called by inheritance in the model.xml file.<br />
<br />
Imagine the opacity map as a box surrounding the cockpit and trying to closely follow its contours. The origin in the box needs to be placed into the center of the cockpit, which is what <b><opacity-cube-center></b> does. Each of the three dimensions then needs to be stretched to roughly fit the layout of the canopy, this is done by <b><opacity-cube-scale></b>. <br />
<br />
If opacity map center and scale are wrong, you will still see shadows, but they won't match the real cockpit layout (the lightspot of a window will be seen displaced and at a different size of the real window). Thus, carefully measuring the best box layout in a 3d tool is moderately important.<br />
<br />
<br />
<br />
Aircraft-side the effect is called as<br />
<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Aircraft/c172p/Models/Effects/c172p-interior</inherits-from><br />
<object-name>Plane.010_0</object-name><br />
<object-name>Plane.010_1</object-name><br />
<object-name>PilotSeat</object-name><br />
<object-name>CopilotSeat</object-name><br />
<object-name>panel_1_1</object-name><br />
<object-name>InstrumentCover.001</object-name><br />
<object-name>doorint_right</object-name><br />
<object-name>doorint_left</object-name><br />
<object-name>doorhandleint_right</object-name><br />
<object-name>doorhandleint_left</object-name><br />
<object-name>Panel_0</object-name><br />
<object-name>Throttle</object-name><br />
<object-name>Mixture</object-name><br />
<object-name>Pedestal</object-name><br />
<object-name>TrimWheel</object-name><br />
<object-name>ParkingBrake</object-name><br />
<object-name>BackSeat</object-name><br />
<object-name>FuelSelectorFace</object-name><br />
</effect><br />
</syntaxhighlight><br />
<br />
Each object that you want the shadow effect to fall on must be included in the inheritance.<br />
<br />
Unless you supply a path, the cube_.png's need to reside in the same directory as the model.xml where you added the <effect> tag pair that calls c172-interior.eff, not where you put the aircraft_interior.eff.<br />
<br />
<br />
The orientation of the faces of each cube have to be adjusted based on the positive and negative axis of the model.<br />
<br />
For example, using the c172p model as a reference.<br />
<br />
The tail, right wing and top on the model are positive inside Blender. So the cube faces are laid out as follows.<br />
<br />
Note: Depending on the image's orientation when photographed the rotation direction will vary. This is assuming the images are being taken from the center of the cockpit looking out. Using compass headings to describe how to rotate the images.<br />
<br />
px (tail) rotate 90 deg from N or S to W<br />
<br />
nx (nose) rotate 90 deg from N or S to E<br />
<br />
py (starboard/right) from N do not rotate<br />
<br />
ny (port/left) from N rotate 180 deg to S<br />
<br />
pz (top) rotate 90 deg from N or S to W<br />
<br />
nz (bottom) rotate 90 deg from N or S to W<br />
<br />
[[File:C172p-cube.jpg|640px|Cube map layout of the c172p]]<br />
<br />
<br />
With Blender, it's pretty easy to create the cubemap.<br />
<br />
1. Add a camera where the cubemap will be. Set the FOV to 90 degrees.<br />
2. Set the resolution to 1024x1024 (or any other square, power-of-two size).<br />
3. Hide all lights and windows; disable ambient lighting (set it to black) and turn off ambient occlusion.<br />
4. Set the world color to white.<br />
5. Enable the compositor and add an invert node.<br />
6. Render and save the six views as you would normally.<br />
7. Add dirt, tinted glass color and caustics by hand<br />
<br />
This process depends on the model setup but it should work for most aircraft with a few tweaks.<br />
<br />
==== Cubemap Kit for Blender ====<br />
<br />
[[File:Als-interior-shadow-blender-instructions.png|320px|How to make an interior cubemap with the cubemap kit]]<br />
<br />
See [http://chateau-logic.com/content/flightgear-interior-shadow-cubemap-kit flightgear-interior-shadow-cubemap-kit] for a premade kit to create the cubemap and the .eff sample file to use it.<br />
<br />
==== Important Notes ====<br />
<br />
<b>Important note:</b> Currently (May 2015) the effect does not deal gracefully with child models included into the main model with offsets and/or rotations because these introduce a different coordinate system in which the shadow does not match. The general idea of a code solution is known, but not implemented. Right now this can only be addressed by explicitly positioning child models in the *.ac file and not using any offsets when including them.<br />
<br />
=== Shadow Mapping ===<br />
<br />
Shadow mapping is disabled by default for objects using the model-interior Effect. The previously mentioned technique of using a cubemap to render shadows is much cheaper than shadow mapping, but it suffers from perspective errors and the shadows can look wrong in some cases. If your aircraft does not use cubemap shadows and instead wants to rely on shadow mapping, you can add the following parameter to the <tt>predicate</tt> section of your Effect:<br />
<br />
<syntaxhighlight lang="xml"><br />
<shadow-mapping-enabled type="bool">true</shadow-mapping-enabled><br />
</syntaxhighlight><br />
<br />
'''Special note:'''<br />
Because your still using model-interior and model-interior.eff is setup around the opacity cube map, if you go without one, and in the event you try, you get an environment reflection cube map as default which happens to have green grass on it and may cast a greenish hue over applied objects thus washing out the compositor shadows some what. A workaround is to create a pseudo cubemap by creating a white.png 64x64 square, and creating the following structure to represent a transparent cubemap.<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Aircraft/c172p/Models/Effects/interior/white.png</positive-x><br />
<negative-x>Aircraft/c172p/Models/Effects/interior/white.png</negative-x><br />
<positive-y>Aircraft/c172p/Models/Effects/interior/white.png</positive-y><br />
<negative-y>Aircraft/c172p/Models/Effects/interior/white.png</negative-y><br />
<positive-z>Aircraft/c172p/Models/Effects/interior/white.png</positive-z><br />
<negative-z>Aircraft/c172p/Models/Effects/interior/white.png</negative-z><br />
</images><br />
</texture><br />
</syntaxhighlight><br />
<br />
=== ALS flashlight ===<br />
<br />
This effect is meant to imitate a hand held flashlight for use in getting instruments in the cockpit turned on in dark conditions.<br />
It is almost identical in nature to ALS searchlight only it is applied using interior-model.eff.<br />
It has two user defined light color filters that can be applied and also a user defined light radius setting.<br />
<br />
[[File:ALS flashlight.jpg|600px|ALS flashlight effect]]<br />
<br />
To implement this effect use<br />
<syntaxhighlight lang="xml"><inherits-from>Effects/model-interior</inherits-from></syntaxhighlight><br />
A full definition looks like this<br />
<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0" encoding="utf-8"?><br />
<PropertyList><br />
<name>c172-interior</name><br />
<inherits-from>Effects/model-interior</inherits-from><br />
<parameters><br />
<light-filter-one type="vec3d">0.5 0.5 0.5</light-filter-one><br />
<light-filter-two type="vec3d">0.9 0.2 0.2</light-filter-two><br />
<light-radius type="float">13</light-radius><br />
</parameters><br />
</PropertyList><br />
</syntaxhighlight><br />
In the example above light-filter-one is soft white light and light-filter-two is a soft red light.<br />
<br />
After defining as above you can turn it on using the following property<br />
<br />
/sim/rendering/als-secondary-lights/use-flashlight = 1 is light-filter-one<br />
<br />
/sim/rendering/als-secondary-lights/use-flashlight = 2 is light-filter-two<br />
<br />
'''Special note:'''<br />
The flashlight effect inherits model-interior, model-interior.eff is setup around the opacity cube map, it won't allow you to go without one, and in the event you try, you get an environment reflection cube map as default which happens to have green grass on it and may cast a greenish hue over applied objects.<br />
A workaround is to create a pseudo cubemap by creating a white.png 64x64 square, and creating the following structure to represent a transparent cubemap.<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Aircraft/c172p/Models/Effects/interior/white.png</positive-x><br />
<negative-x>Aircraft/c172p/Models/Effects/interior/white.png</negative-x><br />
<positive-y>Aircraft/c172p/Models/Effects/interior/white.png</positive-y><br />
<negative-y>Aircraft/c172p/Models/Effects/interior/white.png</negative-y><br />
<positive-z>Aircraft/c172p/Models/Effects/interior/white.png</positive-z><br />
<negative-z>Aircraft/c172p/Models/Effects/interior/white.png</negative-z><br />
</images><br />
</texture><br />
</syntaxhighlight><br />
<br />
=== Implicit lightmap ===<br />
<br />
At lowest quality level, the effect supports an implicit lightmap, i.e. a color range of the basic texture can be selected and declared to act as a lightmap. This is specifically useful to render panel backlighting as in the example below:<br />
<br />
[[File:Ilightmap.jpg|600px|An implicit lightmap used to simulate a backlit panel]]<br />
<br />
The effect is off by default and switched on by setting<br />
<br />
<syntaxhighlight lang="xml"><br />
<implicit-lightmap-enabled type="int">1</implicit-lightmap-enabled><br />
</syntaxhighlight><br />
<br />
The following parameters are available:<br />
<br />
<syntaxhighlight lang="xml"><br />
<implicit-lightmap-tag-color type="vec3d">1.0 1.0 1.0</implicit-lightmap-tag-color><br />
</syntaxhighlight><br />
<br />
This sets the base color to be tagged, i.e. if the panel labels to be illuminated at night are white, the color needs to be set to white.<br />
<br />
<syntaxhighlight lang="xml"><br />
<implicit-lightmap-threshold-low type="float">0.5</implicit-lightmap-threshold-low><br />
<implicit-lightmap-threshold-high type="float">1.5</implicit-lightmap-threshold-high><br />
</syntaxhighlight><br />
<br />
The thresholds determine how similar a color may be to the base color in order to be still illuminated. The measure is the Euklidean distance of the color vectors. The lower thresholds determines when illumination will start to fade, the higher threshold at what distance in color space illumination will no longer take place. The thresholds have to be adapted to the specific situation - the technique works best for high-contrast panels (white labels on black background) and may not work at all for low contrast panels.<br />
<br />
<syntaxhighlight lang="xml"><br />
<implicit-lightmap-emit-color type="vec3d">1.0 1.0 1.0</implicit-lightmap-emit-color><br />
</syntaxhighlight><br />
<br />
The emit color specifies at which color the pixel will show if it is tagged (see above) and the implicit lightmap is on (see below) - set this to the color of the backlight.<br />
<br />
<syntaxhighlight lang="xml"><br />
<implicit-lightmap-intensity type="float">0.0</implicit-lightmap-intensity><br />
</syntaxhighlight><br />
<br />
Finally, the intensity determines how brightly the illuminated pixel will shine.<br />
<br />
Ambiance lighting can be simulated with the following tags.<br />
<br />
<syntaxhighlight lang="xml"><br />
<residual-ambience-r type="float"><use>/fdm/jsbsim/systems/light/cockpit-ambience-r</use></residual-ambience-r><br />
<residual-ambience-g type="float"><use>/fdm/jsbsim/systems/light/cockpit-ambience-g</use></residual-ambience-g><br />
<residual-ambience-b type="float"><use>/fdm/jsbsim/systems/light/cockpit-ambience-b</use></residual-ambience-b><br />
</syntaxhighlight><br />
<br />
In the above example note the use of the "use" tag.<br />
<br />
<syntaxhighlight lang="xml"><br />
<use>/fdm/jsbsim/systems/light/cockpit-ambience-r</use><br />
</syntaxhighlight><br />
<br />
This can be any defined property or static value.<br />
<br />
'''Special note:'''<br />
The implicit lightmap inherits model-interior, model-interior.eff is setup around the opacity cube map, it won't allow you to go without one, and in the event you try, you get an environment reflection cube map as default which happens to have green grass on it and may cast a greenish hue over applied objects.<br />
A workaround is to create a pseudo cubemap by creating a white.png 64x64 square, and creating the following structure to represent a transparent cubemap.<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Aircraft/c172p/Models/Effects/interior/white.png</positive-x><br />
<negative-x>Aircraft/c172p/Models/Effects/interior/white.png</negative-x><br />
<positive-y>Aircraft/c172p/Models/Effects/interior/white.png</positive-y><br />
<negative-y>Aircraft/c172p/Models/Effects/interior/white.png</negative-y><br />
<positive-z>Aircraft/c172p/Models/Effects/interior/white.png</positive-z><br />
<negative-z>Aircraft/c172p/Models/Effects/interior/white.png</negative-z><br />
</images><br />
</texture><br />
</syntaxhighlight><br />
<br />
=== Irradiance maps ===<br />
<br />
<b>Note:</b> This effect requires higher than minimum model shader quality setting.<br />
<br />
In the simplest rendering schemes, diffuse and specular light are assumed to be highly directional (i.e. it illuminates lit surfaces only) while ambient light is taken to be omnidirectional.<br />
<br />
In reality, that is hardly ever true. In a typical outside location, ambient light is mainly coming from the sky above (which is why the ground underneath a car is dark even in the absence of directional light when the sky is overcast and the sun is not visible). In an enclosed space (like a room, or an aircraft cockpit), ambient light has to fall through the windows, i.e. is mainly not coming above but falling in horizontally.<br />
<br />
The directional dependence is not very strong though, yet it leaves measurable effects. In rendering, this can be accounted for by irradiance maps. In the following, the interior of the C-172p is rendered in the first case using omnidirectional ambient light, in the second case using an irradiance map giving the ambient light the directionality of the cabin windows, i.e. the light falls in predominantly horizontally (in addition, a grain map is superimposed to provide structure). Note how the spatial structure of the roof, looking bland when rendered in omnidirectional light is brought out by the irradiance map.<br />
<br />
[[File:Als-interior-irradiance01.jpg|400px|C-172p cabin interior rendered without irradiance and grain map]]<br />
[[File:Als-interior-irradiance02.jpg|400px|C-172p cabin interior rendered with irradiance and grain map]]<br />
<br />
Irradiance mapping is configured by the following parameters:<br />
<br />
<syntaxhighlight lang="xml"><br />
<irradiance-map-type type="int">2</irradiance-map-type><br />
<irradiance-map-strength type="float">0.5</irradiance-map-strength><br />
</syntaxhighlight><br />
<br />
There are several pre-configured irradiance map functions which can be chosen by map type. <br />
<br />
0: (default) omndirectional light<br />
1: light predominantly coming from above (most appropriate for fighter cockpits)<br />
2: light predominantly coming from the horizon (most appropriate for GA aircraft)<br />
<br />
The strength of the irradiance map regulates how pronounced the asymmetry of the map will be. A strength of zero always makes the light omnidirectional, whereas a strength of 1 implies that no light is coming from any direction 90 degree to the main direction (i.e. for the option 2, a strength of 1.0 means that no ambient light will fall in from above or below and that hence horizontal surfaces will appear pitch black unless direct light falls on them)<br />
<br />
'''Special note:'''<br />
The irradiance map inherits model-interior, model-interior.eff is setup around the opacity cube map, it won't allow you to go without one, and in the event you try, you get an environment reflection cube map as default which happens to have green grass on it and may cast a greenish hue over applied objects.<br />
A workaround is to create a pseudo cubemap by creating a white.png 64x64 square, and creating the following structure to represent a transparent cubemap.<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="4"><br />
<type>cubemap</type><br />
<images><br />
<positive-x>Aircraft/c172p/Models/Effects/interior/white.png</positive-x><br />
<negative-x>Aircraft/c172p/Models/Effects/interior/white.png</negative-x><br />
<positive-y>Aircraft/c172p/Models/Effects/interior/white.png</positive-y><br />
<negative-y>Aircraft/c172p/Models/Effects/interior/white.png</negative-y><br />
<positive-z>Aircraft/c172p/Models/Effects/interior/white.png</positive-z><br />
<negative-z>Aircraft/c172p/Models/Effects/interior/white.png</negative-z><br />
</images><br />
</texture><br />
</syntaxhighlight>.<br />
<br />
=== Explicit lightmap ===<br />
<br />
<b>Note:</b> This effect requires higher than minimum model shader quality setting.<br />
<br />
In addition to the implicit lightmap, it is also possible to explicitly specify a lightmap. The syntax for this exactly parallels the syntax of the [[Model-combined_effect]] which supplies lightmaps for the exterior.<br />
<br />
For example<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="3"><br />
<image>Aircraft/MyAircraft/Effects/my_lightmap.png</image><br />
<type>2d</type><br />
<filter>linear-mipmap-linear</filter><br />
<wrap-s>clamp</wrap-s><br />
<wrap-t>clamp</wrap-t><br />
<internal-format>normalized</internal-format><br />
</texture><br />
<lightmap-enabled type="int">1</lightmap-enabled><br />
<lightmap-multi type="int">0</lightmap-multi><br />
<lightmap-factor type="float" n="0">1.0</lightmap-factor><br />
<lightmap-color type="vec3d" n="0"> 1.0 1.0 1.0 </lightmap-color><br />
</syntaxhighlight><br />
<br />
sets up a single channel lightmap in which pixel color times the lightmap color provides the illumination. Using the multi-channel function, up to four different maps can be specified in which the (rgba) values of a pixel encode where the light falls and the associated lightmap color what color the illumination takes. Each of these maps can be switched on and off or dimmed in intensity independently.<br />
<br />
=== Grain map ===<br />
<br />
<b>Note:</b> This effect requires higher than minimum model shader quality setting.<br />
<br />
The grain map sets a repeating hires overlay texture which can supply a very credible illusion of structure to a surface for cheap. The syntax exactly parallels that of the [[Model-combined_effect]] ALS grain feature described above.<br />
<br />
For instance, the following<br />
<br />
<syntaxhighlight lang="xml"><br />
<texture n="7"><br />
<image>Aircraft/Effects/MyGrainmap.png</image><br />
<type>2d</type><br />
<filter>linear-mipmap-linear</filter><br />
<wrap-s>repeat</wrap-s><br />
<wrap-t>repeat</wrap-t><br />
<internal-format>normalized</internal-format><br />
</texture><br />
<grain-texture-enabled type="int">1</grain-texture-enabled><br />
<grain-magnification type="float">10</grain-magnification><br />
</syntaxhighlight><br />
<br />
sets up a grain overlay with a 10-time higher resolution over the base texture layer.<br />
<br />
== ALS procedural lights ==<br />
<br />
The ALS framework supports procedurally generated lights (for instance aircraft position lights, strobe lights,... ) for aircraft and models. Note that the effect produces the visuals of the lights themselves, but they do not illuminate their surroundings.<br />
<br />
=== Why procedural lights? ===<br />
<br />
Traditionally aircraft position lights have been implemented as billboarded emissive textures. This technique is limited in scope, as it has difficulty producing a directional light or changes in the light appearance (for instance glare) with changed scene lighting. The ALS procedural lights are designed to give visuals consistent with the auto-generated scene lights (runway lighting, street lights) and support configurable directionality, glare and even the illumination of fog by the lights.<br />
<br />
<br />
=== Basic implementation ===<br />
<br />
The base of the light is a texture quad which has Effects/procedural-light.eff assigned. Start from including the template provided into your model as<br />
<br />
<syntaxhighlight lang="xml"><br />
<model><br />
<path>/Models/Effects/procedural_light.xml</path><br />
<offsets><br />
<x-m> 0 </x-m><br />
<y-m> 0 </y-m><br />
<z-m> 2 </z-m><br />
</offsets><br />
</model><br />
</syntaxhighlight><br />
<br />
and configure from there according to your own needs.<br />
<br />
<b>Do not billboard the light via animation!</b> The GLSL code will take care of the billboarding. Use a scale animation to change the size of the light, do not change the quad (the *.ac) itself in size, the shader code requires its geometry to be fixed.<br />
<br />
The lights are currently not supported in the default or Rembrandt renderer and will simply be invisible in these frameworks.<br />
<br />
=== Configuring the light ===<br />
<br />
Make your own derived effect inheriting from Effects/procedural-light.eff and assign it in the xml wrapper of the light.<br />
<br />
====The base light color set====<br />
<br />
The base light color can be set via:<br />
<br />
<syntaxhighlight lang="xml"><br />
<light_color_base_r type="float">1.0</light_color_base_r><br />
<light_color_base_g type="float">0.0</light_color_base_g><br />
<light_color_base_b type="float">0.0</light_color_base_b><br />
</syntaxhighlight><br />
<br />
These take the normal set of values ranging from 0 to 1. <br />
<br />
====Light full intensity in the center====<br />
<br />
Now the light appears at full intensity in the center can be set via:<br />
<br />
<syntaxhighlight lang="xml"><br />
<light_color_center_r type="float">1.0</light_color_center_r><br />
<light_color_center_g type="float">1.0</light_color_center_g><br />
<light_color_center_b type="float">1.0</light_color_center_b><br />
</syntaxhighlight><br />
<br />
The idea behind this is that lights give a better visual appearance if their center is rendered visually brighter and de-saturated, but this occurs only if the light is at full intensity.<br />
<br />
There are no sanity checks done, you can assign any center color you like even if this makes no sense - you can change center color or darken it, so use with care.<br />
<br />
====Runtime change the light intensity====<br />
<br />
To runtime change the light intensity, assign<br />
<br />
<syntaxhighlight lang="xml"><br />
<intensity_scale type="float">1.0</intensity_scale><br />
</syntaxhighlight><br />
<br />
to a property and change that property in the range from 0 to 1. Eg:<br />
<br />
<syntaxhighlight lang="xml"><br />
<intensity_scale><br />
<use>/rendering/nav-lights-factor</use><br />
</intensity_scale><br />
</syntaxhighlight><br />
<br />
====Set directional lights====<br />
<br />
For directional lights, you need to assign a pointing vector in aircraft coordinates into which the light cone points and set the directionality flag to true to activate the computations. This is done via:<br />
<br />
<syntaxhighlight lang="xml"> <br />
<pointing_x type="float">-1.0</pointing_x><br />
<pointing_y type="float">0.0</pointing_y><br />
<pointing_z type="float">0.0</pointing_z><br />
<is_directional type="bool">true</is_directional><br />
</syntaxhighlight><br />
<br />
It would be customary to pass a normalized vector, but if you don't know how to do it, the shader will do it for you. By assigning properties to the pointing coordinates, the light direction can be changed runtime.<br />
<br />
<b>Do not use a rotation animation to change the light direction - it won't work.</b> Make the pointing vector properties and change them to your needs.<br />
<br />
====Fading of a directional light====<br />
[[File:Directional light.jpg|thumb|Explanation of a light radiation pattern]]<br />
The fading of a directional light away from the pointing axis is controlled by passing angles (or rather sines of angles).<br />
<br />
<syntaxhighlight lang="xml"> <br />
<inner_angle type="float">0.2</inner_angle><br />
<outer_angle type="float">0.4</outer_angle><br />
<zero_angle type="float">0.7</zero_angle><br />
<outer_gain type="float">0.5</outer_gain><br />
</syntaxhighlight><br />
<br />
Up to inner_angle, the light will have full intensity. From inner to outer angle the light will linearly fade to outer_gain. From outer angle to zero angle, the light intensity will linearly fade to zero.<br />
<br />
====Strobe effect====<br />
<br />
For get an automatic strobe effect you can set:<br />
<br />
<syntaxhighlight lang="xml"> <br />
<is_strobe type="bool">true</is_strobe><br />
</syntaxhighlight><br />
<br />
to true. If you want your own strobe pattern, generate a strobe function and use <b>intensity_scale</b> instead to pass it to the shader.<br />
<br />
=== Complete example ===<br />
<br />
Here's the left nav light of the C-172p:<br />
<br />
<syntaxhighlight lang="xml"> <br />
<?xml version="1.0" encoding="utf-8"?><br />
<PropertyList><br />
<br />
<name>procedural-light-nav-left</name><br />
<inherits-from>Effects/procedural-light</inherits-from><br />
<br />
<parameters><br />
<light_color_base_r type="float">1.000</light_color_base_r><br />
<light_color_base_g type="float">0.320</light_color_base_g><br />
<light_color_base_b type="float">0.320</light_color_base_b><br />
<light_color_center_r type="float">1.0</light_color_center_r><br />
<light_color_center_g type="float">1.0</light_color_center_g><br />
<light_color_center_b type="float">1.0</light_color_center_b><br />
<intensity_scale type="float">1.0</intensity_scale><br />
<br />
<!-- Arc is 110 deg, is 55 deg per side, giving 35 deg from wing --><br />
<pointing_x type="float">1.0</pointing_x><br />
<pointing_y type="float">0.7002075382097097</pointing_y><br />
<pointing_z type="float">0.0</pointing_z><br />
<br />
<is_directional type="bool">true</is_directional><br />
<is_strobe type="bool">false</is_strobe><br />
<br />
<!-- Angles are 0.0 at 0 deg from pointing direction, 1.0 at<br />
90/-90 deg, and 0.0 at 180/-180 deg.<br />
<br />
For left navigation light we use -0/-35 .. +110/+145 for<br />
the inner/outer range. This gives an arc of 110/180 deg,<br />
or 55/90 deg from center.<br />
<br />
Value = sin(angle in degrees)<br />
<br />
0.8191520442889918 = 55 deg (* 2 = 110 deg inner angle)<br />
1.0000 = 90 deg (* 2 = 180 deg outer angle)<br />
--><br />
<inner_angle type="float">0.8191520442889918</inner_angle><br />
<outer_angle type="float">1.0</outer_angle><br />
<zero_angle type="float">0.982547593563</zero_angle><br />
<outer_gain type="float">0.1</outer_gain><br />
</parameters><br />
<br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
=== Examples ===<br />
The Cessna 182 by Heiko Schulz and Gilberto Agostinho with procedural lights activated:<br><br />
:''(To percieve the effect well, you probably have to darken your room and switch to fullscreen)''<br />
[[File:Cessna 182 with procedural lights.jpg|800px]]<br />
<br />
===Move dynamically the procedural light===<br />
<br />
The position of a procedural light is declared in the '''<model>''' section, within the '''<PropertyList>''' XML code, for example:<br />
<br />
<syntaxhighlight lang="xml"><br />
<model><br />
<name>procedural-light-gear-white-left</name><br />
<path>Effects/lights/procedural_light_gear_white.xml</path><br />
<offsets><br />
<x-m> -3.08</x-m><br />
<y-m> -0.21 </y-m><br />
<z-m> -1.18 </z-m><br />
</offsets><br />
</model><br />
</syntaxhighlight><br />
<br />
The tag ''procedural-light-gear-white-left'' is very important because is the object name. This name will be used as the reference object.<BR>Next, we can define an animation in the same xml file:<br />
<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>rotate</type><br />
<object-name>GearFrontalDoor</object-name><br />
<object-name>procedural-light-gear-white-left</object-name><br />
<property>gear/gear/position-norm</property><br />
<axis><br />
<x1-m> -3.00240</x1-m><br />
<y1-m> 1.0</y1-m><br />
<z1-m> -1.02906</z1-m><br />
<x2-m> -3.00240</x2-m><br />
<y2-m> -1.0</y2-m><br />
<z2-m> -1.0290</z2-m><br />
</axis><br />
<interpolation><br />
<entry><ind>0.0</ind><dep>90</dep></entry><br />
<entry><ind>0.25</ind><dep>90</dep></entry><br />
<entry><ind>0.50</ind><dep>60</dep></entry><br />
<entry><ind>0.75</ind><dep>30</dep></entry><br />
<entry><ind>1.0</ind><dep>0</dep></entry><br />
</interpolation><br />
</animation><br />
</syntaxhighlight><br />
<br />
The ''procedural light'' object code is this:<br />
<br />
<syntaxhighlight lang="xml"><br />
<object-name>procedural-light-gear-white-left</object-name><br />
</syntaxhighlight><br />
<br />
== ALS fuselage shadow effect ==<br />
ALS supports the manipulation of a (simplified) ground shadow. This effect uses an existing simplified shadow animation configuration and by default uses the gear-agl-m property to calculate the ground placement of that simplified shadow.<br />
<br />
The system, techniques for using it, and several working examples are on [https://forum.flightgear.org/viewtopic.php?f=47&t=24859&start=135 this extensive forum thread about the ALS shadow effects].<br />
<br />
[[File:Alsshadow.jpg|800px|ALS Shadow]]<br />
<br />
The effect can be applied easily in any aircraft that report the gear-agl-m property by simply adding a declaration inheriting from shadow.eff.<br />
<br />
If the aircraft does not support the gear-agl-m property, (notably JSBSim), you need to create a [[Autopilot configuration reference | Property Rule]] to pass a supported AGL data to the gear-agl-m property. In this case we use altitude-agl-ft converted to meters using a property rule configuration file.<br />
<br />
For the first example we'll use the "supported gear-agl-m" method for aircraft that don't require a property rule.<br />
<br />
Simply add the following inheritance declaration after you declare your shadow animation statement.<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Effects/shadow</inherits-from><br />
<object-name>name_of_the_shadow_object</object-name><br />
</effect><br />
</syntaxhighlight><br />
In the non-ALS simplified shadow code you normally use a "translate" animation to position the shadow on the ground.<br />
When using the ALS method you must either remove, comment out, or apply a condition to restrict its use to non ALS shadow applications, because ALS is responsible for computing the shadows ground position.<br />
<br />
Here is how we apply a condition to the translation to limit it effect to non-ALS application only.<br />
<syntaxhighlight lang="xml"><br />
<!--Translate to ground level --><br />
<animation><br />
<type>translate</type><br />
<object-name>shadow</object-name><br />
<condition><br />
<not><br />
<property>/sim/rendering/shaders/skydome</property><br />
</not><br />
</condition><br />
<property>/position/altitude-agl-ft</property><br />
<factor>-0.3048</factor><br />
<center><br />
<x-m>0</x-m><br />
<y-m>0</y-m><br />
<z-m>0</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>0</y><br />
<z>1</z><br />
</axis><br />
</animation><br />
</syntaxhighlight><br />
<br />
A complete shadow animation block looks like this.<br />
<syntaxhighlight lang="xml"><br />
<PropertyList><br />
<br />
<animation><br />
<!-- opaque objects --><br />
<!-- transparent objects --><br />
<object-name>shadow</object-name><br />
<type>select</type><br />
<condition><br />
<not><br />
<property>/sim/rendering/rembrandt/enabled</property><br />
</not><br />
</condition><br />
</animation><br />
<br />
<effect><br />
<inherits-from>Effects/shadow</inherits-from><br />
<object-name>shadow</object-name><br />
</effect><br />
<br />
<animation><br />
<type>noshadow</type><br />
<object-name>shadow</object-name><br />
</animation><br />
<br />
<!-- pitch --><br />
<animation><br />
<type>rotate</type><br />
<object-name>shadow</object-name><br />
<property>/orientation/pitch-deg</property><br />
<factor>-1.0</factor><br />
<center><br />
<x-m>0</x-m><br />
<y-m>0</y-m><br />
<z-m>0</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
<br />
<!-- roll --><br />
<animation><br />
<type>rotate</type><br />
<object-name>shadow</object-name><br />
<property>/orientation/roll-deg</property><br />
<factor>1.0</factor><br />
<center><br />
<x-m>0</x-m><br />
<y-m>0</y-m><br />
<z-m>0</z-m><br />
</center><br />
<axis><br />
<x>1</x><br />
<y>0</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
<br />
<!--Translate to ground level --><br />
<animation><br />
<type>translate</type><br />
<object-name>shadow</object-name><br />
<condition><br />
<not><br />
<property>/sim/rendering/shaders/skydome</property><br />
</not><br />
</condition><br />
<property>/position/altitude-agl-ft</property><br />
<factor>-0.3048</factor><br />
<center><br />
<x-m>0</x-m><br />
<y-m>0</y-m><br />
<z-m>0</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>0</y><br />
<z>1</z><br />
</axis><br />
</animation><br />
<br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
For aircraft requiring a [[Autopilot configuration reference | Property Rule]] there are a couple extra steps.<br />
<br />
In aircraft-set.xml you add the property rule call to the "configuration file" in between the PropertyList/sim/systems tag pairs.<br />
<syntaxhighlight lang="xml"> <br />
<property-rule n="101"><br />
<name>gear_agl-m</name><br />
<path>Aircraft/c172p/Systems/gearAGL.xml</path><br />
</property-rule><br />
</syntaxhighlight><br />
Note: the n="101" needs to be =+100 as -100 is reserved for system wide property rules.<br />
In the above example 101 was used because 100 was already being used by a previous property rule definition.<br />
<br />
The "configuration file" normally goes in /Systems.<br />
In this example we named the configuration file /Systems/gearAGL.xml.<br />
<br />
Here is the complete /Systems/gearAGL.xml configuration file.<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0"?><br />
<br />
<PropertyList><br />
<filter><br />
<type>gain</type><br />
<gain>0.3048</gain><br />
<input>/position/altitude-agl-ft</input><br />
<reference>6</reference><br />
<output>/position/gear-agl-m</output><br />
</filter><br />
</PropertyList><br />
</syntaxhighlight><br />
What the configuration file does is convert the input of altitude-agl-ft to the output of (((altitude-agl-ft)-6)*0.3048) or (convert ft-6 to m) and pass it to /position/gear-agl-m.<br />
<br />
See [[Autopilot configuration reference | Input and reference properties or values <input> and <reference>]].<br />
<br />
== ALS 3d shadow volume effect ==<br />
What might be considered the next level of realism using a relatively "cheap" shadow effect is to use a 3d volume shadow.<br />
<br />
[[File:Shadow vol02.jpg|800px|ALS 3d Shadow Volume]]<br />
<br />
The procedure to implement the ALS shadow volume is similar to the ALS-shadow above with a few modifications.<br />
<br />
First you have to have a 3d shadow volume model of the aircraft you are applying the effect to. This model should be a low poly model that is optimized to be as little of a footprint as possible.<br />
<br />
A property rule is required, same as above. This is used to generate the above ground altitude in meters, (altitude-agl-m). The "altitude-agl-m" is used to place the shadow close to the ground in real time at an FDM rate of execution.<br />
{{note|Do not confuse "altitude-agl-m" with the other type of non-3d ALS-shadow property of "gear-agl-m". The shaders involved use these two different properties respectively for the two different effect. They are not interchangeable.}}<br />
<syntaxhighlight lang="xml"><br />
<?xml version="1.0"?><br />
<PropertyList><br />
<filter><br />
<type>gain</type><br />
<gain>0.3048</gain><br />
<input>/position/altitude-agl-ft</input><br />
<reference>1.0</reference><br />
<output>/position/altitude-agl-m</output><br />
</filter><br />
</PropertyList><br />
</syntaxhighlight><br />
<br />
The other difference from the ALS-shadow above is that it uses a different inherited effect.<br />
Instead of<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Effects/shadow</inherits-from><br />
<object-name>shadow</object-name><br />
</effect><br />
</syntaxhighlight><br />
you use<br />
<syntaxhighlight lang="xml"><br />
<effect><br />
<inherits-from>Effects/shadow-vol</inherits-from><br />
<object-name>shadow</object-name><br />
</effect><br />
</syntaxhighlight><br />
<br />
To make sure there is no duplicate 3d model shown in other renderers besides ALS it is also important to use a different select animation:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<!-- hide 3d shadow in non ALS mode --><br />
<object-name>shadow</object-name><br />
<type>select</type><br />
<condition><br />
<property>/sim/rendering/shaders/skydome</property><br />
</condition><br />
</animation><br />
</syntaxhighlight><br />
<br />
== Related content ==<br />
<br />
* [[Procedural Texturing]]<br />
* [[Atmospheric light scattering]]<br />
* [[ALS infrared vision]]<br />
<br />
[[Category:Atmospheric light scattering shader]]<br />
[[Category:Aircraft enhancement]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User:Richard_H&diff=128909User:Richard H2020-11-11T11:08:21Z<p>Richard H: </p>
<hr />
<div>{{user<br />
| name = Richard Harrison<br />
| location = France<br />
| interests =<br />
* Flight Simulation<br />
* Aerodynamic modelling<br />
* FlightGear aircraft modelling<br />
* FlightGear core development<br />
* Aviation, especially Naval Aviation<br />
| callsign = [https://fgtracker.ml/modules/fgtracker/?FUNCT=FLIGHTS&CALLSIGN=Richard Richard]<br />
| favourite =<br />
* [[McDonnell_Douglas_F-15_Eagle|F-15]] (Main developer)<br />
* [[Grumman_F-14_Tomcat|F-14]] (Main developer)<br />
* Tornado F2<br />
* BAe Hawk<br />
| website = zaretto.com<br />
| website = chateau-logic.com<br />
}}<br />
<br />
== About me ==<br />
I've been involved in Flight Simulation since 1984 when I started working at Link-Miles in Lancing, England on the Tornado F2 simulator. I've worked on (and flown) many certified simulators since then, including B737-2/3/4/5, A320, BAe Hawk, B757/767, B747-2/4, Super Puma.<br />
<br />
There are some [[http://chateau-logic.com/taxonomy/term/60 FlightGear articles]] that I've published on my personal site.<br />
<br />
=== Contributions to FlightGear ===<br />
Returning to FlightGear in 2014 after a renewed interest in simulation the first thing I did was to redevelop the aerodynamics model for the F-14 based on real data [[http://zaretto.com/F-14 F-14 Development page]] this took me a few months and I fixed a load of other things afterwards. The next logical step seemed to be the F-15 which was very poorly modelling and I felt a serious omission in aircraft for FlightGear. So I built a new model based on the F-14, [[http://zaretto.com/F-15 F-15 development page]]<br />
<br />
==== Aircraft Models ====<br />
* F-14<br />
* F-15<br />
* F-16<br />
* Supermarine Swift FR.5<br />
* Jaguar GR1<br />
* Mirage 2000-5<br />
<br />
==== Core development ====<br />
In 2016 I became a core developer and really have been focussed around improvements to the core to improve performance, improve modelling and Naval aviation.<br />
<br />
* 2015 - Crashes on exit<br />
* 2016 - Multiplayer segfaults<br />
* 2016 - FGData; Simple generic MFD framework<br />
* 2016 - Emesary (Nasal)<br />
* 2016 - Added date to the Time dialog <br />
* 2017 - Improved Multiplayer protocol (more efficient usage of space)<br />
* 2017 - Tortola GUI Style (better for AMD hardware)<br />
* 2018 - Model performance measuring; performance monitor improvements.<br />
* 2018 - FGData fallback models<br />
* 2018 - Joystick GUI improvements<br />
* 2019 - LOD (Level of Detail) improvements (GUI, core)<br />
* 2019 - OSG thread safety improvements by using the '''ReadRef''' methods<br />
* 2019 - DDS Texture cache (using osg_nvtt) - to improve texture loading pauses.<br />
* 2019 - FGComm added channel support<br />
* 2019 - Emesary (simgear)<br />
* 2019 - Nasal background garbage collection (disabled due to stability issues)<br />
* 2019 - Multithreaded rendering experiment (stalled) [<br />
* 2017->2019 research and development into the future of scenery; ended up starting the WS3.0x VirtualPlanetBuilder project that is now (2020) underway and scheduled for NLTS after 2020.3<br />
<br />
=== FlightGear Core areas ===<br />
<br />
Generally I look after <br />
<br />
* Multiplayer comms (core)<br />
* (FGdata) Emesary, both Nasal <br />
* (simgear) Emesary<br />
* (FGdata) Emesary MP bridge<br />
* (simgear) DDS Texture cache<br />
* FGComm<br />
<br />
and assist with<br />
* Animation changes<br />
* General modelling topics<br />
* WS3.x <br />
* Windows (AMD Radeon) - most core developers use Linux/OSX and NVIDIA<br />
<br />
<br />
[[Category:Users]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User:Richard_H&diff=128907User:Richard H2020-11-11T11:06:53Z<p>Richard H: /* About me */</p>
<hr />
<div>{{user<br />
| name = Richard Harrison<br />
| location = France<br />
| interests =<br />
* Flight Simulation<br />
* Aerodynamic modelling<br />
* FlightGear aircraft modelling<br />
* FlightGear core development<br />
* Aviation, especially Naval Aviation<br />
| callsign = [https://fgtracker.ml/modules/fgtracker/?FUNCT=FLIGHTS&CALLSIGN=Richard Richard]<br />
| favourite =<br />
* [[McDonnell_Douglas_F-15_Eagle|F-15]] (Main developer)<br />
* [[Grumman_F-14_Tomcat|F-14]] (Main developer)<br />
* Tornado F2<br />
* BAe Hawk<br />
| website = zaretto.com<br />
| website = chateau-logic.com<br />
}}<br />
<br />
== About me ==<br />
I've been involved in Flight Simulation since 1984 when I started working at Link-Miles in Lancing, England on the Tornado F2 simulator. I've worked on (and flown) many certified simulators since then, including B737-2/3/4/5, A320, BAe Hawk, B757/767, B747-2/4, Super Puma.<br />
<br />
=== Contributions to FlightGear ===<br />
Returning to FlightGear in 2014 after a renewed interest in simulation the first thing I did was to redevelop the aerodynamics model for the F-14 based on real data [[http://zaretto.com/F-14 F-14 Development page]] this took me a few months and I fixed a load of other things afterwards. The next logical step seemed to be the F-15 which was very poorly modelling and I felt a serious omission in aircraft for FlightGear. So I built a new model based on the F-14, [[http://zaretto.com/F-15 F-15 development page]]<br />
<br />
=== Aircraft Models ===<br />
* F-14<br />
* F-15<br />
* F-16<br />
* Supermarine Swift FR.5<br />
* Jaguar GR1<br />
* Mirage 2000-5<br />
<br />
=== FlightGear Core areas === <br />
<br />
Generally I look after <br />
<br />
* Multiplayer comms (core)<br />
* (FGdata) Emesary, both Nasal <br />
* (simgear) Emesary<br />
* (FGdata) Emesary MP bridge<br />
* (simgear) DDS Texture cache<br />
* FGComm<br />
<br />
and assist with<br />
* Animation changes<br />
* General modelling topics<br />
* WS3.x <br />
* Windows (AMD Radeon) - most core developers use Linux/OSX and NVIDIA<br />
<br />
In 2016 I became a core developer and really have been focussed around improvements to the core to improve performance, improve modelling and Naval aviation.<br />
<br />
* 2015 - Crashes on exit<br />
* 2016 - Multiplayer segfaults<br />
* 2016 - FGData; Simple generic MFD framework<br />
* 2016 - Emesary (Nasal)<br />
* 2016 - Added date to the Time dialog <br />
* 2017 - Improved Multiplayer protocol (more efficient usage of space)<br />
* 2017 - Tortola GUI Style (better for AMD hardware)<br />
* 2018 - Model performance measuring; performance monitor improvements.<br />
* 2018 - FGData fallback models<br />
* 2018 - Joystick GUI improvements<br />
* 2019 - LOD (Level of Detail) improvements (GUI, core)<br />
* 2019 - OSG thread safety improvements by using the '''ReadRef''' methods<br />
* 2019 - DDS Texture cache (using osg_nvtt) - to improve texture loading pauses.<br />
* 2019 - FGComm added channel support<br />
* 2019 - Emesary (simgear)<br />
* 2019 - Nasal background garbage collection (disabled due to stability issues)<br />
* 2019 - Multithreaded rendering experiment (stalled) [<br />
* 2017->2019 research and development into the future of scenery; ended up starting the WS3.0x VirtualPlanetBuilder project that is now (2020) underway and scheduled for NLTS after 2020.3<br />
<br />
There are some [[http://chateau-logic.com/taxonomy/term/60 FlightGear articles]] that I've published on my personal site.<br />
<br />
[[Category:Users]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Talk:Multiplayer_protocol&diff=128905Talk:Multiplayer protocol2020-11-11T11:04:20Z<p>Richard H: /* Regarding some properties */</p>
<hr />
<div>== Regarding some properties ==<br />
{{hatnote|From Discord by WoodSTokk}}<br />
The property list ... has no marking <code>V1_2_PROP_ID</code> … instead, there are properties marked with <code>V1_1_2_PROP_ID</code>.<br />
<br />
Additionally, the property with <code>ID 10</code> (<code>sim/multiplay/protocol-version</code>) is marked with <code>V1_1_PROP_ID</code> … but if i switch to the old protocol, this prop will not transmitted.<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 14:56, 8 November 2020 (EST)<br />
<br />
{{hatnote|From Discord by WoodSTokk}}<br />
Hmmm, I think this line Properties marked as <code>V1_2_PROP_ID</code> will only be … should be Properties marked as <code>V1_1_2_PROP_ID</code> will only be … because version in header is <code>1.1</code> … only the version property stay at <code>2</code><br />
<br />
So I think <code>1_1_2</code> means <code>1.1</code> (major_minor) from the header … and the <code>2</code> means protocol out of the property<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 15:11, 8 November 2020 (EST)<br />
<br />
The corrections have been made as V1_1_2_PROP_ID is the correct ID and V1_2_PROP_ID is the value prior to renaming to be consistent with the numbering scheme of V''PROTO_VER(Major)''_''PROTO_VER(Minor)''_''MsgVersion'' where MsgVersion is 2 for 2017.2 and 1 for ''Compatible'' (i.e. the version used since FlightGear 3.x)<br />
<br />
—[[User:Richard_H|Richard]] ([[User_talk:Richard_H|Talk]]) [[Special:Contributions/Richard_H|wiki contribs]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User:Richard_H&diff=128902User:Richard H2020-11-11T11:02:01Z<p>Richard H: Created my vanity page.</p>
<hr />
<div>{{user<br />
| name = Richard Harrison<br />
| location = France<br />
| interests =<br />
* Flight Simulation<br />
* Aerodynamic modelling<br />
* FlightGear aircraft modelling<br />
* FlightGear core development<br />
* Aviation, especially Naval Aviation<br />
| callsign = [https://fgtracker.ml/modules/fgtracker/?FUNCT=FLIGHTS&CALLSIGN=Richard Richard]<br />
| favourite =<br />
* [[McDonnell_Douglas_F-15_Eagle|F-15]] (Main developer)<br />
* [[Grumman_F-14_Tomcat|F-14]] (Main developer)<br />
* Tornado F2<br />
* BAe Hawk<br />
| website = zaretto.com<br />
| website = chateau-logic.com<br />
}}<br />
<br />
== About me ==<br />
I've been involved in Flight Simulation since 1984 when I started working at Link-Miles in Lancing, England on the Tornado F2 simulator. I've worked on (and flown) many certified simulators since then, including B737-2/3/4/5, A320, BAe Hawk, B757/767, B747-2/4, Super Puma.<br />
<br />
=== Contributions to FlightGear ===<br />
Returning to FlightGear in 2014 after a renewed interest in simulation the first thing I did was to redevelop the aerodynamics model for the F-14 based on real data [[http://zaretto.com/F-14 F-14 Development page]] this took me a few months and I fixed a load of other things afterwards. The next logical step seemed to be the F-15 which was very poorly modelling and I felt a serious omission in aircraft for FlightGear. So I built a new model based on the F-14, [[http://zaretto.com/F-15 F-15 development page]]<br />
<br />
=== FlightGear Core areas === <br />
<br />
Generally I look after <br />
<br />
* Multiplayer comms (core)<br />
* (FGdata) Emesary, both Nasal <br />
* (simgear) Emesary<br />
* (FGdata) Emesary MP bridge<br />
* (simgear) DDS Texture cache<br />
* FGComm<br />
<br />
and assist with<br />
* Animation changes<br />
* General modelling topics<br />
* WS3.x <br />
* Windows (AMD Radeon) - most core developers use Linux/OSX and NVIDIA<br />
<br />
In 2016 I became a core developer and really have been focussed around improvements to the core to improve performance, improve modelling and Naval aviation.<br />
<br />
* 2015 - Crashes on exit<br />
* 2016 - Multiplayer segfaults<br />
* 2016 - FGData; Simple generic MFD framework<br />
* 2016 - Emesary (Nasal)<br />
* 2016 - Added date to the Time dialog <br />
* 2017 - Improved Multiplayer protocol (more efficient usage of space)<br />
* 2017 - Tortola GUI Style (better for AMD hardware)<br />
* 2018 - Model performance measuring; performance monitor improvements.<br />
* 2018 - FGData fallback models<br />
* 2018 - Joystick GUI improvements<br />
* 2019 - LOD (Level of Detail) improvements (GUI, core)<br />
* 2019 - OSG thread safety improvements by using the '''ReadRef''' methods<br />
* 2019 - DDS Texture cache (using osg_nvtt) - to improve texture loading pauses.<br />
* 2019 - FGComm added channel support<br />
* 2019 - Emesary (simgear)<br />
* 2019 - Nasal background garbage collection (disabled due to stability issues)<br />
* 2019 - Multithreaded rendering experiment (stalled) [<br />
* 2017->2019 research and development into the future of scenery; ended up starting the WS3.0x VirtualPlanetBuilder project that is now (2020) underway and scheduled for NLTS after 2020.3<br />
<br />
There are some [[http://chateau-logic.com/taxonomy/term/60 FlightGear articles]] that I've published on my personal site.<br />
<br />
[[Category:Users]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128841Multiplayer protocol2020-11-09T13:33:44Z<p>Richard H: /* Master property transmission list */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to {{flightgear file|src/MultiPlayer/mpmessages.hxx|l=48}} for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID!! Property!! Type!!Transmit As!! Protocol Ident<br />
|-<br />
||10||sim/multiplay/protocol-version||INT||TT_SHORTINT||V2_PROP_ID_PROTOCOL||<br />
|-<br />
||100||surface-positions/left-aileron-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||101||surface-positions/right-aileron-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||102||surface-positions/elevator-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||103||surface-positions/rudder-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||104||surface-positions/flap-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||105||surface-positions/speedbrake-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||106||gear/tailhook/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||107||gear/launchbar/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||108||gear/launchbar/state||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||109||gear/launchbar/holdback-position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||110||canopy/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||111||surface-positions/wing-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||112||surface-positions/wing-fold-pos-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||120||gear/launchbar/state-value||INT||TT_NOSEND||V1_1_2_PROP_ID||<br />
|-<br />
||200||gear/gear[0]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||201||gear/gear[0]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||210||gear/gear[1]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||211||gear/gear[1]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||220||gear/gear[2]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||221||gear/gear[2]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||230||gear/gear[3]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||231||gear/gear[3]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||240||gear/gear[4]/compression-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||241||gear/gear[4]/position-norm||FLOAT||TT_SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
||300||engines/engine[0]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||301||engines/engine[0]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||302||engines/engine[0]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||310||engines/engine[1]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||311||engines/engine[1]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||312||engines/engine[1]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||320||engines/engine[2]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||321||engines/engine[2]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||322||engines/engine[2]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||330||engines/engine[3]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||331||engines/engine[3]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||332||engines/engine[3]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||340||engines/engine[4]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||341||engines/engine[4]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||342||engines/engine[4]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||350||engines/engine[5]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||351||engines/engine[5]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||352||engines/engine[5]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||360||engines/engine[6]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||361||engines/engine[6]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||362||engines/engine[6]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||370||engines/engine[7]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||371||engines/engine[7]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||372||engines/engine[7]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||380||engines/engine[8]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||381||engines/engine[8]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||382||engines/engine[8]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||390||engines/engine[9]/n1||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||391||engines/engine[9]/n2||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||392||engines/engine[9]/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||800||rotors/main/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||801||rotors/tail/rpm||FLOAT||TT_SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
||810||rotors/main/blade[0]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||811||rotors/main/blade[1]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||812||rotors/main/blade[2]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||813||rotors/main/blade[3]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||820||rotors/main/blade[0]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||821||rotors/main/blade[1]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||822||rotors/main/blade[2]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||823||rotors/main/blade[3]/flap-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||830||rotors/tail/blade[0]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||831||rotors/tail/blade[1]/position-deg||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||900||sim/hitches/aerotow/tow/length||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||903||sim/hitches/aerotow/tow/dist||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||906||sim/hitches/aerotow/tow/brake-force||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||907||sim/hitches/aerotow/tow/end-force-x||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||908||sim/hitches/aerotow/tow/end-force-y||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||909||sim/hitches/aerotow/tow/end-force-z||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||930||sim/hitches/aerotow/is-slave||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||932||sim/hitches/aerotow/open||BOOL||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||933||sim/hitches/aerotow/local-pos-x||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||934||sim/hitches/aerotow/local-pos-y||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||935||sim/hitches/aerotow/local-pos-z||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1001||controls/flight/slats||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1002||controls/flight/speedbrake||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1003||controls/flight/spoilers||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1004||controls/gear/gear-down||FLOAT||TT_SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
||1005||controls/lighting/nav-lights||FLOAT||TT_SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
||1006||controls/armament/station[0]/jettison-all||BOOL||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1100||sim/model/variant||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1101||sim/model/livery/file||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1200||environment/wildfire/data||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1201||environment/contrail||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1300||tanker||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1400||scenery/events||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||1500||instrumentation/transponder/transmitted-id||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1501||instrumentation/transponder/altitude||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||1502||instrumentation/transponder/ident||BOOL||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1503||instrumentation/transponder/inputs/mode||INT||TT_SHORTINT||V1_1_PROP_ID||<br />
|-<br />
||1504||instrumentation/transponder/ground-bit||BOOL||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||1505||instrumentation/transponder/airspeed-kt||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10001||sim/multiplay/transmission-freq-hz||STRING||TT_NOSEND||V1_1_2_PROP_ID||<br />
|-<br />
||10002||sim/multiplay/chat||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10100||sim/multiplay/generic/string[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10101||sim/multiplay/generic/string[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10102||sim/multiplay/generic/string[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10103||sim/multiplay/generic/string[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10104||sim/multiplay/generic/string[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10105||sim/multiplay/generic/string[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10106||sim/multiplay/generic/string[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10107||sim/multiplay/generic/string[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10108||sim/multiplay/generic/string[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10109||sim/multiplay/generic/string[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10110||sim/multiplay/generic/string[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10111||sim/multiplay/generic/string[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10112||sim/multiplay/generic/string[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10113||sim/multiplay/generic/string[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10114||sim/multiplay/generic/string[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10115||sim/multiplay/generic/string[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10116||sim/multiplay/generic/string[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10117||sim/multiplay/generic/string[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10118||sim/multiplay/generic/string[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10119||sim/multiplay/generic/string[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||10200||sim/multiplay/generic/float[0]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10201||sim/multiplay/generic/float[1]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10202||sim/multiplay/generic/float[2]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10203||sim/multiplay/generic/float[3]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10204||sim/multiplay/generic/float[4]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10205||sim/multiplay/generic/float[5]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10206||sim/multiplay/generic/float[6]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10207||sim/multiplay/generic/float[7]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10208||sim/multiplay/generic/float[8]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10209||sim/multiplay/generic/float[9]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10210||sim/multiplay/generic/float[10]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10211||sim/multiplay/generic/float[11]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10212||sim/multiplay/generic/float[12]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10213||sim/multiplay/generic/float[13]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10214||sim/multiplay/generic/float[14]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10215||sim/multiplay/generic/float[15]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10216||sim/multiplay/generic/float[16]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10217||sim/multiplay/generic/float[17]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10218||sim/multiplay/generic/float[18]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10219||sim/multiplay/generic/float[19]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10220||sim/multiplay/generic/float[20]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10221||sim/multiplay/generic/float[21]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10222||sim/multiplay/generic/float[22]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10223||sim/multiplay/generic/float[23]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10224||sim/multiplay/generic/float[24]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10225||sim/multiplay/generic/float[25]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10226||sim/multiplay/generic/float[26]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10227||sim/multiplay/generic/float[27]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10228||sim/multiplay/generic/float[28]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10229||sim/multiplay/generic/float[29]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10230||sim/multiplay/generic/float[30]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10231||sim/multiplay/generic/float[31]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10232||sim/multiplay/generic/float[32]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10233||sim/multiplay/generic/float[33]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10234||sim/multiplay/generic/float[34]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10235||sim/multiplay/generic/float[35]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10236||sim/multiplay/generic/float[36]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10237||sim/multiplay/generic/float[37]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10238||sim/multiplay/generic/float[38]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10239||sim/multiplay/generic/float[39]||FLOAT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10300||sim/multiplay/generic/int[0]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10301||sim/multiplay/generic/int[1]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10302||sim/multiplay/generic/int[2]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10303||sim/multiplay/generic/int[3]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10304||sim/multiplay/generic/int[4]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10305||sim/multiplay/generic/int[5]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10306||sim/multiplay/generic/int[6]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10307||sim/multiplay/generic/int[7]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10308||sim/multiplay/generic/int[8]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10309||sim/multiplay/generic/int[9]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10310||sim/multiplay/generic/int[10]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10311||sim/multiplay/generic/int[11]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10312||sim/multiplay/generic/int[12]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10313||sim/multiplay/generic/int[13]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10314||sim/multiplay/generic/int[14]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10315||sim/multiplay/generic/int[15]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10316||sim/multiplay/generic/int[16]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10317||sim/multiplay/generic/int[17]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10318||sim/multiplay/generic/int[18]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10319||sim/multiplay/generic/int[19]||INT||TT_ASIS||V1_1_PROP_ID||<br />
|-<br />
||10500||sim/multiplay/generic/short[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10501||sim/multiplay/generic/short[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10502||sim/multiplay/generic/short[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10503||sim/multiplay/generic/short[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10504||sim/multiplay/generic/short[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10505||sim/multiplay/generic/short[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10506||sim/multiplay/generic/short[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10507||sim/multiplay/generic/short[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10508||sim/multiplay/generic/short[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10509||sim/multiplay/generic/short[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10510||sim/multiplay/generic/short[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10511||sim/multiplay/generic/short[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10512||sim/multiplay/generic/short[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10513||sim/multiplay/generic/short[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10514||sim/multiplay/generic/short[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10515||sim/multiplay/generic/short[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10516||sim/multiplay/generic/short[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10517||sim/multiplay/generic/short[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10518||sim/multiplay/generic/short[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10519||sim/multiplay/generic/short[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10520||sim/multiplay/generic/short[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10521||sim/multiplay/generic/short[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10522||sim/multiplay/generic/short[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10523||sim/multiplay/generic/short[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10524||sim/multiplay/generic/short[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10525||sim/multiplay/generic/short[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10526||sim/multiplay/generic/short[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10527||sim/multiplay/generic/short[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10528||sim/multiplay/generic/short[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10529||sim/multiplay/generic/short[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10530||sim/multiplay/generic/short[30]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10531||sim/multiplay/generic/short[31]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10532||sim/multiplay/generic/short[32]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10533||sim/multiplay/generic/short[33]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10534||sim/multiplay/generic/short[34]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10535||sim/multiplay/generic/short[35]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10536||sim/multiplay/generic/short[36]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10537||sim/multiplay/generic/short[37]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10538||sim/multiplay/generic/short[38]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10539||sim/multiplay/generic/short[39]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10540||sim/multiplay/generic/short[40]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10541||sim/multiplay/generic/short[41]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10542||sim/multiplay/generic/short[42]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10543||sim/multiplay/generic/short[43]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10544||sim/multiplay/generic/short[44]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10545||sim/multiplay/generic/short[45]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10546||sim/multiplay/generic/short[46]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10547||sim/multiplay/generic/short[47]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10548||sim/multiplay/generic/short[48]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10549||sim/multiplay/generic/short[49]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10550||sim/multiplay/generic/short[50]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10551||sim/multiplay/generic/short[51]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10552||sim/multiplay/generic/short[52]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10553||sim/multiplay/generic/short[53]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10554||sim/multiplay/generic/short[54]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10555||sim/multiplay/generic/short[55]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10556||sim/multiplay/generic/short[56]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10557||sim/multiplay/generic/short[57]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10558||sim/multiplay/generic/short[58]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10559||sim/multiplay/generic/short[59]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10560||sim/multiplay/generic/short[60]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10561||sim/multiplay/generic/short[61]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10562||sim/multiplay/generic/short[62]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10563||sim/multiplay/generic/short[63]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10564||sim/multiplay/generic/short[64]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10565||sim/multiplay/generic/short[65]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10566||sim/multiplay/generic/short[66]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10567||sim/multiplay/generic/short[67]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10568||sim/multiplay/generic/short[68]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10569||sim/multiplay/generic/short[69]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10570||sim/multiplay/generic/short[70]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10571||sim/multiplay/generic/short[71]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10572||sim/multiplay/generic/short[72]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10573||sim/multiplay/generic/short[73]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10574||sim/multiplay/generic/short[74]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10575||sim/multiplay/generic/short[75]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10576||sim/multiplay/generic/short[76]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10577||sim/multiplay/generic/short[77]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10578||sim/multiplay/generic/short[78]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||10579||sim/multiplay/generic/short[79]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11051||sim/multiplay/generic/bool[91]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11091||sim/multiplay/generic/bool[92]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM||V1_1_2_PROP_ID||<br />
|}<br />
<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128840Multiplayer protocol2020-11-09T11:06:55Z<p>Richard H: /* Properties transmitted over MP */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to {{flightgear file|src/MultiPlayer/mpmessages.hxx|l=48}} for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128839Multiplayer protocol2020-11-09T11:05:45Z<p>Richard H: /* Master property transmission list */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to {{flightgear file|src/src/MultiPlayer/mpmessages.hxx|l=48}} for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128838Multiplayer protocol2020-11-09T11:04:48Z<p>Richard H: /* Properties transmitted over MP */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to {{flightgear file|src/src/MultiPlayer/mpmessages.hxx|l=48}} for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128837Multiplayer protocol2020-11-09T11:02:21Z<p>Richard H: </p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed from the GUI and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to src/MultiPlayer/mpmessages.hxx for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128836Multiplayer protocol2020-11-09T11:01:58Z<p>Richard H: </p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
{{Caution|Since FlightGear 2020.3 the option to select protocols other than 2017.2 have been removed and only Version 2 (2017.2) of the property encoding is currently supported, older versions are obsolete and may be removed at some point FlightGear 2020.3.}}<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to src/MultiPlayer/mpmessages.hxx for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128835Multiplayer protocol2020-11-09T10:56:50Z<p>Richard H: /* Properties transmitted */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to src/MultiPlayer/mpmessages.hxx for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Master property transmission list ===<br />
<br />
The following table defines which properties can be transmitted with the position message, i.e. the normal MP use case (as of FG 2020.2).<br />
<br />
{{Note|Only properties present in the property tree will be transmitted.}}<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
||11990||sim/multiplay/mp-clock-mode||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12000||sim/multiplay/emesary/bridge[0]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12001||sim/multiplay/emesary/bridge[1]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12002||sim/multiplay/emesary/bridge[2]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12003||sim/multiplay/emesary/bridge[3]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12004||sim/multiplay/emesary/bridge[4]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12005||sim/multiplay/emesary/bridge[5]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12006||sim/multiplay/emesary/bridge[6]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12007||sim/multiplay/emesary/bridge[7]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12008||sim/multiplay/emesary/bridge[8]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12009||sim/multiplay/emesary/bridge[9]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12010||sim/multiplay/emesary/bridge[10]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12011||sim/multiplay/emesary/bridge[11]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12012||sim/multiplay/emesary/bridge[12]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12013||sim/multiplay/emesary/bridge[13]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12014||sim/multiplay/emesary/bridge[14]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12015||sim/multiplay/emesary/bridge[15]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12016||sim/multiplay/emesary/bridge[16]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12017||sim/multiplay/emesary/bridge[17]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12018||sim/multiplay/emesary/bridge[18]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12019||sim/multiplay/emesary/bridge[19]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12020||sim/multiplay/emesary/bridge[20]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12021||sim/multiplay/emesary/bridge[21]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12022||sim/multiplay/emesary/bridge[22]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12023||sim/multiplay/emesary/bridge[23]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12024||sim/multiplay/emesary/bridge[24]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12025||sim/multiplay/emesary/bridge[25]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12026||sim/multiplay/emesary/bridge[26]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12027||sim/multiplay/emesary/bridge[27]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12028||sim/multiplay/emesary/bridge[28]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12029||sim/multiplay/emesary/bridge[29]||STRING||TT_ASIS||V1_1_2_PROP_ID||<br />
|-<br />
||12200||sim/multiplay/emesary/bridge-type[0]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12201||sim/multiplay/emesary/bridge-type[1]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12202||sim/multiplay/emesary/bridge-type[2]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12203||sim/multiplay/emesary/bridge-type[3]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12204||sim/multiplay/emesary/bridge-type[4]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12205||sim/multiplay/emesary/bridge-type[5]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12206||sim/multiplay/emesary/bridge-type[6]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12207||sim/multiplay/emesary/bridge-type[7]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12208||sim/multiplay/emesary/bridge-type[8]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12209||sim/multiplay/emesary/bridge-type[9]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12210||sim/multiplay/emesary/bridge-type[10]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12211||sim/multiplay/emesary/bridge-type[11]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12212||sim/multiplay/emesary/bridge-type[12]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12213||sim/multiplay/emesary/bridge-type[13]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12214||sim/multiplay/emesary/bridge-type[14]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12215||sim/multiplay/emesary/bridge-type[15]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12216||sim/multiplay/emesary/bridge-type[16]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12217||sim/multiplay/emesary/bridge-type[17]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12218||sim/multiplay/emesary/bridge-type[18]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12219||sim/multiplay/emesary/bridge-type[19]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12220||sim/multiplay/emesary/bridge-type[20]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12221||sim/multiplay/emesary/bridge-type[21]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12222||sim/multiplay/emesary/bridge-type[22]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12223||sim/multiplay/emesary/bridge-type[23]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12224||sim/multiplay/emesary/bridge-type[24]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12225||sim/multiplay/emesary/bridge-type[25]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12226||sim/multiplay/emesary/bridge-type[26]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12227||sim/multiplay/emesary/bridge-type[27]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12228||sim/multiplay/emesary/bridge-type[28]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||12229||sim/multiplay/emesary/bridge-type[29]||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13000||sim/model/fallback-model-index||INT||TT_SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
||13001||sim/multiplay/comm-transmit-frequency-hz||INT||TT_INT||V1_1_2_PROP_ID||<br />
|-<br />
||13002||sim/multiplay/comm-transmit-power-norm||INT||TT_SHORT_FLOAT_NORM ||V1_1_2_PROP_ID||<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2020.3; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
{{Note|Properties related to the Emesary MP Bridge are separated to allow possible future improvements to the MP code to have better handling and therefore these string properties should not be used for anything else. The emesary/bridge-type is not currently used - however in the future it will be to identify a specific type of bridge and/or notification that are being used from a predefined set of bridge-types (not yet implemented).}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128834Multiplayer protocol2020-11-09T10:42:30Z<p>Richard H: /* Properties transmitted over MP */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to src/MultiPlayer/mpmessages.hxx for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
Supported Transmission Types<br />
<br />
{| class="wikitable"<br />
! Encoding !! Description<br />
|-<br />
|TT_ASIS = 0|| transmit as defined in the property. This is the default||<br />
|-<br />
|TT_BOOL||NOT USED||<br />
|-<br />
|TT_INT||32bit integer||<br />
|-<br />
|TT_FLOAT||32bit floating point value||<br />
|-<br />
|TT_STRING||string (deprecated)||<br />
|-<br />
|TT_SHORTINT||16bit integer (lower 16 bits of 32bit int)||<br />
|-<br />
|TT_SHORT_FLOAT_NORM|| -1 .. 1 encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_1|| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_2|| range -327.67 .. 327.67 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_3|| range -32.767 .. 32.767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_SHORT_FLOAT_4|| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)||<br />
|-<br />
|TT_BOOLARRAY||31 boolean values mapped to a 32bit int||<br />
|-<br />
|TT_CHAR||NOT USED||<br />
|-<br />
|TT_NOSEND|| Do not send this property - probably the receive element for a custom encoded property||<br />
|-<br />
|}<br />
<br />
=== Properties transmitted ===<br />
<br />
NOTE: Only properties present in the property tree will be transmitted.<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2017.2; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128833Multiplayer protocol2020-11-09T10:30:04Z<p>Richard H: /* Properties transmitted over MP */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. '''Transmit As''' is also only relevant for 2017.2 or later.<br />
<br />
Although the MP protocol can transmit many different packets mostly a '''T_PositionMsg''' identified by MsgId of '''POS_DATA_ID (7)''' in the header. Refer to src/MultiPlayer/mpmessages.hxx for the PROTO_VER that is in use, currently this is ''0x00010001'' which is '''1.1'''<br />
<br />
The '''T_PositionMsg''' contains the standard MsgHdr, with position and motion information next and then a set of properties. Within the protocol ''1.1'' there is a secondary version that applies to the way that the properties are encoded, and this secondary version is either 1 or 2 (2017.2)<br />
<br />
Version 1 of the properties can be read by all versions of FlightGear; however version 2 properties can only be read by FlightGear 2017.2 (or later). Version 1 of the property encoding is not covered here as it is obsolete and deprecated.<br />
<br />
Version 2 (2017.2) includes new ways of encoding and decoding properties which are designed to save space in the transmitted buffer.<br />
<br />
# ID Property ID (v1)<br />
# Property String (v1)<br />
# Type Property Type (v1)<br />
# TransmitAs (v2) - this causes the property to be transmitted on the wire using the specified format on the wire but decoded back into the original format (sometimes with data loss).<br />
# Protocol Ident - the minimum version of the protocol that is required to transmit a property. Does not apply to incoming properties - as these will be decoded correctly when received<br />
# encode_for_transmit - method that will convert from and to the packet for the value. This Allows specific conversion rules to be applied; such as conversion of a string to an integer for transmission.<br />
# decode_received - decodes received data. <br />
* NOTE: when using the encode/decode methods there should be both specified, however if the result of the encode is to transmit in a different property index the encode/decode will be on different elements in the property id list.<br />
* You can see an example of the encode and decode methods with property ID 108 ''gear/launchbar/state'' which although it is a string in FlightGear it will be transmitted as a SHORT_INT based on the known values. When received the property 120 will act as an intermediary an set the decoded value into ''gear/launchbar/state'' as though it had been transmitted as a string.<br />
<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2017.2; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Multiplayer_protocol&diff=128279Multiplayer protocol2020-10-21T14:32:41Z<p>Richard H: /* Properties Packet */</p>
<hr />
<div>{{Affected by HLA}}<br />
<br />
The '''multiplayer protocol''' is the way FlightGear communicates between instances and the [[Howto:Multiplayer|multiplayer]] servers.<br />
<br />
The multiplayer protocol uses XDR encoded messages that are sent via UDP. All messages are composed of XDR (eXternal Data Representation) encoded data as per RFC 1832.<br />
<br />
XDR basically means that all data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded in Pascal format (length followed by char(length)) and are not zero terminated. Floating point numbers (32 or 64 bit) must be encoded as per the IEEE standard.<br />
<br />
For the record, strings are limited to 128 characters and packets are limited to 1200 bytes; these limits are hardcoded in fgfs and represent the commonly accepted transmission size of a UDP packet .<ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35059961/ <br />
|title = <nowiki> Re: [Flightgear-devel] dual-control-tools and the limit on packet<br />
size </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = May 3rd, 2016 <br />
|added = May 3rd, 2016 <br />
|script_version = 0.36 <br />
}}</ref><br />
<br />
== Future Development ==<br />
{{FGCquote<br />
|1= note that Stuarts HLA efforts might render the MP protocol obsolete sooner or later - I think that's finally on the horion.<br />
|2= {{cite web<br />
| url = http://forum.flightgear.org/viewtopic.php?p=268376#p268376<br />
| title = <nowiki>Military simulation (from Su-15 Screenshots)</nowiki><br />
| author = <nowiki>Thorsten</nowiki><br />
| date = Dec 13th, 2015<br />
| added = Dec 13th, 2015<br />
| script_version = 0.23<br />
}}<br />
}}<br />
<br />
== 2017.3 Changes ==<br />
<br />
New property /sim/multiplay/transmit-only-generics, when this is set only the position header, all of the sim/multiplay/generic/ and instrumentation/transponder/ are transmitted over MP. This is intended to allow models to use an alternative encoding (such as the Emesary PropertyNotification) to transmit a well known (to the model) list of properties packed into the generic properties.<br />
<br />
The maximum size of a string was also increased to 768 bytes (from 128).<br />
<br />
== 2017.2 Changes ==<br />
The 2017.2 protocol allows for much better packing of strings, new types that are transmitted in 4bytes by transmitting<br />
with short int (sometimes scaled) for the values (a lot of the properties that are transmitted will pack nicely into 16bits).<br />
<br />
The 2017.2 protocol also allows for properties to be transmitted automatically as a different type and the encode/decode will<br />
take this into consideration.<br />
<br />
To allow for compatibility with older clients the pad magic is used to force older clients to call verifyProperties, which will result in an invalid result because the first property transmitted is made to ensure that this routine fails on earlier clients; causing the properties part of the packet to be discarded, the basic motion properties remain compatible, so the older client will see just the model, not chat, not animations etc.<br />
<br />
The property transmission definition for 2017.2 has been reworked to take advantage of the more efficient packing options available.<br />
<br />
A reduction of around 30% is achieved on a basic packet; with the new additional short int generics more properties can be transmitted in the remaining space than was previously possible.<br />
<br />
The property /sim/multiplay/protocol-version (1 or 2) controls the protocol in use; 1 is compatible, 2 is 2017.2<br />
<br />
The property /sim/multiplay/visibility-range-nm will be sent in the packet header - to allow the client to request larger visibility ranges from fgms. This has not been implemented in the fgms code.<br />
<br />
== 2017.2 debugging aids ==<br />
<br />
With 2017.2 there are some properties (for the developer) that allow debug of the multiplayer.<br />
<br />
=== Visibility range ===<br />
<br />
/sim/multiplay/visibility-range-nm controls the visibility range. This requires connect to a multiplayer server running FGMS servers 0.13.1 or later (see http://mpmap01.flightgear.org/mpstatus/). Maximum (server defined value) of 2000nm.<br />
<br />
This value is set to 100nm on startup and changes aren't persisted.<br />
<br />
For models that wish to change this value; e.g. radar range, the recommendation is to only increase over 100nm when the Radar Range is also greater than 100nm. <br />
<br />
This property is designed to be controlled by the model, not the user; so take care to use wisely; for a realistic radar simulation this should be set to the radar range; however also setting below 20nm is not generally advised as it is a hard limit and will prevent any communication or visibility of models outside of this range.<br />
<br />
=== Loopback ===<br />
<br />
set /sim/multiplay/debug-level to 1 (bit 0) and your aircraft will be locally looped back (within the protocol) - thus aiding the development of multiplayer animations and general multiplayer debug.<br />
<br />
=== Multiplay debug-level ===<br />
<br />
* /sim/multiplay/debug-level bit 0 : direct loopback (see above). Need to be connected to a multiplayer server, but no extra packets are sent as the loopback is within the MP code.<br />
* /sim/multiplay/debug-level bit 1 : trace (to the console at Network, Info) the properties being sent in the outgoing packet<br />
* /sim/multiplay/debug-level bit 2 : hexdump (to the console at Network, Info) outgoing packets<br />
* /sim/multiplay/debug-level bit 3 : trace (to the console at Network, Info) contents of incoming packets. Can result in a lot of debug.<br />
<br />
=== Outgoing packet size ===<br />
<br />
Property /sim/multiplay/last-xmit-packet-len contains the size (in bytes) of the last transmitted packet.<br />
<br />
== Data types ==<br />
{{Warning|if an aircraft defines all possible properties in the protocol, it tries to send 14988 bytes per packet, almost 12.5 times the allowed limit. Until the protocol is fixed to handle this it is the responsibility of the aircraft modeler to resolve '''Multiplayer packet truncated''' errors. <ref>{{cite web<br />
|url = https://sourceforge.net/p/flightgear/mailman/message/35441502/ <br />
|title = <nowiki> Re: [Flightgear-devel] C172 MP alert on console </nowiki> <br />
|author = <nowiki> Ludovic Brenta </nowiki> <br />
|date = Oct 21st, 2016 <br />
|added = Oct 21st, 2016 <br />
|script_version = 0.40 <br />
}}</ref><br />
}}<br />
<br />
{{Caution|Prior to V2017.2 all bytes in the <tt>STRING</tt> field are sent as '''4-byte ints''' (not in the header or the position message). So STR has length (LEN * 4) bytes and padding ((4 - LEN%4) * 4) bytes, if LEN%4 is not 0.}}<br />
<br />
When running with 2017.2 there is a '''Transmit As''' mapping to allow more efficient usage of the limited space in the packet. This mapping is defined in the property map.<br />
<br />
The data is XDR encoded in two different methods, compatible or 2017.2. This only affects the properties, with the impact that clients prior to 2017.2 will only be able to receive properties using compatible encoding, which can result in missing animations and no receipt of chat messages. <br />
<br />
<br />
=== Compatible encoding === <br />
Prior to 2017.2 the following types are available.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| float<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| bool<br />
| 4 bytes<br />
| Send unconditionally<br />
|-<br />
| string<br />
| (LEN + STR + PAD) bytes<br />
|<br />
LEN: 4 bytes, length of the decoded string<br/><br />
STR: (LEN * 4) bytes, encoded string<br/><br />
PAD: (n * 4) bytes, padding<br/><br />
|}<br />
<br />
=== 2017.2 encoding ===<br />
<br />
All properties are transmitted unconditionally in each frame at the rate specified.<br />
<br />
{| class="wikitable"<br />
! Type !! Size !! Remarks<br />
|-<br />
| int<br />
| 4 bytes<br />
|-<br />
| short int<br />
| 2 bytes<br />
|-<br />
| float<br />
| 4 bytes<br />
|-<br />
| Short_float_norm<br />
| 2 bytes<br />
| -1 .. 1 encoded into a short int<br />
|-<br />
| Short_float_1<br />
| 2 bytes<br />
| range -3276.7 .. 3276.7 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_2<br />
| 2 bytes<br />
| range -327.67 .. 327.67 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_3<br />
| 2 bytes<br />
| range -32.767 .. 32.767 float encoded into a short int (16 bit)<br />
|-<br />
| Short_float_4<br />
| 2 bytes<br />
| range -3.2767 .. 3.2767 float encoded into a short int (16 bit)<br />
|-<br />
| bool<br />
| 4 bytes<br />
|-<br />
| string<br />
| (ID:LEN) 4 bytes, LEN bytes follows<br />
|<br />
ID: 2 bytes<br />
LEN: 2 bytes, length of the string<br/><br />
STR: char[LEN] bytes<br/><br />
|}<br />
<br />
Also with 2017.2 the property ID for short int and strings is transmitted in 16bits.<br />
<br />
== Messages ==<br />
=== Messages header ===<br />
The header is always 32 bytes long and contains the following fields in exactly that order:<br />
<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| Magic<br />
| 4 bytes<br />
| Always 0x46474653 ("FGFS")<br />
|-<br />
| Version<br />
| 4 bytes<br />
| Protocol version, currently 0x00010001 (1.1)<br />
|-<br />
| MsgId<br />
| 4 bytes<br />
| Defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data - all other values are outdated and ignored.<br />
|-<br />
| MsgLen<br />
| 4 bytes<br />
| Length of the data. {{Caution|This is '''not in bytes''', see the description of the STRING data type.}}<br />
|-<br />
| RequestedRangeNm<br />
| 4 bytes<br />
| Requested visibility range in nm. The MP server can provide mp packets from any players within this range; but never over it.<br />
|-<br />
| ReplyPort<br />
| 4 bytes<br />
| Deprecated and ignored<br />
|-<br />
| Callsign<br />
| 8 bytes<br />
| Zero terminated array of characters representing the user callsign<br />
|}<br />
<br />
=== Chat messages ===<br />
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.<br />
<br />
=== Position messages ===<br />
The data of position message is more complicated and is composed of a two parts. The first part contain information needed to place an aircraft model in the right position and orientation. The second part contain property values used for animating the model, provided the user on the receiving end would have that aircraft installed.<br />
<br />
==== First part ====<br />
* Positions are in with respect to the Earth centered frame.<br />
* Orientations are with respect to the X, Y and Z axis of the Earth centered frame, stored in the angle axis representation where the angle is coded into the axis length.<br />
* Velocities are along the X, Y and Z directions of the Earth centered frame.<br />
* Angular accelerations are in two parts of the three dimensional angular velocity vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
* Linear accelerations are in two parts of the three dimensional linear acceleration vector with respect to the Earth centered frame measured in the Earth centered frame.<br />
<br />
The first part contain these fields in exactly that order:<br />
{| class="wikitable"<br />
! Field !! Size !! Remarks<br />
|-<br />
| ModelName<br />
| 96 bytes<br />
| Zero terminated array of characters representing the aircraft model (<code>/sim/model/path</code>) used by the user<br />
|-<br />
| time<br />
| 8 bytes<br />
| Representing the time when this message was generated double<br />
|-<br />
| lag<br />
| 8 bytes<br />
| Time offset for network lag double<br />
|-<br />
| PosX<br />
| 8 bytes<br />
| XDR encoded double value, X-ccordinate of users position<br />
|-<br />
| PosY<br />
| 8 bytes<br />
| XDR encoded double value, Y-ccordinate of users position<br />
|-<br />
| PosZ<br />
| 8 bytes<br />
| XDR encoded double value, z-ccordinate of users position<br />
|-<br />
| OriX<br />
| 4 bytes<br />
| XDR encoded float value, X-orientation of the user<br />
|-<br />
| OriY<br />
| 4 bytes<br />
| XDR encoded float value, Y-orientation of the user<br />
|-<br />
| OriZ<br />
| 4 bytes<br />
| XDR encoded float value, Z-orientation of the user<br />
|-<br />
| VelX<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in X direction<br />
|-<br />
| VelY<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Y direction<br />
|-<br />
|VelZ<br />
| 4 bytes<br />
| XDR encoded float value, velocity of the user in Z direction<br />
|-<br />
| AV1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular velocity vector<br />
|-<br />
| AV2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular velocity vector<br />
|-<br />
| AV3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular velocity vector<br />
|-<br />
| LA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional linear accelaration vector<br />
|-<br />
| LA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional linear accelaration vector<br />
|-<br />
| AA1<br />
| 4 bytes<br />
| XDR encoded float value, 1. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA2<br />
| 4 bytes<br />
| XDR encoded float value, 2. part of the three dimensional angular accelaration vector<br />
|-<br />
| AA3<br />
| 4 bytes<br />
| XDR encoded float value, 3. part of the three dimensional angular accelaration vector<br />
|-<br />
| pad<br />
| up to 8 bytes<br />
| For padding the data to a multiple of 8 bytes<br />
|}<br />
<br />
=== Properties transmitted over MP ===<br />
The fields of the second part are '''property values''' encoded in the form '''ID'''|'''Value'''.<br />
<br />
A subset of the following properties are transmitted in the order below. Properties marked as V1_2_PROP_ID will only be sent when the 2017.2 protocol (or later) is selected. Transmit As is also only relevant for 2017.2 or later.<br />
<br />
{| class="wikitable"<br />
! ID !! Property !! Type !!Transmit As !! Protocol Ident<br />
|-<br />
|10||sim/multiplay/protocol-version||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|100||surface-positions/left-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|101||surface-positions/right-aileron-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|102||surface-positions/elevator-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|103||surface-positions/rudder-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|104||surface-positions/flap-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|105||surface-positions/speedbrake-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|106||gear/tailhook/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|107||gear/launchbar/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|108||gear/launchbar/state||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|109||gear/launchbar/holdback-position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|110||canopy/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|111||surface-positions/wing-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|112||surface-positions/wing-fold-pos-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|200||gear/gear[0]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|201||gear/gear[0]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|210||gear/gear[1]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|211||gear/gear[1]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|220||gear/gear[2]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|221||gear/gear[2]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|230||gear/gear[3]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|231||gear/gear[3]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|240||gear/gear[4]/compression-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|241||gear/gear[4]/position-norm||FLOAT||SHORT_FLOAT_NORM||V1_1_PROP_ID||<br />
|-<br />
|300||engines/engine[0]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|301||engines/engine[0]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|302||engines/engine[0]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|310||engines/engine[1]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|311||engines/engine[1]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|312||engines/engine[1]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|320||engines/engine[2]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|321||engines/engine[2]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|322||engines/engine[2]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|330||engines/engine[3]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|331||engines/engine[3]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|332||engines/engine[3]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|340||engines/engine[4]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|341||engines/engine[4]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|342||engines/engine[4]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|350||engines/engine[5]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|351||engines/engine[5]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|352||engines/engine[5]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|360||engines/engine[6]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|361||engines/engine[6]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|362||engines/engine[6]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|370||engines/engine[7]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|371||engines/engine[7]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|372||engines/engine[7]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|380||engines/engine[8]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|381||engines/engine[8]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|382||engines/engine[8]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|390||engines/engine[9]/n1||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|391||engines/engine[9]/n2||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|392||engines/engine[9]/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|800||rotors/main/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|801||rotors/tail/rpm||FLOAT||SHORT_FLOAT_1||V1_1_PROP_ID||<br />
|-<br />
|810||rotors/main/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|811||rotors/main/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|812||rotors/main/blade[2]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|813||rotors/main/blade[3]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|820||rotors/main/blade[0]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|821||rotors/main/blade[1]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|822||rotors/main/blade[2]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|823||rotors/main/blade[3]/flap-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|830||rotors/tail/blade[0]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|831||rotors/tail/blade[1]/position-deg||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|900||sim/hitches/aerotow/tow/length||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|901||sim/hitches/aerotow/tow/elastic-constant||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|902||sim/hitches/aerotow/tow/weight-per-m-kg-m||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|903||sim/hitches/aerotow/tow/dist||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|904||sim/hitches/aerotow/tow/connected-to-property-node||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|905||sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|906||sim/hitches/aerotow/tow/brake-force||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|907||sim/hitches/aerotow/tow/end-force-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|908||sim/hitches/aerotow/tow/end-force-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|909||sim/hitches/aerotow/tow/end-force-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|930||sim/hitches/aerotow/is-slave||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|931||sim/hitches/aerotow/speed-in-tow-direction||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|932||sim/hitches/aerotow/open||BOOL||same||V1_1_PROP_ID||<br />
|-<br />
|933||sim/hitches/aerotow/local-pos-x||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|934||sim/hitches/aerotow/local-pos-y||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|935||sim/hitches/aerotow/local-pos-z||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|1001||controls/flight/slats||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1002||controls/flight/speedbrake||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1003||controls/flight/spoilers||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1004||controls/gear/gear-down||FLOAT||SHORT_FLOAT_4||V1_1_PROP_ID||<br />
|-<br />
|1005||controls/lighting/nav-lights||FLOAT||SHORT_FLOAT_3||V1_1_PROP_ID||<br />
|-<br />
|1006||controls/armament/station[0]/jettison-all||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1100||sim/model/variant||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1101||sim/model/livery/file||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1200||environment/wildfire/data||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1201||environment/contrail||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1300||tanker||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1400||scenery/events||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|1500||instrumentation/transponder/transmitted-id||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1501||instrumentation/transponder/altitude||INT||same||V1_1_PROP_ID||<br />
|-<br />
|1502||instrumentation/transponder/ident||BOOL||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|1503||instrumentation/transponder/inputs/mode||INT||SHORTINT||V1_1_PROP_ID||<br />
|-<br />
|10001||sim/multiplay/transmission-freq-hz||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10002||sim/multiplay/chat||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10100||sim/multiplay/generic/string[0]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10101||sim/multiplay/generic/string[1]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10102||sim/multiplay/generic/string[2]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10103||sim/multiplay/generic/string[3]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10104||sim/multiplay/generic/string[4]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10105||sim/multiplay/generic/string[5]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10106||sim/multiplay/generic/string[6]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10107||sim/multiplay/generic/string[7]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10108||sim/multiplay/generic/string[8]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10109||sim/multiplay/generic/string[9]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10110||sim/multiplay/generic/string[10]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10111||sim/multiplay/generic/string[11]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10112||sim/multiplay/generic/string[12]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10113||sim/multiplay/generic/string[13]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10114||sim/multiplay/generic/string[14]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10115||sim/multiplay/generic/string[15]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10116||sim/multiplay/generic/string[16]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10117||sim/multiplay/generic/string[17]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10118||sim/multiplay/generic/string[18]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10119||sim/multiplay/generic/string[19]||STRING||same||V1_1_2_PROP_ID||<br />
|-<br />
|10200||sim/multiplay/generic/float[0]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10201||sim/multiplay/generic/float[1]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10202||sim/multiplay/generic/float[2]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10203||sim/multiplay/generic/float[3]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10204||sim/multiplay/generic/float[4]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10205||sim/multiplay/generic/float[5]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10206||sim/multiplay/generic/float[6]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10207||sim/multiplay/generic/float[7]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10208||sim/multiplay/generic/float[8]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10209||sim/multiplay/generic/float[9]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10210||sim/multiplay/generic/float[10]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10211||sim/multiplay/generic/float[11]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10212||sim/multiplay/generic/float[12]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10213||sim/multiplay/generic/float[13]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10214||sim/multiplay/generic/float[14]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10215||sim/multiplay/generic/float[15]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10216||sim/multiplay/generic/float[16]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10217||sim/multiplay/generic/float[17]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10218||sim/multiplay/generic/float[18]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10219||sim/multiplay/generic/float[19]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10220||sim/multiplay/generic/float[20]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10221||sim/multiplay/generic/float[21]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10222||sim/multiplay/generic/float[22]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10223||sim/multiplay/generic/float[23]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10224||sim/multiplay/generic/float[24]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10225||sim/multiplay/generic/float[25]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10226||sim/multiplay/generic/float[26]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10227||sim/multiplay/generic/float[27]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10228||sim/multiplay/generic/float[28]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10229||sim/multiplay/generic/float[29]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10230||sim/multiplay/generic/float[30]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10231||sim/multiplay/generic/float[31]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10232||sim/multiplay/generic/float[32]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10233||sim/multiplay/generic/float[33]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10234||sim/multiplay/generic/float[34]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10235||sim/multiplay/generic/float[35]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10236||sim/multiplay/generic/float[36]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10237||sim/multiplay/generic/float[37]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10238||sim/multiplay/generic/float[38]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10239||sim/multiplay/generic/float[39]||FLOAT||same||V1_1_PROP_ID||<br />
|-<br />
|10300||sim/multiplay/generic/int[0]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10301||sim/multiplay/generic/int[1]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10302||sim/multiplay/generic/int[2]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10303||sim/multiplay/generic/int[3]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10304||sim/multiplay/generic/int[4]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10305||sim/multiplay/generic/int[5]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10306||sim/multiplay/generic/int[6]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10307||sim/multiplay/generic/int[7]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10308||sim/multiplay/generic/int[8]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10309||sim/multiplay/generic/int[9]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10310||sim/multiplay/generic/int[10]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10311||sim/multiplay/generic/int[11]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10312||sim/multiplay/generic/int[12]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10313||sim/multiplay/generic/int[13]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10314||sim/multiplay/generic/int[14]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10315||sim/multiplay/generic/int[15]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10316||sim/multiplay/generic/int[16]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10317||sim/multiplay/generic/int[17]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10318||sim/multiplay/generic/int[18]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10319||sim/multiplay/generic/int[19]||INT||same||V1_1_PROP_ID||<br />
|-<br />
|10500||sim/multiplay/generic/short[0]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10501||sim/multiplay/generic/short[1]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10502||sim/multiplay/generic/short[2]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10503||sim/multiplay/generic/short[3]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10504||sim/multiplay/generic/short[4]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10505||sim/multiplay/generic/short[5]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10506||sim/multiplay/generic/short[6]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10507||sim/multiplay/generic/short[7]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10508||sim/multiplay/generic/short[8]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10509||sim/multiplay/generic/short[9]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10510||sim/multiplay/generic/short[10]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10511||sim/multiplay/generic/short[11]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10512||sim/multiplay/generic/short[12]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10513||sim/multiplay/generic/short[13]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10514||sim/multiplay/generic/short[14]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10515||sim/multiplay/generic/short[15]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10516||sim/multiplay/generic/short[16]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10517||sim/multiplay/generic/short[17]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10518||sim/multiplay/generic/short[18]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10519||sim/multiplay/generic/short[19]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10520||sim/multiplay/generic/short[20]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10521||sim/multiplay/generic/short[21]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10522||sim/multiplay/generic/short[22]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10523||sim/multiplay/generic/short[23]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10524||sim/multiplay/generic/short[24]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10525||sim/multiplay/generic/short[25]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10526||sim/multiplay/generic/short[26]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10527||sim/multiplay/generic/short[27]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10528||sim/multiplay/generic/short[28]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10529||sim/multiplay/generic/short[29]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10530||sim/multiplay/generic/short[30]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10531||sim/multiplay/generic/short[31]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10532||sim/multiplay/generic/short[32]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10533||sim/multiplay/generic/short[33]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10534||sim/multiplay/generic/short[34]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10535||sim/multiplay/generic/short[35]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10536||sim/multiplay/generic/short[36]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10537||sim/multiplay/generic/short[37]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10538||sim/multiplay/generic/short[38]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10539||sim/multiplay/generic/short[39]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10540||sim/multiplay/generic/short[40]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10541||sim/multiplay/generic/short[41]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10542||sim/multiplay/generic/short[42]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10543||sim/multiplay/generic/short[43]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10544||sim/multiplay/generic/short[44]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10545||sim/multiplay/generic/short[45]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10546||sim/multiplay/generic/short[46]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10547||sim/multiplay/generic/short[47]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10548||sim/multiplay/generic/short[48]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10549||sim/multiplay/generic/short[49]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10550||sim/multiplay/generic/short[50]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10551||sim/multiplay/generic/short[51]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10552||sim/multiplay/generic/short[52]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10553||sim/multiplay/generic/short[53]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10554||sim/multiplay/generic/short[54]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10555||sim/multiplay/generic/short[55]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10556||sim/multiplay/generic/short[56]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10557||sim/multiplay/generic/short[57]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10558||sim/multiplay/generic/short[58]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10559||sim/multiplay/generic/short[59]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10560||sim/multiplay/generic/short[60]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10561||sim/multiplay/generic/short[61]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10562||sim/multiplay/generic/short[62]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10563||sim/multiplay/generic/short[63]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10564||sim/multiplay/generic/short[64]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10565||sim/multiplay/generic/short[65]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10566||sim/multiplay/generic/short[66]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10567||sim/multiplay/generic/short[67]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10568||sim/multiplay/generic/short[68]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10569||sim/multiplay/generic/short[69]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10570||sim/multiplay/generic/short[70]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10571||sim/multiplay/generic/short[71]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10572||sim/multiplay/generic/short[72]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10573||sim/multiplay/generic/short[73]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10574||sim/multiplay/generic/short[74]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10575||sim/multiplay/generic/short[75]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10576||sim/multiplay/generic/short[76]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10577||sim/multiplay/generic/short[77]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10578||sim/multiplay/generic/short[78]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|10579||sim/multiplay/generic/short[79]||INT||SHORTINT||V1_1_2_PROP_ID||<br />
|-<br />
|11000||sim/multiplay/generic/bool[0]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11001||sim/multiplay/generic/bool[1]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11002||sim/multiplay/generic/bool[2]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11003||sim/multiplay/generic/bool[3]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11004||sim/multiplay/generic/bool[4]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11005||sim/multiplay/generic/bool[5]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11006||sim/multiplay/generic/bool[6]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11007||sim/multiplay/generic/bool[7]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11008||sim/multiplay/generic/bool[8]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11009||sim/multiplay/generic/bool[9]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11010||sim/multiplay/generic/bool[10]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11011||sim/multiplay/generic/bool[11]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11012||sim/multiplay/generic/bool[12]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11013||sim/multiplay/generic/bool[13]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11014||sim/multiplay/generic/bool[14]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11015||sim/multiplay/generic/bool[15]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11016||sim/multiplay/generic/bool[16]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11017||sim/multiplay/generic/bool[17]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11018||sim/multiplay/generic/bool[18]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11019||sim/multiplay/generic/bool[19]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11020||sim/multiplay/generic/bool[20]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11021||sim/multiplay/generic/bool[21]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11022||sim/multiplay/generic/bool[22]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11023||sim/multiplay/generic/bool[23]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11024||sim/multiplay/generic/bool[24]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11025||sim/multiplay/generic/bool[25]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11026||sim/multiplay/generic/bool[26]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11027||sim/multiplay/generic/bool[27]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11028||sim/multiplay/generic/bool[28]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11029||sim/multiplay/generic/bool[29]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11030||sim/multiplay/generic/bool[30]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11040||sim/multiplay/generic/bool[31]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11041||sim/multiplay/generic/bool[32]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11042||sim/multiplay/generic/bool[33]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11043||sim/multiplay/generic/bool[34]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11044||sim/multiplay/generic/bool[35]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11045||sim/multiplay/generic/bool[36]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11046||sim/multiplay/generic/bool[37]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11047||sim/multiplay/generic/bool[38]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11048||sim/multiplay/generic/bool[39]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11049||sim/multiplay/generic/bool[40]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11050||sim/multiplay/generic/bool[41]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11051||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11052||sim/multiplay/generic/bool[42]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11053||sim/multiplay/generic/bool[43]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11054||sim/multiplay/generic/bool[44]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11055||sim/multiplay/generic/bool[45]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11056||sim/multiplay/generic/bool[46]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11057||sim/multiplay/generic/bool[47]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11058||sim/multiplay/generic/bool[48]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11059||sim/multiplay/generic/bool[49]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11060||sim/multiplay/generic/bool[50]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11061||sim/multiplay/generic/bool[51]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11062||sim/multiplay/generic/bool[52]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11063||sim/multiplay/generic/bool[53]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11064||sim/multiplay/generic/bool[54]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11065||sim/multiplay/generic/bool[55]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11066||sim/multiplay/generic/bool[56]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11067||sim/multiplay/generic/bool[57]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11068||sim/multiplay/generic/bool[58]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11069||sim/multiplay/generic/bool[59]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11070||sim/multiplay/generic/bool[60]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11080||sim/multiplay/generic/bool[61]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11081||sim/multiplay/generic/bool[62]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11082||sim/multiplay/generic/bool[63]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11083||sim/multiplay/generic/bool[64]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11084||sim/multiplay/generic/bool[65]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11085||sim/multiplay/generic/bool[66]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11086||sim/multiplay/generic/bool[67]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11087||sim/multiplay/generic/bool[68]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11088||sim/multiplay/generic/bool[69]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11089||sim/multiplay/generic/bool[70]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11090||sim/multiplay/generic/bool[71]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11091||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11092||sim/multiplay/generic/bool[72]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11093||sim/multiplay/generic/bool[73]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11094||sim/multiplay/generic/bool[74]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11095||sim/multiplay/generic/bool[75]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11096||sim/multiplay/generic/bool[76]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11097||sim/multiplay/generic/bool[77]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11098||sim/multiplay/generic/bool[78]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11099||sim/multiplay/generic/bool[79]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11100||sim/multiplay/generic/bool[80]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11101||sim/multiplay/generic/bool[81]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11102||sim/multiplay/generic/bool[82]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11103||sim/multiplay/generic/bool[83]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11104||sim/multiplay/generic/bool[84]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11105||sim/multiplay/generic/bool[85]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11106||sim/multiplay/generic/bool[86]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11107||sim/multiplay/generic/bool[87]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11108||sim/multiplay/generic/bool[88]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11109||sim/multiplay/generic/bool[89]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|11110||sim/multiplay/generic/bool[90]||BOOL||TT_BOOLARRAY||V1_1_2_PROP_ID||<br />
|-<br />
|}<br />
<br />
{{Note|This table is is current for FlightGear 2017.2; but may have been changed. Refer to see {{flightgear file|src/MultiPlayer/multiplaymgr.cxx|l=129}}.}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[Aircraft properties reference]]<br />
* [[Howto:Multiplayer]]<br />
* [[Howto:Record, analyze and replay multiplayer flights with network tools]] <br />
* [[Howto:Transmit properties over MP]]<br />
* [[Howto:Using mp broadcast.nas]]<br />
<br />
=== Forum topics ===<br />
* [http://forum.flightgear.org/viewtopic.php?p=136501&sid=38acd29e73affe2a085eef43f0a184c9#p136501 Re: Development Help]<br />
<br />
=== Source code ===<br />
==== XDR handling ====<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/tiny_xdr.cxx}}<br />
<br />
==== Message types ====<br />
* {{flightgear file|src/MultiPlayer/mpmessages.hxx}}<br />
<br />
==== Multiplayer system ====<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.hxx}}<br />
* {{flightgear file|src/MultiPlayer/multiplaymgr.cxx}}<br />
<br />
== External links ==<br />
* {{Wikipedia|External Data Representation}} (XDR)<br />
* {{cite web<br />
| url = https://tools.ietf.org/html/rfc1832<br />
| title = RFC 1832 – XDR: External Data Representation Standard<br />
| author = R. Srinivasan<br />
| date = August 1995<br />
| publisher = Internet Engineering Task Force (IETF)<br />
}}<br />
<br />
[[Category:Multiplayer]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Howto:Animate_models&diff=127981Howto:Animate models2020-10-11T12:41:56Z<p>Richard H: /* Touch */</p>
<hr />
<div>The real world is full of motion. To simulate this in [[FlightGear]], '''models must be animated'''.<br />
<br />
FlightGear allows you to animate models in response to property changes: for example, the propellers can spin when the engine is on and the elevators can move up and down with your controller. There is no fixed limit on what parts can be animated: the only requirements are that the part is named in the 3D model file, and that there is a property in the main tree that you can use to get the positioning information. <br />
<br />
This document provides basic information for all kind of animations. When animating your model, it is very helpful to find an aircraft with parts similar to yours and use it as an example. Cut and paste the code into your wrapper file and then edit to suit.<br />
<br />
== Notes ==<br />
=== File name of main model and animation XML file ===<br />
{{main article|Aircraft-set.xml#Not used for loading multiplayer aircraft}}<br />
The file name of the main model and animation XML file, or the .ac file if there is no XML file, (in essence the property <code>/sim/model/path</code>) will be the name of the aircraft that is transmitted when using [[multiplayer]] and will also be used for loading multiplayer aircraft.<br />
<br />
There is also a mechanism to substitute a full aircraft model with a simpler AI aircraft model if one is available at the same file path (including for example <code>Models/Boeing-797-800.xml</code>), but in <code>[[$FG_ROOT]]/'''AI'''/Aircraft/</code> instead of <code>$FG_ROOT/Aircraft/</code>.<br />
<br />
=== .ac files ===<br />
{{Main article|AC files: Understanding and changing .ac code#Identifying an object}}<br />
<br />
When referring to an .ac file in your xml animation, it is important that the <code><object-name></code> exactly matches the object named in the .ac file (this includes cases!). <br />
<br />
'''Note for SketchUp users:''' The spatial reference X/Y/Z used in animation to locate an object or a point are different from the ones in AC3D ie X values are the same in both but Y in animation must be matched to AC3D's -Z (Z value but opposite sign) and Z value in animation must be matched to AC3D's Y value. <br />
<br />
'''Note for SketchUp users:''' when exporting to AC3D in Sketchup, the .ac file will name the objects in your model to "blah" by default. You need to amend the relevant object names in your .ac file using text edit, so that the xml will work.<br />
<br />
=== Animation order ===<br />
Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s).<br />
<br />
== Tags used in most animations ==<br />
=== Name ===<br />
With a name animation, you can group multiple objects. <br />
<br />
<source><br />
<animation><br />
<name>Collection1</name><br />
<object-name>Object1</object-name><br />
<object-name>Object2</object-name><br />
<object-name>Object3</object-name><br />
</animation><br />
</source><br />
<br />
The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:<br />
<br />
<source><br />
<object-name>Collection1</object-name><br />
</source><br />
<br />
=== Object-name ===<br />
These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.<br />
<br />
=== Property ===<br />
Each animation must be associated with exactly one property from the main FlightGear property tree (remember that the properties in the wrapper file are not part of the main tree), using <code><property></code> to provide the property path:<br />
<br />
<source><br />
<animation><br />
<type>rotate</type><br />
<object-name>Rudder</object-name><br />
<property>controls/rudder</property><br />
</animation><br />
</source><br />
<br />
Note the omission of the leading slash '/' when referring to the property. This assures that when the model is used for AI or multiplayer traffic the animations will follow that of the AI controller instead of that of the user.<br />
<br />
=== Axis ===<br />
An axis part is required in every animation that involves a rotating or moving thing.<br />
<br />
<source><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:<br />
* In rotation animations, the axis part defines around what axis the object rotates. Negative/positive values make the difference between counterclockwise and clockwise rotations.<br />
* In translate animations, the part defines along what axis the object moves. If the x-axis is poiting backwards, an x-value of -1 will result in forward motion.<br />
<br />
You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a [[#Center|<nowiki><center></nowiki>]] tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).<br />
<br />
<source><br />
<axis> <br />
<x1-m> 4.9</x1-m><br />
<y1-m> 7.1</y1-m><br />
<z1-m>-1.0</z1-m><br />
<x2-m> 5.9</x2-m><br />
<y2-m>11.2</y2-m><br />
<z2-m>-0.5</z2-m><br />
</axis><br />
</source><br />
<br />
=== Center ===<br />
Various animations ([[#Rotate|rotate]], [[#Spin|spin]], [[#Scale|scale]]) move around a center point.<br />
<br />
<source><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
</source><br />
<br />
The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.<br />
<br />
=== Using a geometry object for axis and centre (2017.2) ===<br />
<br />
Added in V2017.2 is support to allow a geometry object (a line segment with two vertices) that is used to define both the centre and the axis for an animation. This will work with rotate, translate and the knob animations.<br />
<br />
The axis line should be balanced, i.e. it should protrude equal amounts.<br />
<br />
The syntax for this is <br />
<source><br />
<axis><br />
<object-name>some-object</object-name><br />
</axis><br />
</source><br />
<br />
Once the object-name used for the axis has been processed the geometry object will be hidden. This also allows a visual check for any axis objects that are not yet assigned.<br />
<br />
It is possible to reuse the same object definition multiple times within a single XML file. <br />
<br />
[[File:Canopy-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for a canopy]]<br />
<br />
[[File:Gauges-knobs-animation-axis-object.png|small|Illustration of where an axis object (2017.2) can be placed for cockpit elements]]<br />
<br />
== Additional tags that can be used in most animations ==<br />
=== Conditions ===<br />
Multiple animations can make use of a conditional. Check <tt>$FGDATA/Docs/README.conditions</tt> for some more details.<br />
<br />
* '''equals:''' property value (or second property) is equal to value/(first)property.<br />
* '''greater-than:''' property value (or second property) is larger than value/(first)property.<br />
* '''greater-than-equals:''' property value (or second property) is greater than or equal to value/(first)property.<br />
* '''less-than:''' property value (or second property) is smaller than value/(first)property.<br />
* '''less-than-equals:''' property value (or second property) is smaller than or equal to value/(first)property.<br />
<br />
The example below is true when n1 has a value greater than 25.<br />
<source><br />
<condition><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</source><br />
<br />
Then there are some special tags:<br />
<br />
* '''and:'''<br />
* '''not:'''<br />
* '''or:'''<br />
<br />
In the example below, the condition is true when either n1 is greater than 25% or equal to 0%.<br />
<source><br />
<condition><br />
<or><br />
<greater-than><br />
<property>engines/engine[1]/n1</property><br />
<value>25</value><br />
</greater-than><br />
<equals><br />
<property>engines/engine[1]/n1</property><br />
<value>0</value><br />
</equals><br />
</or><br />
</condition><br />
</source><br />
<br />
An example of implementation into an animation looks as follows:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<condition><br />
<greater-than><br />
<property>suface-positions/left-aileron-pos-norm</property><br />
<value>10</value><br />
</greater-than><br />
</condition><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Interpolation ===<br />
For non-fixed factors, an interpolation "table" can be created. <br />
<br />
<source><br />
<interpolation><br />
<entry><br />
<ind> 0.0</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 0.667</ind><br />
<dep> 0.0</dep><br />
</entry><br />
<entry><br />
<ind> 1.0</ind><br />
<dep> 0.5</dep><br />
</entry><br />
</interpolation><br />
</source><br />
<br />
The lines above represent the following table:<br />
<br />
{|<br />
!Input<br />
!Output<br />
|-<br />
|0.0<br />
|0.0<br />
|-<br />
|0.667<br />
|0.0<br />
|-<br />
|1.0<br />
|0.5<br />
|}<br />
<br />
You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).<br />
<br />
=== Expressions ===<br />
For some animations it is possible to define complex animations by using [[Expressions|Expressions]]. This even allows to drive the animation from multiple properties without the need for additional Nasal scripts. Here is an example for a translate animation depending on two properties and the cosine function:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>translate</type><br />
<expression><br />
<product><br />
<property>/my/factor-property</property><br />
<cos><br />
<deg2rad><br />
<property>/my/angular-property</property><br />
</deg2rad><br />
</cos><br />
</product><br />
</expression><br />
[..]more elements[..]<br />
</animation><br />
</syntaxhighlight><br />
<br />
Animations which can utilize [[Expressions|Expressions]] are: <br />
* [[Howto:Animate_models#Translate|Translate]]<br />
* [[Howto:Animate_models#Rotate|Rotate]]<br />
* [[Howto:Animate_models#Scale|Scale]]<br />
* [[Howto:Animate_models#Range|Range]]<br />
* [[Howto:Animate_models#Blend|Blend]]<br />
<br />
See more detailed info at [[Expressions|Expressions]]<br />
<br />
== Object animations ==<br />
=== Alpha-test ===<br />
<source><br />
<animation><br />
<type>alpha-test</type><br />
<object-name>Object</object-name><br />
<alpha-factor>0.01</alpha-factor><br />
</animation><br />
</source><br />
This "animation" is a way to set an alpha test on a model branch. The effect is to avoid depth buffer writing of pixel that are not seen because they are transparent. This is particulary useful when modeling a metallic structure or a tree with a billboard. The threshold of transparency is set with the <alpha-factor> element. See also [[Pixel testing in effects]].<br />
<br />
=== Blend ===<br />
Blends an object with the surrounding. Comparable to a translucency animation. A value of 0 corresponds to no transparency, i.e. and ordinary solid object, and a value of 1 makes the object fully transparent, i.e., not visible at all.<br />
<br />
<source><br />
<animation><br />
<type>blend</type><br />
<property>/velocities/airspeed-kt</property><br />
<factor>0.00025</factor><br />
<min>0.2</min><br />
<max>0.7</max><br />
</animation><br />
</source><br />
<br />
* '''property:'''<br />
* '''factor:'''<br />
* '''min:'''<br />
* '''max:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
Note that when using the Project Rembrandt renderer, all transparent and translucent objects must be registered to display properly. [[Project_Rembrandt#Registering_all_translucent_surfaces|More information here.]]<br />
<br />
=== Billboard ===<br />
This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.<br />
<br />
<source><br />
<animation><br />
<type>billboard</type><br />
<object-name>Object</object-name><br />
<spherical type="bool">true</spherical><br />
</animation><br />
</source><br />
<br />
* '''spherical:'''<br />
<br />
=== Dist-scale ===<br />
Used to scale an object, based on the distance to the viewer.<br />
<br />
<source><br />
<animation><br />
<type>dist-scale</type><br />
<object-name>Object</object-name><br />
<interpolation><br />
<entry><br />
<ind>0</ind><br />
<dep>1</dep><br />
</entry><br />
<entry><br />
<ind>300</ind><br />
<dep>4</dep><br />
</entry><br />
<entry><br />
<ind>1500</ind><br />
<dep>8</dep><br />
</entry><br />
</interpolation><br />
</animation><br />
</source><br />
<br />
You can optionally add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
<br />
=== Flash ===<br />
<br />
Used to scale an object based on the cosine of the angle between the axis provided in the animation and the view vector.<br />
<br />
<source><br />
<animation><br />
<type>flash</type><br />
<object-name>Object</object-name><br />
<offset>0.0</offset><br />
<factor>1.0</factor><br />
<power>2</power><br />
<two-sides type="bool">false</two-sides><br />
<min>0.0</min><br />
<max>1.0</max><br />
<center><br />
<x-m>0.0</x-m><br />
<y-m>0.0</y-m><br />
<z-m>0.0</z-m><br />
</center><br />
<axis><br />
<x>0.0</x><br />
<y>-1</y><br />
<z>0.1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''offset:'''<br />
* '''factor:'''<br />
* '''power:'''<br />
* '''two-sides:''' if false, nothing is drawn if the cosine is negative.<br />
* '''min:'''<br />
* '''max:'''<br />
<br />
scale = factor * pow( cosine, power ) + offset<br />
<br />
scale is then clamped between min and max.<br />
<br />
and this scale factor is applied to the object, from the center specified. It works best if scale is less than 1. Otherwise, there will be clipping issues.<br />
<br />
=== Noshadow ===<br />
This animation is used to make sure an object will cast no shadow.<br />
<br />
<source><br />
<animation><br />
<type>noshadow</type><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
=== Range ===<br />
: ''See also [[Modeling - Getting Started#Level of Detail (LOD)]].''<br />
<br />
To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used. <br />
<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-m>30</max-m><br />
</animation><br />
</syntaxhighlight><br />
<br />
* '''min-m:''' the shortest distance (in meters) from the object center at which it is visible.<br />
* '''max-m:''' the largest distance (in meters) from the object center at which it is visible.<br />
<br />
You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers: <br />
{| class="wikitable"<br />
! Property<br />
! Description<br />
! Default value<br />
|-<br />
|<tt>/sim/rendering/static-lod/bare</tt><br />
| only a rough exterior model<br />
| 30,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/rough</tt> <br />
| most should be visible<br />
| 9,000 m<br />
|-<br />
|<tt>/sim/rendering/static-lod/detailed</tt> <br />
| all details should be visible<br />
| 1,500 m<br />
|}<br />
<br />
The animation code will look like this:<br />
<syntaxhighlight lang="xml"><br />
<animation><br />
<type>range</type><br />
<min-m>0</min-m><br />
<max-property>sim/rendering/static-lod/bare</max-property><br />
</animation><br />
</syntaxhighlight><br />
<br />
You can have both ranges (max and min) bound to a property, or just one of them.<br />
* '''min-property:''' <br />
* '''max-property:'''<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Rotate ===<br />
One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>rotate</type><br />
<property>surface-positions/left-aileron-pos-norm</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
* '''offset-deg:''' is optional. Offset in degrees.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
=== Scale ===<br />
A scale animation scales (resizes) an object. This can be either property-value dependant (first example) or a fixed scale (second example).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<object-name>Object</object-name><br />
<property>sim/time/sun-angle-rad</property><br />
<x-min>1.0</x-min><br />
<y-min>1.0</y-min><br />
<z-min>1.0</z-min><br />
<x-factor>1.4</x-factor><br />
<y-factor>1.4</y-factor><br />
<z-factor>2.0</z-factor><br />
</animation><br />
</source><br />
<br />
* ?-min: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.<br />
* ?-factor: the scale factor for each axis (factor*property=scale factor).<br />
<br />
<source><br />
<animation><br />
<type>scale</type><br />
<x-offset>0.5</x-offset><br />
<y-offset>0.5</y-offset><br />
<z-offset>0.5</z-offset><br />
</animation><br />
</source><br />
<br />
* x.offset: the scale factor.<br />
* Add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.<br />
* '''You can optionally use an [[Howto:Animate_models#Expressions|expression]] in the <factor> or <offset> inputs.''' For more details see [[Expressions|Expressions]]<br />
<br />
=== Select ===<br />
This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 25%.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>select</type><br />
<condition><br />
<greater-than><br />
<property>engines/engine[0]/n1</property><br />
<value>25</value><br />
</greater-than><br />
</condition><br />
</animation><br />
</source><br />
<br />
=== Shader ===<br />
<source><br />
<animation><br />
<type>shader</type><br />
<shader>chrome</shader><br />
<texture>chrome2.png</texture><br />
<object-name>Object</object-name><br />
</animation><br />
</source><br />
<br />
* '''shader:''' <br />
* '''texture:''' path to the texture used by the shader.<br />
<br />
=== Spin ===<br />
Very similar to [[#Rotate|rotate]], but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>spin</type><br />
<property>engines/engine[0]/n1</property><br />
<factor>25</factor><br />
<center><br />
<x-m>-1.50</x-m><br />
<y-m> 1 </y-m><br />
<z-m> 0.25</z-m><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''factor:''' is optional.<br />
<br />
=== Timed ===<br />
Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.<br />
<br />
<source><br />
<animation><br />
<type>timed</type><br />
<object-name>BacklightOn</object-name><br />
<object-name>BacklightOff</object-name><br />
<use-personality type="bool">true</use-personality><br />
<branch-duration-sec>0.8</branch-duration-sec><br />
<branch-duration-sec>0.2</branch-duration-sec><br />
</animation><br />
</source><br />
<br />
=== Tracking ===<br />
The new (in 2.11) [[Tracking animation|'''locked-track animation''']] can do exactly the same thing as the [http://wiki.blender.org/index.php/Doc:2.6/Manual/Constraints/Tracking/Locked_Track Locked Track constraint] available in Blender. However it can also be used to simulate simple inverse kinematic systems consisting of two bones connected with a revolute joint (aka hinge). See [[Tracking animation|detailed explanantion]]<br />
<br />
=== Translate ===<br />
The same as [[#Textranslate|textranslate]], but this animation moves a whole object (so including fixed textures). The example below will move an object in the y-direction:<br />
<br />
{| class="wikitable" border="0" cellspacing="0" <br />
!Property value<br />
!Output<br />
|-<br />
| -1<br />
| -2.5<br />
|-<br />
| 0<br />
| 2.5<br />
|-<br />
| 1<br />
| 7.5<br />
|}<br />
<br />
<source><br />
<animation><br />
<type>translate</type><br />
<object-name>Object</object-name><br />
<property>controls/seat/pilot/position-norm</property><br />
<factor>5</factor><br />
<offset-m>2.5</offset-m><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
When using interpolation tables such as:<br />
<source><br />
<interpolation><br />
<entry><ind>0.0</ind><dep> 0</dep></entry><br />
<entry><ind>0.666</ind><dep>0.18</dep></entry><br />
<entry><ind>1.0</ind><dep>0.27</dep></entry><br />
</interpolation><br />
</source><br />
The first figure (<ind> refers to the value of the property associated with the object and the second figure (in <dep>) refers to the amount that the object moves in metres. For example, in this case, the object moves 18cm when the value reads 0.66 and 27cm when the value is 1.<br />
<br />
'''IF used WTIHOUT property''' : The object is placed at some (Value of Offset) meters away from its original position, along the virtual axis formed by said original position and the point with coordinates x/y/z defined in the <axis> tag.<br />
Mathematically, assuming the Object to translate is (in the model space) placed at point A (x1, y1, z1) and you want to relocate it to point B (x2, y2, z2) then x2,y2,z2 are the values in the <axis> tag of the Translate animation and <offset> can be computed as SQRT((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)<br />
<br />
<br />
* '''factor:''' is optional.<br />
* '''offset-m:''' is optional. Offset in meters.<br />
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]<br />
<br />
== Material animation ==<br />
An animation type that can be used in various ways. Of course you can combine the below mentiond systems into one (big) animation.<br />
<br />
<source><br />
<animation> <br />
<type>material</type> <br />
<object-name>Object</object-name><br />
<property-base>sim/model/c172p/material</property-base><br />
<global type="bool">true</global> <!-- This tag is no longer supported --><br />
...<br />
lines as mentioned below<br />
...<br />
</animation><br />
</source><br />
<br />
'''Optional:'''<br />
* '''property-base:''' when using prop(erties), you might want to set a property-base. All props will be relative to this path.<br />
* '''global (deprecated):''' by setting this to <tt>true</tt>, all objects using the same material as the defined object(s) (via <tt><object-name></tt>) will be affected by the animation. This is preferred to listing several objects in <object-name> tags. It's not only faster, but also doesn't break animations by forcing objects together. <span style="color:red; text-decoration: underline;">This tag is no longer supported</span><br />
<br />
'''Notes:'''<br />
* Numbers are clamped to 0.0-1.0, except "shininess", which is clamped to 0-128.<br />
* By appending <tt>-prop</tt> each of the material properties can read its value from another property.<br />
<br />
=== Ambient ===<br />
<source><br />
<ambient><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</ambient><br />
</source><br />
<br />
=== Diffuse ===<br />
<source><br />
<diffuse><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</diffuse><br />
</source><br />
<br />
=== Emission ===<br />
{{Main article|Howto: Illuminate faces}}<br />
<source><br />
<emission><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
<factor-prop>controls/lighting/panel-norm</factor-prop><br />
</emission><br />
</source><br />
<br />
Emission colors are multiplied by the factor-prop value. 1 is maximum color intensity, while 0 is the minimum. Colors are calculated according to the [http://en.wikipedia.org/wiki/RGB_color_model RGB color model].<br />
<br />
=== Shininess ===<br />
Shininess is clamped to 0-128.<br />
<source><br />
<shininess>105</shininess><br />
</source><br />
<br />
=== Specular ===<br />
<source><br />
<specular><br />
<red>1.0</red><br />
<green>0.2</green><br />
<blue>0.0</blue><br />
</specular><br />
</source><br />
<br />
=== Texture ===<br />
Used for the [[Livery over MP]] system.<br />
<br />
<source><br />
<property-base>sim/model/livery</property-base> <br />
<texture-prop>engine</texture-prop> <br />
<texture>KLM.png</texture> <br />
</source><br />
<br />
=== Transparency ===<br />
<source><br />
<transparency><br />
<alpha-prop>rotors/tail/rpm</alpha-prop><br />
<factor>-0.0015</factor><br />
<offset>1</offset><br />
</transparency><br />
</source><br />
<br />
=== Threshold ===<br />
<source><br />
<threshold>0.001</threshold><br />
</source><br />
<br />
== Texture Animations ==<br />
<br />
Applying different matrix transformations to the textures of an object.<br />
<br />
=== Textranslate ===<br />
A very important animation for cockpits! This animation moves textures over a surface.<br />
<br />
<source><br />
<animation><br />
<type>textranslate</type><br />
<object-name>Object</object-name><br />
<property>autopilot/settings/target-speed-kt</property><br />
<bias>0.0001</bias><br />
<factor>0.001</factor><br />
<step>100</step><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
</axis><br />
</animation><br />
</source><br />
<br />
* '''bias:''' Adds an offset to the property before factor/step. A small value is needed to compensate for [http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems floating point accuracy].<br />
* '''factor:''' property * factor * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.<br />
* '''step:''' the step size at which the texture is translated. If this is set to 0.1, the texture will only be translated at 0.1, 0.2, 0.3 etc.<br />
* '''axis:''' the direction in which the texture is translated. Y is up/down, while X is left/right.<br />
<br />
=== Texrotate ===<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<type>texrotate</type><br />
<property>some/property/path</property><br />
<factor>25</factor><br />
<offset-deg>25</offset-deg><br />
<center><br />
<x>0.5</x><br />
<y>0.5</y><br />
<z>0</z><br />
</center><br />
<axis><br />
<x>0</x><br />
<y>0</y><br />
<z>1</z><br />
</axis><br />
</animation><br />
</source><br />
<br />
=== Textrapezoid ===<br />
<br />
<source><br />
<animation><br />
<type>textrapezoid</type><br />
<object-name>HUD.l.canvas</object-name><br />
<property>/hud/trapezoid-correction</property><br />
<side>bottom</side><br />
</animation><br />
</source><br />
<br />
* '''side''': side of quad which should be scaled (''top'' (default)/''right''/''bottom''/''left'')<br />
<br />
=== Texmultiple ===<br />
<br />
Only one texture matrix can be applied to each object. With ''textmultiple'' multiple texture animations can be combined into a single matrix, applied to the specified object.<br />
<br />
<source><br />
<animation><br />
<type>texmultiple</type><br />
<object-name>HUD.l.canvas</object-name><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-x</property><br />
<axis><br />
<x>1</x><br />
<y>0</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textranslate</subtype><br />
<property>/hud/offset-y</property><br />
<axis><br />
<x>0</x><br />
<y>1</y><br />
<z>0</z><br />
</axis><br />
</transform><br />
<transform><br />
<subtype>textrapezoid</subtype><br />
<property>/hud/trapezoid-correction</property><br />
</transform><br />
</animation><br />
</source><br />
<br />
== Object interaction animations ==<br />
=== Enable-hot ===<br />
Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:<br />
<br />
<source><br />
<animation><br />
<object-name>Object</object-name><br />
<enable-hot type="bool">false</enable-hot><br />
</animation><br />
</source><br />
<br />
* '''enable-hot:''' can be either true or false. Remember that objects are automatically solid, so it should not be necessary to set this at all when wanting solidness.<br />
<br />
=== Interactions ===<br />
<source><br />
<animation> <br />
<type>interaction</type> <br />
<object-name>Object</object-name> <br />
<interaction-type>carrier-wire</interaction-type> <br />
</animation> <br />
</source><br />
<br />
* '''interaction-type:''' can have the following values:<br />
** '''carrier-catapult:'''<br />
** '''carrier-wire:''' makes the object act as an arresting wire, as used on [[aircraft carrier]]s.<br />
<br />
== Direct manipulation animations ==<br />
=== Knob / slider (v. 2.11-) ===<br />
{{Main article|Knob / slider animation}}<br />
<br />
=== Pick ===<br />
{{Main article|Howto: Make a clickable panel#Pick}}<br />
<br />
=== Touch ===<br />
<br />
The touch animation provides the normalized coordinates of a touch (or click) event on a 2d surface. The coordinates are passed in the argument and can be accessed using cmdarg() in Nasal.<br />
<br />
* Touch animation is designed to work with a quad that is being used as a Canvas placement (display).<br />
* The touch animation must not be combined with a pick animation on the same object.<br />
* More info here: [[Touch Animation]]<br />
<br />
==== touch example ====<br />
<br />
<animation><br />
<type>touch</type><br />
<visible>true</visible><br />
<object-name>CanvasPlacement</object-name><br />
<action><br />
<touch>0</touch><br />
<repeatable>false</repeatable><br />
<binding><br />
<command>nasal</command><br />
<script>print("touch input (",cmdarg().getNode("x").getValue(),",",cmdarg().getNode("y").getValue())</script><br />
</binding><br />
</action><br />
</animation><br />
<br />
== Shadow Handling ==<br />
There exist several possibilites for handling of shadows. <br /><br />
See '''[[ALS_technical_notes|ALS Technical Notes]]''' and more specific '''[[ALS_technical_notes#ALS_fuselage_shadow_effect|Fuselage Shadow Effect with ALS]]''' for a relatively simple shadow handling.<br /><br />
See '''[[Project Rembrandt]]''' which - amongst other functionality - implements a very realistic shadow mapping.<br />
<br />
== References ==<br />
{{Appendix|all|<br />
* {{cite web |url=http://www.opensubscriber.com/message/flightgear-devel@flightgear.org/958955.html |title="material" animation (and the bo105 as an example) |first=Melchior |last=Franz |date=22 March 2005 |work=FlightGear-devel mailinglist }}<br />
* {{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg01546.html |title=flash animation |first=Frederic |last=Bouvier |date=22 Feb 2006 |work=FlightGear-devel mailinglist }}<br />
}}<br />
<br />
== Related content ==<br />
=== Wiki articles ===<br />
* [[MP Fallback models]]<br />
* [[Howto:Animate gear scissors]]<br />
* [[Howto:Animate helicopters]]<br />
* [[Howto:Creating 3D instruments]]<br />
<br />
=== Forum topics ===<br />
* {{forum link|t=37353|title=3d models, how to produce them in an understandable way}} (April 2020-) - Touches on the subject of not using LOD range animations in scenery models.<br />
* {{forum link|t=36545|title=speedo Drum settings}} (November 2019) - Animating a mechanical multi-digit drum counter<br />
<br />
[[Category:Aircraft enhancement|Animate models]]<br />
[[Category:Howto|Animate models]]<br />
[[Category:Modeling|Animate models]]<br />
[[Category:Scenery enhancement|Animate models]]</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=127763User talk:Richard H2020-09-29T06:00:30Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{done}} OPRF Release F-14, F-15 <br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS<br />
# {{Pending}} Fix F-15 post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} Port any changes from above to OPRF Release <br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|50}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=127750User talk:Richard H2020-09-28T11:15:31Z<p>Richard H: </p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{Pending}} OPRF Release F-14, F-15 <br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS<br />
# {{Pending}} Fix F-15 post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} Port any changes from above to OPRF Release <br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|50}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=127558User talk:Richard H2020-09-11T17:01:24Z<p>Richard H: /* FlightGear todo list */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{done}} Release Mirage 2000-5 to FGAddon<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS<br />
# {{Pending}} Fix F-15 post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} OPRF Release F-14, F-15 <br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|50}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=User_talk:Richard_H&diff=127557User talk:Richard H2020-09-11T13:36:25Z<p>Richard H: /* Models */</p>
<hr />
<div>== FlightGear todo list ==<br />
<br />
=== Models ===<br />
# {{done}} Release Supermarine Swift to FGAddon<br />
# {{done}} Release Jaguar GR1 to FGAddon<br />
# {{Pending}} Release Mirage 2000-5 to FGAddon<br />
# {{Progressbar|80}} Finish F-14 carrier changes for NLTS<br />
# {{Pending}} Fix F-15 post takeoff handling - it feels weird as the G stabilisation becomes active in the FCS<br />
# {{Pending}} OPRF Release F-14, F-15 <br />
# {{Paused}} A320 VSPAERO FDM<br />
<br />
=== Core ===<br />
# Carrier improvements [[Post_FlightGear_2020.2_LTS_changes#Carriers_and_AI]]<br />
# {{Progressbar|50}} Fix point light sprites for AMD cards (again).<br />
# {{Pending}} Finish investigating LOD support for AI models (e.g. carriers models)<br />
# {{Pending}} AI Logic blocks - effectively this is to allow autopilot configuration to be used to script logic for AI models.<br />
# {{done}} DDS-TC exclusions for splash screen and low pixel depth (grayscale)<br />
# {{abandoned}} Background threading display - branch pushed for future reference. Overall the feature isn't stable enough nor does it achieve enough improvement to be worthwhile. Fernando may have different usage or investigate further related to compositor.<br />
<br />
<br />
<br />
== F-15 screenshot categories ==<br />
I have set up a few F-15 screenshot categories at [[:Category:McDonnell Douglas F-15 Eagle screenshots]].<br />
<br />
See also [[Special:CategoryTree/McDonnell Douglas F-15 Eagle screenshots]] and [[Help:Categories]].<br />
<br />
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 07:38, 18 July 2015 (EDT)</div>Richard Hhttps://wiki.flightgear.org/w/index.php?title=Supermarine_Swift/info&diff=127480Supermarine Swift/info2020-09-11T07:12:08Z<p>Richard H: </p>
<hr />
<div><includeonly>{{infobox aircraft<br />
| name = Supermarine-Swift<br />
| hangar = fgaddon<br />
| aircraft = Supermarine-Swift<br />
| image = SupermarineSwiftFR.5-external-h.jpg<br />
| alt = {{LangSwitch<br />
| en = External view<br />
| fr = Vue externe<br />
}}<br />
| image2 = SupermarineSwift-Cockpit.jpg<br />
| alt2 = {{LangSwitch<br />
| en = Cockpit view<br />
| fr = Vue interne<br />
}}<br />
| type = Fighter Reconnaissance aircraft<br />
| propulsion = SingleJet<br />
| manufacturer = Supermarine<br />
| authors = Virtavia/FGUK/Richard Harrison<br />
| fdm = JSBSim<br />
| fgname = SwiftFR5<br />
| status-fdm = 5<br />
| status-systems = 3<br />
| status-cockpit = 5<br />
| status-model = 5<br />
| status = Production<br />
| ready = <br />
| devel-website = https://github.com/Zaretto/Supermarine-Swift<br />
| navbar = 1<br />
}}</includeonly><noinclude><br />
This is the aircraft infobox subpage of the [[Supermarine Swift]].<br />
[[Category:Aircraft infobox documentation]]<br />
</noinclude></div>Richard H