http://arma3.ru/foru...missii/?p=31145
Экипировка юнитов
#21 OFFLINE
Posted 04 September 2014 - 19:10
#22 OFFLINE
Posted 04 September 2014 - 19:10
Спасибо большое. Основная цель достигнута. Дальше буду пытаться сам разбираться.
#23 OFFLINE
Posted 04 September 2014 - 19:17
Спасибо большое. Основная цель достигнута. Дальше буду пытаться сам разбираться.
Да нет проблем)
И вот ещё что, я всё таки не очень понял что вы имели ввиду под этим
А можно конфигурировать снаряжение данного конкретного класса путем запуска конкретно для каждого класса написанным скриптом?
Изложите более развёрнуто, что вы желаете реализовать.
#24 OFFLINE
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.
#25 OFFLINE
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 {
}; ?Извините, если несу бред, но тема абсолютна для меня новая и неизвестная.
То что пишется в конфигурационный файл, это параметры, и да можно организовать вызов своего файла с кодом для каждого класса юнитов. Шаблон по позже)
#26 OFFLINE
Posted 04 September 2014 - 23:20
CodeEquip
так будет изящней)
ИмяКласса.sqf B_Soldier_F.sqf
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)]; }]; };
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.
#27 OFFLINE
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"; }]; };
#28 OFFLINE
Posted 05 September 2014 - 00:02
PS
Я вот прикинул, рекомендую вам остановиться на втором варианте, это избавит от ошибок, которые я уже вижу), и придаст вашему творению большую гибкость.
#29 OFFLINE
Posted 05 September 2014 - 13:42
Попытался действовать по второму варианту, который мне кажется более привлекательным из-за своей лучшей структурированности и гибкости в использовании, но ничего не получается - стоят ребята в неглиже и все тут. Не могли бы Вы помочь в исправлении ошибок?
Attached Files
Edited by 10258, 05 September 2014 - 13:47.
#30 OFFLINE
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.
#32 OFFLINE
Posted 05 September 2014 - 17:16
SteelRat, атмосфера, удобство и эстетичность
Разверните ответ шире
Вот вам мой разворот
1 Какая, чуть не выругался), атмосфера
2 По поводу удобства, под большим вопросом, что бы перезарядить ствол, вам не надо лезть в инвентарь
3 Эстетичность, это тогда, когда всё то что например, лежит в разгрузке, в мультике я увижу на вас, вот это эстетичность
#33 OFFLINE
Posted 05 September 2014 - 17:40
1-3. Ну некрасиво и нереалестично смотрятся коробки 10×10 см в разгрузке, где карманы ну макс 5×5 см или пачка гранат в штанах, в карманы которых они не влазиют
2. Удобство сколько не тыканья, а просмотра и взятие вещей союзником - допустим ты тоскаешь патроны к винтовке и 1 пуху (для себя), другой снаряги нет, в итоге если делать обычным добавлениям предметов, то эти вещи попадут в разгрузку/униформу
И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень )
Edited by vlad333000, 05 September 2014 - 17:42.
#34 OFFLINE
Posted 05 September 2014 - 17:43
Все. Понял ошибку. Все заработало именно так, как мне хотелось. Всем ОГРОМНОЕ спасибо!!! Особенно SteelRat за помощь и терпение!
По поводу моего способа раскладки БП и плюшек: vlad333000 в приципе все верно изложил. Я в курсе, что в А3 раскладка идет в автомате - собственно вчерашний вариант с использованием только CfgEquipUnits.hpp именно так и работал, но если бы он меня устраивал, я бы не выносил SteelRat мозг своими "хотениями странного" (АБС). За что ему еще раз спасибо за терпение в желании понять, то, что для него некритично и не нужно.
Edited by 10258, 05 September 2014 - 17:51.
#35 OFFLINE
Posted 05 September 2014 - 17:53
SteelRat,
1-3. Ну некрасиво и нереалестично смотрятся коробки 10×10 см в разгрузке, где карманы ну макс 5×5 см или пачка гранат в штанах, в карманы которых они не влазиют
2. Удобство сколько не тыканья, а просмотра и взятие вещей союзником - допустим ты тоскаешь патроны к винтовке и 1 пуху (для себя), другой снаряги нет, в итоге если делать обычным добавлениям предметов, то эти вещи попадут в разгрузку/униформу
И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень )
И вот когда ты выцеливаешь цель, уже почти готов выстрелить, тут резко твой начальник (кому ты патроны таскаешь) орет "дай патроны" и тебе придеться открыть инвентарь - и выложить вручную ему эти магазины и естественно отвлечься от свой цели и потерять неного времени, а если все это командой засунуть сразу в рюкзак, то этот начальник сам будет брать когда ему захочется (кончно это можно самому сделать, но это же "неудобно" да и лень )
Для меня единственная веская причина, уговорили!
Фикс первого варианта
Создаёте в папке с миссией папку с названием
CodeEquip
ИмяКласса.sqf B_Soldier_F.sqf
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.
#36 OFFLINE
Posted 05 September 2014 - 18:22
орет "дай патроны" и тебе придеться открыть инвентарь
Не много юмора, в современном мире живём! Пусть робот подаёт)
#37 OFFLINE
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.
#38 OFFLINE
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"} };
#39 OFFLINE
Posted 06 September 2014 - 16:38
PS
В вашем случае код пытается произвести подобно сравнение
_Массив неРавен _Строке
При сравнении массива и строки оператором
!=
вызывается ошибка
Edited by SteelRat, 06 September 2014 - 16:41.
#40 OFFLINE
Posted 06 September 2014 - 17:24
weapons[] = { {"arifle_Katiba_F", "arifle_Katiba_C_F"}, {"hgun_Rook40_F", "hgun_Rook40_F"} };
Та же самая ошибка