Jump to content


Photo

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


  • Please log in to reply
80 replies to this topic

#21 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 04 September 2014 - 19:10

http://arma3.ru/foru...missii/?p=31145


  • 0

#22 OFFLINE   10258

10258

    Рядовой

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

Posted 04 September 2014 - 19:10

Спасибо большое. Основная цель достигнута. Дальше буду пытаться сам разбираться.


  • 0

#23 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 04 September 2014 - 19:17

Спасибо большое. Основная цель достигнута. Дальше буду пытаться сам разбираться.

Да нет проблем)

И вот ещё что, я всё таки не очень понял что вы имели ввиду под этим

 

 

 А можно конфигурировать снаряжение данного конкретного класса путем запуска конкретно для каждого класса написанным скриптом?

Изложите более развёрнуто, что вы желаете реализовать.


  • 0

#24 OFFLINE   10258

10258

    Рядовой

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

Posted 04 September 2014 - 19:46

У меня для каждого юнита определенного класса написан скрипт, который дает данному юниту некий конкретный набор снаряжения. И вот, нельзя ли в конфигурационном файле CfgEquipUnits.hpp конфигурировать снаряжение каждого класса не путем команд    

class B_Soldier_F {    
        uniformClass[] = {"U_I_G_resistanceLeader_F"};
        magazines[] = {"30Rnd_65x39_caseless_mag","HandGrenade", "HandGrenade"};
        linkedItems[] = {"V_Rangemaster_belt"};
        items[] = {"FirstAidKit"};
    };  и пр., а путем вызова для каждого класса своего отдельного скрипта внутри конструкции

class B_Soldier_F {    

    }; ?

Извините, если несу бред, но тема абсолютна для меня новая и неизвестная.


Edited by 10258, 04 September 2014 - 19:47.

  • 0

#25 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 04 September 2014 - 22:40

У меня для каждого юнита определенного класса написан скрипт, который дает данному юниту некий конкретный набор снаряжения. И вот, нельзя ли в конфигурационном файле CfgEquipUnits.hpp конфигурировать снаряжение каждого класса не путем команд    

class B_Soldier_F {    
        uniformClass[] = {"U_I_G_resistanceLeader_F"};
        magazines[] = {"30Rnd_65x39_caseless_mag","HandGrenade", "HandGrenade"};
        linkedItems[] = {"V_Rangemaster_belt"};
        items[] = {"FirstAidKit"};
    };  и пр., а путем вызова для каждого класса своего отдельного скрипта внутри конструкции

class B_Soldier_F {    

    }; ?

Извините, если несу бред, но тема абсолютна для меня новая и неизвестная.

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


  • 0

#26 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 04 September 2014 - 23:20

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

так будет изящней)

Создаёте в этой папке для каждого класса юнитов файл, даёте имена файлам по такому шаблону
ИмяКласса.sqf
B_Soldier_F.sqf
И в этих файлах пишете код описывающий этот конкретный класс
И просто добавляете вызов этого кода
 
Вариант 1
Если вы решили отказаться от конфигурационного файла вообще, удаляйте оба файла
initLoadEquip.sqf
CfgEquipUnits.hpp

и удаляйте вставку из description.ext

#include "CfgEquipUnits.hpp"

А в

init.sqf 

пишете такой код

if (isServer) then {
	{
		if !(isPlayer _x) then {
			_x call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf _x];
		};
	} foreach allUnits;
};

if !(isDedicated) then {
	player call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf player];

        player addEventHandler ["Respawn",{
               (_this select 1) removeAllEventHandlers "Respawn";
               (_this select 0) call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf (_this select 0)];
        }];
};
Вариант 2
Если вы не планируете отказываться от конфиг файла, а добавить к этому какие либо ещё настройки тогда, измените код в файле
initLoadEquip.sqf

на такой

_unit = 	_this;
_isUnit =	isClass( missionConfigFile / "CfgEquipUnits" / (typeOf _unit));

If (_isUnit) then {
	[_unit, missionConfigFile/"CfgEquipUnits"/(typeOf _unit)] call BIS_fnc_loadInventory;
	_unit call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf _unit];
        
        _unit addEventHandler ["Respawn",{
              (_this select 1) removeAllEventHandlers "Respawn";
              (_this select 0) call compile preprocessFileLineNumbers "initLoadEquip.sqf";
              (_this select 0) call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf (_this select 0)];
        }];
};

Шаблон файла описывающего класс, всё просто)

/* file B_Soldier_F.sqf */

_unit = _this;

/*
	далее ваш код, что вы ходите сделать с юнитом данного класса
	
	пример	
	_unit addWeapon "BigGun";
*/

Edited by SteelRat, 04 September 2014 - 23:29.

  • 0

#27 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 04 September 2014 - 23:33

Кстати только сейчас обратил внимание, в вашей редакции моего кода, производится два раза проверка одного и того же), хотя это не ошибка, но всё равно лишнее

 

У вас

_unit = 	_this;
	_isUnit =	isClass( missionConfigFile / "CfgEquipUnits" / (typeOf _unit));

		If (_isUnit) then {
			[_unit, missionConfigFile/"CfgEquipUnits"/(typeOf _unit)] call BIS_fnc_loadInventory;
		};
	
	if (_isUnit) then {

		_unit addEventHandler ["Respawn",{
			(_this select 1) removeAllEventHandlers "Respawn";
			(_this select 0) call compile preprocessFileLineNumbers "initLoadEquip.sqf";
		}];
	};

вполне сойдёт и так

_unit = 	_this;
_isUnit =	isClass( missionConfigFile / "CfgEquipUnits" / (typeOf _unit));

If (_isUnit) then {
	[_unit, missionConfigFile/"CfgEquipUnits"/(typeOf _unit)] call BIS_fnc_loadInventory;
	
	_unit addEventHandler ["Respawn",{
		(_this select 1) removeAllEventHandlers "Respawn";
		(_this select 0) call compile preprocessFileLineNumbers "initLoadEquip.sqf";
	}];
};

  • 0

#28 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 September 2014 - 00:02

PS

Я вот прикинул, рекомендую вам остановиться на втором варианте, это избавит от ошибок, которые я уже вижу), и придаст вашему творению большую гибкость. 


  • 0

#29 OFFLINE   10258

10258

    Рядовой

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

Posted 05 September 2014 - 13:42

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

Attached Files


Edited by 10258, 05 September 2014 - 13:47.

  • 0

#30 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 September 2014 - 16:59

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

Сударь! Вы сотворили не вероятное!

class CfgEquipUnits {

	class B_soldier_AR_F
	{
	file = "B_soldier_AR_F.sqf";
	};
};

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

Верните файл к перыдущему состоянию


И объясните, всё таки мне, какова такая острая необходимость всё раскладывать именно так

_unit = _this;

//									Даем персонажу униформу
_unit addUniform "U_B_CombatUniform_mcam";

//									Даем персонажу разгрузку
_unit addVest "V_PlateCarrier1_rgr";

//									Даем персонажу все нужное снаряжение: шлем, карту, радио, компас и часы
_unit linkItem "H_HelmetEUF";
_unit linkItem "ItemMap";
_unit linkItem "ItemRadio";
_unit linkItem "ItemCompass";
_unit linkItem "ItemWatch";

//									Даем персонажу штурмовой ранец
_unit addBackpack "B_AssaultPack_mcamo";

//									Заряжаем оружие одним магазином
_unit AddMagazine "150Rnd_762x51_Box";

//									Даем персонажу ручной пулемет Зафир (к примеру)
_unit AddWeapon "LMG_Zafir_F";
//									Ставим на ручной пулемет Зафир коллиматорный прицел закрытого типа переменной кратности х1 и х4 MRCO
_unit AddPrimaryWeaponItem "optic_MRCO";

/									Кладем в карманы униформы 2 пакета первой медицинской помощи
{_unit addItemToUniform "FirstAidKit";} count [1,2];

//									Кладем в разгрузку коробку на 150 патронов к ручному пулемету Зафир
_unit addItemToVest "150Rnd_762x51_Box";
//									Кладем в разгрузку 2 ручные осколочные гранаты РГО
{_unit addItemToVest "HandGrenade";} count [1,2];
//									Кладем в разгрузку 2 белые дымовые шашки
{_unit addItemToVest "SmokeShell";} count [1,2];

//									Кладем в штурмовой ранец 2 коробки на 150 патронов к ручному пулемету Зафир
{_unit addItemToBackpack "150Rnd_762x51_Box";} count [1,2];
//									Кладем в штурмовой ранец 2 ручные осколочные гранаты РГО
{_unit addItemToBackpack "HandGrenade";} count [1,2];
//									Кладем в штурмовой ранец прибор ночного видения
_unit addItemToBackpack "NVGoggles"; 

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

 

И я вот почему заостряю на этом внимание, это в арме 2 приходилось акцентировать на этом внимание, потому что в инвентарь и в вещь мешок итемы ложились разными командами, и если в инвентаре не хватало места то итем просто не ложился, в арме 3 всё работает автоматом, есть место в униформе положится туда, нет, положится в разгрузку, нет, положится в вещь мешок, и не каких запарок.


Edited by SteelRat, 05 September 2014 - 17:10.

  • 0

#31 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 05 September 2014 - 17:11

SteelRat, атмосфера, удобство и эстетичность :)
  • 0

#32 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 September 2014 - 17:16

SteelRat, атмосфера, удобство и эстетичность :)

Разверните ответ шире

 

Вот вам мой разворот

 

1 Какая, чуть не выругался), атмосфера

2 По поводу удобства, под большим вопросом, что бы перезарядить ствол, вам не надо лезть в инвентарь

3 Эстетичность, это тогда, когда всё то что например, лежит в разгрузке, в мультике я увижу на вас, вот это эстетичность


  • 0

#33 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 05 September 2014 - 17:40

SteelRat, :)
1-3. Ну некрасиво и нереалестично смотрятся коробки 10×10 см в разгрузке, где карманы ну макс 5×5 см или пачка гранат в штанах, в карманы которых они не влазиют :)
2. Удобство сколько не тыканья, а просмотра и взятие вещей союзником - допустим ты тоскаешь патроны к винтовке и 1 пуху (для себя), другой снаряги нет, в итоге если делать обычным добавлениям предметов, то эти вещи попадут в разгрузку/униформу
И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень :) )

Edited by vlad333000, 05 September 2014 - 17:42.

  • 0

#34 OFFLINE   10258

10258

    Рядовой

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

Posted 05 September 2014 - 17:43

Все. Понял ошибку. Все заработало именно так, как мне хотелось. Всем ОГРОМНОЕ спасибо!!! Особенно SteelRat за помощь и терпение!

По поводу моего способа раскладки БП и плюшек: vlad333000 в приципе все верно изложил. Я в курсе, что в А3 раскладка идет в автомате - собственно вчерашний вариант с использованием только CfgEquipUnits.hpp именно так и работал, но если бы он меня устраивал, я бы не выносил SteelRat мозг своими "хотениями странного" (АБС). За что ему еще раз спасибо за терпение в желании понять, то, что для него некритично и не нужно.


Edited by 10258, 05 September 2014 - 17:51.

  • 0

#35 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 September 2014 - 17:53

SteelRat, :)
1-3. Ну некрасиво и нереалестично смотрятся коробки 10×10 см в разгрузке, где карманы ну макс 5×5 см или пачка гранат в штанах, в карманы которых они не влазиют :)
2. Удобство сколько не тыканья, а просмотра и взятие вещей союзником - допустим ты тоскаешь патроны к винтовке и 1 пуху (для себя), другой снаряги нет, в итоге если делать обычным добавлениям предметов, то эти вещи попадут в разгрузку/униформу
И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень :) )

 

 

 

И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень  :) ) 

Для меня единственная веская причина, уговорили!


Фикс первого варианта

 

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

CodeEquip
так будет изящней)
Создаёте в этой папке для каждого класса юнитов файл, даёте имена файлам по такому шаблону
ИмяКласса.sqf
B_Soldier_F.sqf
И в этих файлах пишете код описывающий этот конкретный класс
И просто добавляете вызов этого кода
 
Вариант 1
Если вы решили отказаться от конфигурационного файла вообще, удаляйте оба файла
initLoadEquip.sqf
CfgEquipUnits.hpp

и удаляйте вставку из description.ext

#include "CfgEquipUnits.hpp"

А в

init.sqf 

пишете такой код

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

//	Эта переменная будет содержать массив классов юнитов, операции с которыми будут производиться, эта переменная нам нужна для корректного исполнения кода
//	это пример определения переменной, вместо 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 call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf _x];
			};
		};
	} foreach allUnits;
};

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

		player addEventHandler ["Respawn",{
			(_this select 1) removeAllEventHandlers "Respawn";
			(_this select 0) call compile format["_this call compile preprocessFileLineNumbers 'CodeEquip\%1.sqf'", typeOf (_this select 0)];
		}];
	};
};

Edited by SteelRat, 05 September 2014 - 17:56.

  • 0

#36 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 September 2014 - 18:22

 

 

орет "дай патроны" и тебе придеться открыть инвентарь

Не много юмора, в современном мире живём! Пусть робот подаёт)


  • 0

#37 OFFLINE   IHUNTERI

IHUNTERI

    Мл.сержант

  • Пользователи
  • 130 posts
  • Отряд:Reborn

Posted 06 September 2014 - 15:51

Не могу заставить работать рандомный выбор оружия. Остановился на этом

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

Функция выдает

Error in expression <inventory select 8 select 0]};
{
if (_x != "") then {
_weapon = _x;
if (typename>
  Error position: <!= "") then {
_weapon = _x;
if (typename>
  Error !=: Type Array, expected Number,String,Object,Side,Group,Text,Config entry,Display (dialog),Control,Network Object,Team member,Task,Location
File A3\functions_f\inventory\fn_loadInventory.sqf, line 252

Edited by IHUNTERI, 06 September 2014 - 16:07.

  • 0

#38 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 06 September 2014 - 16:31

 

Не могу заставить работать рандомный выбор оружия. Остановился на этом

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

Функция выдает

Error in expression <inventory select 8 select 0]};
{
if (_x != "") then {
_weapon = _x;
if (typename>
  Error position: <!= "") then {
_weapon = _x;
if (typename>
  Error !=: Type Array, expected Number,String,Object,Side,Group,Text,Config entry,Display (dialog),Control,Network Object,Team member,Task,Location
File A3\functions_f\inventory\fn_loadInventory.sqf, line 252

 

Не корректное оформление параметра, не должно быть пустых массивов, объясните, что вы хотели получить наличием пустого массива.

Вот так корректно

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

  • 0

#39 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 06 September 2014 - 16:38

PS

В вашем случае код пытается произвести подобно сравнение

_Массив неРавен _Строке

При сравнении массива и строки оператором

!=

вызывается ошибка


Edited by SteelRat, 06 September 2014 - 16:41.

  • 0

#40 OFFLINE   IHUNTERI

IHUNTERI

    Мл.сержант

  • Пользователи
  • 130 posts
  • Отряд:Reborn

Posted 06 September 2014 - 17:24

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

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


  • 0




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