diff --git a/sa_ropes.sqf b/sa_ropes.sqf new file mode 100644 index 0000000..bddb56e --- /dev/null +++ b/sa_ropes.sqf @@ -0,0 +1,513 @@ + + +//[l1,[0,0,0],[0,0,-1]] ropeAttachTo (ropeCreate [h1, [0,0,0], 50]); +//[l1,[0,0,0],[0,0,-1]] ropeAttachTo (ropeCreate [h2, [0,0,0], 50]); +/* +_bbr = boundingBoxReal c1; +_p1 = _bbr select 0; +_p2 = _bbr select 1; +_x1 = (_p1 select 0); +_y1 = (_p1 select 1); +_z1 = (_p1 select 2); +_x2 = (_p2 select 0); +_y2 = (_p2 select 1); +_z2 = (_p2 select 2); + +_maxWidth = abs ((_p2 select 0) - (_p1 select 0)); +_maxLength = abs ((_p2 select 1) - (_p1 select 1)); +_maxHeight = abs ((_p2 select 2) - (_p1 select 2)); +*/ +//ropeCreate [h1, [0,0,-0.8], c1, [_x1/2,_y1/2,-_z2/2], 30]; +//ropeCreate [h1, [0,0,-0.8], c1, [_x2/2,_y1/2,-_z2/2], 30]; +//ropeCreate [h1, [0,0,-0.8], c1, [_x2/2,_y2/2,-_z2/2], 30]; +//ropeCreate [h1, [0,0,-0.8], c1, [_x1/2,_y2/2,-_z2/2], 30]; + +//ropeCreate [h1, [0,0,-1], 30, 30, false]; +//ropeCreate [h1, [0,0,-1], 30, 30, false]; +//ropeCreate [h1, [0,0,-1], 30, 30, false]; +//ropeCreate [h1, [0,0,-1], 30, 30, false]; + +/* +SA_Rope_Action_Menu = +[ + // First array: "User menu" This will be displayed under the menu, bool value: has Input Focus or not. + // Note that as to version Arma2 1.05, if the bool value set to false, Custom Icons will not be displayed. + ["Ropes",false] + // Syntax and semantics for following array elements: + // ["Title_in_menu", [assigned_key], "Submenu_name", CMD, [["expression",script-string]], "isVisible", "isActive" <, optional icon path> ] + // Title_in_menu: string that will be displayed for the player + // Assigned_key: 0 - no key, 1 - escape key, 2 - key-1, 3 - key-2, ... , 10 - key-9, 11 - key-0, 12 and up... the whole keyboard + // Submenu_name: User menu name string (eg "#USER:MY_SUBMENU_NAME" ), "" for script to execute. + // CMD: (for main menu:) CMD_SEPARATOR -1; CMD_NOTHING -2; CMD_HIDE_MENU -3; CMD_BACK -4; (for custom menu:) CMD_EXECUTE -5 + // script-string: command to be executed on activation. (no arguments passed) + // isVisible - Boolean 1 or 0 for yes or no, - or optional argument string, eg: "CursorOnGround" + // isActive - Boolean 1 or 0 for yes or no - if item is not active, it appears gray. + // optional icon path: The path to the texture of the cursor, that should be used on this menuitem. + //["First", [0], "", -5, [["expression", "player sidechat ""First"" "]], "1", "1"], + //["Second", [2], "", -5, [["expression", "player sidechat ""Second"" "]], "1", "1"], + //["Submenu", [3], "#USER:MY_SUBMENU_inCommunication", -5, [["expression", "player sidechat ""Submenu"" "]], "1", "1"] +]; +*/ + +/* +500 +B_Heli_Light_01_F +B_Heli_Light_01_armed_F +C_Heli_Light_01_civil_F +2000 +O_Heli_Light_02_F +O_Heli_Light_02_unarmed_F +O_Heli_Light_02_v2_F +I_Heli_light_03_F +I_Heli_light_03_unarmed_F +4000 +B_Heli_Transport_01_F +B_Heli_Transport_01_camo_F +I_Heli_Transport_02_F +10000 +B_Heli_Transport_03_F +B_Heli_Transport_03_unarmed_F +12000 +O_Heli_Transport_04_F +O_Heli_Transport_04_ammo_F +*/ + +SA_Rope_Get_Lift_Capability = { + private ["_heli","_heliType"]; + _heli = [_this,0] call BIS_fnc_param; + _heliType = toLower(typeOf _heli); + _returnVal = [500,0]; + if( + //(_heliType) == toLower("B_Heli_Transport_01_F") || + //(_heliType) == toLower("B_Heli_Transport_01_camo_F") || + (_heliType) == toLower("I_Heli_Transport_02_F") + ) then { + _returnVal = [4000,100000]; + }; + if( + (_heliType) == toLower("B_Heli_Transport_03_F") || + (_heliType) == toLower("B_Heli_Transport_03_unarmed_F") + ) then { + _returnVal = [10000,100000]; + }; + if( + (_heliType) == toLower("O_Heli_Transport_04_F") || + (_heliType) == toLower("O_Heli_Transport_04_ammo_F") + ) then { + _returnVal = [12000,100000]; + }; + _returnVal; +}; + +SA_Rope_Set_Mass = { + private ["_obj","_mass"]; + _obj = [_this,0] call BIS_fnc_param; + _mass = [_this,1] call BIS_fnc_param; + _obj setMass _mass; +}; + +SA_Rope_Adjust_Mass = { + private ["_obj","_mass","_lift","_heli","_originalMass","_ropes"]; + _obj = [_this,0] call BIS_fnc_param; + _heli = [_this,1] call BIS_fnc_param; + _ropes = [_this,2,[]] call BIS_fnc_param; + _lift = [_heli] call SA_Rope_Get_Lift_Capability; + _originalMass = _obj getVariable ["sa_rope_original_mass", getMass _obj]; + // Is mass adjustment needed? + if( _originalMass >= ((_lift select 0)*0.8) && _originalMass <= _lift select 1 ) then { + private ["_originalMassSet","_ends","_endDistance","_ropeLength"]; + _originalMassSet = (getMass _obj) == _originalMass; + while { _obj in (ropeAttachedObjects _heli) && _originalMassSet } do { + { + _ends = ropeEndPosition _x; + _endDistance = (_ends select 0) distance (_ends select 1); + _ropeLength = ropeLength _x; + if((_ropeLength - 2) <= _endDistance && ((position _heli) select 2) > 0 ) then { + [[_obj, ((_lift select 0)*0.8)],"SA_Rope_Set_Mass",_obj,false,true] spawn BIS_fnc_MP; + _originalMassSet = false; + }; + } forEach _ropes; + sleep 0.1; + }; + while { _obj in (ropeAttachedObjects _heli) } do { + sleep 0.5; + }; + [[_obj, _originalMass],"SA_Rope_Set_Mass",_obj,false,true] spawn BIS_fnc_MP; + }; +}; + +SA_Rope_Build_Action_Menu = { + + private ["_heli","_actionMenu","_length"]; + + _heli = vehicle player; + + _actionMenu = [ + ["Ropes",false] + ]; + + if( _heli isKindOf "Helicopter" ) then { + + _cargoRopesDeployed = _heli getVariable ["sa_rope_cargo_ropes_deployed",false]; + if(!_cargoRopesDeployed) then { + _actionMenu = _actionMenu + [["Deploy Cargo Ropes (5m)", [0], "", -5, [["expression", "[[vehicle player, 5],""SA_Rope_Deploy_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + _actionMenu = _actionMenu + [["Deploy Cargo Ropes (10m)", [0], "", -5, [["expression", "[[vehicle player, 10],""SA_Rope_Deploy_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + _actionMenu = _actionMenu + [["Deploy Cargo Ropes (15m)", [0], "", -5, [["expression", "[[vehicle player, 15],""SA_Rope_Deploy_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + } else { + if( count ropeAttachedObjects _heli == 0 ) then { + _actionMenu = _actionMenu + [["Retract Cargo Ropes", [0], "", -5, [["expression", "[[vehicle player],""SA_Rope_Retract_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + } else { + _actionMenu = _actionMenu + [["Release Cargo", [0], "", -5, [["expression", "[[vehicle player],""SA_Rope_Release_Cargo"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + }; + _length = ropeLength (ropes _heli select 0); + _actionMenu = _actionMenu + [["Extend Cargo Ropes (+5m)", [0], "", -5, [["expression", "[[vehicle player, 5],""SA_Rope_Extend_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + if(_length >= 10) then { + _actionMenu = _actionMenu + [["Shorten Cargo Ropes (-5m)", [0], "", -5, [["expression", "[[vehicle player, -5],""SA_Rope_Shorten_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + } else { + if(_length > 2) then { + _actionMenu = _actionMenu + [["Shorten Cargo Ropes (-1m)", [0], "", -5, [["expression", "[[vehicle player, -1],""SA_Rope_Shorten_Cargo_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + }; + }; + + }; + + /* + _fastRopesDeployed = _heli getVariable ["sa_rope_fast_ropes_deployed",false]; + if(!_fastRopesDeployed) then { + _actionMenu = _actionMenu + [["Deploy Fast Rope", [0], "", -5, [["expression", "[[vehicle player],""SA_Rope_Deploy_Fast_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + } else { + _actionMenu = _actionMenu + [["Retract Fast Rope", [0], "", -5, [["expression", "[[vehicle player],""SA_Rope_Retract_Fast_Ropes"",vehicle player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + if(vehicle player != player) then { + _actionMenu = _actionMenu + [["Rappel to Ground", [0], "", -5, [["expression", "[[vehicle player, player],""SA_Rope_Rappel_To_Groud"", player,false,true] spawn BIS_fnc_MP"]], "1", "1"]]; + } + }; + */ + + }; + + _actionMenu +}; + +SA_Rope_Deploy_Cargo_Ropes = { + private ["_heli","_cargoRopesDeployed","_cargoRopes","_length"]; + _heli = [_this,0] call BIS_fnc_param; + _length = [_this,1] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _cargoRopesDeployed = _heli getVariable ["sa_rope_cargo_ropes_deployed",false]; + if(!_cargoRopesDeployed) then { + _heli setVariable ["sa_rope_cargo_ropes_deployed",true,true]; + _cargoRopes = _heli getVariable ["sa_rope_cargo_ropes",[]]; + { ropeDestroy _x } forEach _cargoRopes; + _cargoRopes = _cargoRopes + [ropeCreate [_heli, "slingload0", 0]]; + _cargoRopes = _cargoRopes + [ropeCreate [_heli, "slingload0", 0]]; + _cargoRopes = _cargoRopes + [ropeCreate [_heli, "slingload0", 0]]; + _cargoRopes = _cargoRopes + [ropeCreate [_heli, "slingload0", 0]]; + { + ropeUnwind [_x, 5, _length]; + } forEach _cargoRopes; + _heli setVariable ["sa_rope_cargo_ropes",_cargoRopes,true]; + }; + }; +}; + +SA_Rope_Pickup_Rope_Action_Check = { + isNull (player getVariable ["SA_Rope_Cargo_Ropes_Picked_Up", objNull]) && vehicle player == player; +}; + +SA_Rope_Drop_Rope_Action_Check = { + !isNull (player getVariable ["SA_Rope_Cargo_Ropes_Picked_Up", objNull]); +}; + +SA_Rope_Attach_Rope_Action_Check = { + (call SA_Rope_Drop_Rope_Action_Check) && !isNull cursorTarget && cursorTarget distance player < 5; +}; + +SA_Rope_Attach_Cargo_Ropes = { + private ["_target","_bbr","_ropeLength","_objDistance"]; + private ["_heli","_ropes","_player"]; + _heli = [_this,0] call BIS_fnc_param; + _player = [_this,1] call BIS_fnc_param; + _target = [_this,2] call BIS_fnc_param; + _ropes = _heli getVariable ["sa_rope_cargo_ropes",[objNull,objNull,objNull,objNull]]; + if( !isNull _target && _target distance _player < 5 && _target != _heli ) then { + _ropeLength = ropeLength (_ropes select 0); + _objDistance = _target distance _heli; + if( (_objDistance + 2) > _ropeLength ) then { + [{ hint "The ropes are too short. Extend them." },"BIS_fnc_spawn",_player] call BIS_fnc_MP; + } else { + [_heli,_player] call SA_Rope_Drop_Cargo_Ropes; + _bbr = boundingBoxReal _target; + _p1 = _bbr select 0; + _p2 = _bbr select 1; + _x1 = (_p1 select 0); + _y1 = (_p1 select 1); + _z1 = (_p1 select 2); + _x2 = (_p2 select 0); + _y2 = (_p2 select 1); + _z2 = (_p2 select 2); + [_target, [_x1/2,_y1/2,0], [0,0,-1]] ropeAttachTo (_ropes select 0); + [_target, [_x2/2,_y1/2,0], [0,0,-1]] ropeAttachTo (_ropes select 1); + [_target, [_x2/2,_y2/2,0], [0,0,-1]] ropeAttachTo (_ropes select 2); + [_target, [_x1/2,_y2/2,0], [0,0,-1]] ropeAttachTo (_ropes select 3); + [_target, _heli, _ropes] spawn SA_Rope_Adjust_Mass; + }; + }; +}; + +SA_Rope_Pickup_Cargo_Ropes = { + private ["_heli","_player","_originalMass"]; + _heli = [_this,0] call BIS_fnc_param; + _player = [_this,1] call BIS_fnc_param; + { + _attachedObj = _x; + { + _attachedObj ropeDetach _x; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + } forEach ropeAttachedObjects _heli; + _helper = "Land_Can_V2_F" createVehicle position _player; + { + [_helper, [0, 0, 0], [0,0,-1]] ropeAttachTo _x; + _helper attachTo [_player, [-0.1, 0.1, 0.15], "Pelvis"]; + hideObject _helper; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + _player setVariable ["SA_Rope_Cargo_Ropes_Picked_Up", _heli,true]; + _player setVariable ["SA_Rope_Cargo_Ropes_Picked_Up_Helper", _helper,true]; +}; + +SA_Rope_Drop_Cargo_Ropes = { + private ["_heli","_player"]; + _heli = [_this,0] call BIS_fnc_param; + _player = [_this,1] call BIS_fnc_param; + _helper = (_player getVariable ["SA_Rope_Cargo_Ropes_Picked_Up_Helper", objNull]); + if(!isNull _heli) then { + { + _helper ropeDetach _x; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + detach _helper; + deleteVehicle _helper; + }; + _player setVariable ["SA_Rope_Cargo_Ropes_Picked_Up", nil,true]; + _player setVariable ["SA_Rope_Cargo_Ropes_Picked_Up_Helper", nil,true]; +}; + +SA_Rope_Find_Nearby_Cargo_Heli = { + private ["_heli","_nearHelis","_nearCargoRopes","_ends","_end1","_end2"]; + _nearHelis = position player nearObjects ["Helicopter", 30]; + _nearCargoHelis = []; + { + _heli = _x; + { + _ends = ropeEndPosition _x; + if(count _ends == 2) then { + _end1 = _ends select 0; + _end2 = _ends select 1; + if(((position player) distance _end1) < 5 || ((position player) distance _end2) < 5 ) then { + if!(_heli in _nearCargoHelis) then { + _nearCargoHelis = _nearCargoHelis + [_heli]; + } + } + }; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + } forEach _nearHelis; + _nearCargoHelis; +}; + +SA_Rope_Rappel_To_Groud = { + private ["_heli","_player"]; + _heli = [_this,0] call BIS_fnc_param; + _player = [_this,1] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _fastRope = _heli getVariable ["sa_rope_fast_ropes",[objNull]] select 0; + if(!isNull _fastRope) then { + _ends = ropeEndPosition _fastRope; + if(count _ends == 2) then { + unassignVehicle _player; + (_player) action ["getOut", _heli]; + _end1 = _ends select 0; + _end2 = _ends select 1; + if((_end1 select 2) < (_end2 select 2)) then { + _player setPos _end1; + } else { + _player setPos _end2; + }; + }; + }; + }; +}; + +SA_Rope_Deploy_Fast_Ropes = { + private ["_heli","_fastRopesDeployed","_fastRopes"]; + _heli = [_this,0] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _fastRopesDeployed = _heli getVariable ["sa_rope_fast_ropes_deployed",false]; + if(!_fastRopesDeployed) then { + _heli setVariable ["sa_rope_fast_ropes_deployed",true,true]; + _fastRopes = _heli getVariable ["sa_rope_fast_ropes",[]]; + { ropeDestroy _x } forEach _fastRopes; + _fastRopes = _fastRopes + [ropeCreate [_heli, "fastrope0", 0]]; + { + ropeUnwind [_x, 5, 25]; + } forEach _fastRopes; + _heli setVariable ["sa_rope_fast_ropes",_fastRopes,true]; + }; + }; +}; + +SA_Rope_Retract_Cargo_Ropes = { + private ["_heli","_cargoRopesDeployed"]; + _heli = [_this,0] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _cargoRopesDeployed = _heli getVariable ["sa_rope_cargo_ropes_deployed",false]; + if(_cargoRopesDeployed) then { + { + [_x,_heli] spawn { + private ["_rope","_count","_heli"]; + _rope = [_this,0] call BIS_fnc_param; + _heli = [_this,1] call BIS_fnc_param; + _count = 0; + ropeUnwind [_rope, 3, 0]; + while {(!ropeUnwound _rope) && _count < 20} do { + sleep 1; + _count = _count + 1; + }; + ropeDestroy _rope; + _heli setVariable ["sa_rope_cargo_ropes_deployed",false,true]; + _heli setVariable ["sa_rope_cargo_ropes",[],true]; + }; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + }; + }; +}; + +SA_Rope_Extend_Cargo_Ropes = { + private ["_heli","_cargoRopesDeployed","_lengthOffset"]; + _heli = [_this,0] call BIS_fnc_param; + _lengthOffset = [_this,1] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _cargoRopesDeployed = _heli getVariable ["sa_rope_cargo_ropes_deployed",false]; + if(_cargoRopesDeployed) then { + { + ropeUnwind [_x, 3, _lengthOffset, true]; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + }; + }; +}; + +SA_Rope_Shorten_Cargo_Ropes = { + private ["_heli","_cargoRopesDeployed","_lengthOffset"]; + _heli = [_this,0] call BIS_fnc_param; + _lengthOffset = [_this,1] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _cargoRopesDeployed = _heli getVariable ["sa_rope_cargo_ropes_deployed",false]; + if(_cargoRopesDeployed) then { + { + scopeName "ropeloop"; + if(ropeLength _x <= 2) then { + [_heli] call SA_Rope_Release_Cargo; + breakOut "ropeloop"; + } else { + ropeUnwind [_x, 3, _lengthOffset, true]; + }; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + }; + }; +}; + +SA_Rope_Release_Cargo = { + private ["_heli","_cargoRopesDeployed","_originalMass"]; + _heli = [_this,0] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + { + _attachedObj = _x; + { + _attachedObj ropeDetach _x; + } forEach (_heli getVariable ["sa_rope_cargo_ropes",[]]); + } forEach ropeAttachedObjects _heli; + [_heli] call SA_Rope_Retract_Cargo_Ropes; + }; +}; + +SA_Rope_Retract_Fast_Ropes = { + private ["_heli","_fastRopesDeployed"]; + _heli = [_this,0] call BIS_fnc_param; + if( _heli isKindOf "Helicopter" ) then { + _fastRopesDeployed = _heli getVariable ["sa_rope_fast_ropes_deployed",false]; + if(_fastRopesDeployed) then { + _heli setVariable ["sa_rope_fast_ropes_retracted",true,true]; + { + [_x,_heli] spawn { + private ["_rope","_count","_heli"]; + _rope = [_this,0] call BIS_fnc_param; + _heli = [_this,1] call BIS_fnc_param; + _count = 0; + ropeUnwind [_rope, 3, 0]; + while {(!ropeUnwound _rope) && _count < 20} do { + sleep 1; + _count = _count + 1; + }; + ropeDestroy _rope; + _heli setVariable ["sa_rope_fast_ropes_deployed",false,true]; + _heli setVariable ["sa_rope_fast_ropes",[],true]; + }; + } forEach (_heli getVariable ["sa_rope_fast_ropes",[]]); + }; + }; +}; + +SA_Rope_Action_Check = { + vehicle player isKindOf "Helicopter"; +}; + +if(!isDedicated) then { + player addAction ["Ropes", { + SA_Rope_Action_Menu = call SA_Rope_Build_Action_Menu; + showCommandingMenu "#USER:SA_Rope_Action_Menu"; + }, nil, 0, false, true, "", "call SA_Rope_Action_Check"]; + + player addEventHandler ["Respawn", { + player addAction ["Ropes", { + SA_Rope_Action_Menu = call SA_Rope_Build_Action_Menu; + showCommandingMenu "#USER:SA_Rope_Action_Menu"; + }, nil, 0, false, true, "", "call SA_Rope_Action_Check"]; + }]; +}; + +if(!isDedicated) then { + [] spawn { + private ["_cargoHelisWithActions","_nearCargoHelis","_action","_cargoHelisNotNearbyWithActions"]; + _cargoHelisWithActions = []; + while {true} do { + _nearCargoHelis = call SA_Rope_Find_Nearby_Cargo_Heli; + { + if!( _x in _cargoHelisWithActions ) then { + _action = player addAction ["Pick Up Cargo Ropes", { + [[_this select 3, player],"SA_Rope_Pickup_Cargo_Ropes",_this select 3,false,true] spawn BIS_fnc_MP + //[_this select 3] call SA_Rope_Pickup_Cargo_Ropes; + }, _x, 0, false, true, "", "call SA_Rope_Pickup_Rope_Action_Check"]; + _x setVariable ["SA_Rope_Pickup_Action", _action]; + _action = player addAction ["Drop Cargo Ropes", { + [[_this select 3, player],"SA_Rope_Drop_Cargo_Ropes",_this select 3,false,true] spawn BIS_fnc_MP + //[_this select 3] call SA_Rope_Drop_Cargo_Ropes; + }, _x, 0, false, true, "", "call SA_Rope_Drop_Rope_Action_Check"]; + _x setVariable ["SA_Rope_Drop_Action", _action]; + _action = player addAction ["Attach Cargo Ropes", { + [[_this select 3, player, cursorTarget],"SA_Rope_Attach_Cargo_Ropes",_this select 3,false,true] spawn BIS_fnc_MP + //[_this select 3] call SA_Rope_Attach_Cargo_Ropes; + }, _x, 0, false, true, "", "call SA_Rope_Attach_Rope_Action_Check"]; + _x setVariable ["SA_Rope_Attach_Action", _action]; + }; + } forEach _nearCargoHelis; + _cargoHelisNotNearbyWithActions = _cargoHelisWithActions - _nearCargoHelis; + { + player removeAction (_x getVariable "SA_Rope_Pickup_Action"); + player removeAction (_x getVariable "SA_Rope_Drop_Action"); + player removeAction (_x getVariable "SA_Rope_Attach_Action"); + } forEach _cargoHelisNotNearbyWithActions; + _cargoHelisWithActions = _nearCargoHelis; + sleep 2; + }; + }; +}; + + +