diff --git a/addons/admin/XEH_PREP.hpp b/addons/admin/XEH_PREP.hpp index d510380..530d7d4 100644 --- a/addons/admin/XEH_PREP.hpp +++ b/addons/admin/XEH_PREP.hpp @@ -1,7 +1,7 @@ -PREP(adminMessage); -PREP(adminPromote); PREP(adminRefresh); -PREP(adminTransfer); +PREP(handleEvents); +PREP(handleTransfer); PREP(initAdmin); PREP(openAdmin); -PREP(printAddonName); \ No newline at end of file +PREP(sendMessage); +PREP(updatePaygrade); \ No newline at end of file diff --git a/addons/admin/functions/fnc_adminMessage.sqf b/addons/admin/functions/fnc_adminMessage.sqf deleted file mode 100644 index 983d735..0000000 --- a/addons/admin/functions/fnc_adminMessage.sqf +++ /dev/null @@ -1,49 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Function: forge_client_admin_fnc_adminMessage - * Author: IDSolutions - * - * [Description] - * Admin Message Menu - * - * Arguments: - * None - * - * Return Value: - * None - * - * Examples: - * None - * - * Public: Yes - */ - -private ["_data", "_dialog", "_list", "_target", "_targetValue", "_textBox", "_textMessage"]; - -_dialog = findDisplay 202303; -_list = _dialog displayCtrl 2023001; -_textBox = _dialog displayCtrl 2023006; -_targetValue = lbCurSel _list; -_data = _list lbData _targetValue; - -if ((isNil {_data})) exitWith { hintSilent "You did not select a player!" }; - -{ - if (str (name (_x)) == str _data) then { - _target = _x; - }; -} forEach playableUnits; - -hintSilent format ["Player Selected. You have selected %1", _target]; - -if (isNil "_target") then { - hintSilent "Please Select an Active Player First!" -} else { - _textMessage = ctrlText _textBox; - [_target, _textMessage] remoteExec ["forge_server_misc_fnc_textMessage", 2]; - - // [format ["Message sent to %1:
%2", _target, _textMessage], "blue-grey", 3] call EFUNC(misc,notify); -}; - -["dummy"] call FUNC(adminRefresh); \ No newline at end of file diff --git a/addons/admin/functions/fnc_adminPromote.sqf b/addons/admin/functions/fnc_adminPromote.sqf deleted file mode 100644 index 7ced94e..0000000 --- a/addons/admin/functions/fnc_adminPromote.sqf +++ /dev/null @@ -1,51 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Function: forge_client_admin_fnc_adminPromote - * Author: IDSolutions - * - * [Description] - * Admin Promote Menu - * - * Arguments: - * None - * - * Return Value: - * None - * - * Examples: - * None - * - * Public: Yes - */ - -params [["_condition", "", [""]]]; - -private ["_data", "_data2", "_dialog", "_list", "_list2", "_paygrade", "_rankValue", "_target", "_targetValue"]; - -_dialog = findDisplay 202303; -_list = _dialog displayCtrl 2023001; -_list2 = _dialog displayCtrl 2023003; -_targetValue = lbCurSel _list; -_rankValue = lbCurSel _list2; -_data = _list lbData _targetValue; -_data2 = call compile format ["%1", (_list2 lbData _rankValue)]; -_paygrade = _data2 select 0; - -if ((isNil {_data})) exitWith { hintSilent "You did not select a player!" }; -{ - if (str (name (_x)) == str _data) then { - _target = _x; - }; -} forEach playableUnits; - -switch (_condition) do { - case ("promote"): { - SETPVAR(_target,FORGE_PayGrade,_paygrade) - }; - case ("demote"): { - SETPVAR(_target,FORGE_PayGrade,_paygrade) - }; -}; - -["dummy"] call FUNC(adminRefresh); \ No newline at end of file diff --git a/addons/admin/functions/fnc_adminRefresh.sqf b/addons/admin/functions/fnc_adminRefresh.sqf index 2293259..5329f93 100644 --- a/addons/admin/functions/fnc_adminRefresh.sqf +++ b/addons/admin/functions/fnc_adminRefresh.sqf @@ -5,74 +5,39 @@ * Author: IDSolutions * * [Description] - * Admin Refresh Menu + * Refreshes the admin interface player list and resets input fields. + * This function populates the player list with names and paygrades, + * storing player UIDs as data for each entry. Only shows players + * on the same side as the admin. * * Arguments: - * None + * 0: Dummy - Optional parameter, not used (for compatibility with event handlers) * * Return Value: * None * * Examples: - * None + * [] call forge_client_admin_fnc_adminRefresh; + * ["dummy"] call forge_client_admin_fnc_adminRefresh; * - * Public: Yes + * Public: No - Called from admin dialog controls */ -params [["_condition", "", [""]], ["_amount", 0, [0]]]; -private _store = missionNamespace getVariable ["FORGE_ORG_STORE_REG", createHashMap]; -private _org = _store call ["getOrg", []]; - -if (isNil "_org") exitWith { ["You are not in an organization!", "warning", 3] call EFUNC(misc,notify) }; - -private _orgFunds = _org get "funds"; - -private _newFunds = 0; private _dialog = findDisplay 202303; private _list = _dialog displayCtrl 2023001; -switch (_condition) do { - case ("deduct"): { - _newFunds = _orgFunds - _amount; - ctrlSetText [2023002, format ["$%1", (_newFunds call EFUNC(misc,formatNumber))]]; - }; - case ("advance"): { - _newFunds = _orgFunds + _amount; - ctrlSetText [2023002, format ["$%1", (_newFunds call EFUNC(misc,formatNumber))]]; - }; - default { - lbClear _list; - - { - if (str (side _x) == str (playerSide)) then { - private _name = name (_x); - private _defaultPaygrade = "E1"; - private _paygrade = GETVAR(_x,FORGE_PayGrade,_defaultPaygrade); - private _index = _list lbAdd format["%1 - %2", _name, _paygrade]; - - _list lbSetData [_index, name (_x)]; - }; - } forEach playableUnits; - - lbSetCurSel [2023001, 0]; - ctrlSetText [2023005, ""]; - ctrlSetText [2023006, ""]; - }; -}; - lbClear _list; { if (str (side _x) == str (playerSide)) then { private _name = name (_x); - private _defaultPaygrade = "E1"; - private _paygrade = GETVAR(_x,FORGE_PayGrade,_defaultPaygrade); + private _paygrade = GETVAR(_x,FORGE_PayGrade,QUOTE(E1)); private _index = _list lbAdd format["%1 - %2", _name, _paygrade]; - _list lbSetData [_index, name (_x)]; + _list lbSetData [_index, getPlayerUID _x]; }; -} forEach playableUnits; +} forEach allPlayers; lbSetCurSel [2023001, 0]; ctrlSetText [2023005, ""]; diff --git a/addons/admin/functions/fnc_adminTransfer.sqf b/addons/admin/functions/fnc_adminTransfer.sqf deleted file mode 100644 index 6ef1213..0000000 --- a/addons/admin/functions/fnc_adminTransfer.sqf +++ /dev/null @@ -1,118 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Function: forge_client_admin_fnc_adminTransfer - * Author: IDSolutions - * - * [Description] - * Admin Transfer Menu - * - * Arguments: - * None - * - * Return Value: - * None - * - * Examples: - * None - * - * Public: Yes - */ - -params [["_condition", "", [""]]]; - -private _store = missionNamespace getVariable ["FORGE_ORG_STORE_REG", createHashMap]; -private _org = _store call ["getOrg", []]; - -if (isNil "_org") exitWith { ["You are not in an organization!", "warning", 3] call EFUNC(misc,notify) }; - -private _orgFunds = _org get "funds"; - -private _dialog = findDisplay 202303; -private _list = _dialog displayCtrl 2023001; -private _targetValue = lbCurSel _list; -private _data = _list lbData _targetValue; -private _amount = round (parseNumber (ctrlText 2023005)); - -if ((isNil {_data})) exitWith { hint "You did not select a player!" }; - -{ - if (str (name (_x)) == str _data) then { - private _target = _x; - }; -} count playableUnits; - -switch (_condition) do { - case ("advance"): { - private _bank = GETVAR(_target,FORGE_Bank,0); - private _newBalance = _bank + _amount; - - if (_amount > _orgFunds) exitWith { ["Not enough money in the organization's account!", "warning", 3] call EFUNC(misc,notify) }; - - SETPVAR(_target,FORGE_Bank,_newBalance); - - ["deduct", _amount] call FUNC(adminRefresh); - _store call ["updateFunds", -_amount]; - }; - case ("advanceAll"): { - private _count = count playableUnits; - - if ((10000 * _count) > _orgFunds) exitWith { ["Not enough money in the organization's account!", "warning", 3] call EFUNC(misc,notify) }; - - { - private _bank = GETVAR(_x,FORGE_Bank,0); - private _newBalance = _bank + 10000; - - SETPVAR(_x,FORGE_Bank,_newBalance); - } count playableUnits; - - ["deduct", (10000 * _count)] call FUNC(adminRefresh); - _store call ["updateFunds", -(10000 * _count)]; - }; - case ("deduct"): { - private _bank = GETVAR(_target,FORGE_Bank,0); - private _newBalance = _bank - _amount; - - if (_amount > _bank) exitWith { ["Not enough money in the player's account!", "warning", 3] call EFUNC(misc,notify) }; - - SETPVAR(_target,FORGE_Bank,_newBalance); - - ["advance", _amount] call FUNC(adminRefresh); - _store call ["updateFunds", _amount]; - }; - case ("payday"): { - private _totalPayment = 0; - private _paymentToDo = []; - private _payGrades = (missionConfigFile >> "CfgPaygrades" >> "payGrades") call BIS_fnc_getCfgData; - - { - private _player = _x; - private _payGrade = GETVAR(_player,FORGE_PayGrade,nil); - - { - _x params ["_payGradeIndex", "_payGradeBonus"]; - - if ((_x select 0) == _payGrade) then { - _paymentToDo pushBack [_player, _payGradeBonus]; - _totalPayment = _totalPayment + _payGradeBonus; - }; - } forEach _payGrades; - } count playableUnits; - - if (_totalPayment > _orgFunds) exitWith { ["Not enough money in the organization's account!", "warning", 3] call EFUNC(misc,notify) }; - - { - _x params ["_player", "_bonus"]; - - private _bank = GETVAR(_player,FORGE_Bank,0); - private _newBalance = _bank + _bonus; - - SETPVAR(_player,FORGE_Bank,_newBalance); - } count _paymentToDo; - - ["deduct", _totalPayment] call FUNC(adminRefresh); - _store call ["updateFunds", -_totalPayment]; - }; -}; - -ctrlSetText [2023005, ""]; \ No newline at end of file diff --git a/addons/admin/functions/fnc_handleEvents.sqf b/addons/admin/functions/fnc_handleEvents.sqf new file mode 100644 index 0000000..4d3eed9 --- /dev/null +++ b/addons/admin/functions/fnc_handleEvents.sqf @@ -0,0 +1,62 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_client_admin_fnc_handleEvents + * Author: IDSolutions + * + * [Description] + * Handles events from the admin interface. + * This function listens for events from the admin interface + * and processes them accordingly. + * + * Arguments: + * 0: Event - The event to handle + * 1: Data - The data associated with the event + * + * Return Value: + * None + * + * Examples: + * ["EVENT_NAME", "DATA"] call forge_client_admin_fnc_handleEvents; + * + * Public: No - Called from admin dialog controls + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +diag_log format ["[FORGE: Admin] Received event: %1", _message]; + +private _messageParts = _message splitString ":"; +private _event = _messageParts select 0; +private _data = _messageParts select 1; + +switch (_event) do { + case "REQUEST_PLAYER_DATA": { + private _playerData = createHashMap; + private _playerList = []; + + { + private _player = _x; + private _uid = getPlayerUID _player; + private _name = name _player; + private _paygrade = GETVAR(_player,FORGE_PayGrade,QUOTE(E1)); + private _funds = GETVAR(_player,FORGE_BankBalance,0); + + private _playerInfo = createHashMapFromArray [ + ["uid", _uid], + ["name", _name], + ["paygrade", _paygrade], + ["funds", _funds], + ["side", str (side _player)] + ]; + + _playerList pushBack _playerInfo; + } forEach allPlayers; + + _playerData set ["players", _playerList]; + _control ctrlWebBrowserAction ["ExecJS", format ["handlePlayerDataRequest(%1)", (toJSON _playerList)]]; + }; + default { + diag_log format ["[FORGE: Admin] Unknown event: %1", _event]; + }; +}; \ No newline at end of file diff --git a/addons/admin/functions/fnc_handleTransfer.sqf b/addons/admin/functions/fnc_handleTransfer.sqf new file mode 100644 index 0000000..8ad6004 --- /dev/null +++ b/addons/admin/functions/fnc_handleTransfer.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_client_admin_fnc_handleTransfer + * Author: IDSolutions + * + * [Description] + * Handles fund transfers through the admin interface. + * This function retrieves the selected player's UID and amount + * from the admin dialog, then sends it to the server-side admin store. + * Supports multiple transfer types: advance (to single player), + * deduct (from single player), advanceAll (to all players), + * and payday (distribute based on paygrade). + * + * Arguments: + * 0: Condition - The type of transfer to perform ("advance", "deduct", "advanceAll", "payday") + * + * Return Value: + * None + * + * Examples: + * ["advance"] call forge_client_admin_fnc_handleTransfer; + * ["payday"] call forge_client_admin_fnc_handleTransfer; + * + * Public: No - Called from admin dialog controls + */ + +params [["_condition", "", [""]]]; + +private _dialog = findDisplay 202303; +private _list = _dialog displayCtrl 2023001; +private _index = lbCurSel _list; +private _uid = _list lbData _index; +private _amount = round (parseNumber (ctrlText 2023005)); + +if (_condition in ["advance", "deduct"] && ((isNil "_uid") || { _uid isEqualTo "" })) exitWith { hint "You did not select a player!"; }; + +[_condition, _amount, _uid] remoteExec ["forge_server_admin_fnc_handleTransfer", 2]; + +ctrlSetText [2023005, ""]; \ No newline at end of file diff --git a/addons/admin/functions/fnc_openAdmin.sqf b/addons/admin/functions/fnc_openAdmin.sqf index ccd5fc4..a9f965c 100644 --- a/addons/admin/functions/fnc_openAdmin.sqf +++ b/addons/admin/functions/fnc_openAdmin.sqf @@ -27,13 +27,13 @@ private _list = _dialog displayCtrl 2023001; private _list2 = _dialog displayCtrl 2023003; { - if (str (side _x) == str (playerSide)) then { + if (str (side _x) == str (playerSide) && isPlayer _x) then { private _name = name (_x); - private _defaultPaygrade = "E1"; - private _payGrade = GETVAR(_x,FORGE_PayGrade,_defaultPaygrade); + private _uid = getPlayerUID _x; + private _payGrade = GETVAR(_x,FORGE_PayGrade,QUOTE(E1)); private _index = _list lbAdd format["%1 - %2", _name, _payGrade]; - _list lbSetData [_index, _name]; + _list lbSetData [_index, _uid]; }; } count (allPlayers); diff --git a/addons/admin/functions/fnc_printAddonName.sqf b/addons/admin/functions/fnc_printAddonName.sqf deleted file mode 100644 index e0326e0..0000000 --- a/addons/admin/functions/fnc_printAddonName.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Function: forge_client_admin_fnc_printAddonName - * Author: IDSolutions - * - * [Description] - * Prints the name of the addon to the system chat. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Examples: - * None - * - * Public: No - */ - -systemChat format ["Thank you for using the %1", 'ADDON']; \ No newline at end of file diff --git a/addons/admin/functions/fnc_sendMessage.sqf b/addons/admin/functions/fnc_sendMessage.sqf new file mode 100644 index 0000000..34e50d9 --- /dev/null +++ b/addons/admin/functions/fnc_sendMessage.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_client_admin_fnc_sendMessage + * Author: IDSolutions + * + * [Description] + * Sends a message to a selected player through the admin interface. + * This function retrieves the selected player's UID and message content + * from the admin dialog, then sends it to the server-side admin store. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_client_admin_fnc_sendMessage; + * + * Public: No - Called from admin dialog controls + */ + +private _dialog = findDisplay 202303; +private _list = _dialog displayCtrl 2023001; +private _control = _dialog displayCtrl 2023006; +private _index = lbCurSel _list; +private _uid = _list lbData _index; +private _message = ctrlText _control; + +if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; }; + +[_uid, _message] remoteExec ["forge_server_admin_fnc_sendMessage", 2]; + +hintSilent format ["Message sent to UID %1: %2", _uid, _message]; + +["dummy"] call FUNC(adminRefresh); \ No newline at end of file diff --git a/addons/admin/functions/fnc_updatePaygrade.sqf b/addons/admin/functions/fnc_updatePaygrade.sqf new file mode 100644 index 0000000..c9ad0e3 --- /dev/null +++ b/addons/admin/functions/fnc_updatePaygrade.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_client_admin_fnc_updatePaygrade + * Author: IDSolutions + * + * [Description] + * Updates a player's paygrade in the server's admin store. + * This function retrieves the selected player's UID and the target paygrade + * from the admin dialog, then sends it to the server-side admin store. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_client_admin_fnc_updatePaygrade; + * + * Public: No - Called from admin dialog controls + */ + +private _dialog = findDisplay 202303; +private _list = _dialog displayCtrl 2023001; +private _list2 = _dialog displayCtrl 2023003; +private _targetIndex = lbCurSel _list; +private _rankIndex = lbCurSel _list2; +private _targetUID = _list lbData _targetIndex; +private _rankData = call compile format ["%1", (_list2 lbData _rankIndex)]; +private _paygrade = _rankData select 0; + +if ((isNil "_targetUID") || {_targetUID isEqualTo ""}) exitWith { hintSilent "You did not select a player!" }; + +[_targetUID, _paygrade] remoteExec ["forge_server_admin_fnc_updatePaygrade", 2]; + +["dummy"] call FUNC(adminRefresh); \ No newline at end of file diff --git a/addons/admin/ui/RscAdmin.hpp b/addons/admin/ui/RscAdmin.hpp index 8c07dc0..2fdcb4c 100644 --- a/addons/admin/ui/RscAdmin.hpp +++ b/addons/admin/ui/RscAdmin.hpp @@ -83,7 +83,7 @@ class RscAdmin { class RscAdminPromote: RscButton { idc = -1; colorText[] = {1,1,1,1}; - onButtonClick = "['promote'] call forge_client_admin_fnc_adminPromote;"; + onButtonClick = "[] call forge_client_admin_fnc_updatePaygrade;"; soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; text = "Promote"; x = "0.675 * safezoneW + safezoneX"; @@ -163,7 +163,7 @@ class RscAdmin { class RscAdminSend: RscButton { idc = -1; colorText[] = {1,1,1,1}; - onButtonClick = "[] call forge_client_admin_fnc_adminMessage;"; + onButtonClick = "[] call forge_client_admin_fnc_sendMessage;"; soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; text = "Send Message"; x = "0.6125 * safezoneW + safezoneX"; diff --git a/addons/arsenal/functions/fnc_addArmoryItem.sqf b/addons/arsenal/functions/fnc_addArmoryItem.sqf index 684097d..7eb4e40 100644 --- a/addons/arsenal/functions/fnc_addArmoryItem.sqf +++ b/addons/arsenal/functions/fnc_addArmoryItem.sqf @@ -26,15 +26,15 @@ private _default = [[],[],[],[]]; private _armory_unlocks = GETVAR(player,Armory_Unlocks,_default); private _typeToNumber = switch (_type) do { - case "backpack": {3}; - case "facewear": {0}; - case "headgear": {0}; - case "hmd": {0}; - case "item": {0}; - case "magazine": {2}; - case "uniform": {0}; + case "facewear"; + case "headgear"; + case "hmd"; + case "item"; + case "uniform"; case "vest": {0}; case "weapon": {1}; + case "magazine": {2}; + case "backpack": {3}; default {0}; }; diff --git a/addons/arsenal/functions/fnc_initArsenal.sqf b/addons/arsenal/functions/fnc_initArsenal.sqf index 6d6f7b9..8dadd56 100644 --- a/addons/arsenal/functions/fnc_initArsenal.sqf +++ b/addons/arsenal/functions/fnc_initArsenal.sqf @@ -5,25 +5,26 @@ * Author: IDSolutions * * [Description] - * Initializes the arsenal system + * Initializes the arsenal system with armory and garage data * * Arguments: - * 0: Armory data - * 1: Garage data + * 0: Armory data - [items, weapons, magazines, backpacks] + * 1: Garage data - [cars, armor, helicopters, planes, naval, static] * * Return Value: - * None + * BOOLEAN - true if initialization successful, false if invalid data * - * Examples: - * None - * - * Public: Yes + * Example: + * [[_items, _weapons, _magazines, _backpacks], [_cars, _armor, _helis, _planes, _naval, _statics]] call forge_client_arsenal_fnc_initArsenal */ params [["_armory_data", [], [[]]], ["_garage_data", [], [[]]]]; -if (count _armory_data isEqualTo [""]) then { _armory_data = [[],[],[],[]] }; -if (count _garage_data isEqualTo [""]) then { _garage_data = [[],[],[],[],[],[]] }; +private _defaultArmory = [[],[],[],[]]; +private _defaultGarage = [[],[],[],[],[],[]]; + +if (!(_armory_data isEqualTypeArray _defaultArmory) || (count _armory_data != 4)) then { _armory_data = _defaultArmory; }; +if (!(_garage_data isEqualTypeArray _defaultGarage) || (count _garage_data != 6)) then { _garage_data = _defaultGarage; }; if (GVAR(armory_type) == 0) then { { [GVAR(gear_box), _x, false, true, 1, _forEachIndex] call BFUNC(addVirtualItemCargo); @@ -34,23 +35,29 @@ if (GVAR(armory_type) == 0) then { } forEach _armory_data; }; +_armory_data params [["_items", [], [[]]], ["_weapons", [], [[]]], ["_magazines", [], [[]]], ["_backpacks", [], [[]]]]; +_garage_data params [["_cars", [], [[]]], ["_armor", [], [[]]], ["_helis", [], [[]]], ["_planes", [], [[]]], ["_naval", [], [[]]], ["_statics", [], [[]]]]; + GVAR(armory_unlocks) = _armory_data; GVAR(garage_unlocks) = _garage_data; -GVAR(item_unlocks) = _armory_data select 0; -GVAR(weapon_unlocks) = _armory_data select 1; -GVAR(magazine_unlocks) = _armory_data select 2; -GVAR(backpack_unlocks) = _armory_data select 3; +GVAR(item_unlocks) = _items; +GVAR(weapon_unlocks) = _weapons; +GVAR(magazine_unlocks) = _magazines; +GVAR(backpack_unlocks) = _backpacks; -GVAR(car_unlocks) = _garage_data select 0; -GVAR(armor_unlocks) = _garage_data select 1; -GVAR(heli_unlocks) = _garage_data select 2; -GVAR(plane_unlocks) = _garage_data select 3; -GVAR(naval_unlocks) = _garage_data select 4; -GVAR(static_unlocks) = _garage_data select 5; +GVAR(car_unlocks) = _cars; +GVAR(armor_unlocks) = _armor; +GVAR(heli_unlocks) = _helis; +GVAR(plane_unlocks) = _planes; +GVAR(naval_unlocks) = _naval; +GVAR(static_unlocks) = _statics; { [_x] call FUNC(addVirtualVehicles); } forEach GVAR(garage_unlocks); -TRACE_2("Arsenal System Initialized with defaults",count GVAR(armory_unlocks),count GVAR(garage_unlocks)); \ No newline at end of file +private _armoryCount = count (_armory_data select { count _x > 0 }); +private _garageCount = count (_garage_data select { count _x > 0 }); + +TRACE_2("Arsenal System Initialized",_armoryCount,_garageCount); \ No newline at end of file diff --git a/addons/store/XEH_PREP.hpp b/addons/store/XEH_PREP.hpp index bb692d1..a556f8c 100644 --- a/addons/store/XEH_PREP.hpp +++ b/addons/store/XEH_PREP.hpp @@ -2,6 +2,7 @@ PREP(buyItem); PREP(buyVehicle); PREP(changeFilter); PREP(changePayment); +PREP(handleDelivery); PREP(handlePurchase); PREP(initStore); PREP(openStore); diff --git a/addons/store/functions/fnc_buyItem.sqf b/addons/store/functions/fnc_buyItem.sqf index 0e258ce..90f6a21 100644 --- a/addons/store/functions/fnc_buyItem.sqf +++ b/addons/store/functions/fnc_buyItem.sqf @@ -30,10 +30,7 @@ private _locker = GETVAR(player,FORGE_Locker,[]); if !([_price] call FUNC(handlePurchase)) exitWith {}; switch (_configType) do { - case "item": { - _displayName = getText (configFile >> "CfgWeapons" >> _className >> "displayName"); - _locker pushBack [_itemType, _className]; - }; + case "item"; case "weapon": { _displayName = getText (configFile >> "CfgWeapons" >> _className >> "displayName"); _locker pushBack [_itemType, _className]; @@ -48,7 +45,7 @@ switch (_configType) do { }; }; -SETPVAR(player,FORGE_Locker,_locker); +[_locker] spawn FUNC(handleDelivery); [_className, _itemType] call EFUNC(arsenal,addArmoryItem); diff --git a/addons/store/functions/fnc_changeFilter.sqf b/addons/store/functions/fnc_changeFilter.sqf index 2357c1b..885c370 100644 --- a/addons/store/functions/fnc_changeFilter.sqf +++ b/addons/store/functions/fnc_changeFilter.sqf @@ -38,14 +38,7 @@ private _items = _data select 1; if (_category == _selectedCategory) then { switch (_configType) do { - case "item": { - private _displayName = getText (configFile >> "CfgWeapons" >> _item >> "displayName"); - private _picture = getText (configFile >> "CfgWeapons" >> _item >> "picture"); - - _index = _productList lbAdd _displayName; - _productList lbSetData [_index, str [_item, _price, _category, _configType, _itemType]]; - _productList lbSetPicture [_index, _picture]; - }; + case "item"; case "weapon": { private _displayName = getText (configFile >> "CfgWeapons" >> _item >> "displayName"); private _picture = getText (configFile >> "CfgWeapons" >> _item >> "picture"); @@ -62,14 +55,7 @@ private _items = _data select 1; _productList lbSetData [_index, str [_item, _price, _category, _configType, _itemType]]; _productList lbSetPicture [_index, _picture]; }; - case "backpack": { - private _displayName = getText (configFile >> "CfgVehicles" >> _item >> "displayName"); - private _picture = getText (configFile >> "CfgVehicles" >> _item >> "picture"); - - _index = _productList lbAdd _displayName; - _productList lbSetData [_index, str [_item, _price, _category, _configType, _itemType]]; - _productList lbSetPicture [_index, _picture]; - }; + case "backpack"; case "vehicle": { private _displayName = getText (configFile >> "CfgVehicles" >> _item >> "displayName"); private _picture = getText (configFile >> "CfgVehicles" >> _item >> "picture"); diff --git a/addons/store/functions/fnc_handleDelivery.sqf b/addons/store/functions/fnc_handleDelivery.sqf new file mode 100644 index 0000000..0e78dea --- /dev/null +++ b/addons/store/functions/fnc_handleDelivery.sqf @@ -0,0 +1,69 @@ +#include "..\script_component.hpp" + +/* + * Function: forge_store_fnc_handleDelivery + * Description: + * Handles the delivery timer and locker updates for purchased items + * + * Parameters: + * 0: New Locker Contents + * + * Returns: + * None + * + * Example: + * [_newLocker] spawn forge_store_fnc_handleDelivery + */ + +params [["_newLocker", [], [[]]]]; + +if (_newLocker isEqualTo []) exitWith { + ["Error: Empty locker contents", "error", 5] call FUNC(notify); +}; + +private _deliveryTime = ["DT", 0] call BIS_fnc_getParamValue; + +if (_deliveryTime > 0) then { + [ + format [ + "Order Processing
Estimated delivery: %1", + [_deliveryTime, "MM:SS"] call BIS_fnc_secondsToString + ], + "info", + 3, + "left" + ] call FUNC(notify); + + sleep (_deliveryTime / 2); + + [ + "Package in transit", + "warning", + 2, + "left" + ] call FUNC(notify); + + sleep (_deliveryTime / 2); + + SETPVAR(player,FORGE_Locker,_newLocker); + + [ + "Order Delivered!
Check your locker", + "success", + 5, + "left" + ] call FUNC(notify); + + if (hasInterface) then { + playSound "FD_Finish_F"; + }; +} else { + SETPVAR(player,FORGE_Locker,_newLocker); + + [ + "Order Complete!
Items added to locker", + "success", + 3, + "left" + ] call FUNC(notify); +}; \ No newline at end of file diff --git a/addons/store/functions/fnc_handlePurchase.sqf b/addons/store/functions/fnc_handlePurchase.sqf index 6cc1cef..d04f3ea 100644 --- a/addons/store/functions/fnc_handlePurchase.sqf +++ b/addons/store/functions/fnc_handlePurchase.sqf @@ -47,14 +47,13 @@ if (_payment select 0 == "Organization") then { }; }; -private _varType = _payment select 2; +private _varType = toLower (_payment select 2); +private _varName = _payment param [1, "", [""]]; private _balance = switch (_varType) do { - case "organization": { - _store call ["getFunds", []]; - }; - case "player": { player getVariable [_payment select 1, 0] }; - case "mission": { missionNamespace getVariable [_payment select 1, 0] }; - default { 0 }; + case "organization": { _store call ["getFunds", []] }; + case "player": { GETVAR(player,_varName,0) }; + case "mission": { GETVAR(missionNamespace,_varName,0) }; + default { diag_log "[FORGE Store] Error: Unknown payment type"; 0 }; }; if (_balance < _price) exitWith { @@ -63,14 +62,14 @@ if (_balance < _price) exitWith { }; switch (_varType) do { - case "organization": { - _store call ["updateFunds", -_price]; - }; + case "organization": { _store call ["updateFunds", -_price] }; case "player": { - player setVariable [_payment select 1, (_balance - _price), true]; + private _newBalance = _balance - _price; + SETPVAR(player,_varName,_newBalance); }; case "mission": { - missionNamespace setVariable [_payment select 1, (_balance - _price), true]; + private _newBalance = _balance - _price; + SETPVAR(missionNamespace,_varName,_newBalance); }; }; diff --git a/addons/store/functions/fnc_openStore.sqf b/addons/store/functions/fnc_openStore.sqf index 66056a1..b60ba21 100644 --- a/addons/store/functions/fnc_openStore.sqf +++ b/addons/store/functions/fnc_openStore.sqf @@ -30,14 +30,11 @@ private _display = findDisplay IDD_STOREDIALOG; private _categoryList = _display displayCtrl IDC_CATEGORYLIST; private _paymentList = _display displayCtrl IDC_PAYMENTLIST; private _storeName = _display displayCtrl IDC_DIALOGNAME; -private _data = _store getVariable "storeData"; -private _categories = _data select 0; -private _products = _data select 1; -private _name = _data select 2; -private _paymentMethods = _data select 3; +private _data = _store getVariable ["storeData", []]; + +_data params [["_categories", [], [[]]], ["_products", [], [[]]], ["_name", "", [""]], ["_paymentMethods", [], [[]]]]; GVAR(currentStore) = _data; - _storeName ctrlSetText _name; { diff --git a/addons/store/functions/fnc_selectProduct.sqf b/addons/store/functions/fnc_selectProduct.sqf index d3c9200..0780a9a 100644 --- a/addons/store/functions/fnc_selectProduct.sqf +++ b/addons/store/functions/fnc_selectProduct.sqf @@ -23,12 +23,9 @@ private _display = findDisplay IDD_STOREDIALOG; private _productList = _display displayCtrl IDC_PRODUCTLIST; private _productIndex = lbCurSel _productList; private _productData = lbData [IDC_PRODUCTLIST, _productIndex]; - private _product = call compile _productData; -private _item = _product select 0; -private _price = _product select 1; -private _configType = _product select 3; -private _itemType = _product select 4; + +_product params [["_item", "", [""]], ["_price", 0, [0]], ["_category", "", [""]], ["_configType", "", [""]], ["_itemType", "", [""]]]; switch (_configType) do { case "item";