Jump to content


Photo

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

config

  • Please log in to reply
2 replies to this topic

#1 OFFLINE   Blender

Blender

    Прапорщик

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

Posted 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

    Капитан

  • Пользователи
  • 1834 posts

Posted 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?

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


Edited by Schatten, 25 July 2015 - 19:16.

  • 0

#3 OFFLINE   StDIABLO

StDIABLO

    Рядовой

  • Пользователи
  • 3 posts
  • Откуда:Муром
  • Отряд:GUF

Posted 22 October 2015 - 23:21

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


Edited by StDIABLO, 24 October 2015 - 01:51.

  • 0




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