Создание аддонов — различия между версиями
RamZesIV (обсуждение | вклад) |
Lom3uk (обсуждение | вклад) (→Мастер-конфиг) |
||
(не показаны 62 промежуточные версии 4 участников) | |||
Строка 1: | Строка 1: | ||
− | + | ==Базовые знания и определения== | |
+ | |||
+ | ===Конфигурационный файл=== | ||
Игры серии '''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; - ''изменяемый параметр'' | ||
+ | }; | ||
− | + | Внимание - переписывать все дерево классов не нужно, достаточно одного родителя. Но наследоваться параметры могут и от классов выше по дереву. | |
− | |||
− | |||
− | |||
− | |||
− | + | ===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; | |
− | + | }; | |
− | |||
Строка 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 | + | ===Кастомные параметры=== |
+ | |||
+ | 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 - нет) };
Добавлением этих параметров можно добавлять дополнительный функционал к существующем контенту. Это применимо к серверной сборке, но при обновлении контента его конфиг будет перезаписан, поэтому такие изменения целесообразно вносить через отдельные файлы-надстройки.