Compare commits

..

No commits in common. "0ed1bc3a1971fc213def880a03551125292e9c32" and "65d9154c09a14f1ebaf0bd0bdfa54663a9d466ab" have entirely different histories.

29 changed files with 448 additions and 683 deletions

View File

@ -1,5 +1,6 @@
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 +1,96 @@
#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,93 +1 @@
#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", ["ADMIN::TRANSFER", [_condition, _amount, _uid]]] call CFUNC(serverEvent); ["forge_server_admin_handleEvents", ["handleTransfer", [_condition, _amount, _uid]]] call CFUNC(serverEvent);
ctrlSetText [2023005, ""]; ctrlSetText [2023005, ""];

View File

@ -0,0 +1,37 @@
#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,8 +1,11 @@
#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
@ -10,8 +13,8 @@
* Return Value: * Return Value:
* None * None
* *
* Example: * Examples:
* [] call forge_client_admin_fnc_openAdmin; * None
* *
* Public: Yes * Public: Yes
*/ */

View File

@ -30,6 +30,8 @@ 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", ["ADMIN::SEND::MESSAGE", [_uid, _message]]] call CFUNC(serverEvent); ["forge_server_admin_handleEvents", ["sendMessage", [_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", ["ADMIN::UPDATE::PAYGRADE", [_uid, _paygrade]]] call CFUNC(serverEvent); ["forge_server_admin_handleEvents", ["updatePaygrade", [_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,4 +1,5 @@
PREP(deposit); PREP(deposit);
PREP(initBank);
PREP(openBank); PREP(openBank);
PREP(refresh); PREP(refresh);
PREP(submit); PREP(submit);

View File

@ -1,11 +1 @@
#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,86 +1 @@
#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

@ -16,4 +16,3 @@ 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,8 +1,11 @@
#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
@ -10,27 +13,25 @@
* Return Value: * Return Value:
* None * None
* *
* Example: * Examples:
* [] call forge_client_bank_fnc_deposit; * None
* *
* Public: Yes * Public: Yes
*/ */
private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT); private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT);
private _uid = getPlayerUID player; private _bank = GETVAR(player,FORGE_Bank,0);
private _cash = GETVAR(player,FORGE_Cash,0);
private _messageData = createHashMapFromArray [ if (_amount > 0 && _amount <= _cash) then {
["event", "DEPOSIT::FUNDS"], _cash = _cash - _amount;
["data", createHashMapFromArray [ _bank = _bank + _amount;
["amount", _amount],
["uid", _uid]
]]
];
private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent); SETPVAR(player,FORGE_Bank,_bank);
SETPVAR(player,FORGE_Cash,_cash);
if (_response) then { [] call FUNC(refresh);
[format ["Deposited $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); hint "Money deposited successfully";
} else { } else {
[format ["Deposit failed"], "warning", 3, "right"] call EFUNC(misc,notify); hint "Invalid amount";
}; };

View File

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

View File

@ -1,8 +1,11 @@
#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
@ -10,15 +13,14 @@
* Return Value: * Return Value:
* None * None
* *
* Example: * Examples:
* [] call forge_client_bank_fnc_refresh; * None
* *
* Public: Yes * Public: Yes
*/ */
private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server private _bank = GETVAR(player,FORGE_Bank,0);
private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server private _cash = GETVAR(player,FORGE_Cash,0);
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); //TODO: Implement balance from server private _bank = GETVAR(player,FORGE_Bank,0);
private _payMultiplyer = "MULTIPLYR" call BFUNC(getParamValue); private _payMultiplyer = "MULTIPLYR" call BFUNC(getParamValue);
private _plyscore = rating player; //TODO: Implement rating from server private _plyscore = rating player;
private _multiplyer = _plyscore * _payMultiplyer; private _multiplyer = _plyscore * _payMultiplyer;
_bank = _bank + _multiplyer; _bank = _bank + _multiplyer;

View File

@ -1,8 +1,11 @@
#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
@ -10,8 +13,8 @@
* Return Value: * Return Value:
* None * None
* *
* Example: * Examples:
* [] call forge_client_bank_fnc_transfer; * None
* *
* Public: Yes * Public: Yes
*/ */
@ -19,28 +22,23 @@
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 _fromUid = getPlayerUID player; private _bank = GETVAR(player,FORGE_Bank,0);
private _toUid = getPlayerUID _target; private _targetBank = GETVAR(_target,FORGE_Bank,0);
private _messageData = createHashMapFromArray [ if (!isNull _target && _amount > 0 && _amount <= _bank) then {
["event", "TRANSFER::FUNDS"], _targetBank = _targetBank + _amount;
["data", createHashMapFromArray [ SETPVAR(_target,FORGE_Bank,_targetBank);
["fromUid", _fromUid],
["toUid", _toUid],
["amount", _amount]
]]
];
private _response = [QGVAR(handleEvents), (toJSON _messageData)] call CFUNC(localEvent); _bank = _bank - _amount;
SETPVAR(player,FORGE_Bank,_bank);
if (_response) then { [] call FUNC(refresh);
[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 ["Transfer failed"], "warning", 3, "right"] call EFUNC(misc,notify); [format ["Invalid transfer details"], "warning", 3, "right"] call EFUNC(misc,notify);
}; };

View File

@ -1,8 +1,11 @@
#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
@ -10,8 +13,8 @@
* Return Value: * Return Value:
* None * None
* *
* Example: * Examples:
* [] call forge_client_bank_fnc_withdraw; * None
* *
* Public: Yes * Public: Yes
*/ */
@ -20,17 +23,18 @@ 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 _messageData = createHashMapFromArray [ private _bank = GETVAR(player,FORGE_Bank,0);
["event", "WITHDRAW::FUNDS"], private _cash = GETVAR(player,FORGE_Cash,0);
["data", createHashMapFromArray [
["amount", _amount]
]]
];
private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent); if (_amount > 0 && _amount <= _bank) then {
_bank = _bank - _amount;
_cash = _cash + _amount;
if (_response) then { SETPVAR(player,FORGE_Bank,_bank);
[format ["Withdrawn $%1", _amount], "info", 3, "right"] call EFUNC(misc,notify); SETPVAR(player,FORGE_Cash,_cash);
[] call FUNC(refresh);
[format ["Money withdrawn successfully"], "info", 3, "right"] call EFUNC(misc,notify);
} else { } else {
[format ["Withdrawal failed"], "warning", 3, "right"] call EFUNC(misc,notify); [format ["Invalid amount"], "warning", 3, "right"] call EFUNC(misc,notify);
}; };

View File

@ -4,6 +4,9 @@
<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

@ -1,17 +0,0 @@
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,32 +1,14 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- <meta charset="UTF-8">
Dynamic Resource Loading <meta name="viewport" content="width=device-width, initial-scale=1.0">
The following script loads CSS and JavaScript files dynamically using the A3API <title>FORGE - FDIC</title>
This approach is used instead of static HTML imports to work with Arma 3's file system <link rel="preconnect" href="https://fonts.googleapis.com">
--> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<script> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
Promise.all([ <link rel="stylesheet" href="styles.css">
// Load CSS file <script src="script.js" defer></script>
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>
@ -34,6 +16,7 @@
<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>
@ -41,6 +24,7 @@
</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>
@ -51,10 +35,10 @@
</header> </header>
<main class="container"> <main class="container">
<div class="actions-grid"> <div class="actions-grid"> <!-- Transfer Between Accounts -->
<!-- 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>
@ -66,12 +50,14 @@
<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>
@ -82,12 +68,14 @@
<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>
@ -96,7 +84,8 @@
<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,212 +1,79 @@
/** // 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: 0, wallet: 1000,
account: 0, account: 5000,
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() {
// 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();
}
/**
* 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(); updateBalanceDisplays();
populatePlayerList();
setupEventListeners();
loadTransactionHistory();
} }
/** // Update balance displays in the header
* 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() {
const walletElement = document.getElementById('walletBalance'); document.getElementById('walletBalance').textContent = `$${bankState.wallet.toLocaleString()}`;
const accountElement = document.getElementById('accountBalance'); document.getElementById('accountBalance').textContent = `$${bankState.account.toLocaleString()}`;
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.uid; option.value = player.id;
option.textContent = player.name; option.textContent = player.name;
playerSelect.appendChild(option); playerSelect.appendChild(option);
}); });
} }
/** // Add a new transaction to history
* Update the transaction history display function addTransaction(type, amount, details = '') {
*/ 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}$${amount.toLocaleString()}</span> <span class="amount ${amountClass}">${amountPrefix}$${Math.abs(transaction.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',
@ -218,94 +85,63 @@ function formatTransactionType(type) {
return types[type] || type; return types[type] || type;
} }
//============================================================================= // Set up all form event listeners
// #region ACTION HANDLERS function setupEventListeners() { // Handle transfers between wallet and account
//============================================================================= document.getElementById('transferForm').addEventListener('submit', (e) => {
e.preventDefault();
/**
* Handle transfer between wallet and account
*/
function handleTransfer() {
const amount = parseInt(document.getElementById('transferAmount').value); const amount = parseInt(document.getElementById('transferAmount').value);
const transferType = document.getElementById('transferType').value; const transferType = document.getElementById('transferType').value;
if (amount <= 0) { if (transferType === 'to_wallet') {
alert('Amount must be greater than 0'); if (amount > bankState.account) {
alert('Insufficient funds in account');
return; return;
} }
bankState.account -= amount;
const event = transferType === 'to_wallet' ? 'WITHDRAW::FUNDS' : 'DEPOSIT::FUNDS'; bankState.wallet += amount;
} else {
const message = { if (amount > bankState.wallet) {
event: event, alert('Insufficient funds in wallet');
data: { return;
amount: amount }
bankState.wallet -= amount;
bankState.account += amount;
} }
};
A3API.SendAlert(JSON.stringify(message)); addTransaction(transferType, amount);
document.getElementById('transferAmount').value = ''; updateBalanceDisplays();
} e.target.reset();
}); // Transfer to Player
/** document.getElementById('transferPlayerForm').addEventListener('submit', (e) => {
* Handle transfer to another player e.preventDefault();
*/
function handlePlayerTransfer() {
const amount = parseInt(document.getElementById('playerTransferAmount').value); const amount = parseInt(document.getElementById('playerTransferAmount').value);
const playerUid = document.getElementById('playerSelect').value; const playerId = document.getElementById('playerSelect').value;
const playerName = bankState.players.find(p => p.id.toString() === playerId)?.name;
if (amount <= 0) { if (amount > bankState.account) {
alert('Amount must be greater than 0'); alert('Insufficient funds in account');
return; return;
} }
if (!playerUid) { bankState.account -= amount;
alert('Please select a player'); addTransaction('transfer_out', amount, `To ${playerName}`);
return; updateBalanceDisplays();
} e.target.reset();
});
const message = { // Submit Timesheet
event: 'TRANSFER::FUNDS', document.getElementById('timesheetForm').addEventListener('submit', (e) => {
data: { e.preventDefault();
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 hours = parseFloat(document.getElementById('hoursWorked').value);
const rate = parseInt(document.getElementById('hourlyRate').value); const rate = parseInt(document.getElementById('hourlyRate').value);
const amount = Math.floor(hours * rate); const amount = Math.floor(hours * rate);
if (amount <= 0) { bankState.account += amount;
alert('Invalid timesheet amount'); addTransaction('timesheet', amount, `${hours} hours @ $${rate}/hr`);
return; updateBalanceDisplays();
} e.target.reset();
});
const message = {
event: 'DEPOSIT::FUNDS',
data: {
amount: amount
}
};
A3API.SendAlert(JSON.stringify(message));
document.getElementById('hoursWorked').value = '';
document.getElementById('hourlyRate').value = '';
} }
//============================================================================= // Initialize when DOM is loaded
// #region INITIALIZATION
//=============================================================================
/**
* Initialize when DOM is loaded
*/
document.addEventListener('DOMContentLoaded', initializeBank); document.addEventListener('DOMContentLoaded', initializeBank);

View File

@ -1 +1,48 @@
#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,48 +1 @@
#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,6 +1,9 @@
<?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,16 +1,19 @@
#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:
* None * N/A
* *
* Example: * Examples:
* [[_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,6 +1,9 @@
<?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,6 +7,9 @@
<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>