client/addons/task/functions/fnc_hvt.sqf
Jacob Schmidt c87deec60b
All checks were successful
Build / Build (push) Successful in 26s
Refactor: Organization Funds, Reputation, Tasks, and Player Saving
This commit refactors how organization funds and reputation are handled, updates task completion logic to use the new organization functions, and modifies player saving to include organization data. Additionally, it introduces string serialization/deserialization and fixes a player save loop.

*   **Organization Funds and Reputation:** Replaces direct server calls for handling funds and reputation with calls to the new organization functions (`EFUNC(org,addFunds)` and `EFUNC(org,addReputation)`). This centralizes fund and reputation management within the organization store.
*   **Task Completion Logic:** Updates task completion functions (`fnc_destroy.sqf`, `fnc_attack.sqf`, `fnc_hostage.sqf`, `fnc_hvt.sqf`, `fnc_defuse.sqf`) to use the new organization functions for adding funds and reputation upon task success or failure. Also adds notifications to inform the player of reputation and fund changes.
*   **Player Saving:** Modifies the player saving function (`fnc_playerDBSave.sqf`) to include the player's organization ID in the saved data.
*   **String Serialization/Deserialization:** Adds `serializeString` and `deserializeString` PREP macros to `XEH_PREP.hpp` and uses them in `fnc_handleOrgLoad.sqf` and `fnc_create.sqf` to handle special characters in organization and member names.
*   **Player Save Loop Fix:** Removes unnecessary brackets from the `call FUNC(playerDBSave)` in `fnc_playerSaveLoop.sqf`.
*   **Organization Purchase Verification:** Adds organization ownership verification to `fnc_handlePurchase.sqf` to ensure only the owner can make purchases using organization funds.
*   **Player Initialization:** Updates `fnc_initPlayer.sqf` to retrieve and set the player's organization upon initialization.
2025-04-05 14:16:24 -05:00

105 lines
4.2 KiB
Plaintext

#include "..\script_component.hpp"
/*
* Author: Creedcoder, J. Schmidt
* Registers an hvt task.
*
* Arguments:
* 0: ID of the task <STRING>
* 1: Amount of HVTs KIA to fail the task <NUMBER>
* 2: Amount of HVTs Captured or KIA to complete the task <NUMBER>
* 3: Marker name for the extraction zone <STRING>
* 4: Amount of funds the company recieves if the task is successful <NUMBER> (default: 0)
* 5: Amount of rating the company and player lose if the task is failed <NUMBER> (default: 0)
* 6: Amount of rating the company and player recieve if the task is successful <NUMBER> (default: 0)
* 7: Subcategory of task <ARRAY> (default: [true, false])
* 8: Should the mission end (MissionSuccess) if the task is successful <BOOL> (default: false)
* 9: Should the mission end (MissionFailed) if the task is failed <BOOL> (default: false)
* 10: Amount of time before hvt(s) die <NUMBER> (default: nil)
*
* Return Value:
* None
*
* Example:
* ["task_name", 1, 1, "marker_name", 500000, -75, 300, [true, false], false, false] spawn forge_client_task_fnc_hvt;
* ["task_name", -1, 1, "", 500000, -75, 300, [false, true], false, false] spawn forge_client_task_fnc_hvt;
* ["task_name", 1, 1, "marker_name", 500000, -75, 300, [true, false], false, false, 45] spawn forge_client_task_fnc_hvt;
* ["task_name", -1, 1, "", 500000, -75, 300, [false, true], false, false, 45] spawn forge_client_task_fnc_hvt;
*
* Public: Yes
*/
params [["_taskID", ""], ["_limitFail", -1], ["_limitSuccess", -1], ["_extZone", ""], ["_companyFunds", 0], ["_ratingFail", 0], ["_ratingSuccess", 0], ["_type", [["_capture", true], ["_eliminate", false]]], ["_endSuccess", false], ["_endFail", false], "_time"];
private _capture = (_this select 7) select 0;
private _eliminate = (_this select 7) select 1;
private _result = 0;
waitUntil {
sleep 1;
_hvts = GVAR(allHVTs) select { (_x getVariable ["assignedTask", ""]) == _taskID };
count _hvts > 0
};
private _hvts = GVAR(allHVTs) select { (_x getVariable ["assignedTask", ""]) == _taskID };
private _startTime = if (!isNil "_time") then { floor(time) } else { nil };
waitUntil {
sleep 1;
private _hvtsCaptive = ({ captive _x } count _hvts);
private _hvtsKilled = ({ !alive _x } count _hvts);
private _hvtsInZone = ({ _x inArea _extZone } count _hvts);
if (!isNil "_time") then {
private _timeExpired = (floor time - _startTime >= _time);
if (_capture && _hvtsKilled >= _limitFail) then { _result = 1; };
if (_capture && _hvtsCaptive < _limitSuccess && _timeExpired) then { _result = 1; };
if (_eliminate && _hvtsKilled < _limitSuccess && _timeExpired) then { _result = 1; };
(_result == 1) or (_capture && (_hvtsInZone >= _limitSuccess) && (_hvtsKilled < _limitFail)) or (_eliminate && (_hvtsKilled >= _limitSuccess))
} else {
if (_capture && (_hvtsKilled >= _limitFail)) then { _result = 1; };
(_result == 1) or (_capture && (_hvtsInZone >= _limitSuccess) && (_hvtsKilled < _limitFail)) or (_eliminate && (_hvtsKilled >= _limitSuccess))
};
};
if (_result == 1) then {
{ deleteVehicle _x } forEach _hvts;
[_taskID, "FAILED"] call BFUNC(taskSetState);
if (_endFail) then {
["MissionFail", false] remoteExecCall ["BIS_fnc_endMission", playerSide];
};
// ["deduct", _ratingFail] remoteExecCall ["forge_server_rating_fnc_handleRating", 2];
[_ratingFail] call EFUNC(org,addReputation);
[format ["Task failed: %1 reputation", _ratingFail], "warning", 5, "right"] call EFUNC(misc,notify);
sleep 1;
{ [_x, _ratingFail] remoteExec ["addRating", -2] } forEach allPlayers;
} else {
{ deleteVehicle _x } forEach _hvts;
[_taskID, "SUCCEEDED"] call BFUNC(taskSetState);
if (_endSuccess) then {
["MissionSuccess", true] remoteExecCall ["BIS_fnc_endMission", playerSide];
};
// ["advance", _ratingSuccess] remoteExecCall ["forge_server_rating_fnc_handleRating", 2];
[_ratingSuccess] call EFUNC(org,addReputation);
[format ["Task succeeded: %1 reputation", _ratingSuccess], "success", 5, "right"] call EFUNC(misc,notify);
sleep 1;
{ [_x, _ratingSuccess] remoteExec ["addRating", -2] } forEach allPlayers;
// ["advance", _companyFunds] remoteExecCall ["forge_server_money_fnc_handleFunds", 2];
[_companyFunds] call EFUNC(org,addFunds);
[format ["Task succeeded: %1 funds", _companyFunds], "success", 5, "right"] call EFUNC(misc,notify);
};