Перейти к содержимому


Фотография

Создание собственных "патчей" для аддонов

config

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 OFFLINE   Blender

Blender

    Прапорщик

  • Администраторы
  • 615 сообщений
  • Откуда:Torrevieja, España

Отправлено 25 July 2015 - 05:59

Очень часто в закромах всяких 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

,

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

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

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

Так что же делать?

- мы будем писать так называемую замену конфига - ведь все, интересующее нас начинается именно с config.cpp.

 

В качестве примера мы возьмем аддон

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

с ПТУР «Конкурс» и заменим боеприпасы на аналог из аддона

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.

 

I. Подготовка.

Для создания собственного аддона необходимо:

Создать папку, файл с префиксом аддона, и файл конфига.

Рассматривать варианты с файлами префикса не будем, остановимся лишь на самом простом:

Назовите файл $PBOPREFIX$, а внутри опишите название аддона, либо виртуальный путь, по которому в дальнейшем мы сможем обращаться к ресурсам нашего аддона (если они есть).

Пускай, в данном случае префиксом будет cha_brdm2_rhs.

Далее создаем файл конфига с именем config.cpp, в который мы поместим информацию и требования для нашего аддона.

Стоит отметить, что наш патч должен загружаться после инициализации аддонов, с которыми мы хотим взаимодействовать. Для этого мы берем их идентификаторы из класса CfgPatches в файлах config.cpp наших аддонов.

В нашем случае - это аддон Cha_BRDM2 (аддон с БРДМ 2) и rhs_c_heavyweapons (аддон с конфигурацией оружия у RHS).

В дальнейшем мы пропишем их в параметре requiredAddons нашего аддона:

class CfgPatches
{
	class cha_brdm2_rhs // Идентификатор нашего аддона
	{
		units[] = {};
		weapons[] = {};
		requiredVersion = 0.1;
		requiredAddons[] = { "Cha_BRDM2", "rhs_c_heavyweapons" }; // Требуемые нашим патчем аддоны для предзагрузки
		version = "0.1"; // Версия
		versionStr = "0.1"; // Версия в строковом варианте (необязательно, используется CBA)
		versionAr[] = {0, 1}; // Версия в виде массива (необязательно, используется CBA)
		author[] = {"Blender"}; // Автор (необязательно, используется CBA)
		authorUrl = "http://www.arma3.ru"; // URL (необязательно, используется CBA)
		description = "Chairborne BRDM 2 ATGM to RHS replacement"; // Описание (необязательно, используется CBA)
	};
}; 
Теперь, наш аддон встанет в очередь инициализации за аддонами БРДМ 2 и Конфигурацией оружия в RHS.

 

II. Поиск и замена необходимых классов в интересующих нас аддонах.

Теперь, нам нужно заменить боеприпасы у БРДМ 2 на аналогичные из аддона RHS и "научить" оружие аддона Chairborne заряжаться от этих боеприпасов.

Для этого мы поищем и найдем в аддоне rhs_c_heavyweapons что-нибудь связанное с ATGM, например файл rhs_mags_atgm.hpp. Откроем его, и увидим два подходящих нам класса:

class rhs_mag_9m113_3 : VehicleMagazine
{
	scope = public;
	DISP_MAG_STR(9M113);
	ammo = "rhs_ammo_9m113";
	count = 3;
	initSpeed = 80;
	//maxleadspeed = 100;
	nameSound = "missiles";
};

class rhs_mag_9m113_4 : rhs_mag_9m113_3
{
	count = 4;
};
Но что же делать? - есть только варианты с 3-мя и 4-мя зарядами, а у БРДМ 2 их 5!?
- Не проблема, мы создадим свой класс с пятью зарядами на основе 4-х зарядного.
Для этого, в нашем аддоне сделаем ссылку на 4-х зарядный класс, и создадим свой на его основе:
 
class CfgMagazines {
	class rhs_mag_9m113_4; // Инициализируем в нашем аддоне класс RHS
	class rhs_mag_9m113_5: rhs_mag_9m113_4 { // Создаем свой, 5-ти зарядный на основе RHS
		count = 5; // Даем ему 5 зарядов
	};
};
Итак, мы создали свой класс магазина на пять зарядов - rhs_mag_9m113_5.
Теперь нам осталось добавить его к классу оружия БРДМ, и заменить на него стандартные магазины, выдающиеся при появлении БРДМ.
Ищем в аддоне cha_brdm2 в классе CfgWeapons соответствующее оружие, например вот это:
class Cha_BRDM2_AT5_Launcher: Missiles_Scalpel
{
	canlock = 0;
	magazines[] = {"Cha_BRDM2_5Rnd_At5"};
	displayname = "9M113 Konkurs";
	magazineReloadTime = 60;
};
Здесь мы видим, что используется магазин Cha_BRDM2_5Rnd_At5, в принципе мы можем просто заменить его, но можем и добавить совместимость с магазином RHS, что позволит заряжать оба типа боеприпаса - так мы и поступим.
 
class CfgWeapons {
	class Missiles_Scalpel; // Ссылка на базовый класс для нашего оружия
	class Cha_BRDM2_AT5_Launcher: Missiles_Scalpel
	{
		magazines[] = {"Cha_BRDM2_5Rnd_At5", "rhs_mag_9m113_5"};
	};
};

Теперь в БРДМ 2 можно заряжать и наш, созданный на основе RHS - 5-ти зарядный боеприпас.

Нам остается заменить выдачу боеприпасов на старте.

Для этого в классе CfgVehicles аддона cha_brdm2 находим нужный нам базовый класс БРДМ, где описано установленное на него вооружение и боеприпасы - Cha_BRDM2_ATGM_Base и видим, что в Turrets >> MainTurret присутствует класс magazines, в котором выдано два стандартных Cha-боеприпаса по 5 ракет:

magazines[] = {"Cha_BRDM2_5Rnd_AT5","Cha_BRDM2_5Rnd_AT5"}; 

Отлично, теперь делаем ссылки на классы в нашем патче соблюдая порядок наследования в конфиге cha_brdm2, и заменяем боеприпасы:

class CfgVehicles {
	class Car;
	class Car_F: Car
	{
		class NewTurret;
		class Turrets
		{
			class MainTurret: NewTurret	{};
		};
	};
	class Wheeled_APC_F: Car_F{};
	class Cha_BRDM2_Base: Wheeled_APC_F {};
	class Cha_BRDM2_ATGM_Base: Cha_BRDM2_Base
	{
		class Turrets: Turrets
		{
			class MainTurret: MainTurret
			{
				magazines[] = {"rhs_mag_9m113_5", "rhs_mag_9m113_5"}; // Вот они, наши боеприпасы
			};
		};
	};
};

Вот и все, остается только запаковать наш аддон и патч готов!

config.cpp

 

Надеюсь расписал все более-менее понятно. Если есть вопросы - задавайте.


  • 5

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 25 July 2015 - 19:13

Правильно ли я понимаю, что здесь:

	class Car_F: Car
	{
		class NewTurret;
		class Turrets
		{
			class MainTurret: NewTurret	{};
		};
	};

в классе Car_F будет создан подкласс Turrets? Если да, то не лучше ли расширить уже существующий:

		class Turrets : Turrets
		{
			class MainTurret: NewTurret	{};
		};

?

 

Правильно ли я понимаю, что под записью

class MainTurret : NewTurret
{
};

подразумевается, что подкласс MainTurret расширит класс NewTurret, но никаких изменений вноситься не будет?

 

Можно ли удалить переменные из класса?

Допустим, нужно "перенести" переменную stabilizedInAxes из дочернего класса в родительский:

class M1A1_base : Tank
{
	class Turrets : Turrets
	{
		class MainTurret : MainTurret
		{
			class Turrets : Turrets
			{
				class CommanderOptics : CommanderOptics
				{
					stabilizedInAxes = "StabilizedInAxesBoth";
				};
			};
		};
	};
};

А что писать для дочернего класса M1A1? Или "удаление" возможно только написанием класса CommanderOptics без этой переменной, который будет записан "поверх" исходного класса CommanderOptics?

Заранее благодарен за ответы.


Сообщение отредактировал Schatten: 25 July 2015 - 19:16

  • 0

#3 OFFLINE   StDIABLO

StDIABLO

    Рядовой

  • Пользователи
  • 3 сообщений
  • Откуда:Муром
  • Отряд:GUF

Отправлено 22 October 2015 - 23:21

разобрался спасибо за хелп


Сообщение отредактировал StDIABLO: 24 October 2015 - 01:51

  • 0




Яндекс.Метрика