Compare commits

...

2 Commits

Author SHA1 Message Date
Jacob Schmidt
0ed1bc3a19 Merge branch 'master' of https://gitea.innovativedevsolutions.org/IDSolutions/client
All checks were successful
Build / Build (push) Successful in 26s
2025-05-10 17:50:36 -05:00
Jacob Schmidt
90476345db 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.
2025-05-10 17:50:11 -05:00
29 changed files with 683 additions and 448 deletions

View File

@ -1,6 +1,5 @@
PREP(adminRefresh); PREP(adminRefresh);
PREP(handleTransfer); PREP(handleTransfer);
PREP(initAdmin);
PREP(openAdmin); PREP(openAdmin);
PREP(sendMessage); PREP(sendMessage);
PREP(updatePaygrade); PREP(updatePaygrade);

View File

@ -1,96 +1 @@
#include "script_component.hpp" #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);

View File

@ -1 +1,93 @@
#include "script_component.hpp" #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);

View File

@ -33,8 +33,8 @@ private _index = lbCurSel _list;
private _uid = _list lbData _index; private _uid = _list lbData _index;
private _amount = round (parseNumber (ctrlText 2023005)); 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, ""]; ctrlSetText [2023005, ""];

View File

@ -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"));

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_admin_fnc_openAdmin
* Author: IDSolutions * Author: IDSolutions
* * Opens the admin dialog.
* [Description]
* Opens the admin menu.
* *
* Arguments: * Arguments:
* None * None
@ -13,8 +10,8 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_admin_fnc_openAdmin;
* *
* Public: Yes * Public: Yes
*/ */

View File

@ -30,8 +30,6 @@ private _message = ctrlText _control;
if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; }; if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!"; };
["forge_server_admin_handleEvents", ["sendMessage", [_uid, _message]]] call CFUNC(serverEvent); ["forge_server_admin_handleEvents", ["ADMIN::SEND::MESSAGE", [_uid, _message]]] call CFUNC(serverEvent);
hintSilent format ["Message sent to UID %1: %2", _uid, _message];
["dummy"] call FUNC(adminRefresh); ["dummy"] call FUNC(adminRefresh);

View File

@ -32,6 +32,6 @@ private _paygrade = _rankData select 0;
if ((isNil "_uid") || {_uid isEqualTo ""}) exitWith { hintSilent "You did not select a player!" }; 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); ["dummy"] call FUNC(adminRefresh);

View File

@ -46,7 +46,7 @@ function initializeAdmin() {
*/ */
function requestPlayerData() { function requestPlayerData() {
const message = { const message = {
event: "REQUEST_PLAYER_DATA", event: "REQUEST::PLAYER::DATA",
data: {} data: {}
}; };
@ -60,7 +60,7 @@ function requestPlayerData() {
*/ */
function requestPaygradeData() { function requestPaygradeData() {
const message = { const message = {
event: "REQUEST_PAYGRADE_DATA", event: "REQUEST::PAYGRADE::DATA",
data: {} data: {}
}; };
@ -286,7 +286,7 @@ function updatePaygrade(uid, isPromotion) {
} }
const message = { const message = {
event: "UPDATE_PAYGRADE", event: "UPDATE::PAYGRADE",
data: [uid, newPaygrade] data: [uid, newPaygrade]
}; };
@ -341,7 +341,7 @@ function giveMoney() {
function giveAllMoney() { function giveAllMoney() {
const amount = parseInt(document.getElementById('giveAllAmount').value); const amount = parseInt(document.getElementById('giveAllAmount').value);
const message = { const message = {
event: "ADVANCE_ALL", event: "ADVANCE::ALL",
data: [amount] data: [amount]
} }
@ -371,7 +371,7 @@ function takeMoney() {
*/ */
function handleTransferFunds(condition, amount, uid) { function handleTransferFunds(condition, amount, uid) {
const message = { const message = {
event: "HANDLE_TRANSFER", event: "HANDLE::TRANSFER",
data: [condition, amount, uid] data: [condition, amount, uid]
}; };
@ -425,7 +425,7 @@ function sendPlayerMessage() {
const message = document.getElementById('messageInput').value; const message = document.getElementById('messageInput').value;
if (message && selectedPlayerId) { if (message && selectedPlayerId) {
const messageData = { const messageData = {
event: "SEND_MESSAGE", event: "SEND::MESSAGE",
data: [selectedPlayerId, message] data: [selectedPlayerId, message]
}; };
@ -441,7 +441,7 @@ function broadcastMessage() {
const message = document.getElementById('broadcastMessage').value; const message = document.getElementById('broadcastMessage').value;
if (message) { if (message) {
const messageData = { const messageData = {
event: "BROADCAST_MESSAGE", event: "BROADCAST::MESSAGE",
data: ["", message] data: ["", message]
}; };
@ -461,7 +461,7 @@ function broadcastMessage() {
*/ */
function Payday() { function Payday() {
const message = { const message = {
event: "HANDLE_PAYDAY", event: "HANDLE::PAYDAY",
data: [] data: []
}; };

View File

@ -1,5 +1,4 @@
PREP(deposit); PREP(deposit);
PREP(initBank);
PREP(openBank); PREP(openBank);
PREP(refresh); PREP(refresh);
PREP(submit); PREP(submit);

View File

@ -1 +1,11 @@
#include "script_component.hpp" #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);

View File

@ -1 +1,86 @@
#include "script_component.hpp" #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);

View File

@ -15,4 +15,5 @@ class CfgPatches {
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "ui\BaseControls.hpp" #include "ui\BaseControls.hpp"
#include "ui\RscBankDialog.hpp" #include "ui\RscBankDialog.hpp"
#include "ui\RscWebBank.hpp"

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_bank_fnc_deposit
* Author: IDSolutions * Author: IDSolutions
* * Deposits money into the bank.
* [Description]
* Deposits money into the bank
* *
* Arguments: * Arguments:
* None * None
@ -13,25 +10,27 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_bank_fnc_deposit;
* *
* Public: Yes * Public: Yes
*/ */
private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT); private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT);
private _bank = GETVAR(player,FORGE_Bank,0); private _uid = getPlayerUID player;
private _cash = GETVAR(player,FORGE_Cash,0);
if (_amount > 0 && _amount <= _cash) then { private _messageData = createHashMapFromArray [
_cash = _cash - _amount; ["event", "DEPOSIT::FUNDS"],
_bank = _bank + _amount; ["data", createHashMapFromArray [
["amount", _amount],
["uid", _uid]
]]
];
SETPVAR(player,FORGE_Bank,_bank); private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent);
SETPVAR(player,FORGE_Cash,_cash);
[] call FUNC(refresh); if (_response) then {
hint "Money deposited successfully"; [format ["Deposited $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify);
} else { } else {
hint "Invalid amount"; [format ["Deposit failed"], "warning", 3, "right"] call EFUNC(misc,notify);
}; };

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_bank_fnc_openBank
* Author: IDSolutions * Author: IDSolutions
* * Opens the bank dialog.
* [Description]
* Opens the bank dialog
* *
* Arguments: * Arguments:
* None * None
@ -13,34 +10,51 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_bank_fnc_openBank;
* *
* Public: Yes * Public: Yes
*/ */
private _bank = GETVAR(player,FORGE_Bank,0); private _productVersion = productVersion;
private _cash = GETVAR(player,FORGE_Cash,0); private _steamBranchName = _productVersion select 8;
private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue); private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue);
private _plyscore = rating player;
private _pending = _plyscore * _payMultiplier;
disableSerialization; if (_steamBranchName == "profiling") then {
createDialog "RscBankDialog"; private _display = (findDisplay 46) createDisplay "RscWebBank";
private _ctrl = _display displayCtrl 2025;
private _formattedBank = _bank call EFUNC(misc,formatNumber); _ctrl ctrlAddEventHandler ["JSDialog", {
private _formattedCash = _cash call EFUNC(misc,formatNumber); params ["_control", "_isConfirmDialog", "_message"];
private _formattedPending = _pending call EFUNC(misc,formatNumber); [QGVAR(handleEvents), [_control, _isConfirmDialog, _message]] call CFUNC(localEvent);
}];
ctrlSetText [IDC_CASHTEXT, format ["Cash: $%1", _formattedCash]]; _ctrl ctrlWebBrowserAction ["LoadFile", QUOTE(PATHTOF(ui\_site\index.html))];
ctrlSetText [IDC_BANKTEXT, format ["Bank: $%1", _formattedBank]]; _ctrl ctrlWebBrowserAction ["OpenDevConsole"];
ctrlSetText [IDC_RATINGTEXT, format ["Pending: %1", _formattedPending]]; } else {
ctrlSetText [IDC_TIMESHEETTEXT, "Ready for Timesheet"]; disableSerialization;
createDialog "RscBankDialog";
{ private _uid = getPlayerUID player;
lbAdd [IDC_PLAYERINPUT, name _x]; private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server
lbSetData [IDC_PLAYERINPUT, _forEachIndex, netId _x]; private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server
} forEach allPlayers; private _plyscore = rating player;
private _pending = _plyscore * _payMultiplier;
lbSetCurSel [IDC_PLAYERINPUT, 0]; private _formattedBank = _bank call EFUNC(misc,formatNumber);
ctrlSetText [IDC_AMOUNTINPUT, ""]; 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, ""];
};

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_bank_fnc_refresh
* Author: IDSolutions * Author: IDSolutions
* * Refreshes the bank dialog.
* [Description]
* Refreshes the bank dialog
* *
* Arguments: * Arguments:
* None * None
@ -13,14 +10,15 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_bank_fnc_refresh;
* *
* Public: Yes * Public: Yes
*/ */
private _bank = GETVAR(player,FORGE_Bank,0); private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server
private _cash = GETVAR(player,FORGE_Cash,0); private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server
private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue); private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue);
private _plyscore = rating player; private _plyscore = rating player;
private _pending = _plyscore * _payMultiplier; private _pending = _plyscore * _payMultiplier;

View File

@ -19,9 +19,9 @@
* Public: Yes * 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 _payMultiplyer = "MULTIPLYR" call BFUNC(getParamValue);
private _plyscore = rating player; private _plyscore = rating player; //TODO: Implement rating from server
private _multiplyer = _plyscore * _payMultiplyer; private _multiplyer = _plyscore * _payMultiplyer;
_bank = _bank + _multiplyer; _bank = _bank + _multiplyer;

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_bank_fnc_transfer
* Author: IDSolutions * Author: IDSolutions
* * Transfers money to a player.
* [Description]
* Transfers money to a player
* *
* Arguments: * Arguments:
* None * None
@ -13,8 +10,8 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_bank_fnc_transfer;
* *
* Public: Yes * Public: Yes
*/ */
@ -22,23 +19,28 @@
private _display = findDisplay IDD_BANKDIALOG; private _display = findDisplay IDD_BANKDIALOG;
private _input = _display displayCtrl IDC_AMOUNTINPUT; private _input = _display displayCtrl IDC_AMOUNTINPUT;
private _dropdown = _display displayCtrl IDC_PLAYERINPUT; private _dropdown = _display displayCtrl IDC_PLAYERINPUT;
private _amount = parseNumber (ctrlText _input); private _amount = parseNumber (ctrlText _input);
private _selectedTarget = lbCurSel _dropdown; private _selectedTarget = lbCurSel _dropdown;
private _selectedTargetData = _dropdown lbData _selectedTarget; private _selectedTargetData = _dropdown lbData _selectedTarget;
private _target = objectFromNetId _selectedTargetData; private _target = objectFromNetId _selectedTargetData;
private _bank = GETVAR(player,FORGE_Bank,0); private _fromUid = getPlayerUID player;
private _targetBank = GETVAR(_target,FORGE_Bank,0); private _toUid = getPlayerUID _target;
if (!isNull _target && _amount > 0 && _amount <= _bank) then { private _messageData = createHashMapFromArray [
_targetBank = _targetBank + _amount; ["event", "TRANSFER::FUNDS"],
SETPVAR(_target,FORGE_Bank,_targetBank); ["data", createHashMapFromArray [
["fromUid", _fromUid],
["toUid", _toUid],
["amount", _amount]
]]
];
_bank = _bank - _amount; private _response = [QGVAR(handleEvents), (toJSON _messageData)] call CFUNC(localEvent);
SETPVAR(player,FORGE_Bank,_bank);
[] call FUNC(refresh); if (_response) then {
[format ["Transferred $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); [format ["Transferred $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify);
} else { } else {
[format ["Invalid transfer details"], "warning", 3, "right"] call EFUNC(misc,notify); [format ["Transfer failed"], "warning", 3, "right"] call EFUNC(misc,notify);
}; };

View File

@ -1,11 +1,8 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_bank_fnc_withdraw
* Author: IDSolutions * Author: IDSolutions
* * Withdraws money from the bank.
* [Description]
* Withdraws money from the bank
* *
* Arguments: * Arguments:
* None * None
@ -13,8 +10,8 @@
* Return Value: * Return Value:
* None * None
* *
* Examples: * Example:
* None * [] call forge_client_bank_fnc_withdraw;
* *
* Public: Yes * Public: Yes
*/ */
@ -23,18 +20,17 @@ private _display = findDisplay IDD_BANKDIALOG;
private _input = _display displayCtrl IDC_AMOUNTINPUT; private _input = _display displayCtrl IDC_AMOUNTINPUT;
private _amount = parseNumber (ctrlText _input); private _amount = parseNumber (ctrlText _input);
private _bank = GETVAR(player,FORGE_Bank,0); private _messageData = createHashMapFromArray [
private _cash = GETVAR(player,FORGE_Cash,0); ["event", "WITHDRAW::FUNDS"],
["data", createHashMapFromArray [
["amount", _amount]
]]
];
if (_amount > 0 && _amount <= _bank) then { private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent);
_bank = _bank - _amount;
_cash = _cash + _amount;
SETPVAR(player,FORGE_Bank,_bank); if (_response) then {
SETPVAR(player,FORGE_Cash,_cash); [format ["Withdrawn $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify);
[] call FUNC(refresh);
[format ["Money withdrawn successfully"], "info", 3, "right"] call EFUNC(misc,notify);
} else { } else {
[format ["Invalid amount"], "warning", 3, "right"] call EFUNC(misc,notify); [format ["Withdrawal failed"], "warning", 3, "right"] call EFUNC(misc,notify);
}; };

View File

@ -4,9 +4,6 @@
<Key ID="STR_forge_client_bank_Amount"> <Key ID="STR_forge_client_bank_Amount">
<English>Amount</English> <English>Amount</English>
</Key> </Key>
<Key ID="STR_forge_client_bank_Close">
<English>Close</English>
</Key>
<Key ID="STR_forge_client_bank_Deposit"> <Key ID="STR_forge_client_bank_Deposit">
<English>Deposit</English> <English>Deposit</English>
</Key> </Key>

View File

@ -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";
};
};
};

View File

@ -1,14 +1,32 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <!--
<meta name="viewport" content="width=device-width, initial-scale=1.0"> Dynamic Resource Loading
<title>FORGE - FDIC</title> The following script loads CSS and JavaScript files dynamically using the A3API
<link rel="preconnect" href="https://fonts.googleapis.com"> This approach is used instead of static HTML imports to work with Arma 3's file system
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"> <script>
<link rel="stylesheet" href="styles.css"> Promise.all([
<script src="script.js" defer></script> // Load CSS file
A3API.RequestFile("z\\forge_client\\addons\\bank\\ui\\_site\\styles.css"),
// Load JavaScript file
A3API.RequestFile("z\\forge_client\\addons\\bank\\ui\\_site\\script.js")
]).then(([css, js]) => {
// Apply CSS
const style = document.createElement('style');
style.textContent = css;
document.head.appendChild(style);
// Load and execute JavaScript
const script = document.createElement('script');
script.text = js;
document.head.appendChild(script);
// Initialize the bank interface
initializeBank();
});
</script>
</head> </head>
<body> <body>
<header> <header>
@ -16,7 +34,6 @@
<h1>Federal Deposit Insurance Corporation</h1> <h1>Federal Deposit Insurance Corporation</h1>
<div class="balance-display"> <div class="balance-display">
<div class="balance-item"> <div class="balance-item">
<div class="balance-icon">💰</div>
<div class="balance-info"> <div class="balance-info">
<span class="balance-label">Wallet Balance</span> <span class="balance-label">Wallet Balance</span>
<span class="balance-amount" id="walletBalance">$0</span> <span class="balance-amount" id="walletBalance">$0</span>
@ -24,7 +41,6 @@
</div> </div>
<div class="balance-divider"></div> <div class="balance-divider"></div>
<div class="balance-item"> <div class="balance-item">
<div class="balance-icon">🏦</div>
<div class="balance-info"> <div class="balance-info">
<span class="balance-label">Account Balance</span> <span class="balance-label">Account Balance</span>
<span class="balance-amount" id="accountBalance">$0</span> <span class="balance-amount" id="accountBalance">$0</span>
@ -35,57 +51,52 @@
</header> </header>
<main class="container"> <main class="container">
<div class="actions-grid"> <!-- Transfer Between Accounts --> <div class="actions-grid">
<!-- Transfer Between Accounts -->
<div class="action-tile"> <div class="action-tile">
<h2>Transfer Money</h2> <h2>Transfer Money</h2>
<form id="transferForm"> <div class="form-group">
<div class="form-group"> <label for="transferType">Transfer From</label>
<label for="transferType">Transfer From</label> <select id="transferType" required>
<select id="transferType" required> <option value="to_wallet">Account to Wallet</option>
<option value="to_wallet">Account to Wallet</option> <option value="to_account">Wallet to Account</option>
<option value="to_account">Wallet to Account</option> </select>
</select> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="transferAmount">Amount</label>
<label for="transferAmount">Amount</label> <input type="number" id="transferAmount" min="1" step="1" required>
<input type="number" id="transferAmount" min="1" step="1" required> </div>
</div> <button type="button" class="submit-btn" onclick="handleTransfer()">Transfer</button>
<button type="submit" class="submit-btn">Transfer</button>
</form>
</div> </div>
<!-- Transfer to Player --> <!-- Transfer to Player -->
<div class="action-tile"> <div class="action-tile">
<h2>Transfer to Player</h2> <h2>Transfer to Player</h2>
<form id="transferPlayerForm"> <div class="form-group">
<div class="form-group"> <label for="playerSelect">Player</label>
<label for="playerSelect">Player</label> <select id="playerSelect" required>
<select id="playerSelect" required> <option value="" disabled selected>Select Player</option>
<option value="" disabled selected>Select Player</option> </select>
</select> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="playerTransferAmount">Amount</label>
<label for="playerTransferAmount">Amount</label> <input type="number" id="playerTransferAmount" min="1" step="1" required>
<input type="number" id="playerTransferAmount" min="1" step="1" required> </div>
</div> <button type="button" class="submit-btn" onclick="handlePlayerTransfer()">Send Money</button>
<button type="submit" class="submit-btn">Send Money</button>
</form>
</div> </div>
<!-- Submit Timesheet --> <!-- Submit Timesheet -->
<div class="action-tile"> <div class="action-tile">
<h2>Submit Timesheet</h2> <h2>Submit Timesheet</h2>
<form id="timesheetForm"> <div class="form-group">
<div class="form-group"> <label for="hoursWorked">Hours Worked</label>
<label for="hoursWorked">Hours Worked</label> <input type="number" id="hoursWorked" min="1" step="0.5" required>
<input type="number" id="hoursWorked" min="1" step="0.5" required> </div>
</div> <div class="form-group">
<div class="form-group"> <label for="hourlyRate">Hourly Rate</label>
<label for="hourlyRate">Hourly Rate</label> <input type="number" id="hourlyRate" min="1" step="1" required>
<input type="number" id="hourlyRate" min="1" step="1" required> </div>
</div> <button type="button" class="submit-btn" onclick="handleTimesheet()">Submit Timesheet</button>
<button type="submit" class="submit-btn">Submit Timesheet</button>
</form>
</div> </div>
</div> </div>

View File

@ -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 = { let bankState = {
wallet: 1000, wallet: 0,
account: 5000, account: 0,
players: [ players: [],
{ id: 1, name: "Player 1" },
{ id: 2, name: "Player 2" },
{ id: 3, name: "Player 3" }
],
transactions: [] 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() { 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(); 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() { function updateBalanceDisplays() {
document.getElementById('walletBalance').textContent = `$${bankState.wallet.toLocaleString()}`; const walletElement = document.getElementById('walletBalance');
document.getElementById('accountBalance').textContent = `$${bankState.account.toLocaleString()}`; 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() { function populatePlayerList() {
const playerSelect = document.getElementById('playerSelect'); const playerSelect = document.getElementById('playerSelect');
playerSelect.innerHTML = '<option value="" disabled selected>Select Player</option>'; playerSelect.innerHTML = '<option value="" disabled selected>Select Player</option>';
bankState.players.forEach(player => { bankState.players.forEach(player => {
const option = document.createElement('option'); const option = document.createElement('option');
option.value = player.id; option.value = player.uid;
option.textContent = player.name; option.textContent = player.name;
playerSelect.appendChild(option); playerSelect.appendChild(option);
}); });
} }
// Add a new transaction to history /**
function addTransaction(type, amount, details = '') { * Update the transaction history display
const transaction = { */
type,
amount,
details,
timestamp: new Date().toISOString()
};
bankState.transactions.unshift(transaction);
updateTransactionHistory();
}
// Update the transaction history display
function updateTransactionHistory() { function updateTransactionHistory() {
const historyList = document.getElementById('transactionHistory'); const historyList = document.getElementById('transactionHistory');
if (!historyList) return;
historyList.innerHTML = ''; 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 => { bankState.transactions.forEach(transaction => {
if (!transaction) return;
const li = document.createElement('li'); const li = document.createElement('li');
li.className = 'history-item'; li.className = 'history-item';
const isNegative = ['transfer_out', 'to_wallet'].includes(transaction.type); const isNegative = ['transfer_out', 'to_wallet'].includes(transaction.type);
const amountClass = isNegative ? 'amount-negative' : 'amount-positive'; const amountClass = isNegative ? 'amount-negative' : 'amount-positive';
const amountPrefix = isNegative ? '-' : '+'; const amountPrefix = isNegative ? '-' : '+';
const amount = Math.abs(Number(transaction.amount) || 0);
li.innerHTML = ` li.innerHTML = `
<span class="transaction-type">${formatTransactionType(transaction.type)}</span> <span class="transaction-type">${formatTransactionType(transaction.type)}</span>
<span class="transaction-details">${transaction.details}</span> <span class="transaction-details">${transaction.details || ''}</span>
<span class="amount ${amountClass}">${amountPrefix}$${Math.abs(transaction.amount).toLocaleString()}</span> <span class="amount ${amountClass}">${amountPrefix}$${amount.toLocaleString()}</span>
`; `;
historyList.appendChild(li); 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) { function formatTransactionType(type) {
const types = { const types = {
'to_wallet': 'To Wallet', 'to_wallet': 'To Wallet',
@ -85,63 +218,94 @@ function formatTransactionType(type) {
return types[type] || type; return types[type] || type;
} }
// Set up all form event listeners //=============================================================================
function setupEventListeners() { // Handle transfers between wallet and account // #region ACTION HANDLERS
document.getElementById('transferForm').addEventListener('submit', (e) => { //=============================================================================
e.preventDefault();
const amount = parseInt(document.getElementById('transferAmount').value); /**
const transferType = document.getElementById('transferType').value; * Handle transfer between wallet and account
*/
if (transferType === 'to_wallet') { function handleTransfer() {
if (amount > bankState.account) { const amount = parseInt(document.getElementById('transferAmount').value);
alert('Insufficient funds in account'); const transferType = document.getElementById('transferType').value;
return;
} if (amount <= 0) {
bankState.account -= amount; alert('Amount must be greater than 0');
bankState.wallet += amount; return;
} else { }
if (amount > bankState.wallet) {
alert('Insufficient funds in wallet'); const event = transferType === 'to_wallet' ? 'WITHDRAW::FUNDS' : 'DEPOSIT::FUNDS';
return;
} const message = {
bankState.wallet -= amount; event: event,
bankState.account += amount; data: {
amount: amount
} }
};
addTransaction(transferType, amount);
updateBalanceDisplays(); A3API.SendAlert(JSON.stringify(message));
e.target.reset(); document.getElementById('transferAmount').value = '';
}); // 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();
});
} }
// 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); document.addEventListener('DOMContentLoaded', initializeBank);

View File

@ -1,48 +1 @@
#include "script_component.hpp" #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);

View File

@ -1 +1,48 @@
#include "script_component.hpp" #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);

View File

@ -1,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="forge_client"> <Project name="forge_client">
<Package name="Garage"> <Package name="Garage">
<Key ID="STR_forge_client_garage_Close">
<English>Close</English>
</Key>
<Key ID="STR_forge_client_garage_Name"> <Key ID="STR_forge_client_garage_Name">
<English>Garage</English> <English>Garage</English>
</Key> </Key>

View File

@ -1,19 +1,16 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Function: forge_client_init_fnc_handlePlayerLoad
* Author: IDSolutions * Author: IDSolutions
*
* [Description]
* Handle player load from DB. * Handle player load from DB.
* *
* Arguments: * Arguments:
* 0: Data from key [<ARRAY|STRING|NUMBER|BOOL>] (default: []) * 0: Data from key <ARRAY|STRING|NUMBER|BOOL> (default: [])
* *
* Return Value: * Return Value:
* N/A * None
* *
* Examples: * Example:
* [[_data]] call forge_client_init_fnc_handlePlayerLoad (Server or Singleplayer Only) * [[_data]] call forge_client_init_fnc_handlePlayerLoad (Server or Singleplayer Only)
* [[_data]] remoteExecCall ["forge_client_init_fnc_handlePlayerLoad", 2, false] (Multiplayer Only) * [[_data]] remoteExecCall ["forge_client_init_fnc_handlePlayerLoad", 2, false] (Multiplayer Only)
* *

View File

@ -1,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="forge_client"> <Project name="forge_client">
<Package name="Locker"> <Package name="Locker">
<Key ID="STR_forge_client_locker_Close">
<English>Close</English>
</Key>
<Key ID="STR_forge_client_locker_Equip"> <Key ID="STR_forge_client_locker_Equip">
<English>Equip</English> <English>Equip</English>
</Key> </Key>

View File

@ -7,9 +7,6 @@
<Key ID="STR_forge_client_store_Category"> <Key ID="STR_forge_client_store_Category">
<English>FILTER BY CATEGORY</English> <English>FILTER BY CATEGORY</English>
</Key> </Key>
<Key ID="STR_forge_client_store_Close">
<English>Close</English>
</Key>
<Key ID="STR_forge_client_store_Name"> <Key ID="STR_forge_client_store_Name">
<English>Store</English> <English>Store</English>
</Key> </Key>