weapons[] = { {"arifle_Katiba_F", "arifle_Katiba_C_F"}, {"hgun_Rook40_F", "hgun_Rook40_F"} };Та же самая ошибка
Да я уже понял, один момент
Отправлено 06 September 2014 - 17:40
weapons[] = { {"arifle_Katiba_F", "arifle_Katiba_C_F"}, {"hgun_Rook40_F", "hgun_Rook40_F"} };Та же самая ошибка
Да я уже понял, один момент
Отправлено 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
Отправлено 06 September 2014 - 18:43
Но есть и приятные, для некоторых, новости.
Последняя версия функции
BIS_fnc_loadInventory
вполне себе позволяет организовать раскладку итемов по униформам, разгрузкам и вещь мешкам.
Отправлено 06 September 2014 - 18:52
Можете выложить полностью код измененой функции? И как я понял рэндом так работает? Допустим для магазинов
{{случайный элемент этого массива будет 1 вещью}, {случайный элемент этого массива будет 2 вещью}, {случайный элемент этого массива будет 3 вещью}, ...}
Отправлено 06 September 2014 - 19:56
Можете выложить полностью код измененой функции? И как я понял рэндом так работает? Допустим для магазинов
{{случайный элемент этого массива будет 1 вещью}, {случайный элемент этого массива будет 2 вещью}, {случайный элемент этого массива будет 3 вещью}, ...}
По позже, просто мой вариант, тоже надо привести в соответствие с новой БИСовской версией.
Да, ход вашей логики правильный
Отправлено 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
Отправлено 10 September 2014 - 17:45
functions
В эту папку положите файл
fn_loadInventory.sqf
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
Отправлено 11 September 2014 - 14:53
Забыл написать, что эта функция в игре вызывается
[player, missionConfigFile/"CfgEquipUnits"/(typeOf player)] call A3_fnc_loadInventory;
Отправлено 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
Отправлено 11 September 2014 - 17:20
Да уж, блин, короче, через description.ext миссии перекомпилировать оригинал функции BIS_fnc_loadInventory не выйдет, только через аддон.
В связи с этим выкладываю новый пакет файлов
EquipUnits_addRandom.rar 6.41К 67 Количество загрузок:
Отправлено 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
Отправлено 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
Отправлено 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]);
Приятного аппетита, коллеги, и как всегда не стесняемся задавать вопросы, если таковые будут.
Отправлено 06 December 2014 - 04:50
А как перевооружить ботов спавнящихся виртуально? Например в UPS?
Сообщение отредактировал Evgen66: 06 December 2014 - 05:36
Отправлено 06 December 2014 - 17:51
А как перевооружить ботов спавнящихся виртуально? Например в UPS?
Изложите проблему по понятней и более развёрнуто, я вообще не понял, о чём вы?
И что это за виртуальный спавн бота? Бот либо спавнится, либо нет!
Отправлено 07 December 2014 - 06:19
А как перевооружить ботов спавнящихся виртуально? Например в UPS?
Изложите проблему по понятней и более развёрнуто, я вообще не понял, о чём вы?
И что это за виртуальный спавн бота? Бот либо спавнится, либо нет!
Есть Urban Patrol Script от Kronzky в котором можно спавнить ботов на маркере, например в городе, то бишь ботов в редакторе на карте нет. Они появляются виртуально при активации маркера. Вот и нужно этих ботов как то перевооружить. Спасибо за внимание к вопросу)))
Отправлено 08 December 2014 - 02:20
Они появляются виртуально при активации маркера.
Не применяйте больше к процессу спавна ботов, и неважно чего либо ещё, выражения "виртуальный спавн", оно сюда совсем не в кассу.
Такой процесс спавна называется "динамический".
Экипировать вы можете кого угодно, в вашем случае, вам придётся немного по редактировать сам функционал UPS.
Что бы вы могли это сделать, вы должны понимать что вы делаете.
Смотря на то как вы ставите вопрос, я понимаю, что сами, и сейчас, вы этого не сможете сделать, потому что всё что отписано мной в этой ветке для вас всё равно что китайская грамота.
Если появился интерес испытать себя, то стоит начать отсюда
http://arma3.ru/foru...kriptopisaniiu/
Сообщение отредактировал SteelRat: 08 December 2014 - 02:22