-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzlt_fastrope.sqf
220 lines (181 loc) · 6.6 KB
/
zlt_fastrope.sqf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// v1g Fast Rope by [STELS]Zealot
#define MAX_SPEED_WHILE_FASTROPING 10
#define MAX_SPEED_ROPES_AVAIL 15
#define STR_TOSS_ROPES "Toss Ropes"
#define STR_FAST_ROPE "Fast Rope"
#define STR_CUT_ROPES "Cut Ropes"
#define CUT_ROPES_CONDITION 'driver vehicle player == player && not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0'
#define FAST_ROPE_CONDITION 'not zlt_mutexAction and count ((vehicle player) getvariable ["zlt_ropes", []]) != 0 and ((not isNull driver vehicle player && player != driver vehicle player) || (vehicle player getCargoIndex player != -1))'
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","I_Heli_light_03_unarmed_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]
],
[
["I_Heli_light_03_unarmed_F"],
[0.7,2.75,-25.9],
[-0.9,2.75,-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, "zlt_fnc_fastropeUnit", false] call Bis_fnc_mp;
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;
moveOut _unit;
//_unit action ["eject", _heli];
//_unit leaveVehicle _heli;
//_unit switchmove "gunner_standup01";
_unit setpos [(getpos _unit select 0), (getpos _unit select 1), 0 max ((getpos _unit select 2) - 4)];
[[_unit, "gunner_standup01"], "switchMove", true] call Bis_fnc_mp;
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;
_unit switchmove "gunner_standup01";
sleep 0.1;
};
//_unit switchmove "";
[[_unit, ""], "switchMove", true] call Bis_fnc_mp;
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;
};
if(side group player == west) then
{
player createDiarySubject [STR_SCRIPTS_NAME,STR_SCRIPTS_NAME];
player createDiaryRecord [STR_SCRIPTS_NAME,[STR_SCRIPT_NAME, STR_HELP]];
player addAction["<t color='#ffff00'>"+STR_TOSS_ROPES+"</t>", zlt_fnc_createropes, [], -1, false, false, '','[] call zlt_fnc_ropes_cond'];
player addAction["<t color='#ff0000'>"+STR_CUT_ROPES+"</t>", zlt_fnc_removeropes, [], -1, false, false, '', CUT_ROPES_CONDITION];
player addAction["<t color='#00ff00'>"+STR_FAST_ROPE+"</t>", zlt_fnc_fastrope, [], 15, false, false, '', FAST_ROPE_CONDITION];
player addEventHandler ["Respawn", {
player addAction["<t color='#ffff00'>"+STR_TOSS_ROPES+"</t>", zlt_fnc_createropes, [], -1, false, false, '','[] call zlt_fnc_ropes_cond'];
player addAction["<t color='#ff0000'>"+STR_CUT_ROPES+"</t>", zlt_fnc_removeropes, [], -1, false, false, '', CUT_ROPES_CONDITION];
player addAction["<t color='#00ff00'>"+STR_FAST_ROPE+"</t>", zlt_fnc_fastrope, [], 15, false, false, '', FAST_ROPE_CONDITION];
}];
};