diff --git a/cScripts/CfgFunctions.hpp b/cScripts/CfgFunctions.hpp index b864c200c..8b756ea65 100644 --- a/cScripts/CfgFunctions.hpp +++ b/cScripts/CfgFunctions.hpp @@ -14,6 +14,8 @@ class cScripts { class init_chatCommands {}; class init_eventHandlers {}; + + class init_virtualBackpacks {}; class init_zenModuels {}; }; @@ -112,6 +114,12 @@ class cScripts { class para_equipment {}; class para_backpack {}; + // Virtual Backpack + class saveVirtualBackpack {}; + class loadVirtualBackpack {}; + class swapVirtualBackpack {}; + class getVirtualBackpackName {}; + // Buttons and options class addReGear {}; class addHeal {}; diff --git a/cScripts/cScripts_postInit.sqf b/cScripts/cScripts_postInit.sqf index 15812b5bd..52ec2da4e 100644 --- a/cScripts/cScripts_postInit.sqf +++ b/cScripts/cScripts_postInit.sqf @@ -20,6 +20,10 @@ if (EGVAR(Settings,allowReplaceItem)) then { // staging [] call EFUNC(init,staging); +// Virtual Backpack +if (EGVAR(Settings,allowVirtualBackpacks)) then { + [] call EFUNC(init,virtualBackpacks); +}; // messages [] call EFUNC(init,message); diff --git a/cScripts/cScripts_preInit.sqf b/cScripts/cScripts_preInit.sqf index 12ade78b7..9201372e1 100644 --- a/cScripts/cScripts_preInit.sqf +++ b/cScripts/cScripts_preInit.sqf @@ -316,6 +316,16 @@ private _cScriptSettings = "cScripts Mission Settings"; // 9; Other +[ // Virtual Backpack + QEGVAR(Settings,allowVirtualBackpacks), + "CHECKBOX", + ["Enable Virtual Backpacks","Allow usage of virtual backpacks"], + [_cScriptSettings, "9; Other"], + false, + true, + {}, + true +] call CBA_fnc_addSetting; [ // Primary Clan Tag QEGVAR(Settings,primaryClanTag), "EDITBOX", diff --git a/cScripts/functions/init/fn_init_virtualBackpacks.sqf b/cScripts/functions/init/fn_init_virtualBackpacks.sqf new file mode 100644 index 000000000..cd788f7c1 --- /dev/null +++ b/cScripts/functions/init/fn_init_virtualBackpacks.sqf @@ -0,0 +1,98 @@ +#include "..\script_component.hpp"; +/* + * Author: CPL.Brostrom.A + * This function handle the virtual backpack system + * + * Example: + * call cScripts_fnc_init_virtualBackpacks + * + * Public: No + */ + +if !(GVAR(isPlayer)) exitWith {}; + +private _condition = { true }; +private _virtualBackpackCat = [QEGVAR(Actions,virtualBackpacks), "Backpacks", "", {true}, _condition] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions"], _virtualBackpackCat] call ace_interact_menu_fnc_addActionToObject; + +// First Actions +private _condition_Save1 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player != "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_1), []]) < 1)}} +}; +private _virtualBackpack_1_save = [QEGVAR(Actions,virtualBackpack_1_save), + "Put away backpack", "", { + [player, QEGVAR(player,virtualBackpack_1)] call FUNC(saveVirtualBackpack); +}, _condition_Save1] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_1_save] call ace_interact_menu_fnc_addActionToObject; + +private _condition_Load1 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player == "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_1), []]) > 1)}} +}; +private _virtualBackpack_1_Load = [QEGVAR(Actions,virtualBackpack_1_load), + format ["Take out %1", [player, QEGVAR(player,virtualBackpack_1)] call FUNC(getVirtualBackpackName)], "", { + [player, QEGVAR(player,virtualBackpack_1)] call FUNC(loadVirtualBackpack); +}, _condition_Load1] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_1_Load] call ace_interact_menu_fnc_addActionToObject; + +private _condition_Swap1 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player != "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_1), []]) > 1)}} +}; +private _virtualBackpack_1_Swap = [QEGVAR(Actions,virtualBackpack_1_Swap), + format ["Swap out to %1", [player, QEGVAR(player,virtualBackpack_1)] call FUNC(getVirtualBackpackName)], "", { + [player, QEGVAR(player,virtualBackpack_1)] call FUNC(swapVirtualBackpack); +}, _condition_Swap1] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_1_Swap] call ace_interact_menu_fnc_addActionToObject; + +// Second Actions +private _condition_Save2 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player != "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_2), []]) < 1)}} +}; +private _virtualBackpack_2_save = [QEGVAR(Actions,virtualBackpack_2_save), + "Put away backpack", "", { + [player, QEGVAR(player,virtualBackpack_2)] call FUNC(saveVirtualBackpack); +}, _condition_Save2] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_2_save] call ace_interact_menu_fnc_addActionToObject; + +private _condition_Load2 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player == "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_2), []]) > 1)}} +}; +private _virtualBackpack_2_Load = [QEGVAR(Actions,virtualBackpack_2_load), + format ["Take out %1", [player, QEGVAR(player,virtualBackpack_2)] call FUNC(getVirtualBackpackName)], "", { + [player, QEGVAR(player,virtualBackpack_2)] call FUNC(loadVirtualBackpack); +}, _condition_Load2] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_2_Load] call ace_interact_menu_fnc_addActionToObject; + +private _condition_Swap2 = { + (count (player getVariable [QEGVAR(player,backpack), []]) < 1) && + {(backpack player != "") && + {(count (player getVariable [QEGVAR(player,virtualBackpack_2), []]) > 1)}} +}; +private _virtualBackpack_2_Swap = [QEGVAR(Actions,virtualBackpack_2_Swap), + format ["Swap out to %1", [player, QEGVAR(player,virtualBackpack_2)] call FUNC(getVirtualBackpackName)], "", { + [player, QEGVAR(player,virtualBackpack_2)] call FUNC(swapVirtualBackpack); +}, _condition_Swap2] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", QEGVAR(Actions,virtualBackpacks)], _virtualBackpack_2_Swap] call ace_interact_menu_fnc_addActionToObject; + + +// Event handlers +["CAManBase", "Respawn", { + params ["_unit"]; + if (_unit == player) then { + if (count (player getVariable [QEGVAR(player,virtualBackpack_1), []]) > 1) then { + _unit setVariable [QEGVAR(player,virtualBackpack_1), []]; + }; + if (count (player getVariable [QEGVAR(player,virtualBackpack_2), []]) > 1) then { + _unit setVariable [QEGVAR(player,virtualBackpack_2), []]; + }; + }; +}] call CBA_fnc_addClassEventHandler; \ No newline at end of file diff --git a/cScripts/functions/systems/fn_getVirtualBackpackName.sqf b/cScripts/functions/systems/fn_getVirtualBackpackName.sqf new file mode 100644 index 000000000..704f6f7bc --- /dev/null +++ b/cScripts/functions/systems/fn_getVirtualBackpackName.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp"; +/* + * Author: CPL.Brostrom.A + * This function return the name of the current stored backpack + * + * Arguments: + * 0: player + * 1: varname + * + * Return Value: + * Backpack + * + * Example: + * [player, "cScripts_player_virtualBackpack_1"] call cScripts_fnc_getVirtualBackpackName + * + */ + +params [ + ["_player", objNull, [objNull]], + ["_variableName", "", [""]] +]; + +private _var = (player getVariable [_variableName, [""]])#0; + +if (_var == "") exitWith {"backpack"}; + +getText (configFile >> "CfgVehicles" >> _var >> "displayName"); \ No newline at end of file diff --git a/cScripts/functions/systems/fn_loadVirtualBackpack.sqf b/cScripts/functions/systems/fn_loadVirtualBackpack.sqf new file mode 100644 index 000000000..b99ad3458 --- /dev/null +++ b/cScripts/functions/systems/fn_loadVirtualBackpack.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp"; +/* + * Author: CPL.Brostrom.A + * This function saves a virtual backpack to sertain variable. + * + * Arguments: + * 0: player + * 1: varname + * + * Return Value: + * True if successfull + * + * Example: + * [player, "cScripts_player_virtualBackpack_1"] call cScripts_fnc_loadVirtualBackpack + * + */ + +params [ + ["_player", objNull, [objNull]], + ["_variableName", "", [""]] +]; + +if ((count (player getVariable [_variableName, []])) < 1) exitWith {false}; + +private _backpackAndContent = _player getVariable [_variableName, []]; +_backpackAndContent params [ + ["_backpack", ""], + ["_cargo", []] +]; + +_player addBackpack _backpack; + +{ + _player addItemToBackpack _x; +} forEach _cargo; + +_player setVariable [_variableName, []]; + +true \ No newline at end of file diff --git a/cScripts/functions/systems/fn_saveVirtualBackpack.sqf b/cScripts/functions/systems/fn_saveVirtualBackpack.sqf new file mode 100644 index 000000000..e3319b643 --- /dev/null +++ b/cScripts/functions/systems/fn_saveVirtualBackpack.sqf @@ -0,0 +1,35 @@ +#include "..\script_component.hpp"; +/* + * Author: CPL.Brostrom.A + * This function saves a virtual backpack to sertain variable. + * + * Arguments: + * 0: player + * 1: varname + * + * Return Value: + * True if successfull + * + * Example: + * [player, "cScripts_player_virtualBackpack_1"] call cScripts_fnc_saveVirtualBackpack + * + */ + +params [ + ["_player", objNull, [objNull]], + ["_variableName", "", [""]] +]; + +if ((count (player getVariable [_variableName, []])) > 1) exitWith {false}; + +private _backpack = backpack _player call BIS_fnc_basicBackpack; + +private _cargo = backpackItems _player; + +private _backpackAndContent = [_backpack, _cargo]; + +removeBackpack _player; + +_player setVariable [_variableName, _backpackAndContent]; + +true \ No newline at end of file diff --git a/cScripts/functions/systems/fn_swapVirtualBackpack.sqf b/cScripts/functions/systems/fn_swapVirtualBackpack.sqf new file mode 100644 index 000000000..9dbcb19fb --- /dev/null +++ b/cScripts/functions/systems/fn_swapVirtualBackpack.sqf @@ -0,0 +1,47 @@ +#include "..\script_component.hpp"; +/* + * Author: CPL.Brostrom.A + * This function saves and retrive a virtual backpack to sertain variable. + * + * Arguments: + * 0: player + * 1: varname + * + * Return Value: + * True if successfull + * + * Example: + * [player, "cScripts_player_virtualBackpack_1"] call cScripts_fnc_swapVirtualBackpack + * + */ + +params [ + ["_player", objNull, [objNull]], + ["_variableName", "", [""]] +]; + +if ((count (player getVariable [_variableName, []])) < 1) exitWith {false}; + +// Obtain current virtual +private _backpack = backpack _player call BIS_fnc_basicBackpack; +private _cargo = backpackItems _player; +private _backpackAndContent = [_backpack, _cargo]; + +removeBackpack _player; + +// Retrived saved +private _backpackAndContentStored = _player getVariable [_variableName, []]; +_backpackAndContentStored params [ + ["_backpack", ""], + ["_cargo", []] +]; + +_player addBackpack _backpack; + +{ + _player addItemToBackpack _x; +} forEach _cargo; + +_player setVariable [_variableName, _backpackAndContent]; + +true \ No newline at end of file