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