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