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
+