From 90476345dbddc0e5c833a8f17d784698f66bcc10 Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Sat, 10 May 2025 17:50:11 -0500 Subject: [PATCH] feat: Enhance admin and bank systems with event handling and UI improvements This commit introduces significant updates to the admin and bank systems, focusing on improved event handling and user interface enhancements. Key changes include: - Refactored event handling for player data requests, paygrade updates, and message broadcasting in the admin panel. - Implemented new event types for handling player funds and transaction history in the bank system. - Updated JavaScript functions for better interaction with the web-based UI, including dynamic data requests and improved user feedback. - Removed deprecated functions and streamlined code for better maintainability. These enhancements aim to provide a more efficient and user-friendly experience for administrators and players alike. --- addons/admin/XEH_PREP.hpp | 1 - addons/admin/XEH_postInit.sqf | 97 +---- addons/admin/XEH_postInit_client.sqf | 94 ++++- addons/admin/functions/fnc_handleTransfer.sqf | 4 +- addons/admin/functions/fnc_initAdmin.sqf | 37 -- addons/admin/functions/fnc_openAdmin.sqf | 9 +- addons/admin/functions/fnc_sendMessage.sqf | 4 +- addons/admin/functions/fnc_updatePaygrade.sqf | 2 +- addons/admin/ui/_site/script.js | 16 +- addons/bank/XEH_PREP.hpp | 1 - addons/bank/XEH_postInit.sqf | 12 +- addons/bank/XEH_postInit_client.sqf | 87 ++++- addons/bank/config.cpp | 3 +- addons/bank/functions/fnc_deposit.sqf | 31 +- addons/bank/functions/fnc_openBank.sqf | 64 ++-- addons/bank/functions/fnc_refresh.sqf | 14 +- addons/bank/functions/fnc_submit.sqf | 4 +- addons/bank/functions/fnc_transfer.sqf | 32 +- addons/bank/functions/fnc_withdraw.sqf | 30 +- addons/bank/stringtable.xml | 3 - addons/bank/ui/RscWebBank.hpp | 17 + addons/bank/ui/_site/index.html | 109 +++--- addons/bank/ui/_site/script.js | 344 +++++++++++++----- addons/garage/XEH_postInit.sqf | 49 +-- addons/garage/XEH_postInit_client.sqf | 49 ++- addons/garage/stringtable.xml | 3 - .../init/functions/fnc_handlePlayerLoad.sqf | 9 +- addons/locker/stringtable.xml | 3 - addons/store/stringtable.xml | 3 - 29 files changed, 683 insertions(+), 448 deletions(-) delete mode 100644 addons/admin/functions/fnc_initAdmin.sqf create mode 100644 addons/bank/ui/RscWebBank.hpp diff --git a/addons/admin/XEH_PREP.hpp b/addons/admin/XEH_PREP.hpp index dcb11aa..0c8ec51 100644 --- a/addons/admin/XEH_PREP.hpp +++ b/addons/admin/XEH_PREP.hpp @@ -1,6 +1,5 @@ PREP(adminRefresh); PREP(handleTransfer); -PREP(initAdmin); PREP(openAdmin); PREP(sendMessage); PREP(updatePaygrade); \ No newline at end of file diff --git a/addons/admin/XEH_postInit.sqf b/addons/admin/XEH_postInit.sqf index f554e99..84f2529 100644 --- a/addons/admin/XEH_postInit.sqf +++ b/addons/admin/XEH_postInit.sqf @@ -1,96 +1 @@ -#include "script_component.hpp" - -[QGVAR(handleEvents), { - params ["_control", "_isConfirmDialog", "_message"]; - - diag_log format ["[FORGE: Admin] Received event: %1", _message]; - - _message = fromJSON _message; - private _event = _message get "event"; - private _data = _message get "data"; - - 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_Bank,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)]]; - }; - case "REQUEST_PAYGRADE_DATA": { - private _payGrades = (missionConfigFile >> "CfgPaygrades" >> "payGrades") call BIS_fnc_getCfgData; - private _paygradeData = createHashMap; - private _paygradeList = []; - - { - private _paygradeInfo = createHashMapFromArray [ - ["paygrade", _x select 0], - ["bonus", _x select 1] - ]; - - _paygradeList pushBack _paygradeInfo; - } forEach _payGrades; - - _paygradeData set ["paygrades", _paygradeList]; - _control ctrlWebBrowserAction ["ExecJS", format ["handlePaygradeDataRequest(%1)", (toJSON _paygradeList)]]; - }; - case "BROADCAST_MESSAGE": { - _data params ["_uid", "_message"]; - - if ((isNil "_message") || {_message isEqualTo ""}) exitWith { hintSilent "Message cannot be empty!"; }; - - ["forge_server_admin_handleEvents", ["sendMessage", [_uid, _message]]] call CFUNC(serverEvent); - }; - case "SEND_MESSAGE": { - _data params ["_uid", "_message"]; - - if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; }; - - ["forge_server_admin_handleEvents", ["sendMessage", [_uid, _message]]] call CFUNC(serverEvent); - }; - case "UPDATE_PAYGRADE": { - private _uid = _data select 0; - private _paygrade = _data select 1; - - if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; }; - - ["forge_server_admin_handleEvents", ["updatePaygrade", [_uid, _paygrade]]] call CFUNC(serverEvent); - }; - case "HANDLE_TRANSFER": { - private _condition = _data select 0; - private _amount = _data select 1; - private _uid = _data select 2; - - ["forge_server_admin_handleEvents", ["handleTransfer", [_condition, _amount, _uid]]] call CFUNC(serverEvent); - }; - case "ADVANCE_ALL": { - private _amount = _data select 0; - - ["forge_server_admin_handleEvents", ["advanceAll", [_amount]]] call CFUNC(serverEvent); - }; - case "HANDLE_PAYDAY": { - ["forge_server_admin_handleEvents", ["handlePayday"]] call CFUNC(serverEvent); - }; - default { - diag_log format ["[FORGE: Admin] Unhandled event: %1", _event]; - }; - }; -}] call CFUNC(addEventHandler); \ No newline at end of file +#include "script_component.hpp" \ No newline at end of file diff --git a/addons/admin/XEH_postInit_client.sqf b/addons/admin/XEH_postInit_client.sqf index 84f2529..1f04e6c 100644 --- a/addons/admin/XEH_postInit_client.sqf +++ b/addons/admin/XEH_postInit_client.sqf @@ -1 +1,93 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(handleEvents), { + params ["_control", "_isConfirmDialog", "_message"]; + + diag_log format ["[FORGE::Client::Admin::XEH_postInit] Received event: %1", _message]; + + _message = fromJSON _message; + private _event = _message get "event"; + private _data = _message get "data"; + + 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)); //TODO: Implement paygrade from server + private _funds = GETVAR(_player,FORGE_Bank,0); //TODO: Implement funds from server + + 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)]]; + }; + case "REQUEST::PAYGRADE::DATA": { + private _payGrades = (missionConfigFile >> "CfgPaygrades" >> "payGrades") call BIS_fnc_getCfgData; + private _paygradeData = createHashMap; + private _paygradeList = []; + + { + private _paygradeInfo = createHashMapFromArray [ + ["paygrade", _x select 0], + ["bonus", _x select 1] + ]; + + _paygradeList pushBack _paygradeInfo; + } forEach _payGrades; + + _paygradeData set ["paygrades", _paygradeList]; + _control ctrlWebBrowserAction ["ExecJS", format ["handlePaygradeDataRequest(%1)", (toJSON _paygradeList)]]; + }; + case "BROADCAST::MESSAGE": { + _data params ["_uid", "_message"]; + + if ((isNil "_message") || {_message isEqualTo ""}) exitWith { systemChat "Message cannot be empty!"; }; + + ["forge_server_admin_handleEvents", ["ADMIN::SEND::MESSAGE", [_uid, _message]]] call CFUNC(serverEvent); + }; + case "SEND::MESSAGE": { + _data params ["_uid", "_message"]; + + if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { systemChat "You did not select a player!"; }; + + ["forge_server_admin_handleEvents", ["ADMIN::SEND::MESSAGE", [_uid, _message]]] call CFUNC(serverEvent); + }; + case "UPDATE::PAYGRADE": { + _data params ["_uid", "_paygrade"]; + + if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { systemChat "You did not select a player!"; }; + + ["forge_server_admin_handleEvents", ["ADMIN::UPDATE::PAYGRADE", [_uid, _paygrade]]] call CFUNC(serverEvent); + }; + case "HANDLE::TRANSFER": { + _data params ["_condition", "_amount", "_uid"]; + + ["forge_server_admin_handleEvents", ["ADMIN::TRANSFER", [_condition, _amount, _uid]]] call CFUNC(serverEvent); + }; + case "ADVANCE::ALL": { + _data params ["_amount"]; + + ["forge_server_admin_handleEvents", ["ADMIN::ADVANCE::ALL", [_amount]]] call CFUNC(serverEvent); + }; + case "HANDLE::PAYDAY": { + ["forge_server_admin_handleEvents", ["ADMIN::PAYDAY"]] call CFUNC(serverEvent); + }; + default { + diag_log format ["[FORGE::Client::Admin::XEH_postInit] Unhandled event: %1", _event]; + }; + }; +}] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/admin/functions/fnc_handleTransfer.sqf b/addons/admin/functions/fnc_handleTransfer.sqf index 54e786d..9657581 100644 --- a/addons/admin/functions/fnc_handleTransfer.sqf +++ b/addons/admin/functions/fnc_handleTransfer.sqf @@ -33,8 +33,8 @@ 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!"; }; +if ({_condition in ["advance", "deduct"]} && ((isNil "_uid") || { _uid isEqualTo "" })) exitWith { hint "You did not select a player!"; }; -["forge_server_admin_handleEvents", ["handleTransfer", [_condition, _amount, _uid]]] call CFUNC(serverEvent); +["forge_server_admin_handleEvents", ["ADMIN::TRANSFER", [_condition, _amount, _uid]]] call CFUNC(serverEvent); ctrlSetText [2023005, ""]; \ No newline at end of file diff --git a/addons/admin/functions/fnc_initAdmin.sqf b/addons/admin/functions/fnc_initAdmin.sqf deleted file mode 100644 index 6bb88dc..0000000 --- a/addons/admin/functions/fnc_initAdmin.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Function: forge_client_admin_fnc_initAdmin - * Author: IDSolutions - * - * [Description] - * Initializes the admin menu. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Examples: - * None - * - * Public: No - */ - -{ - private _configName = configName(_x); - private _className = (missionConfigFile >> "CfgCpofs" >> "cpofs" >> _configName >> "className") call BFUNC(getCfgData); - private _pos = (missionConfigFile >> "CfgCpofs" >> "cpofs" >> _configName >> "pos") call BFUNC(getCfgData); - private _dir = (missionConfigFile >> "CfgCpofs" >> "cpofs" >> _configName >> "dir") call BFUNC(getCfgData); - - private _cpof = createSimpleObject [_className, [0, 0, 0]]; - - _cpof setPosATL _pos; - _cpof setDir _dir; - _cpof allowDamage false; - _cpof setVariable ["isCPOF", true, true]; - - diag_log text format ["[FORGE Admin] ClassName: '%1' Pos: '%2' Dir: '%3'", _className, _pos, _dir]; - -} forEach ("true" configClasses (missionConfigFile >> "CfgCpofs" >> "cpofs")); \ No newline at end of file diff --git a/addons/admin/functions/fnc_openAdmin.sqf b/addons/admin/functions/fnc_openAdmin.sqf index 4aff4df..a89cb17 100644 --- a/addons/admin/functions/fnc_openAdmin.sqf +++ b/addons/admin/functions/fnc_openAdmin.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_admin_fnc_openAdmin * Author: IDSolutions - * - * [Description] - * Opens the admin menu. + * Opens the admin dialog. * * Arguments: * None @@ -13,8 +10,8 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_admin_fnc_openAdmin; * * Public: Yes */ diff --git a/addons/admin/functions/fnc_sendMessage.sqf b/addons/admin/functions/fnc_sendMessage.sqf index 8783e20..ed1ec97 100644 --- a/addons/admin/functions/fnc_sendMessage.sqf +++ b/addons/admin/functions/fnc_sendMessage.sqf @@ -30,8 +30,6 @@ private _message = ctrlText _control; if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; }; -["forge_server_admin_handleEvents", ["sendMessage", [_uid, _message]]] call CFUNC(serverEvent); - -hintSilent format ["Message sent to UID %1: %2", _uid, _message]; +["forge_server_admin_handleEvents", ["ADMIN::SEND::MESSAGE", [_uid, _message]]] call CFUNC(serverEvent); ["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 index 1c226e4..3371354 100644 --- a/addons/admin/functions/fnc_updatePaygrade.sqf +++ b/addons/admin/functions/fnc_updatePaygrade.sqf @@ -32,6 +32,6 @@ private _paygrade = _rankData select 0; if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!" }; -["forge_server_admin_handleEvents", ["updatePaygrade", [_uid, _paygrade]]] call CFUNC(serverEvent); +["forge_server_admin_handleEvents", ["ADMIN::UPDATE::PAYGRADE", [_uid, _paygrade]]] call CFUNC(serverEvent); ["dummy"] call FUNC(adminRefresh); \ No newline at end of file diff --git a/addons/admin/ui/_site/script.js b/addons/admin/ui/_site/script.js index b65f751..222f366 100644 --- a/addons/admin/ui/_site/script.js +++ b/addons/admin/ui/_site/script.js @@ -46,7 +46,7 @@ function initializeAdmin() { */ function requestPlayerData() { const message = { - event: "REQUEST_PLAYER_DATA", + event: "REQUEST::PLAYER::DATA", data: {} }; @@ -60,7 +60,7 @@ function requestPlayerData() { */ function requestPaygradeData() { const message = { - event: "REQUEST_PAYGRADE_DATA", + event: "REQUEST::PAYGRADE::DATA", data: {} }; @@ -286,7 +286,7 @@ function updatePaygrade(uid, isPromotion) { } const message = { - event: "UPDATE_PAYGRADE", + event: "UPDATE::PAYGRADE", data: [uid, newPaygrade] }; @@ -341,7 +341,7 @@ function giveMoney() { function giveAllMoney() { const amount = parseInt(document.getElementById('giveAllAmount').value); const message = { - event: "ADVANCE_ALL", + event: "ADVANCE::ALL", data: [amount] } @@ -371,7 +371,7 @@ function takeMoney() { */ function handleTransferFunds(condition, amount, uid) { const message = { - event: "HANDLE_TRANSFER", + event: "HANDLE::TRANSFER", data: [condition, amount, uid] }; @@ -425,7 +425,7 @@ function sendPlayerMessage() { const message = document.getElementById('messageInput').value; if (message && selectedPlayerId) { const messageData = { - event: "SEND_MESSAGE", + event: "SEND::MESSAGE", data: [selectedPlayerId, message] }; @@ -441,7 +441,7 @@ function broadcastMessage() { const message = document.getElementById('broadcastMessage').value; if (message) { const messageData = { - event: "BROADCAST_MESSAGE", + event: "BROADCAST::MESSAGE", data: ["", message] }; @@ -461,7 +461,7 @@ function broadcastMessage() { */ function Payday() { const message = { - event: "HANDLE_PAYDAY", + event: "HANDLE::PAYDAY", data: [] }; diff --git a/addons/bank/XEH_PREP.hpp b/addons/bank/XEH_PREP.hpp index 746ca50..96b75ce 100644 --- a/addons/bank/XEH_PREP.hpp +++ b/addons/bank/XEH_PREP.hpp @@ -1,5 +1,4 @@ PREP(deposit); -PREP(initBank); PREP(openBank); PREP(refresh); PREP(submit); diff --git a/addons/bank/XEH_postInit.sqf b/addons/bank/XEH_postInit.sqf index 84f2529..ce7c0a8 100644 --- a/addons/bank/XEH_postInit.sqf +++ b/addons/bank/XEH_postInit.sqf @@ -1 +1,11 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[{ + GETVAR(player,value_loadDone,false) +}, { + private _bank = GETVAR(player,FORGE_Bank,0); + private _cash = GETVAR(player,FORGE_Cash,0); + private _uid = getPlayerUID player; + + ["forge_server_bank_handleEvents", ["BANK::HANDLE::PLAYER::LOAD", [_uid, _bank, _cash]]] call CFUNC(serverEvent); +}] call CFUNC(waitUntilAndExecute); \ No newline at end of file diff --git a/addons/bank/XEH_postInit_client.sqf b/addons/bank/XEH_postInit_client.sqf index 84f2529..6986511 100644 --- a/addons/bank/XEH_postInit_client.sqf +++ b/addons/bank/XEH_postInit_client.sqf @@ -1 +1,86 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(handleEvents), { + params ["_control", "_isConfirmDialog", "_message"]; + + diag_log text format ["[FORGE::Client::Bank::XEH_postInit] Received event: '%1'", _message]; + + _message = fromJSON _message; + private _event = _message get "event"; + private _data = _message get "data"; + + switch (_event) do { + case "REQUEST::PLAYER::DATA": { + private _playerData = createHashMap; + private _playerList = []; + + { + private _player = _x; + private _uid = getPlayerUID _player; + private _name = name _player; + private _funds = GETVAR(_player,FORGE_Bank,0); //TODO: Implement funds from server + private _cash = GETVAR(_player,FORGE_Cash,0); //TODO: Implement cash from server + private _playerInfo = createHashMapFromArray [ + ["uid", _uid], + ["name", _name], + ["funds", _funds], + ["cash", _cash] + ]; + + _playerList pushBack _playerInfo; + } forEach allPlayers; + + _playerData set ["players", _playerList]; + _control ctrlWebBrowserAction ["ExecJS", format ["handlePlayerDataRequest(%1)", (toJSON _playerList)]]; + }; + case "REQUEST::PLAYER::FUNDS": { + private _playerData = createHashMap; + private _uid = getPlayerUID player; + private _balance = GETVAR(_player,FORGE_Bank,0); //TODO: Implement balance from server + private _cash = GETVAR(_player,FORGE_Cash,0); //TODO: Implement cash from server + private _playerData = createHashMapFromArray [ + ["balance", _balance], + ["cash", _cash] + ]; + + _control ctrlWebBrowserAction ["ExecJS", format ["handlePlayerFundsRequest(%1)", (toJSON _playerData)]]; + }; + case "REQUEST::TRANSACTION::HISTORY": { + private _uid = getPlayerUID player; + private _history = []; //TODO: Implement history from server + private _historyData = createHashMapFromArray [["history", _history]]; + + _control ctrlWebBrowserAction ["ExecJS", format ["handleTransactionHistoryRequest(%1)", (toJSON _historyData)]]; + }; + case "DEPOSIT::FUNDS": { + _data params ["_amount"]; + + if (_amount <= 0) exitWith { systemChat "Invalid amount, must be greater than 0!"; false }; + + ["forge_server_bank_handleEvents", ["BANK::DEPOSIT", [getPlayerUID player, _amount]]] call CFUNC(serverEvent); + + true + }; + case "WITHDRAW::FUNDS": { + _data params ["_amount"]; + + if (_amount <= 0) exitWith { systemChat "Invalid amount, must be greater than 0!"; false }; + + ["forge_server_bank_handleEvents", ["BANK::WITHDRAW", [getPlayerUID player, _amount]]] call CFUNC(serverEvent); + + true + }; + case "TRANSFER::FUNDS": { + _data params ["_amount", "_toUid"]; + + if ((_amount <= 0) || {_toUid isEqualTo ""}) exitWith { systemChat "Invalid UID or amount, UID cannot be empty and amount must be greater than 0!"; false }; + + ["forge_server_bank_handleEvents", ["BANK::TRANSFER", [getPlayerUID player, _toUid, _amount]]] call CFUNC(serverEvent); + + true + }; + default { + diag_log format ["[FORGE::Client::Bank::XEH_postInit] Unhandled event: %1", _event]; + }; + }; +}] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/bank/config.cpp b/addons/bank/config.cpp index c3688dc..ceb0e29 100644 --- a/addons/bank/config.cpp +++ b/addons/bank/config.cpp @@ -15,4 +15,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "ui\BaseControls.hpp" -#include "ui\RscBankDialog.hpp" \ No newline at end of file +#include "ui\RscBankDialog.hpp" +#include "ui\RscWebBank.hpp" \ No newline at end of file diff --git a/addons/bank/functions/fnc_deposit.sqf b/addons/bank/functions/fnc_deposit.sqf index 61533f0..43bc4bb 100644 --- a/addons/bank/functions/fnc_deposit.sqf +++ b/addons/bank/functions/fnc_deposit.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_bank_fnc_deposit * Author: IDSolutions - * - * [Description] - * Deposits money into the bank + * Deposits money into the bank. * * Arguments: * None @@ -13,25 +10,27 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_bank_fnc_deposit; * * Public: Yes */ private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT); -private _bank = GETVAR(player,FORGE_Bank,0); -private _cash = GETVAR(player,FORGE_Cash,0); +private _uid = getPlayerUID player; -if (_amount > 0 && _amount <= _cash) then { - _cash = _cash - _amount; - _bank = _bank + _amount; +private _messageData = createHashMapFromArray [ + ["event", "DEPOSIT::FUNDS"], + ["data", createHashMapFromArray [ + ["amount", _amount], + ["uid", _uid] + ]] +]; - SETPVAR(player,FORGE_Bank,_bank); - SETPVAR(player,FORGE_Cash,_cash); +private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent); - [] call FUNC(refresh); - hint "Money deposited successfully"; +if (_response) then { + [format ["Deposited $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); } else { - hint "Invalid amount"; + [format ["Deposit failed"], "warning", 3, "right"] call EFUNC(misc,notify); }; \ No newline at end of file diff --git a/addons/bank/functions/fnc_openBank.sqf b/addons/bank/functions/fnc_openBank.sqf index bd9b3a4..4b083c9 100644 --- a/addons/bank/functions/fnc_openBank.sqf +++ b/addons/bank/functions/fnc_openBank.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_bank_fnc_openBank * Author: IDSolutions - * - * [Description] - * Opens the bank dialog + * Opens the bank dialog. * * Arguments: * None @@ -13,34 +10,51 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_bank_fnc_openBank; * * Public: Yes */ -private _bank = GETVAR(player,FORGE_Bank,0); -private _cash = GETVAR(player,FORGE_Cash,0); +private _productVersion = productVersion; +private _steamBranchName = _productVersion select 8; private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue); -private _plyscore = rating player; -private _pending = _plyscore * _payMultiplier; -disableSerialization; -createDialog "RscBankDialog"; +if (_steamBranchName == "profiling") then { + private _display = (findDisplay 46) createDisplay "RscWebBank"; + private _ctrl = _display displayCtrl 2025; -private _formattedBank = _bank call EFUNC(misc,formatNumber); -private _formattedCash = _cash call EFUNC(misc,formatNumber); -private _formattedPending = _pending call EFUNC(misc,formatNumber); + _ctrl ctrlAddEventHandler ["JSDialog", { + params ["_control", "_isConfirmDialog", "_message"]; + [QGVAR(handleEvents), [_control, _isConfirmDialog, _message]] call CFUNC(localEvent); + }]; -ctrlSetText [IDC_CASHTEXT, format ["Cash: $%1", _formattedCash]]; -ctrlSetText [IDC_BANKTEXT, format ["Bank: $%1", _formattedBank]]; -ctrlSetText [IDC_RATINGTEXT, format ["Pending: %1", _formattedPending]]; -ctrlSetText [IDC_TIMESHEETTEXT, "Ready for Timesheet"]; + _ctrl ctrlWebBrowserAction ["LoadFile", QUOTE(PATHTOF(ui\_site\index.html))]; + _ctrl ctrlWebBrowserAction ["OpenDevConsole"]; +} else { + disableSerialization; + createDialog "RscBankDialog"; -{ - lbAdd [IDC_PLAYERINPUT, name _x]; - lbSetData [IDC_PLAYERINPUT, _forEachIndex, netId _x]; -} forEach allPlayers; + private _uid = getPlayerUID player; + private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server + private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server + private _plyscore = rating player; + private _pending = _plyscore * _payMultiplier; -lbSetCurSel [IDC_PLAYERINPUT, 0]; -ctrlSetText [IDC_AMOUNTINPUT, ""]; \ No newline at end of file + private _formattedBank = _bank call EFUNC(misc,formatNumber); + private _formattedCash = _cash call EFUNC(misc,formatNumber); + private _formattedPending = _pending call EFUNC(misc,formatNumber); + + ctrlSetText [IDC_CASHTEXT, format ["Cash: $%1", _formattedCash]]; + ctrlSetText [IDC_BANKTEXT, format ["Bank: $%1", _formattedBank]]; + ctrlSetText [IDC_RATINGTEXT, format ["Pending: %1", _formattedPending]]; + ctrlSetText [IDC_TIMESHEETTEXT, "Ready for Timesheet"]; + + { + lbAdd [IDC_PLAYERINPUT, name _x]; + lbSetData [IDC_PLAYERINPUT, _forEachIndex, netId _x]; + } forEach allPlayers; + + lbSetCurSel [IDC_PLAYERINPUT, 0]; + ctrlSetText [IDC_AMOUNTINPUT, ""]; +}; \ No newline at end of file diff --git a/addons/bank/functions/fnc_refresh.sqf b/addons/bank/functions/fnc_refresh.sqf index 4771d3e..660e2c9 100644 --- a/addons/bank/functions/fnc_refresh.sqf +++ b/addons/bank/functions/fnc_refresh.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_bank_fnc_refresh * Author: IDSolutions - * - * [Description] - * Refreshes the bank dialog + * Refreshes the bank dialog. * * Arguments: * None @@ -13,14 +10,15 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_bank_fnc_refresh; * * Public: Yes */ -private _bank = GETVAR(player,FORGE_Bank,0); -private _cash = GETVAR(player,FORGE_Cash,0); +private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server +private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server + private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue); private _plyscore = rating player; private _pending = _plyscore * _payMultiplier; diff --git a/addons/bank/functions/fnc_submit.sqf b/addons/bank/functions/fnc_submit.sqf index dcdd9f0..07bcd79 100644 --- a/addons/bank/functions/fnc_submit.sqf +++ b/addons/bank/functions/fnc_submit.sqf @@ -19,9 +19,9 @@ * Public: Yes */ -private _bank = GETVAR(player,FORGE_Bank,0); +private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server private _payMultiplyer = "MULTIPLYR" call BFUNC(getParamValue); -private _plyscore = rating player; +private _plyscore = rating player; //TODO: Implement rating from server private _multiplyer = _plyscore * _payMultiplyer; _bank = _bank + _multiplyer; diff --git a/addons/bank/functions/fnc_transfer.sqf b/addons/bank/functions/fnc_transfer.sqf index 7280554..4a5218d 100644 --- a/addons/bank/functions/fnc_transfer.sqf +++ b/addons/bank/functions/fnc_transfer.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_bank_fnc_transfer * Author: IDSolutions - * - * [Description] - * Transfers money to a player + * Transfers money to a player. * * Arguments: * None @@ -13,8 +10,8 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_bank_fnc_transfer; * * Public: Yes */ @@ -22,23 +19,28 @@ private _display = findDisplay IDD_BANKDIALOG; private _input = _display displayCtrl IDC_AMOUNTINPUT; private _dropdown = _display displayCtrl IDC_PLAYERINPUT; + private _amount = parseNumber (ctrlText _input); private _selectedTarget = lbCurSel _dropdown; private _selectedTargetData = _dropdown lbData _selectedTarget; private _target = objectFromNetId _selectedTargetData; -private _bank = GETVAR(player,FORGE_Bank,0); -private _targetBank = GETVAR(_target,FORGE_Bank,0); +private _fromUid = getPlayerUID player; +private _toUid = getPlayerUID _target; -if (!isNull _target && _amount > 0 && _amount <= _bank) then { - _targetBank = _targetBank + _amount; - SETPVAR(_target,FORGE_Bank,_targetBank); +private _messageData = createHashMapFromArray [ + ["event", "TRANSFER::FUNDS"], + ["data", createHashMapFromArray [ + ["fromUid", _fromUid], + ["toUid", _toUid], + ["amount", _amount] + ]] +]; - _bank = _bank - _amount; - SETPVAR(player,FORGE_Bank,_bank); +private _response = [QGVAR(handleEvents), (toJSON _messageData)] call CFUNC(localEvent); - [] call FUNC(refresh); +if (_response) then { [format ["Transferred $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); } else { - [format ["Invalid transfer details"], "warning", 3, "right"] call EFUNC(misc,notify); + [format ["Transfer failed"], "warning", 3, "right"] call EFUNC(misc,notify); }; \ No newline at end of file diff --git a/addons/bank/functions/fnc_withdraw.sqf b/addons/bank/functions/fnc_withdraw.sqf index 4c1f341..d358ba1 100644 --- a/addons/bank/functions/fnc_withdraw.sqf +++ b/addons/bank/functions/fnc_withdraw.sqf @@ -1,11 +1,8 @@ #include "..\script_component.hpp" /* - * Function: forge_client_bank_fnc_withdraw * Author: IDSolutions - * - * [Description] - * Withdraws money from the bank + * Withdraws money from the bank. * * Arguments: * None @@ -13,8 +10,8 @@ * Return Value: * None * - * Examples: - * None + * Example: + * [] call forge_client_bank_fnc_withdraw; * * Public: Yes */ @@ -23,18 +20,17 @@ private _display = findDisplay IDD_BANKDIALOG; private _input = _display displayCtrl IDC_AMOUNTINPUT; private _amount = parseNumber (ctrlText _input); -private _bank = GETVAR(player,FORGE_Bank,0); -private _cash = GETVAR(player,FORGE_Cash,0); +private _messageData = createHashMapFromArray [ + ["event", "WITHDRAW::FUNDS"], + ["data", createHashMapFromArray [ + ["amount", _amount] + ]] +]; -if (_amount > 0 && _amount <= _bank) then { - _bank = _bank - _amount; - _cash = _cash + _amount; +private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent); - SETPVAR(player,FORGE_Bank,_bank); - SETPVAR(player,FORGE_Cash,_cash); - - [] call FUNC(refresh); - [format ["Money withdrawn successfully"], "info", 3, "right"] call EFUNC(misc,notify); +if (_response) then { + [format ["Withdrawn $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); } else { - [format ["Invalid amount"], "warning", 3, "right"] call EFUNC(misc,notify); + [format ["Withdrawal failed"], "warning", 3, "right"] call EFUNC(misc,notify); }; \ No newline at end of file diff --git a/addons/bank/stringtable.xml b/addons/bank/stringtable.xml index f34c6e8..0d64d40 100644 --- a/addons/bank/stringtable.xml +++ b/addons/bank/stringtable.xml @@ -4,9 +4,6 @@ Amount - - Close - Deposit diff --git a/addons/bank/ui/RscWebBank.hpp b/addons/bank/ui/RscWebBank.hpp new file mode 100644 index 0000000..929de85 --- /dev/null +++ b/addons/bank/ui/RscWebBank.hpp @@ -0,0 +1,17 @@ +class RscWebBank { + idd = 20250502; + fadein = 0; + fadeout = 0; + duration = 1e+011; + + class controls { + class Background: RscText { + type = 106; + idc = 2025; + x = "safeZoneY * (pixelW/pixelH) * 2.975"; + y = "safeZoneY + (safeZoneH * 0.05)"; + w = "safeZoneW * (pixelW/pixelH) * 1.17"; + h = "safeZoneH * 0.875"; + }; + }; +}; \ No newline at end of file diff --git a/addons/bank/ui/_site/index.html b/addons/bank/ui/_site/index.html index 4efce4b..a598662 100644 --- a/addons/bank/ui/_site/index.html +++ b/addons/bank/ui/_site/index.html @@ -1,14 +1,32 @@ - - - FORGE - FDIC - - - - - + +
@@ -16,7 +34,6 @@

Federal Deposit Insurance Corporation

-
💰
Wallet Balance $0 @@ -24,7 +41,6 @@
-
🏦
Account Balance $0 @@ -35,57 +51,52 @@
-
+
+

Transfer Money

-
-
- - -
-
- - -
- -
+
+ + +
+
+ + +
+

Transfer to Player

-
-
- - -
-
- - -
- -
+
+ + +
+
+ + +
+

Submit Timesheet

-
-
- - -
-
- - -
- -
+
+ + +
+
+ + +
+
diff --git a/addons/bank/ui/_site/script.js b/addons/bank/ui/_site/script.js index 21d9dcd..84d92e5 100644 --- a/addons/bank/ui/_site/script.js +++ b/addons/bank/ui/_site/script.js @@ -1,79 +1,212 @@ -// Simulated data - this would be replaced with actual game data +/** + * Bank Management Script + * This script handles the bank interface functionality for the Arma 3 game interface. + * It provides wallet/account management, transfers, and transaction history. + */ + +//============================================================================= +// #region DATA STRUCTURES AND VARIABLES +//============================================================================= + +/** + * Bank state - will be populated from game events + */ let bankState = { - wallet: 1000, - account: 5000, - players: [ - { id: 1, name: "Player 1" }, - { id: 2, name: "Player 2" }, - { id: 3, name: "Player 3" } - ], + wallet: 0, + account: 0, + players: [], transactions: [] }; -// Initialize the interface +//============================================================================= +// #region INITIALIZATION AND DATA REQUESTS +//============================================================================= + +/** + * Initialize the bank interface + * Sets up the UI and requests initial data from the game engine + */ function initializeBank() { - updateBalanceDisplays(); + // Request initial data from the game + requestPlayerFunds(); + requestPlayerData(); + requestTransactionHistory(); +} + +/** + * Request player funds data from the game engine + */ +function requestPlayerFunds() { + const message = { + event: "REQUEST::PLAYER::FUNDS", + data: {} + }; + + A3API.SendAlert(JSON.stringify(message)); +} + +/** + * Request player data from the game engine + */ +function requestPlayerData() { + const message = { + event: "REQUEST::PLAYER::DATA", + data: {} + }; + + A3API.SendAlert(JSON.stringify(message)); +} + +/** + * Request transaction history from the game engine + */ +function requestTransactionHistory() { + const message = { + event: "REQUEST::TRANSACTION::HISTORY", + data: {} + }; + + A3API.SendAlert(JSON.stringify(message)); +} + +//============================================================================= +// #region DATA HANDLERS +//============================================================================= + +/** + * Handle player data received from the game engine + * @param {Array} data - List of player objects + */ +function handlePlayerDataRequest(data) { + bankState.players = data; populatePlayerList(); - setupEventListeners(); - loadTransactionHistory(); } -// Update balance displays in the header +/** + * Handle player funds data received from the game engine + * @param {Object} data - Object containing cash and balance + */ +function handlePlayerFundsRequest(data) { + console.log('Received funds data:', data); + + // Parse the data if it's a string + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { + console.error('Failed to parse data:', e); + return; + } + } + + // Ensure we have valid numbers, default to 0 if null + bankState.wallet = data.cash !== null ? Number(data.cash) : 0; + bankState.account = data.balance !== null ? Number(data.balance) : 0; + updateBalanceDisplays(); +} + +/** + * Handle transaction history data received from the game engine + * @param {Object} data - Object containing transaction history + */ +function handleTransactionHistoryRequest(data) { + console.log('Received transaction history:', data); + + // Parse the data if it's a string + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { + console.error('Failed to parse transaction history:', e); + return; + } + } + + // Initialize empty array if history is null + bankState.transactions = []; + updateTransactionHistory(); +} + +//============================================================================= +// #region UI UPDATES AND DISPLAY +//============================================================================= + +/** + * Update balance displays in the header + */ function updateBalanceDisplays() { - document.getElementById('walletBalance').textContent = `$${bankState.wallet.toLocaleString()}`; - document.getElementById('accountBalance').textContent = `$${bankState.account.toLocaleString()}`; + const walletElement = document.getElementById('walletBalance'); + const accountElement = document.getElementById('accountBalance'); + + if (walletElement && accountElement) { + walletElement.textContent = `$${(bankState.wallet || 0).toLocaleString()}`; + accountElement.textContent = `$${(bankState.account || 0).toLocaleString()}`; + } } -// Populate the player selection dropdown +/** + * Populate the player selection dropdown + */ function populatePlayerList() { const playerSelect = document.getElementById('playerSelect'); playerSelect.innerHTML = ''; bankState.players.forEach(player => { const option = document.createElement('option'); - option.value = player.id; + option.value = player.uid; option.textContent = player.name; playerSelect.appendChild(option); }); } -// Add a new transaction to history -function addTransaction(type, amount, details = '') { - const transaction = { - type, - amount, - details, - timestamp: new Date().toISOString() - }; - - bankState.transactions.unshift(transaction); - updateTransactionHistory(); -} - -// Update the transaction history display +/** + * Update the transaction history display + */ function updateTransactionHistory() { const historyList = document.getElementById('transactionHistory'); + if (!historyList) return; + historyList.innerHTML = ''; + if (!Array.isArray(bankState.transactions)) { + console.error('Transaction history is not an array:', bankState.transactions); + return; + } + + if (bankState.transactions.length === 0) { + const li = document.createElement('li'); + li.className = 'history-item empty'; + li.textContent = 'No transactions yet'; + historyList.appendChild(li); + return; + } + bankState.transactions.forEach(transaction => { + if (!transaction) return; + const li = document.createElement('li'); li.className = 'history-item'; const isNegative = ['transfer_out', 'to_wallet'].includes(transaction.type); const amountClass = isNegative ? 'amount-negative' : 'amount-positive'; const amountPrefix = isNegative ? '-' : '+'; + const amount = Math.abs(Number(transaction.amount) || 0); li.innerHTML = ` ${formatTransactionType(transaction.type)} - ${transaction.details} - ${amountPrefix}$${Math.abs(transaction.amount).toLocaleString()} + ${transaction.details || ''} + ${amountPrefix}$${amount.toLocaleString()} `; historyList.appendChild(li); }); } -// Format transaction type for display +/** + * Format transaction type for display + * @param {string} type - Transaction type code + * @returns {string} Formatted transaction type + */ function formatTransactionType(type) { const types = { 'to_wallet': 'To Wallet', @@ -85,63 +218,94 @@ function formatTransactionType(type) { return types[type] || type; } -// Set up all form event listeners -function setupEventListeners() { // Handle transfers between wallet and account - document.getElementById('transferForm').addEventListener('submit', (e) => { - e.preventDefault(); - const amount = parseInt(document.getElementById('transferAmount').value); - const transferType = document.getElementById('transferType').value; - - if (transferType === 'to_wallet') { - if (amount > bankState.account) { - alert('Insufficient funds in account'); - return; - } - bankState.account -= amount; - bankState.wallet += amount; - } else { - if (amount > bankState.wallet) { - alert('Insufficient funds in wallet'); - return; - } - bankState.wallet -= amount; - bankState.account += amount; +//============================================================================= +// #region ACTION HANDLERS +//============================================================================= + +/** + * Handle transfer between wallet and account + */ +function handleTransfer() { + const amount = parseInt(document.getElementById('transferAmount').value); + const transferType = document.getElementById('transferType').value; + + if (amount <= 0) { + alert('Amount must be greater than 0'); + return; + } + + const event = transferType === 'to_wallet' ? 'WITHDRAW::FUNDS' : 'DEPOSIT::FUNDS'; + + const message = { + event: event, + data: { + amount: amount } - - addTransaction(transferType, amount); - updateBalanceDisplays(); - e.target.reset(); - }); // Transfer to Player - document.getElementById('transferPlayerForm').addEventListener('submit', (e) => { - e.preventDefault(); - const amount = parseInt(document.getElementById('playerTransferAmount').value); - const playerId = document.getElementById('playerSelect').value; - const playerName = bankState.players.find(p => p.id.toString() === playerId)?.name; - - if (amount > bankState.account) { - alert('Insufficient funds in account'); - return; - } - - bankState.account -= amount; - addTransaction('transfer_out', amount, `To ${playerName}`); - updateBalanceDisplays(); - e.target.reset(); - }); - - // Submit Timesheet - document.getElementById('timesheetForm').addEventListener('submit', (e) => { - e.preventDefault(); - const hours = parseFloat(document.getElementById('hoursWorked').value); - const rate = parseInt(document.getElementById('hourlyRate').value); - const amount = Math.floor(hours * rate); - - bankState.account += amount; - addTransaction('timesheet', amount, `${hours} hours @ $${rate}/hr`); - updateBalanceDisplays(); - e.target.reset(); - }); + }; + + A3API.SendAlert(JSON.stringify(message)); + document.getElementById('transferAmount').value = ''; } -// Initialize when DOM is loaded +/** + * Handle transfer to another player + */ +function handlePlayerTransfer() { + const amount = parseInt(document.getElementById('playerTransferAmount').value); + const playerUid = document.getElementById('playerSelect').value; + + if (amount <= 0) { + alert('Amount must be greater than 0'); + return; + } + + if (!playerUid) { + alert('Please select a player'); + return; + } + + const message = { + event: 'TRANSFER::FUNDS', + data: { + amount: amount, + uid: playerUid + } + }; + + A3API.SendAlert(JSON.stringify(message)); + document.getElementById('playerTransferAmount').value = ''; +} + +/** + * Handle timesheet submission + */ +function handleTimesheet() { + const hours = parseFloat(document.getElementById('hoursWorked').value); + const rate = parseInt(document.getElementById('hourlyRate').value); + const amount = Math.floor(hours * rate); + + if (amount <= 0) { + alert('Invalid timesheet amount'); + return; + } + + const message = { + event: 'DEPOSIT::FUNDS', + data: { + amount: amount + } + }; + + A3API.SendAlert(JSON.stringify(message)); + document.getElementById('hoursWorked').value = ''; + document.getElementById('hourlyRate').value = ''; +} + +//============================================================================= +// #region INITIALIZATION +//============================================================================= + +/** + * Initialize when DOM is loaded + */ document.addEventListener('DOMContentLoaded', initializeBank); diff --git a/addons/garage/XEH_postInit.sqf b/addons/garage/XEH_postInit.sqf index 09242f7..84f2529 100644 --- a/addons/garage/XEH_postInit.sqf +++ b/addons/garage/XEH_postInit.sqf @@ -1,48 +1 @@ -#include "script_component.hpp" - -[QGVAR(handleEvents), { - params ["_control", "_isConfirmDialog", "_message"]; - - diag_log format ["[FORGE: Garage] Received event: %1", _message]; - - _message = fromJSON _message; - private _event = _message get "event"; - private _data = _message get "data"; - - private _vehicles = GETVAR(player,FORGE_Garage,[]); - - switch (_event) do { - case "REQUEST_GARAGE_DATA": { - private _garageData = createHashMap; - private _vehicleList = []; - - { - private _vehicle = _x; - if (isNull _vehicle || { !alive _vehicle }) exitWith {}; - - private _vehicleInfo = createHashMapFromArray [ - ["classname", typeOf _vehicle], - ["damage", damage _vehicle], - ["fuel", fuel _vehicle], - ["hitpoints", getAllHitPointsDamage _vehicle] - ]; - - _vehicleList pushBack _vehicleInfo; - } forEach _vehicles; - - _garageData set ["vehicles", _vehicleList]; - _control ctrlWebBrowserAction ["ExecJS", format ["handleGarageDataRequest(%1)", (toJSON _vehicleList)]]; - }; - case "STORE_VEHICLE": { - // Logic to store vehicle in garage - // This would typically involve saving the vehicle's state to a database or similar - }; - case "RETRIEVE_VEHICLE": { - // Logic to retrieve vehicle from garage - // This would typically involve loading the vehicle's state from a database or similar - }; - default { - diag_log format ["[FORGE: Garage] Unknown event: %1", _event]; - }; - }; -}] call CFUNC(addEventHandler); \ No newline at end of file +#include "script_component.hpp" \ No newline at end of file diff --git a/addons/garage/XEH_postInit_client.sqf b/addons/garage/XEH_postInit_client.sqf index 84f2529..3b10687 100644 --- a/addons/garage/XEH_postInit_client.sqf +++ b/addons/garage/XEH_postInit_client.sqf @@ -1 +1,48 @@ -#include "script_component.hpp" \ No newline at end of file +#include "script_component.hpp" + +[QGVAR(handleEvents), { + params ["_control", "_isConfirmDialog", "_message"]; + + diag_log text format ["[FORGE::Client::Garage::XEH_postInit] Received event: '%1'", _message]; + + _message = fromJSON _message; + private _event = _message get "event"; + private _data = _message get "data"; + + private _vehicles = GETVAR(player,FORGE_Garage,[]); //TODO: Implement garage from server + + switch (_event) do { + case "REQUEST::GARAGE::DATA": { + private _garageData = createHashMap; + private _vehicleList = []; + + { + private _vehicle = _x; + if (isNull _vehicle || { !alive _vehicle }) exitWith {}; + + private _vehicleInfo = createHashMapFromArray [ + ["classname", typeOf _vehicle], + ["damage", damage _vehicle], + ["fuel", fuel _vehicle], + ["hitpoints", getAllHitPointsDamage _vehicle] + ]; + + _vehicleList pushBack _vehicleInfo; + } forEach _vehicles; + + _garageData set ["vehicles", _vehicleList]; + _control ctrlWebBrowserAction ["ExecJS", format ["handleGarageDataRequest(%1)", (toJSON _vehicleList)]]; + }; + case "STORE::VEHICLE": { + // Logic to store vehicle in garage + // This would typically involve saving the vehicle's state to a database or similar + }; + case "RETRIEVE::VEHICLE": { + // Logic to retrieve vehicle from garage + // This would typically involve loading the vehicle's state from a database or similar + }; + default { + diag_log text format ["[FORGE::Client::Garage::XEH_postInit] Unknown event: '%1'", _event]; + }; + }; +}] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/garage/stringtable.xml b/addons/garage/stringtable.xml index 34a9773..3217e23 100644 --- a/addons/garage/stringtable.xml +++ b/addons/garage/stringtable.xml @@ -1,9 +1,6 @@ - - Close - Garage diff --git a/addons/init/functions/fnc_handlePlayerLoad.sqf b/addons/init/functions/fnc_handlePlayerLoad.sqf index 5f63cd0..ec05cf3 100644 --- a/addons/init/functions/fnc_handlePlayerLoad.sqf +++ b/addons/init/functions/fnc_handlePlayerLoad.sqf @@ -1,19 +1,16 @@ #include "..\script_component.hpp" /* - * Function: forge_client_init_fnc_handlePlayerLoad * Author: IDSolutions - * - * [Description] * Handle player load from DB. * * Arguments: - * 0: Data from key [] (default: []) + * 0: Data from key (default: []) * * Return Value: - * N/A + * None * - * Examples: + * Example: * [[_data]] call forge_client_init_fnc_handlePlayerLoad (Server or Singleplayer Only) * [[_data]] remoteExecCall ["forge_client_init_fnc_handlePlayerLoad", 2, false] (Multiplayer Only) * diff --git a/addons/locker/stringtable.xml b/addons/locker/stringtable.xml index facaae3..ccba9a3 100644 --- a/addons/locker/stringtable.xml +++ b/addons/locker/stringtable.xml @@ -1,9 +1,6 @@ - - Close - Equip diff --git a/addons/store/stringtable.xml b/addons/store/stringtable.xml index 3f5d96d..2c09f42 100644 --- a/addons/store/stringtable.xml +++ b/addons/store/stringtable.xml @@ -7,9 +7,6 @@ FILTER BY CATEGORY - - Close - Store