LeventHAN icon

fastrope.sqf

LeventHAN | PRO | 09/11/18 05:30:58 PM UTC | 0 ⭐ | 6614 👁️ | Never ⏰ | []
SQF |

6.28 KB

|

None

|

0 👍

/

0 👎

// Fast Rope
 
#define MAX_SPEED_WHILE_FASTROPING 10
#define MAX_SPEED_ROPES_AVAIL 30
 
 
#define STR_TOSS_ROPES "Toss Ropes"
#define STR_FAST_ROPE "Fast Rope"
#define STR_CUT_ROPES "Cut Ropes"
 
 
if (isdedicated) exitwith {};
waituntil {player == player};
 
zlt_rope_ropes = [];
zlt_mutexAction = false;
 
zlt_rope_helis = ["O_Heli_Light_02_unarmed_F","O_Heli_Light_02_F","B_Heli_Transport_01_F","B_Heli_Transport_01_camo_F","O_Heli_Attack_02_F","O_Heli_Attack_02_black_F","I_Heli_Transport_02_F","B_Heli_Light_01_F"];
zlt_rope_helidata = 
[
    [
        ["O_Heli_Light_02_unarmed_F", "O_Heli_Light_02_F"],
        [1.35,1.35,-24.95],
        [-1.45,1.35,-24.95]
    ],
    [
        ["B_Heli_Transport_01_F", "B_Heli_Transport_01_camo_F"],
        [-1.11,2.5,-24.7],
        [1.11,2.5,-24.7]
    ],
    [
        ["O_Heli_Attack_02_F", "O_Heli_Attack_02_black_F"],
        [1.3,1.3,-25],
        [-1.3,1.3,-25]
    ],
    [
        ["I_Heli_Transport_02_F"],
        [0,-5,-26],
        []
    ],  
    [
        ["B_Heli_Light_01_F"],
        [0.6,0.5,-25.9],
        [-0.8,0.5,-25.9]
    ]
];
 
 
zlt_fnc_tossropes = {
    private ["_heli","_ropes","_oropes","_rope"];
    _heli = _this;
    _ropes = [];
    _oropes = _heli getvariable ["zlt_ropes",[]];
    if (count _oropes != 0 ) exitwith {};
    _i = 0;
    {
        if ((typeof _heli) in (_x select 0)) exitwith {
            _ropes = _ropes + [_x select 1];
            if ( count (_x select 2) !=0 ) then { 
                _ropes = _ropes + [_x select 2];
            };
        };
        _i = _i +1;
    } foreach zlt_rope_helidata;
    
    sleep random 0.3;
    if ( count (_heli getvariable ["zlt_ropes",[]]) != 0 ) exitwith { zlt_mutexAction = false; };
    _heli animateDoor ['door_R', 1];
    _heli animateDoor ['door_L', 1];
    {
        _rope = createVehicle ["land_rope_f", [0,0,0], [], 0, "CAN_COLLIDE"];
        _rope setdir (getdir _heli);
        _rope attachto [_heli, _x];
        _oropes = _oropes + [_rope];
    } foreach _ropes;
    _heli setvariable ["zlt_ropes",_oropes,true];
    
    _heli spawn {
        private ["_heli","_ropes"];
        _heli = _this;
        while {alive _heli and count (_heli getvariable ["zlt_ropes", []]) != 0 and abs (speed _heli) < MAX_SPEED_ROPES_AVAIL } do {
            sleep 0.3;
        };
        _ropes = (_heli getvariable ["zlt_ropes", []]);
        {deletevehicle _x} foreach _ropes;
        _heli setvariable ["zlt_ropes", [], true];
    };
 
};
 
zlt_fnc_ropes_cond = {
    _veh = vehicle player;
    _flag = (_veh != player) and {(not zlt_mutexAction)} and {count (_veh getvariable ["zlt_ropes", []]) == 0} and { (typeof _veh) in zlt_rope_helis } and {alive player and alive _veh and (abs (speed _veh) < MAX_SPEED_ROPES_AVAIL ) };
    _flag;
 
};
 
zlt_fnc_fastropeaiunits = {
        private ["_heli","_grunits"];
        diag_log ["zlt_fnc_fastropeaiunits", _this];
        _heli = _this select 0;
        _grunits = _this select 1;
 
        dostop (driver _heli );
        (driver _heli) setBehaviour "Careless"; 
        (driver _heli) setCombatMode "Blue"; 
        
        _heli spawn zlt_fnc_tossropes;
 
        [_heli, _grunits] spawn {
            private ["_units","_heli"];
            sleep random 0.5;
            _units = _this select 1;
            _heli = (_this select 0);
            _units = _units - [player];
            _units = _units - [driver _heli];
            {if (!alive _x or isplayer _x or vehicle _x != _heli) then {_units = _units - [_x];}; } foreach _units;
                        
            { sleep (0.5 + random 0.7); _x spawn zlt_fnc_fastropeUnit; } foreach _units;
            waituntil {sleep 0.5; { (getpos _x select 2) < 1 } count _units == count _units; };
            sleep 10;
            (driver _heli) doFollow (leader group (driver _heli ));
            (driver _heli) setBehaviour "Aware"; 
            (driver _heli) setCombatMode "White"; 
            _heli call zlt_fnc_cutropes;
            
        };
};
 
 
zlt_fnc_fastrope = {
    diag_log ["fastrope", _this];
    zlt_mutexAction = true;
    sleep random 0.3;
    if (player == leader group player) then {
        [vehicle player, units group player] call zlt_fnc_fastropeaiunits;
    };
    player call zlt_fnc_fastropeUnit;
    zlt_mutexAction = false;
};
 
zlt_fnc_fastropeUnit = {
    private ["_unit","_heli","_ropes","_rope","_zmax","_zdelta","_zc"];
    _unit = _this;
    _heli = vehicle _unit;
    if (_unit == _heli) exitWith {};
 
    _ropes = (_heli getvariable ["zlt_ropes", []]);
    if (count _ropes == 0) exitwith {};
    
    _rope = _ropes call BIS_fnc_selectRandom;
    _zmax = 22;
    _zdelta = 7 / 10  ;
    
    _zc = _zmax;
    _unit action ["eject", _heli];
    _unit switchmove "gunner_standup01";
    
    _unit setpos [(getpos _unit select 0), (getpos _unit select 1), 0 max ((getpos _unit select 2) - 3)];
    while {alive _unit and (getpos _unit select 2) > 1 and (abs (speed _heli)) < MAX_SPEED_WHILE_FASTROPING  and _zc > -24} do {
        _unit attachTo [_rope, [0,0,_zc]];
        _zc = _zc - _zdelta;
        sleep 0.1;
    };
    _unit switchmove "";
    detach _unit;
 
};
 
 
zlt_fnc_cutropes = {
    _veh = _this;
    _ropes = (_veh getvariable ["zlt_ropes", []]);
    {deletevehicle _x} foreach _ropes;
    _veh setvariable ["zlt_ropes", [], true];
    _veh animateDoor ['door_R', 0];
    _veh animateDoor ['door_L', 0];
 
};
 
zlt_fnc_removeropes = {
    (vehicle player) call zlt_fnc_cutropes;
};
 
zlt_fnc_createropes = {
    zlt_mutexAction = true;
    (vehicle player) call zlt_fnc_tossropes;
    zlt_mutexAction = false;
};
 
 
 
player createDiarySubject [STR_SCRIPTS_NAME,STR_SCRIPTS_NAME];
player createDiaryRecord [STR_SCRIPTS_NAME,[STR_SCRIPT_NAME, STR_HELP]];
 
player addAction["<t color='#00ccff'>"+STR_TOSS_ROPES+"</t>", zlt_fnc_createropes, [], -1, false, false, '','[] call zlt_fnc_ropes_cond'];
player addAction["<t color='#00ccff'>"+STR_CUT_ROPES+"</t>", zlt_fnc_removeropes, [], -1, false, false, '','not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0'];
player addAction["<t color='#00ccff'>"+STR_FAST_ROPE+"</t>", zlt_fnc_fastrope, [], 15, false, false, '','not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0 and player != driver vehicle player'];
 
player addEventHandler ["Respawn", {
    player addAction["<t color='#00ccff'>"+STR_TOSS_ROPES+"</t>", zlt_fnc_createropes, [], -1, false, false, '','[] call zlt_fnc_ropes_cond'];
    player addAction["<t color='#00ccff'>"+STR_CUT_ROPES+"</t>", zlt_fnc_removeropes, [], -1, false, false, '','not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0'];
    player addAction["<t color='#00ccff'>"+STR_FAST_ROPE+"</t>", zlt_fnc_fastrope, [], 15, false, false, '','not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0 and player != driver vehicle player'];
}];

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎