Создание аддонов — различия между версиями

Материал из WOG Wiki
Перейти к: навигация, поиск
(Мастер-конфиг)
 
(не показаны 62 промежуточные версии 4 участников)
Строка 1: Строка 1:
''"И после смерти мне не обрести покой - я душу дьяволу продал за ночь с армой..." (с) Crabe''
+
==Базовые знания и определения==
  
  
 +
 +
===Конфигурационный файл===
  
 
Игры серии '''Operation Flashpoint'''/'''ARMA''' симулируют реальность и объекты в ней. Каждый объект - острова, транспортные средства, вооружения - имеет свойства и функции, прописанные в конфигурационных файлах, загружаемых игрой на старте. Перечень свойств зависит от класса объекта. Конфиг представляет собой файл C++, который может существовать и в бинарном виде.  
 
Игры серии '''Operation Flashpoint'''/'''ARMA''' симулируют реальность и объекты в ней. Каждый объект - острова, транспортные средства, вооружения - имеет свойства и функции, прописанные в конфигурационных файлах, загружаемых игрой на старте. Перечень свойств зависит от класса объекта. Конфиг представляет собой файл C++, который может существовать и в бинарном виде.  
  
 +
 +
===Содержимое архива *.pbo===
  
 
Физически аддон - это архив *.pbo, содержащий конфигурационный файл '''config.cpp''' или '''config.bin''' и дополнительный контент - звуки, текстуры, 3д-модель, скрипты, вынесенные в отдельные файлы через команду '''#include''' разделы конфига.  
 
Физически аддон - это архив *.pbo, содержащий конфигурационный файл '''config.cpp''' или '''config.bin''' и дополнительный контент - звуки, текстуры, 3д-модель, скрипты, вынесенные в отдельные файлы через команду '''#include''' разделы конфига.  
Строка 12: Строка 16:
  
  
Совокупность всех загружаемых аддонов представляет собой единый мастер-конфиг. Во время работы игры он располагается в оперативной памяти, доступен через внутриигровой config viewer и может быть сохранен на жеский диск для просмотра.  
+
===Мастер-конфиг===
 +
 
 +
Совокупность всех загружаемых аддонов представляет собой единый мастер-конфиг. Во время работы игры он располагается в оперативной памяти, доступен через внутриигровой config viewer и может быть сохранен на жесткий диск для просмотра.
  
 +
===Ваниль===
  
 
Принято разделять '''ванильный контент (vanila)''' - объекты, заданные разработчиком при релизе игры, и '''аддоны''' - контент, добавляемый после релиза разработчиком или сторонними лицами. Аддоны могут добавлять новый контент и изменять свойства существующего. Весь контент игры размещается в папке `addons` и, кроме ванильного контента, для удобства разделяется на папки.  
 
Принято разделять '''ванильный контент (vanila)''' - объекты, заданные разработчиком при релизе игры, и '''аддоны''' - контент, добавляемый после релиза разработчиком или сторонними лицами. Аддоны могут добавлять новый контент и изменять свойства существующего. Весь контент игры размещается в папке `addons` и, кроме ванильного контента, для удобства разделяется на папки.  
  
  
*Наследование
+
===Наследование параметров===
  
 
Конфигурационные файлы поддерживают наследование - если объекту (классу) задан родительский класс, он наследует все свойства родителя, присущие данному классу. Это упрощает разработку различных модификаций объектов. К примеру, бронеавтомобиль "Тигр" может существовать в нескольких версиях, отличающихся только камуфляжем-окраской (текстурой) и/или вооружением. Эти отличия укладываются в несколько строк и нет потребности переписывать несколько страниц базовых свойств. При изменении существующего класса требуется прописать его родительский класс без переназначения свойств и затем сам редактируемый класс с указанием родителя.
 
Конфигурационные файлы поддерживают наследование - если объекту (классу) задан родительский класс, он наследует все свойства родителя, присущие данному классу. Это упрощает разработку различных модификаций объектов. К примеру, бронеавтомобиль "Тигр" может существовать в нескольких версиях, отличающихся только камуфляжем-окраской (текстурой) и/или вооружением. Эти отличия укладываются в несколько строк и нет потребности переписывать несколько страниц базовых свойств. При изменении существующего класса требуется прописать его родительский класс без переназначения свойств и затем сам редактируемый класс с указанием родителя.
 
  
 
'''Пример''':
 
'''Пример''':
  
class rhsusf_m998_w_4dr; - ''ссылка на внешний класс-родитель''
+
class rhsusf_m998_w_4dr; - ''ссылка на внешний класс-родитель''
 +
class rhsusf_m998_w_4dr_halftop: rhsusf_m998_w_4dr - ''редактируемый класс с указанием родителя''
 +
{
 +
  insideSoundCoef = 0.4; - ''изменяемый параметр''
 +
};
  
class rhsusf_m998_w_4dr_halftop: rhsusf_m998_w_4dr - ''редактируемый класс с указанием родителя''
+
Внимание - переписывать все дерево классов не нужно, достаточно одного родителя. Но наследоваться параметры могут и от классов выше по дереву.
 
 
{
 
insideSoundCoef = 0.4;
 
}; - ''изменяемый параметр''
 
  
  
Внимание - переписывать все дерево классов не нужно, достаточно одного родителя. Но наследоваться параметры могут и от классов выше по дереву.
+
===required addons===
  
 +
Для того, чтобы изменения вступили в силу и не были перезаписаны исходными, в параметре '''required addons''' раздела '''CfgPatches''' нужно прописать класснэйм изменяемого аддона из раздела CfgPatches. Объекты могут быть модифицированы бесконечное количество раз и нужно, чтобы наши изменения были последними - чтобы именно они были зафиксированы в мастер-конфиге и не были перезаписаны другими конфигами, затрагивающими этот же класс.
  
Для того, чтобы изменения вступили в силу, в параметре '''required addons''' раздела '''CfgPatches'''нужно прописать префикс изменяемого аддона. Префикс - это указанный в каждом архиве *.pbo логический путь, который может отличаться от физического пути и названия файла. Объекты могут быть модифицированы бесконечное количество раз и нужно, чтобы наши изменения были последними - чтобы именно они были зафиксированы в мастер-конфиге и не были перезаписаны другими конфигами, затрагивающими этот же класс.
+
Пример:
 +
  class CfgPatches
 +
  {
 +
      class '''A3_Sounds_F'''  
 +
  {
 +
  author = "$STR_A3_Bohemia_Interactive";
 +
  name = "Arma 3 - Sound Effects";
 +
    url = "https://www.arma3.com";
 +
                ...
 +
  };
 +
  };
  
 +
===Подклассы===
  
 
Подклассы, в которых содержатся параметры объекта, заводятся внутрь фигурных скобок '''{}''', а строки заканчиваются точкой с запятой ''';''' . На старте игра проверяет синтаксис конфигов и при обнаружении ошибки запуск отменяет. При ошибке в теле класса, внутри фигурных скобок, он игнорируется и актуальными остаются заданные ранее значения параметров. Другие классы в этом же конфиге, не связанные с содержащим ошибку, принимаются к изменению мастер-конфига. Не допускается повторное задание класса в пределах одного конфига.
 
Подклассы, в которых содержатся параметры объекта, заводятся внутрь фигурных скобок '''{}''', а строки заканчиваются точкой с запятой ''';''' . На старте игра проверяет синтаксис конфигов и при обнаружении ошибки запуск отменяет. При ошибке в теле класса, внутри фигурных скобок, он игнорируется и актуальными остаются заданные ранее значения параметров. Другие классы в этом же конфиге, не связанные с содержащим ошибку, принимаются к изменению мастер-конфига. Не допускается повторное задание класса в пределах одного конфига.
  
  
Конифиги поддерживают комментирование через двойную косую черту '''//''', содержимое после нее игнорируется до окончания строки. Это позволяет оставлять комментарии в теле файла, упрощая поиск.  
+
===Комментирование===
 +
 
 +
Конфиги поддерживают комментирование через двойную косую черту '''//''', содержимое после нее игнорируется до окончания строки. Это позволяет оставлять комментарии в теле файла, упрощая поиск.  
  
 
'''Пример''':
 
'''Пример''':
  
//Тайфун-К
+
  //Тайфун-К
+
  class Truck_03_base_F : Truck_F
class Truck_03_base_F : Truck_F
+
  {
{
+
  slowSpeedForwardCoef = 0.0065;
slowSpeedForwardCoef = 0.0065;
+
  terrainCoef = 1.1;
terrainCoef = 1.1;
+
  };
};
 
  
  
Строка 60: Строка 79:
 
'''Пример''':
 
'''Пример''':
  
/* class Idle_ext { sound[] = { "wog_vehicleSound_Fix\SOUNDS\UAZ\UAZ_ext_IDLE", 1.5, 1, 350}; }; */
+
  /* class Idle_ext { sound[] = { "wog_vehicleSound_Fix\SOUNDS\UAZ\UAZ_ext_IDLE", 1.5, 1, 350}; }; */
 +
 
  
 +
===Контроллеры===
  
 
Конфигурационные файлы поддерживают '''математические выражения''' в качестве значений параметров. Взаимодействие с окружением и другими объектами реализовано через '''контроллеры''', которые характеризуют их состояние. Например, контроллер '''rain''' имеет значение '''false''' (логический ноль) в ясную погоду и '''true''' (логическая единица) в дождь. Таким образом звук капель дождя по корпусу транспортного средства будет иметь нулевую громкость в ясную погоду и максимальную в дождь.
 
Конфигурационные файлы поддерживают '''математические выражения''' в качестве значений параметров. Взаимодействие с окружением и другими объектами реализовано через '''контроллеры''', которые характеризуют их состояние. Например, контроллер '''rain''' имеет значение '''false''' (логический ноль) в ясную погоду и '''true''' (логическая единица) в дождь. Таким образом звук капель дождя по корпусу транспортного средства будет иметь нулевую громкость в ясную погоду и максимальную в дождь.
  
 +
'''Пример''':
 +
 +
  class RainExt { sound[] = { "rhsafrf\addons\rhs_a2port_car\sounds\rain.wss", 1, 30 }; frequency = 1; volume = " '''rain''' * camPos "; };
  
'''Пример''':
 
  
class RainExt { sound[] = { "rhsafrf\addons\rhs_a2port_car\sounds\rain.wss", 1, 30 }; frequency = 1; volume = " '''rain''' * camPos "; };
+
===Кастомные параметры===
 +
 
 +
ARMA допускает задание дополнительных, помимо ванильных, параметров. Их можно использовать для кастомных же функций при создании аддонов и модификаций. Например, такие параметры есть у модификации [https://ace3mod.com/wiki/framework/cargo-framework.html Advanced Combat Environment 3 (ACE3).]
 +
 
 +
class yourVehicleBaseClass
 +
    {
 +
        ace_cargo_space = 4;  // количество ACE - грузовых ячеек
 +
        ace_cargo_hasCargo = 1;  // допускает погрузку в ACE - багажник (1 - да, 0 - нет)
 +
    };
 +
 
 +
Добавлением этих параметров можно добавлять дополнительный функционал к существующем контенту. Это применимо к серверной сборке, но при обновлении контента его конфиг будет перезаписан, поэтому такие изменения целесообразно вносить через отдельные файлы-надстройки.
 +
 
 +
==Этапы создания аддона==
 +
 
 +
===Создание 3д-модели===
 +
 
 +
===Текстурирование и работа с освещением===
 +
 
 +
===Анимирование===
 +
 
 +
===Создание конфига===
 +
 
 +
====Общие параметры====
 +
====Физика====
 +
=====Двигатель и коробка передач=====
 +
=====Ходовая часть=====
 +
=====Бронирование=====
 +
====Вооружение и башни====
 +
====Звук====
 +
=====Старая звуковая система=====
 +
=====Шейдеры=====
 +
====Функции====
 +
 
 +
==Упаковка==
 +
 
 +
==Тестирование==
 +
[[Category:Разработка]]

Текущая версия на 13:07, 10 июня 2022

Базовые знания и определения

Конфигурационный файл

Игры серии Operation Flashpoint/ARMA симулируют реальность и объекты в ней. Каждый объект - острова, транспортные средства, вооружения - имеет свойства и функции, прописанные в конфигурационных файлах, загружаемых игрой на старте. Перечень свойств зависит от класса объекта. Конфиг представляет собой файл C++, который может существовать и в бинарном виде.


Содержимое архива *.pbo

Физически аддон - это архив *.pbo, содержащий конфигурационный файл config.cpp или config.bin и дополнительный контент - звуки, текстуры, 3д-модель, скрипты, вынесенные в отдельные файлы через команду #include разделы конфига.


Конфигурационные файлы загружаются только на старте и, в отличии от скриптов, не поддерживают изменение переменных на лету. Если присутствуют и файл *.cpp, и *.bin, игра отдает предпочтение первому.


Мастер-конфиг

Совокупность всех загружаемых аддонов представляет собой единый мастер-конфиг. Во время работы игры он располагается в оперативной памяти, доступен через внутриигровой config viewer и может быть сохранен на жесткий диск для просмотра.

Ваниль

Принято разделять ванильный контент (vanila) - объекты, заданные разработчиком при релизе игры, и аддоны - контент, добавляемый после релиза разработчиком или сторонними лицами. Аддоны могут добавлять новый контент и изменять свойства существующего. Весь контент игры размещается в папке `addons` и, кроме ванильного контента, для удобства разделяется на папки.


Наследование параметров

Конфигурационные файлы поддерживают наследование - если объекту (классу) задан родительский класс, он наследует все свойства родителя, присущие данному классу. Это упрощает разработку различных модификаций объектов. К примеру, бронеавтомобиль "Тигр" может существовать в нескольких версиях, отличающихся только камуфляжем-окраской (текстурой) и/или вооружением. Эти отличия укладываются в несколько строк и нет потребности переписывать несколько страниц базовых свойств. При изменении существующего класса требуется прописать его родительский класс без переназначения свойств и затем сам редактируемый класс с указанием родителя.

Пример:

class rhsusf_m998_w_4dr; - ссылка на внешний класс-родитель
class rhsusf_m998_w_4dr_halftop: rhsusf_m998_w_4dr - редактируемый класс с указанием родителя
{
  insideSoundCoef = 0.4; - изменяемый параметр
};

Внимание - переписывать все дерево классов не нужно, достаточно одного родителя. Но наследоваться параметры могут и от классов выше по дереву.


required addons

Для того, чтобы изменения вступили в силу и не были перезаписаны исходными, в параметре required addons раздела CfgPatches нужно прописать класснэйм изменяемого аддона из раздела CfgPatches. Объекты могут быть модифицированы бесконечное количество раз и нужно, чтобы наши изменения были последними - чтобы именно они были зафиксированы в мастер-конфиге и не были перезаписаны другими конфигами, затрагивающими этот же класс.

Пример:

  class CfgPatches 
  {
     	class A3_Sounds_F 
  	{
  		author = "$STR_A3_Bohemia_Interactive";
  		name = "Arma 3 - Sound Effects";
   		url = "https://www.arma3.com";
               ...
  	};
  };

Подклассы

Подклассы, в которых содержатся параметры объекта, заводятся внутрь фигурных скобок {}, а строки заканчиваются точкой с запятой ; . На старте игра проверяет синтаксис конфигов и при обнаружении ошибки запуск отменяет. При ошибке в теле класса, внутри фигурных скобок, он игнорируется и актуальными остаются заданные ранее значения параметров. Другие классы в этом же конфиге, не связанные с содержащим ошибку, принимаются к изменению мастер-конфига. Не допускается повторное задание класса в пределах одного конфига.


Комментирование

Конфиги поддерживают комментирование через двойную косую черту //, содержимое после нее игнорируется до окончания строки. Это позволяет оставлять комментарии в теле файла, упрощая поиск.

Пример:

  //Тайфун-К	
  	class Truck_03_base_F : Truck_F
  	{
  		slowSpeedForwardCoef = 0.0065;
  		terrainCoef = 1.1;
  	};


Второй вариант этой функции /*...*/ позволяет не только оставлять комментарии, но и отключать разделы.

Пример:

  /* class Idle_ext { sound[] = { "wog_vehicleSound_Fix\SOUNDS\UAZ\UAZ_ext_IDLE", 1.5, 1, 350}; }; */


Контроллеры

Конфигурационные файлы поддерживают математические выражения в качестве значений параметров. Взаимодействие с окружением и другими объектами реализовано через контроллеры, которые характеризуют их состояние. Например, контроллер rain имеет значение false (логический ноль) в ясную погоду и true (логическая единица) в дождь. Таким образом звук капель дождя по корпусу транспортного средства будет иметь нулевую громкость в ясную погоду и максимальную в дождь.

Пример:

  class RainExt { sound[] = { "rhsafrf\addons\rhs_a2port_car\sounds\rain.wss", 1, 30 }; frequency = 1; volume = " rain * camPos "; };


Кастомные параметры

ARMA допускает задание дополнительных, помимо ванильных, параметров. Их можно использовать для кастомных же функций при создании аддонов и модификаций. Например, такие параметры есть у модификации Advanced Combat Environment 3 (ACE3).

class yourVehicleBaseClass 
   {
       ace_cargo_space = 4;  // количество ACE - грузовых ячеек
       ace_cargo_hasCargo = 1;  // допускает погрузку в ACE - багажник (1 - да, 0 - нет)
   };

Добавлением этих параметров можно добавлять дополнительный функционал к существующем контенту. Это применимо к серверной сборке, но при обновлении контента его конфиг будет перезаписан, поэтому такие изменения целесообразно вносить через отдельные файлы-надстройки.

Этапы создания аддона

Создание 3д-модели

Текстурирование и работа с освещением

Анимирование

Создание конфига

Общие параметры

Физика

Двигатель и коробка передач
Ходовая часть
Бронирование

Вооружение и башни

Звук

Старая звуковая система
Шейдеры

Функции

Упаковка

Тестирование