Сменные текстуры для мультиплеера

Материал из 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]/

Источники