diff --git a/addons/armory/Dialog.hpp b/addons/armory/Dialog.hpp index bd5484c3..2803beb5 100644 --- a/addons/armory/Dialog.hpp +++ b/addons/armory/Dialog.hpp @@ -386,7 +386,7 @@ class GVAR(Display) { class Export_Pic: GVAR(RscPicture) { idc = EXPORTPIC; x = X_PART(30.5); - y = Y_PART(3); + y = Y_PART(2); w = W_PART(2); h = H_PART(2); text = QPATHTOF(UI\btnExport.paa); @@ -395,10 +395,27 @@ class GVAR(Display) { idc = EXPORTBTN; onMouseButtonClick = QUOTE(call FUNC(exportLoadout)); x = X_PART(30.5); - y = Y_PART(3); + y = Y_PART(2); w = W_PART(2); h = H_PART(2); tooltip = CSTRING(BtnExportTooltip); }; + class Import_Pic: GVAR(RscPicture) { + idc = IMPORTPIC; + x = X_PART(30.5); + y = Y_PART(4); + w = W_PART(2); + h = H_PART(2); + text = QPATHTOF(UI\btnImport.paa); + }; + class Import_Btn: GVAR(RscButton) { + idc = IMPORTBTN; + onMouseButtonClick = QUOTE(call FUNC(importLoadout)); + x = X_PART(30.5); + y = Y_PART(4); + w = W_PART(2); + h = H_PART(2); + tooltip = CSTRING(BtnImportTooltip); + }; }; }; diff --git a/addons/armory/UI/btnImport.paa b/addons/armory/UI/btnImport.paa new file mode 100644 index 00000000..51bd014c Binary files /dev/null and b/addons/armory/UI/btnImport.paa differ diff --git a/addons/armory/XEH_PREP.hpp b/addons/armory/XEH_PREP.hpp index e8abb8af..091b658b 100644 --- a/addons/armory/XEH_PREP.hpp +++ b/addons/armory/XEH_PREP.hpp @@ -15,6 +15,7 @@ PREP(getBaseVariant); PREP(getBoxContents); PREP(getDataVanilla); PREP(getDataChronos); +PREP(importLoadout); PREP(init); PREP(isCompatible); PREP(openArmory); diff --git a/addons/armory/functions/fnc_dialogControl.sqf b/addons/armory/functions/fnc_dialogControl.sqf index 5f6128de..94bfbf09 100644 --- a/addons/armory/functions/fnc_dialogControl.sqf +++ b/addons/armory/functions/fnc_dialogControl.sqf @@ -30,7 +30,8 @@ if (_requestedMenu == "main") exitWith { } forEach [ TITLE, BACKPIC, BACKBTN, - EXPORTPIC, EXPORTBTN + EXPORTPIC, EXPORTBTN, + IMPORTPIC, IMPORTBTN ]; // Set Title diff --git a/addons/armory/functions/fnc_importLoadout.sqf b/addons/armory/functions/fnc_importLoadout.sqf new file mode 100644 index 00000000..af944ce6 --- /dev/null +++ b/addons/armory/functions/fnc_importLoadout.sqf @@ -0,0 +1,196 @@ +#include "..\script_component.hpp" +/* + * Author: JoramD + * Import loadout from clipboard and put those items into a box. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call tac_armory_fnc_importLoadout + * + * Public: No + */ + +private _data = call (compile copyFromClipboard); +private _object = ACE_player getVariable [QGVAR(object), objNull]; + +if (count _data == 10) then { + GVAR(loadoutItems) = []; + for "_index" from 0 to 9 do { + switch (_index) do { + case 0: { + private _rifleElement = _data select _index; + if (count _rifleElement > 0) then { + { + _x params ["_element"]; + + if (typeName _element == "ARRAY") then { + GVAR(loadoutItems) pushBack (_element select 0); + } else { + GVAR(loadoutItems) pushBack _element; + }; + } forEach _rifleElement; + }; + }; + case 1: { + private _launcherElement = _data select _index; + if (count _launcherelement > 0) then { + { + _x params ["_element"]; + + if (typeName _element == "ARRAY") then { + GVAR(loadoutItems) pushBack (_element select 0); + } else { + GVAR(loadoutItems) pushBack _element; + }; + } forEach _launcherelement; + }; + }; + case 2: { + private _pistolElement = _data select _index; + if (count _pistolElement > 0) then { + { + _x params ["_element"]; + + if (typeName _element == "ARRAY") then { + GVAR(loadoutItems) pushBack (_element select 0); + } else { + GVAR(loadoutItems) pushBack _element; + }; + } forEach _pistolElement; + }; + }; + case 3: { + private _uniformElement = _data select _index; + if (count _uniformElement > 0) then { + GVAR(loadoutItems) pushBack (_uniformElement select 0); + private _uniformItemElement = _uniformElement select 1; + { + _x params ["_classname", "_amount"]; + + for _classname from 1 to _amount do { + GVAR(loadoutItems) pushBack _classname; + }; + } forEach _uniformItemElement; + }; + }; + case 4: { + private _vestElement = _data select _index; + if (count _vestElement > 0) then { + GVAR(loadoutItems) pushBack (_vestElement select 0); + private _uniformItemElement = _vestElement select 1; + { + _x params ["_classname", "_amount"]; + + for _classname from 1 to _amount do { + GVAR(loadoutItems) pushBack _classname; + }; + } forEach _uniformItemElement; + }; + }; + case 5: { + private _backpackElement = _data select _index; + if (count _backpackElement > 0) then { + GVAR(loadoutItems) pushBack (_backpackElement select 0); + private _uniformItemElement = _backpackElement select 1; + { + _x params ["_classname", "_amount"]; + + for _classname from 1 to _amount do { + GVAR(loadoutItems) pushBack _classname; + }; + } forEach _uniformItemElement; + }; + }; + case 6: { + GVAR(loadoutItems) pushBack (_data select _index); + }; + case 7: { + GVAR(loadoutItems) pushBack (_data select _index); + }; + case 8: { + private _binocularElement = _data select _index; + if (count _binocularElement > 0) then { + { + _x params ["_element"]; + + if (typeName _element == "ARRAY") then { + GVAR(loadoutItems) pushBack (_element select 0); + } else { + GVAR(loadoutItems) pushBack _element; + }; + } forEach _binocularElement; + }; + }; + case 9: { + private _utilityItemElement = _data select _index; + { + _x params ["_classname"]; + + GVAR(loadoutItems) pushBack _classname; + } forEach _utilityItemElement; + }; + }; + }; +} else { + ["Failed to get loadout, invalid input"] call CBA_fnc_notify; +}; + +// Final array of items in the unitLoadout provided (["item","item"]) +GVAR(loadoutItems) = [GVAR(loadoutItems), {_this in [""]}] call CBA_fnc_reject; + +// Sort loadoutItems (["item",amount],["item",amount]) +private _sortedLoadoutItems = []; +{ + _x params ["_item"]; + + private _itemCount = {_item isEqualTo _x} count GVAR(loadoutItems); + _sortedLoadoutItems pushBackUnique [_item, _itemCount]; +} forEach GVAR(loadoutItems); + +diag_log _sortedLoadoutItems; + +// All items currently in locker ([["classname","category","description","amount","?"],["classname","category","description","amount","?"]]) +private _lockerItems = ["all"] call tac_armory_fnc_getDataChronos; + +// Make array to be searched through +private _lockerSearchItems = _lockerItems apply {_x select 0}; + +// Check if items are in locker +private _itemsToExport = []; +private _allItemsAvailable = true; +{ + _x params ["_item", "_amount"]; + + _lockerSearchItems = _lockerSearchItems apply {configName (_x call CBA_fnc_getItemConfig)}; + + if (_item in _lockerSearchItems) then { + // item is in locker! + private _foundItemIndex = _lockerSearchItems find _item; + private _lockerItemAmount = parseNumber ((_lockerItems select _foundItemIndex) select 3); + + if (_lockerItemAmount >= _amount) then { + _itemsToExport pushBack [_item, _amount]; + } else { + format ["Failed to get loadout, not enough of: %1", _item] call CBA_fnc_notify; + _allItemsAvailable = false; + }; + } else { + // item not in locker + format ["Failed to get loadout, missing: %1", _item] call CBA_fnc_notify; + _allItemsAvailable = false; + }; +} forEach _sortedLoadoutItems; + +if (_allItemsAvailable isEqualTo true) then { + { + _x params ["_item", "_amount"]; + + // [player, "remove", _object, _item, _item, _amount] call tac_apollo_fnc_lockerAction; + } forEach _itemsToExport; + ["Successfully put loadout in box!"] call CBA_fnc_notify; +}; diff --git a/addons/armory/script_component.hpp b/addons/armory/script_component.hpp index efc77daa..76f50d01 100644 --- a/addons/armory/script_component.hpp +++ b/addons/armory/script_component.hpp @@ -75,6 +75,9 @@ #define EXPORTPIC 3330014 #define EXPORTBTN EXPORTPIC + 1 +// Import +#define IMPORTPIC 3330016 +#define IMPORTBTN IMPORTPIC + 1 // MACROS #define CTRL(var) ((findDisplay DISPLAYID) displayCtrl var) diff --git a/addons/armory/stringtable.xml b/addons/armory/stringtable.xml index 53e11e6b..2e71c2f8 100644 --- a/addons/armory/stringtable.xml +++ b/addons/armory/stringtable.xml @@ -142,5 +142,8 @@ Loadout exported to clipboard! + + Import loadout from clipboard +