ACE3/addons/captives/functions/fnc_doBlindfoldCaptive.sqf
Fabio Schick b4c72d8255
Captives - Allow disarming and blindfolding captives in vehicles (#9463)
* Can disarm captives in vehicles

* Can blindfold captives in vehicles

* Fix dropping goggles/blindfold into large vehicles

* Apply suggestions from code review

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>

---------

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>
2023-10-09 14:58:49 -03:00

84 lines
2.9 KiB
Plaintext

#include "..\script_component.hpp"
/*
* Author: mrschick, johnb43
* Puts a blindfold on a captive unit if the player has a blindfold in their inventory.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Target <OBJECT>
* 2: Put on (true) or take off (false) <BOOL>
*
* Return Value:
* None
*
* Example:
* [player, cursorTarget, true] call ace_captives_fnc_doBlindfoldCaptive
*
* Public: No
*/
params ["_unit", "_target", "_state"];
private _dropGoggles = false;
private _previousGoggles = "";
if (_state) then { // Blindfold target
// Check if _unit has a blindfold in its inventory, abort otherwise.
private _carriedBlindfoldIdx = GVAR(blindfolds) findAny (_unit call EFUNC(common,uniqueItems));
if (_carriedBlindfoldIdx == -1) exitWith { ERROR("no blindfold"); };
private _blindfold = GVAR(blindfolds) select _carriedBlindfoldIdx;
_unit removeItem _blindfold;
// Remove target's goggles if it is wearing any and move them to unit's or target's inventory (if they can hold them)
_previousGoggles = goggles _target;
if (_previousGoggles != "") then {
if ([_unit, _previousGoggles] call CBA_fnc_canAddItem) exitWith {
removeGoggles _target;
_unit addItem _previousGoggles;
};
if ([_target, _previousGoggles] call CBA_fnc_canAddItem) exitWith {
removeGoggles _target;
_target addItem _previousGoggles;
};
// If the target's goggles can fit in neither unit's nor target's inventory, drop them on the ground
_dropGoggles = true;
};
_target addGoggles _blindfold;
} else { // Remove blindfold from target
_previousGoggles = goggles _target;
// Abort if already not wearing a blindfold
if !(_previousGoggles in GVAR(blindfolds)) exitWith { ERROR("no blindfold"); };
if ([_unit, _previousGoggles] call CBA_fnc_canAddItem) exitWith {
removeGoggles _target;
_unit addItem _previousGoggles;
};
if ([_target, _previousGoggles] call CBA_fnc_canAddItem) exitWith {
removeGoggles _target;
_target addItem _previousGoggles;
};
// If the target's blindfold can fit in neither unit's nor target's inventory, drop it on the ground
_dropGoggles = true;
removeGoggles _target;
};
// Handle for things that need to be dropped to the ground or in a vehicle inventory
if (_dropGoggles) then {
private _weaponHolder = nearestObject [_target, "WeaponHolder"];
// if _target is in a vehicle, use vehicle inventory as container
private _inVehicle = !isNull objectParent _target;
if (_inVehicle) then {
_weaponHolder = objectParent _target;
};
if (!_inVehicle && {isNull _weaponHolder || {_target distance _weaponHolder > 2}}) then {
_weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
_weaponHolder setPosASL getPosASL _target;
};
_weaponHolder addItemCargoGlobal [_previousGoggles, 1];
};