#include "..\script_component.hpp" /* * Author: IDSolutions * Registers a defend task where players must hold a zone marked by a marker * * Arguments: * 0: ID of the task * 1: Defense zone marker name * 2: Time to defend in seconds * 3: Amount of funds the company receives if the task is successful (default: 0) * 4: Amount of rating the company and player lose if the task is failed (default: 0) * 5: Amount of rating the company and player receive if the task is successful (default: 0) * 6: Should the mission end (MissionSuccess) if the task is successful (default: false) * 7: Should the mission end (MissionFailed) if the task is failed (default: false) * 8: Enemy wave count (default: 3) * 9: Time between waves in seconds (default: 300) * 10: Minimum BLUFOR units required in zone (default: 1) * 11: Equipment rewards (default: []) * 12: Supply rewards (default: []) * 13: Weapon rewards (default: []) * 14: Vehicle rewards (default: []) * 15: Special rewards (default: []) * * Return Value: * None * * Example: * ["defend_zone_1", "defend_marker", 900, 500000, -100, 400, false, false, 3, 300, 1, ["ItemGPS"], ["FirstAidKit"], ["arifle_MX_F"], ["B_MRAP_01_F"], ["B_UAV_01_F"]] spawn forge_client_task_fnc_defend; * * Public: Yes */ params [ ["_taskID", "", [""]], ["_defenseZone", "", [""]], ["_defendTime", 600, [0]], ["_companyFunds", 0, [0]], ["_ratingFail", 0, [0]], ["_ratingSuccess", 0, [0]], ["_endSuccess", false, [false]], ["_endFail", false, [false]], ["_waveCount", 3, [0]], ["_waveCooldown", 300, [0]], ["_minBlufor", 1, [0]], ["_equipmentRewards", [], [[]]], ["_supplyRewards", [], [[]]], ["_weaponRewards", [], [[]]], ["_vehicleRewards", [], [[]]], ["_specialRewards", [], [[]]] ]; if (_defenseZone == "" || !(markerShape _defenseZone in ["RECTANGLE", "ELLIPSE"])) exitWith { diag_log format ["ERROR: Invalid defense zone marker: %1", _defenseZone]; }; private _result = 0; private _startTime = time; private _nextWaveTime = _startTime; private _currentWave = 0; private _zoneEmptyCounter = 0; private _warningIssued = false; waitUntil { sleep 1; private _bluforInZone = count (allUnits select { _x isKindOf "CAManBase" && { side _x == west } && { alive _x }} inAreaArray _defenseZone); private _timeElapsed = time - _startTime; if (_bluforInZone < _minBlufor) then { _zoneEmptyCounter = _zoneEmptyCounter + 1; if (_zoneEmptyCounter == 15 && !_warningIssued) then { ["Warning", ["Defense Zone Empty!", "Return to the defense zone immediately!"]] remoteExec ["BIS_fnc_showNotification", 0]; _warningIssued = true; }; } else { _zoneEmptyCounter = 0; _warningIssued = false; }; if (_currentWave < _waveCount && time >= _nextWaveTime) then { [_defenseZone, _taskID, _currentWave] call FUNC(spawnEnemyWave); _currentWave = _currentWave + 1; _nextWaveTime = time + _waveCooldown; ["IncomingQRF", ["Enemy forces approaching!", format ["Wave %1 of %2", _currentWave, _waveCount]]] remoteExec ["BIS_fnc_showNotification", 0]; }; if (_zoneEmptyCounter >= 30) then { _result = 1; }; (_result == 1) or ((_bluforInZone >= _minBlufor) && (_timeElapsed >= _defendTime) && (_currentWave >= _waveCount)); }; if (_result == 1) then { [_taskID, "FAILED"] call BFUNC(taskSetState); private _penalties = createHashMap; _penalties set ["reputation", _ratingFail]; [_taskID, _penalties] call FUNC(handleTaskRewards); sleep 1; { [_x, _ratingFail] remoteExec ["addRating", -2] } forEach allPlayers; [format ["Task failed: %1 reputation", _ratingFail], "warning", 5, "right"] call EFUNC(misc,notify); if (_endFail) then { ["MissionFail", false] remoteExecCall ["BIS_fnc_endMission", playerSide]; }; } else { private _rewards = createHashMap; _rewards set ["funds", _companyFunds]; _rewards set ["reputation", _ratingSuccess]; if (count _equipmentRewards > 0) then { _rewards set ["equipment", _equipmentRewards]; }; if (count _supplyRewards > 0) then { _rewards set ["supplies", _supplyRewards]; }; if (count _weaponRewards > 0) then { _rewards set ["weapons", _weaponRewards]; }; if (count _vehicleRewards > 0) then { _rewards set ["vehicles", _vehicleRewards]; }; if (count _specialRewards > 0) then { _rewards set ["special", _specialRewards]; }; [_taskID, _rewards] call FUNC(handleTaskRewards); [_taskID, "SUCCEEDED"] call BIS_fnc_taskSetState; sleep 1; { [_x, _ratingSuccess] remoteExec ["addRating", -2] } forEach allPlayers; [format ["Task completed: %1 reputation", _ratingSuccess], "success", 5, "right"] call EFUNC(misc,notify); [format ["Task completed: %1 funds", _companyFunds], "success", 5, "right"] call EFUNC(misc,notify); if (_endSuccess) then { ["MissionSuccess", true] remoteExecCall ["BIS_fnc_endMission", playerSide]; }; };