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


Фотография

Экипировка юнитов


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

#41 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 September 2014 - 17:40

weapons[] =
		{
			{"arifle_Katiba_F", "arifle_Katiba_C_F"},
			{"hgun_Rook40_F", "hgun_Rook40_F"}
		};

Та же самая ошибка

 

Да я уже понял, один момент


  • 0

#42 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 September 2014 - 17:53

Прошу прошения уважаемые коллеги, за свой косяк на который не обратил внимание, а косяк по хорошему БИСовский.

И проблема вот в чём.

В оригинале БИСовской функции

BIS_fnc_loadInventory

В некоторых местах, скажем так, пусть это будут пушки

if !("weapons" in _blacklist) then {
	private ["_weapons"];
	_weapons = if (_isCfg) then {getarray (_cfg >> "weapons")} else {[_inventory select 5 select 0,_inventory select 6 select 0,_inventory select 7 select 0]};
	{
		if (_x != "") then {
			_weapon = _x;
			if (typename _weapon == typename []) then {_weapon = _weapon call bis_fnc_selectrandom;};
			_object addweapon _weapon;
		};
	} foreach _weapons;
};

Так вот, если в этой части кода

                if (_x != "") then {
			_weapon = _x;
			if (typename _weapon == typename []) then {_weapon = _weapon call bis_fnc_selectrandom;};
			_object addweapon _weapon;
		};

переменная _x окажется массивом, то попытка сравнения со строкой вызовет ошибку, если применять оператор сравнения

!=

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

if !(_x isEqualTo "") then {};

что работает корректно.

 

И друзья мои! Я тупо про это забыл!)

Так что с оригинальной функцией рандом не прокатит, ну пока не исправят, а косяк этот уже очень давно.

Так что, кто там дружит с международным языком общения, пусть не поленится и отпишет на баг трекер.

 

Как вариант, можно использовать мою редакцию этой функции, если очень нужен рандом.


Сообщение отредактировал SteelRat: 06 September 2014 - 17:56

  • 0

#43 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 September 2014 - 18:43

Но есть и приятные, для некоторых, новости.

Последняя версия функции

BIS_fnc_loadInventory 

 вполне себе позволяет организовать раскладку итемов по униформам, разгрузкам и вещь мешкам.


  • 0

#44 OFFLINE   IHUNTERI

IHUNTERI

    Мл.сержант

  • Пользователи
  • 130 сообщений
  • Отряд:Reborn

Отправлено 06 September 2014 - 18:52

Можете выложить полностью код измененой функции? И как я понял рэндом так работает? Допустим для магазинов 

{{случайный элемент этого массива будет 1 вещью}, {случайный элемент этого массива будет 2 вещью}, {случайный элемент этого массива будет 3 вещью}, ...}

  • 0

#45 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 September 2014 - 19:56

 

Можете выложить полностью код измененой функции? И как я понял рэндом так работает? Допустим для магазинов 

{{случайный элемент этого массива будет 1 вещью}, {случайный элемент этого массива будет 2 вещью}, {случайный элемент этого массива будет 3 вещью}, ...}

По позже, просто мой вариант, тоже надо привести в соответствие с новой БИСовской версией.

Да, ход вашей логики правильный


  • 0

#46 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 September 2014 - 21:20

И так, уважаемые коллеги!

Вот вам свежий, кошерный, вариант экипировки от БИСов.

/*
	file "bis_fnc_saveInventory_data.inc"
	
	Положить в папку с миссией	
*/

bis_fnc_saveInventory_data = [
/*
	"unit_class",							//	Класс юнита инвентарь которого желаете изменить
	[								//	Далее перечисляете содержимое инвентаря
		["uniform class", ["array items in uniform"]],	        //	_uniform = _inventory select 0 select 0; _items = _inventory select 0 select 1
		["vest class", ["array items in vest"]],		//	_vest = _inventory select 1 select 0; _items = _inventory select 1 select 1
		["backpack class", ["array items in backpack"]],	//	_backpack = _inventory select 2 select 0;  _items = _inventory select 2 select 1
		"headgear class",					//	_headgear = _inventory select 3;
		"goggles class",					//	_goggles = _inventory select 4;
		"Binocular",						//	_binocular = _inventory select 5; И всё тоже, что на него похоже)
		["primary weapon", ["array weapon Linked Items"]],	//	_weapon = _inventory select 6 select 0; _weaponLinkedItems = _inventory select 6 select 1
		["secondary weapon", ["array weapon Linked Items"]],    //	_weapon = _inventory select 7 select 0; _weaponLinkedItems = _inventory select 7 select 1
		["handgun weapon", ["array weapon Linked Items"]],	//	_weapon = _inventory select 8 select 0; _weaponLinkedItems = _inventory select 8 select 1
		["array linked items"]					//	_linkedItems = _inventory select 9
	]
*/

	"B_Soldier_F",
	[	//	_inventory
		["U_I_G_resistanceLeader_F", ["FirstAidKit"]],
		["V_Rangemaster_belt", ["30Rnd_65x39_caseless_mag", "30Rnd_65x39_caseless_mag"]],
		["B_Carryall_khk", ["HandGrenade"]],
		"",
		"",
		"Binocular",
		["arifle_MX_ACO_pointer_F", []],
		["", []],
		["", []],
		[]
	],
	
	//	далее по шаблону
	"unit_class",
	[
	
	]	// 	ВНИМАНИЕ, после описания последнего класса, за этой закрывающей скобкой не должно быть запятой! Изучаем правила оформления массивов, это тем кто не в танке.
	
];
/*	
	file "init.sqf"
	Такое оформление инициализации поможет, в будущем избежать очевидных недоразумений, в случае, если ваш сингл вдруг захочет стать мультиплеером.
*/

#include "bis_fnc_saveInventory_data.inc"

//	Эта переменная будет содержать массив классов юнитов, операции с которыми будут производиться, эта переменная нам нужна для корректного исполнения кода
//	это пример определения переменной, вместо unit_class перечисляете классы юнитов, столько, сколько нужно, хоть километр
_unitsClass = ["unit_class_1", "unit_class_2", "unit_class_3"];

//	Это желательно сделать обязательно, из за особенностей исполнения команды _var in _arrVar
_replace = [];
{
	_replace set [count _replace, toLower(_x)];
} foreach _unitsClass;
_unitsClass = _replace;

//	Эта часть кода исполняется только сервером, в сингле вы и сервер и клиент в одном флаконе
//	То есть экипировкой ботов будет заниматься сервер
if (isServer) then {
	{
		if (toLower(typeOf _x) in _unitsClass) then {
			if !(isPlayer _x) then {
				_x call compile format["[_this, [missionnamespace, '%1']] call BIS_fnc_loadInventory", typeOf _x];
			};
		};
	} foreach allUnits;
};

//	Эта часть кода исполняется только на клиенте, то есть экипировкой игрока будет заниматься комп игрока
if !(isDedicated) then {
	if (toLower(typeOf player) in _unitsClass) then {
		player call compile format["[_this, [missionnamespace, '%1']] call BIS_fnc_loadInventory", typeOf player];

		player addEventHandler ["Respawn",{
			(_this select 1) removeAllEventHandlers "Respawn";
			(_this select 0) call compile format["[_this, [missionnamespace, '%1']] call BIS_fnc_loadInventory", typeOf (_this select 0)];
		}];
	};
};

Сообщение отредактировал SteelRat: 06 September 2014 - 21:24

  • 3

#47 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 10 September 2014 - 17:45

И так коллеги, давайте всё таки реализуем рандом при экипировке юнитов.
Сразу уточню, рандом реализуется только через конфигурационный файл.
 
Создайте в папке с миссией папку с названием
functions

В эту папку положите файл

fn_loadInventory.sqf
ссылка ниже
 
В файл description.ext добавьте это
class CfgFunctions {
	class A3 {
		class Inventory {
			class loadInventory {
				file = "functions\fn_loadInventory.sqf";
			};
		};
	};
};

И оформляем файл CfgEquipUnits.hpp по образу и подобию

class CfgEquipUnits {
	class B_Soldier_F {
		backpack[] = {"B_Carryall_khk"};
		uniformClass[] = {"U_I_G_resistanceLeader_F"};
		magazines[] = {
			"HandGrenade",							        // одна граната
			{"30Rnd_65x39_caseless_mag", {"30Rnd_65x39_caseless_mag", 10}},		// рандомный магазин, полный или с 10 патронами
			{"30Rnd_556x45_Stanag", {"30Rnd_556x45_Stanag", 5}},			// тоже самое
			{{"30Rnd_556x45_Stanag", 15}},						// без рандома, магазин с 15 патронами
			{{"16Rnd_9x21_Mag", 8}},						// тоже самое
			"16Rnd_9x21_Mag"							// полный магазин
		};
		linkedItems[] = {"V_Rangemaster_belt"};
		items[] = {
			"FirstAidKit",								// аптечка
			{"Medikit", "ToolKit"}							// рандом
		};
		weapons[] = {
			"launch_RPG32_F", 
			{"arifle_MX_ACO_pointer_F", "arifle_Katiba_F", "LMG_Zafir_F"},		// рандом
			{"hgun_Rook40_F", "hgun_Pistol_heavy_02_F"},				// рандом
			"Binocular"
		};
	};
};
ВНИМАНИЕ !!!
Не забывайте о такой банальной вещи, рандомно выпавшей пушке должен рандомно выпасть и подходящий этой пушке магазин, вот так вот!

Прикрепленные файлы


Сообщение отредактировал SteelRat: 10 September 2014 - 17:55

  • 1

#48 OFFLINE   IHUNTERI

IHUNTERI

    Мл.сержант

  • Пользователи
  • 130 сообщений
  • Отряд:Reborn

Отправлено 11 September 2014 - 14:53

Забыл написать, что эта функция в игре вызывается

[player, missionConfigFile/"CfgEquipUnits"/(typeOf player)] call A3_fnc_loadInventory;

  • 0

#49 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 11 September 2014 - 16:27

 

Забыл написать, что эта функция в игре вызывается

[player, missionConfigFile/"CfgEquipUnits"/(typeOf player)] call A3_fnc_loadInventory;

Не правильно

[player, missionConfigFile/"CfgEquipUnits"/(typeOf player)] call BIS_fnc_loadInventory;

А вообще, мой последний пост, про рандом, был дополнением к топику.


Сообщение отредактировал SteelRat: 11 September 2014 - 16:32

  • 0

#50 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 11 September 2014 - 17:20

Да уж, блин, короче, через description.ext миссии перекомпилировать оригинал функции BIS_fnc_loadInventory не выйдет, только через аддон.

В связи с этим выкладываю новый пакет файлов

 

Прикрепленный файл  EquipUnits_addRandom.rar   6.41К   67 Количество загрузок:

 

 


  • 0

#51 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 11 September 2014 - 17:35

SteelRat, а создать свою копию с нужными тебе изменениями новую функцию на время миссии?
  • 0

#52 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 11 September 2014 - 17:53

SteelRat, а создать свою копию с нужными тебе изменениями новую функцию на время миссии?

EquipUnits_addRandom.rar


  • 0

#53 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 11 September 2014 - 19:10

SteelRat, все вижу :)
  • 0

#54 OFFLINE   IHUNTERI

IHUNTERI

    Мл.сержант

  • Пользователи
  • 130 сообщений
  • Отряд:Reborn

Отправлено 11 September 2014 - 19:31

 

Не правильно

 

У меня работает :)

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

class CfgFunctions
{
	class myTag
	{
		class myCategory
		{
			class myFunction {file = "myFile.sqf";};
		};
	};
};

myTag_fnc_myFunction

проверял через консоль

copytoclipboard str A3_fnc_loadInventory

Сообщение отредактировал IHUNTERI: 11 September 2014 - 19:34

  • 0

#55 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 11 September 2014 - 20:08

Это то что с вики

class CfgFunctions
{
	class myTag
	{
		class myCategory
		{
			class myFunction {file = "myFile.sqf";};
		};
	};
};

А это то что написал я

class CfgFunctions {
	class A3 {
		class Inventory {
			class loadInventory {
				file = "functions\fn_loadInventory.sqf";
			};
		};
	};
};

Если это вставить в какой нибудь аддон, то это перекомпилирует оригинальную функцию BIS_fnc_loadInventory

 

А через миссию получилась новая функция с тем названием какое вы и получили, я хотел не этого


Сообщение отредактировал SteelRat: 11 September 2014 - 20:14

  • 0

#56 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 September 2014 - 19:25

И снова, Здравствуйте!

Тему сегодняшнего извращения мне подкинул один пост на этом форуме.

 

И так, коллеги, давайте реализуем такую фишку, загрузим инвентарём униформу, разгрузку и мешок, лежащие ну например в вапон боксе, тоже самое будет применительно к инвентарю техники, или  к классу WeaponHolder, лежащему на земле и содержащему в себе интересующие нас предметы.

 

Начнём

 

Создайте в папке с миссией папку

functions

если у вас её ещё нет

 

В этой папке создайте текстовый файл с названием

fn_loadWeaponHolder.sqf

И скопируйте в этот файл код

/*
	Загрузка инвентаря в униформы, разгрузки и мешки лежащие в вапон боксах и технике.
	
	Пример вызова:
	[_box, (missionConfigFile/"CfgLoadWeaponHolder")] execVM "Functions\fn_loadWeaponHolder.sqf";
	
	created by SteelRat
*/

_holder 	= _this select 0;				//	Объект контейнер
if (isNull _holder) exitWith {};			//	Если объект не существует завершаем работу функции
_config		= _this select 1;				//	Конфигурационный файл с данными для загрузки
if !(isClass _config) exitWith {};			//	Если конфиг не существует завершаем работу функции

{
	_contClass	= _x select 0;	//	Класс контейнера, который будем загружать инвентарём
	_contObj	= _x select 1;	//	Объект контейнер, с которым будем работать
	
	{
		_item = _x;
		if (typename _item == typename []) then {_contObj addWeaponCargoGlobal _item};
	} foreach (getarray (_config/_contClass/"weapons"));
	
	{
		_item = _x;
		if (typename _item == typename []) then {_contObj addMagazineCargoGlobal _item};
	} foreach (getarray (_config/_contClass/"magazines"));
	
	{
		_item = _x;
		if (typename _item == typename []) then {_contObj addItemCargoGlobal _item};
	} foreach (getarray (_config/_contClass/"items"));
	
} foreach (everyContainer _holder);

Далее, я уверен, многими самое обожаемое), конфиг, в папке с миссией создайте текстовый файл с названием

CfgLoadWeaponHolder.hpp

И скопируйте в него это

class CfgLoadWeaponHolder {
	
	//	В этой части можно определить базовое содержимое для всех перечисленных классов конкретного типа
	class Uniform_Base {
		items[] = {{"FirstAidKit", 1}};
	};
	
	class Vest_Base {
	
	};
	
	class Backpack_Base {
	
	};

	//	Далее описываете какой класс что будет содержать в себе
	class U_B_CombatUniform_mcam: Uniform_Base {
		magazines[] = {{"SmokeShell", 1}};
	};
	
	class V_PlateCarrier1_rgr: Vest_Base {
		weapons[] = {{"hgun_P07_F", 1}};
		magazines[] = {{"16Rnd_9x21_Mag", 5}, {"HandGrenade", 3}};
		items[] = {{"ItemWatch", 1}};
	};
	
	class B_Carryall_cbr: Backpack_Base {
		weapons[] = {{"arifle_MX_ACO_F", 1}};
		magazines[] = {{"30Rnd_65x39_caseless_mag", 5}, {"Chemlight_green", 3}};
		items[] = {{"NVGoggles", 1}, {"ItemCompass", 1}};
	};
};

В файл description.ext добавьте это

#include "CfgLoadWeaponHolder.hpp"

Ну и на десерт код, для практических упражнений

_box = createVehicle ["Box_NATO_Wps_F", [0,0,0], [], 0, "NONE"];

clearBackpackCargoGlobal _box;
clearItemCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearWeaponCargoGlobal _box;

_box addBackpackCargoGlobal ["B_Carryall_cbr",1];
_box addItemCargoGlobal ["U_B_CombatUniform_mcam",1];
_box addItemCargoGlobal ["V_PlateCarrier1_rgr",1];

[_box, (missionConfigFile/"CfgLoadWeaponHolder")] execVM "Functions\fn_loadWeaponHolder.sqf";

_box setPosATL (player modelToWorld [0,2,0]);

Приятного аппетита, коллеги, и как всегда не стесняемся задавать вопросы, если таковые будут.


  • 2

#57 OFFLINE   Evgen66

Evgen66

    Рядовой

  • Пользователи
  • 5 сообщений

Отправлено 06 December 2014 - 04:50

А как перевооружить ботов спавнящихся виртуально? Например в UPS?


Сообщение отредактировал Evgen66: 06 December 2014 - 05:36

  • 0

#58 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 December 2014 - 17:51

А как перевооружить ботов спавнящихся виртуально? Например в UPS?

 

Изложите проблему по понятней и более развёрнуто, я вообще не понял, о чём вы?

 

И что это за виртуальный спавн бота? Бот либо спавнится, либо нет!


  • 0

#59 OFFLINE   Evgen66

Evgen66

    Рядовой

  • Пользователи
  • 5 сообщений

Отправлено 07 December 2014 - 06:19

 

А как перевооружить ботов спавнящихся виртуально? Например в UPS?

 

Изложите проблему по понятней и более развёрнуто, я вообще не понял, о чём вы?

 

И что это за виртуальный спавн бота? Бот либо спавнится, либо нет!

 

Есть Urban Patrol Script от Kronzky в котором можно спавнить ботов на маркере, например в городе, то бишь ботов в редакторе на карте нет. Они появляются виртуально при активации маркера. Вот и нужно этих ботов как то перевооружить. Спасибо за внимание к вопросу)))


  • 0

#60 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 08 December 2014 - 02:20

 

Они появляются виртуально при активации маркера.

 

Не применяйте больше к процессу спавна ботов, и неважно чего либо ещё, выражения "виртуальный спавн", оно сюда совсем не в кассу.

Такой процесс спавна называется "динамический".

 

Экипировать вы можете кого угодно, в вашем случае, вам придётся немного по редактировать сам функционал UPS.

Что бы вы могли это сделать, вы должны понимать что вы делаете.

Смотря на то как вы ставите вопрос, я понимаю, что сами, и сейчас, вы этого не сможете сделать, потому что всё что отписано мной в этой ветке для вас всё равно что китайская грамота.

 

Если появился интерес испытать себя, то стоит начать отсюда

http://arma3.ru/foru...kriptopisaniiu/


Сообщение отредактировал SteelRat: 08 December 2014 - 02:22

  • 0




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