Сменные текстуры для мультиплеера
Материал из FlightGear.ru.
Описание смены ливрей самолёта будет производится на примере самолёта Ан-2.
Чтобы игроки в мультиплеере могли видеть выбранную вами ливрею самолёта, нужно установить некое связанное с мультиплеером свойство в Property Tree. В нашем случае это sim/model/livery/file
<sim>
<model>
<livery>
<file>afl90</file>
...
Значение можно оставить пустым, если сразу после этого выберем ливрею.
Для начала нужно инициализировать систему ливрей.
aircraft.livery.init("Aircraft/an2/Model/Liveries");
Первый аргумент указывает на каталог, где хранятся XML-файлы с загружаемыми свойствами (путями к текстурам). Вот пример файла:
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<sim>
<model>
<livery>
<name type="string">Aeroflot-70</name>
</livery>
</model>
</sim>
<an2>
<livreas>
<fuselage>afl70_fuse_1_t.rgb</fuselage>
<wings>afl70_wings_1_t.rgb</wings>
</livreas>
</an2>
</PropertyList>
Все XML файлы в указанном каталоге индексируются и запоминаются значения из пути sim/model/livery: имя XML файла без расширения .xml, имя, указанное в теге <name/> (имя тега можно переопределить во время инициализации) и порядок сортировки - тег <index/> (также можно переопределить при инициализации).
Затем выбираем ливрею, по имени, указанному в sim/model/livery/name. Например
aircraft.livery.select("Aeroflot-90");
После этого инициализируются некоторые внутренние переменные, после чего можно выполнять aircraft.livery.next(); и aircraft.livery.previous(); Также инициализируется свойство sim/model/livery/file и передаётся другим самолётам, которые видят нас.
В файле модели, который загружается при показе ЛА (например, Model/an2-model.xml) добавляется следующий код:
Для PLIB версии (версии 1.0)
<nasal>
<load>
var livery_update = aircraft.livery.update("Aircraft/an2/Model/Liveries");
</load>
<unload>
livery_update.stop();
</unload>
</nasal>
Для OSG версии
<nasal>
<load>
var livery_update = aircraft.livery_update.new("Aircraft/an2/Model/Liveries", 10, func { print("UPDATE"); } );
</load>
<unload>
livery_update.stop();
</unload>
</nasal>
Пока визуальная модель загружена, каждые 10 сек скрипт проверяет, не из изменилась ли ливрея. И если изменилась, загружает XML файл в соответсвующее место в Property Tree (/ai/models/multiplayer[n]/)
В aircraft.livery_update.new второй и третий аргументы необязательные. Они означают интервал проверки смены ливреи самолётом и вызов своей функции при смене ливреи.
Сменить ливрею можно при помощи функций
aircraft.livery.next();
aircraft.livery.previous();
aircraft.livery.dialog.toggle(); # Появляется и убирается диалог выбора ливерей
aircraft.livery.select("Aeroflot-90");
Пример анимации:
<!--Runtime selective livereas--> <animation> <type>material</type> <object-name>obj25</object-name> <texture-prop>an2/livreas/fuselage</texture-prop> <global type="bool">true</global> </animation> <animation> <type>material</type> <object-name>obj37</object-name> <texture-prop>an2/livreas/fuselage</texture-prop> <global type="bool">true</global> </animation> <animation> <type>material</type> <object-name>obj26</object-name> <texture-prop>an2/livreas/wings</texture-prop> <global type="bool">true</global> </animation>
Обратите внимание на отсутствующие слэши перед an2 - в этом случае, если самолёт - не ваш, пути будут искаться относительно /ai/models/multiplayer[n]/
Источники
- $FG_ROOT/Nasal/aircraft.nas
- http://marc.info/?l=flightgear-devel&m=120430772615232&w=2
- http://marc.info/?l=flightgear-devel&m=120436629711250&w=2
