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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
|
// =========================================================================================================
// UPSMON - Urban Patrol Script Mon
// Version: 5.1.0
// Author: Monsada (chs.monsada@gmail.com)
//
// Wiki: http://dev-heaven.net/projects/upsmon/wiki
// Forum: http://forums.bistudio.com/showthread.php?t=91696
// Share your missions with upsmon: http://dev-heaven.net/projects/upsmon/boards/86
// ---------------------------------------------------------------------------------------------------------
// Based on Urban Patrol Script
// Version: 2.0.3
// Author: Kronzky (www.kronzky.info / kronzky@gmail.com)
// ---------------------------------------------------------------------------------------------------------
// Some little fixes: !Rafalsky (v5.0.8 - 5.0.9)
// ---------------------------------------------------------------------------------------------------------
//Adding eventhandlers
"KRON_UPS_EAST_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[east] execvm "Server\Module\UPSMON\UPSMON\MON_surrended.sqf";};};
"KRON_UPS_WEST_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[west] execvm "Server\Module\UPSMON\UPSMON\MON_surrended.sqf";};};
"KRON_UPS_GUER_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[resistance] execvm "Server\Module\UPSMON\UPSMON\MON_surrended.sqf";};};
"MON_LOCAL_EXEC" addPublicVariableEventHandler { if (local ((_this select 1)select 0)) then {
call ( compile format[(_this select 1)select 1,(_this select 1)select 0] );
};
};
if (!isServer) exitWith {};
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// These Variables should be checked and set as required, to make the mission runs properly.
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// ACE Wounds System for AI (set TRUE to On, set FALSE to Off) !
ace_sys_wounds_noai = false; // set it as required
//1=Enable or 0=disable debug. In debug could see a mark positioning de leader and another mark of the destination of movement, very useful for editing mission
KRON_UPS_Debug = 0;
//1=Enable or 0=disable. In game display global chat info about who just killed a civilian.
//numbers of Civilians killed by players could be read from array 'KILLED_CIV_COUNTER' -> [Total,by West,by East,by Res]
R_WHO_IS_CIV_KILLER_INFO = 1;
// if you are spotted by AI group, how close the other AI group have to be to You , to be informed about your present position. over this, will lose target
KRON_UPS_sharedist = 600;
// If enabled IA communication between them with radio defined sharedist distance, 0/2
// (must be set to 2 in order to use reinforcement !R)
KRON_UPS_comradio = 2;
//Sides that are enemies of resistance
KRON_UPS_Res_enemy = [east];
// Distance from destination for searching vehicles. (Search area is about 200m),
// If your destination point is further than KRON_UPS_searchVehicledist, AI will try to find a vehicle to go there.
KRON_UPS_searchVehicledist = 600; // 700, 900
//Enables or disables AI to use static weapons
KRON_UPS_useStatics = true;
//Enables or disables AI to put mines if armoured enemies near
KRON_UPS_useMines = true;
//------------------------------------------------------------------------------------------------------------------------------
// These Variables can be changed if needed but it is not necessary.
//------------------------------------------------------------------------------------------------------------------------------
//% of chanse to use smoke by team members when someone wounded or killed in the group in %(default 13 & 35).
// set both to 0 -> to switch off this function
R_USE_SMOKE_wounded = 13;
R_USE_SMOKE_killed = 35;
//Height that heli will fly this input will be randomised in a 10%
KRON_UPS_flyInHeight = 80;
//Percentage of units to surrender.
KRON_UPS_EAST_SURRENDER = 0; // 10
KRON_UPS_WEST_SURRENDER = 0; // 10
KRON_UPS_GUER_SURRENDER = 0; // 10
// knowsAbout 1.03 , 1.49 to add this enemy to "target list" (1-4) the higher number the less detect ability (original in 5.0.7 was 0.5)
// it does not mean the AI will not shoot at you. This mean what must be knowsAbout you to AI start asking by radio for help other groups in KRON_UPS_sharedist from you
R_knowsAboutEnemy = 1.49;
// units will react (change the beahaviour) when dead bodies found
R_deadBodiesReact = false; // true OR flase
// ---------------------------------------------------------------------------------------------------------------------
// Better do not change these variables if you aren't sure !R
// ---------------------------------------------------------------------------------------------------------------------
//Efective distance for doing perfect ambush (max distance is this x2)
KRON_UPS_ambushdist = 70;
//Max distance to target for doing para-drop, will be randomised between 0 and 100% of this value.
KRON_UPS_paradropdist = 250;
//Frequency for doing calculations for each squad.
KRON_UPS_Cycle = 10; //org 20
//Time that lider wait until doing another movement, this time reduced dynamically under fire, and on new targets
KRON_UPS_react = 60;
//Min time to wait for doing another reaction
KRON_UPS_minreact = 20; // org 30
//Max waiting is the maximum time patrol groups will wait when arrived to target for doing another target.
KRON_UPS_maxwaiting = 30;
// how long AI units should be in alert mode after initially spotting an enemy
KRON_UPS_alerttime = 90;
// how far opfors should move away if they're under attack
KRON_UPS_safedist = 250; //org 300
// how close unit has to be to target to generate a new one target or to enter stealth mode
KRON_UPS_closeenough = 300; //org 300
//Enable it to send reinforcements, better done it in a trigger inside your mission.
KRON_UPS_reinforcement = false;
//Artillery support, better control if set in trigger
KRON_UPS_ARTILLERY_EAST_FIRE = false; //set to true for doing east to fire
KRON_UPS_ARTILLERY_WEST_FIRE = false; //set to true for doing west to fire
KRON_UPS_ARTILLERY_GUER_FIRE = false; //set to true for doing resistance to fire
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Do not touch these variables !!!! !R
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
R_GOTHIT_ARRAY =[0];
AcePresent = isClass(configFile/"CfgPatches"/"ace_main");
UPSMON_Version = "UPSMON 5.1.0 beta1";
KILLED_CIV_COUNTER = [0,0,0,0,0];
KRON_UPS_flankAngle = 45; //Angulo de flanqueo
KRON_UPS_INIT = 0; //Variable que indica que ha sido inicializado
KRON_UPS_EAST_SURRENDED = false;
KRON_UPS_WEST_SURRENDED = false;
KRON_UPS_GUER_SURRENDED = false;
KRON_AllWest=[]; //All west AI
KRON_AllEast=[]; //All east AI
KRON_AllRes=[]; //All resistance AI
KRON_UPS_East_enemies = [];
KRON_UPS_West_enemies = [];
KRON_UPS_Guer_enemies = [];
KRON_UPS_East_friends = [];
KRON_UPS_West_friends = [];
KRON_UPS_Guer_friends = [];
KRON_targets0 =[];//objetivos west
KRON_targets1 =[];//objetivos east
KRON_targets2 =[];//resistence
KRON_targetsPos =[];//Posiciones de destino actuales.
KRON_NPCs = []; //Lideres de los grupos actuales
KRON_UPS_Instances=0;
KRON_UPS_Total=0;
KRON_UPS_Exited=0;
KRON_UPS_East_Total = 0;
KRON_UPS_West_Total = 0;
KRON_UPS_Guer_Total = 0;
KRON_UPS_ARTILLERY_UNITS = [];
KRON_UPS_ARTILLERY_WEST_TARGET = objnull;
KRON_UPS_ARTILLERY_EAST_TARGET = objnull;
KRON_UPS_ARTILLERY_GUER_TARGET = objnull;
KRON_UPS_TEMPLATES = [];
KRON_UPS_MG_WEAPONS = ["MG36","M249","M240","MK_48","PK","PKm","Pecheneg","M249 Para","M249 Para M145","M240G M145","M60"];
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// ***************************************** SERVER INITIALIZATION *****************************************
if (isNil("KRON_UPS_INIT") || KRON_UPS_INIT == 0) then {
//Init library function, Required Version: 5.0 of mon_functions
call compile preprocessFileLineNumbers "Server\Module\UPSMON\UPSMON\common\MON_functions.sqf";
//init !R functions
call compile preprocessFileLineNumbers "Server\Module\UPSMON\UPSMON\!R\R_functions.sqf";
if (isNil "RE") then {[] execVM "\ca\Modules\MP\data\scripts\MPframework.sqf"};
//scripts initialization
UPSMON = compile preprocessFile "Server\Module\UPSMON\UPSMON.sqf";
UPSMON_surrended = compile preprocessFile "Server\Module\UPSMON\UPSMON\MON_surrended.sqf";
// declaración de variables privadas
private["_obj","_trg","_l","_pos"];
// global functions
KRON_randomPos = {private["_cx","_cy","_rx","_ry","_cd","_sd","_ad","_tx","_ty","_xout","_yout"];_cx=_this select 0; _cy=_this select 1; _rx=_this select 2; _ry=_this select 3; _cd=_this select 4; _sd=_this select 5; _ad=_this select 6; _tx=random (_rx*2)-_rx; _ty=random (_ry*2)-_ry; _xout=if (_ad!=0) then {_cx+ (_cd*_tx - _sd*_ty)} else {_cx+_tx}; _yout=if (_ad!=0) then {_cy+ (_sd*_tx + _cd*_ty)} else {_cy+_ty}; [_xout,_yout]};
KRON_PosInfo = {private["_pos","_lst","_bld","_bldpos"];_pos=_this select 0; _lst=_pos nearObjects ["House",12]; if (count _lst==0) then {_bld=0;_bldpos=0} else {_bld=_lst select 0; _bldpos=[_bld] call KRON_BldPos}; [_bld,_bldpos]};
KRON_PosInfo3 = {private["_pos","_lst","_bld","_bldpos"];_pos=_this select 0; _lst= nearestObjects [_pos, [], 3];
if (count _lst==0) then {_bld=objnull;_bldpos=0} else {_bld = nearestbuilding (_lst select 0);
_bldpos=[_bld] call KRON_BldPos2}; [_bld,_bldpos]};
KRON_BldPos = {private ["_bld","_bldpos","_posZ","_maxZ"];_bld=_this select 0;_maxZ=0;_bi=0;_bldpos=0;while {_bi>=0} do {if (((_bld BuildingPos _bi) select 0)==0) then {_bi=-99} else {_bz=((_bld BuildingPos _bi) select 2); if (((_bz)>4) && ((_bz>_maxZ) || ((_bz==_maxZ) && (random 1>.8)))) then {_maxZ=_bz; _bldpos=_bi}};_bi=_bi+1};_bldpos};
KRON_BldPos2 = {private ["_bld","_bldpos"];
_bld=_this select 0; _bldpos = 1;
while {format ["%1", _bld buildingPos _bldpos] != "[0,0,0]"} do {_bldpos = _bldpos + 1;};
_bldpos = _bldpos - 1; _bldpos;};
KRON_getDirPos = {private["_a","_b","_from","_to","_return"]; _from = _this select 0; _to = _this select 1; _return = 0; _a = ((_to select 0) - (_from select 0)); _b = ((_to select 1) - (_from select 1)); if (_a != 0 || _b != 0) then {_return = _a atan2 _b}; if ( _return < 0 ) then { _return = _return + 360 }; _return};
KRON_distancePosSqr = {round(((((_this select 0) select 0)-((_this select 1) select 0))^2 + (((_this select 0) select 1)-((_this select 1) select 1))^2)^0.5)};
KRON_relPos = {private["_p","_d","_a","_x","_y","_xout","_yout"];_p=_this select 0; _x=_p select 0; _y=_p select 1; _d=_this select 1; _a=_this select 2; _xout=_x + sin(_a)*_d; _yout=_y + cos(_a)*_d;[_xout,_yout,0]};
KRON_rotpoint = {private["_cp","_a","_tx","_ty","_cd","_sd","_cx","_cy","_xout","_yout"];_cp=_this select 0; _cx=_cp select 0; _cy=_cp select 1; _a=_this select 1; _cd=cos(_a*-1); _sd=sin(_a*-1); _tx=_this select 2; _ty=_this select 3; _xout=if (_a!=0) then {_cx+ (_cd*_tx - _sd*_ty)} else {_cx+_tx}; _yout=if (_a!=0) then {_cy+ (_sd*_tx + _cd*_ty)} else {_cy+_ty}; [_xout,_yout,0]};
KRON_stayInside = {
private["_np","_nx","_ny","_cp","_cx","_cy","_rx","_ry","_d","_tp","_tx","_ty","_fx","_fy"];
_np=_this select 0; _nx=_np select 0; _ny=_np select 1;
_cp=_this select 1; _cx=_cp select 0; _cy=_cp select 1;
_rx=_this select 2; _ry=_this select 3; _d=_this select 4;
_tp = [_cp,_d,(_nx-_cx),(_ny-_cy)] call KRON_rotpoint;
_tx = _tp select 0; _fx=_tx;
_ty = _tp select 1; _fy=_ty;
if (_tx<(_cx-_rx)) then {_fx=_cx-_rx};
if (_tx>(_cx+_rx)) then {_fx=_cx+_rx};
if (_ty<(_cy-_ry)) then {_fy=_cy-_ry};
if (_ty>(_cy+_ry)) then {_fy=_cy+_ry};
if ((_fx!=_tx) || (_fy!=_ty)) then {_np = [_cp,_d*-1,(_fx-_cx),(_fy-_cy)] call KRON_rotpoint};
_np;
};
// Misc
KRON_UPSgetArg = {private["_cmd","_arg","_list","_a","_v"]; _cmd=_this select 0; _arg=_this select 1; _list=_this select 2; _a=-1; {_a=_a+1; _v=format["%1",_list select _a]; if (_v==_cmd) then {_arg=(_list select _a+1)}} foreach _list; _arg};
KRON_UPSsetArg = {private["_cmd","_arg","_list","_a","_v"];
_cmd=_this select 0;
_arg=_this select 1;
_list=_this select 2;
_a=-1;
{
_a=_a+1;
_v= format ["%1", _list select _a];
if (_v==_cmd) then {
_a=_a+1;
_list set [_a,_arg];
};
} foreach _list;
_list};
KRON_deleteDead = {private["_u","_s"];_u=_this select 0; _s= _this select 1; _u removeAllEventHandlers "killed"; sleep _s; deletevehicle _u};
// ***********************************************************************************************************
// MAIN UPSMON SERVER FUNCTION
// ***********************************************************************************************************
MON_MAIN_server = {
private["_obj","_trg","_l","_pos","_countWestSur","_countEastSur","_countResSur","_WestSur","_EastSur","_ResSur","_target","_targets","_targets0","_targets1","_targets2","_npc","_cycle"
,"_arti","_side","_range","_rounds","_area","_maxcadence","_mincadence","_bullet","_fire","_knownpos","_sharedenemy","_enemyside","_timeout"];
_cycle = 10; //Time to do a call to commander
_arti = objnull;
_side = "";
_range = 0;
_rounds = 0;
_area = 0;
_maxcadence = 0;
_mincadence = 0;
_bullet = "";
_fire = false;
_target = objnull;
_knownpos =[0,0,0];
_enemyside = [];
_WestSur = KRON_UPS_WEST_SURRENDED;
_EastSur = KRON_UPS_EAST_SURRENDED;
_ResSur = KRON_UPS_GUER_SURRENDED;
//Main loop
while {true} do
{
_countWestSur = round ( KRON_UPS_West_Total * KRON_UPS_WEST_SURRENDER / 100);
_countEastSur = round ( KRON_UPS_East_Total * KRON_UPS_EAST_SURRENDER / 100);
_countResSur = round ( KRON_UPS_Guer_Total * KRON_UPS_GUER_SURRENDER / 100);
//Checks for WEST surrender
if (KRON_UPS_WEST_SURRENDER > 0 && !KRON_UPS_WEST_SURRENDED ) then {
{
if (!alive _x || !canmove _x) then {KRON_AllWest = KRON_AllWest-[_x]};
}foreach KRON_AllWest;
if ( count KRON_AllWest <= _countWestSur ) then {
KRON_UPS_WEST_SURRENDED = true;
publicvariable "KRON_AllWest";
publicvariable "KRON_UPS_WEST_SURRENDED";
};
};
//Checks for EAST surrender
if (KRON_UPS_EAST_SURRENDER > 0 && !KRON_UPS_EAST_SURRENDED ) then {
{
if (!alive _x || !canmove _x) then {KRON_AllEast = KRON_AllEast-[_x]};
}foreach KRON_AllEast;
if ( count KRON_AllEast <= _countEastSur ) then {
KRON_UPS_EAST_SURRENDED = true;
publicvariable "KRON_AllEast";
publicvariable "KRON_UPS_EAST_SURRENDED";
};
};
//Checks for RESISTANCE surrender
if (KRON_UPS_GUER_SURRENDER > 0 && !KRON_UPS_GUER_SURRENDED ) then {
{
if (!alive _x || !canmove _x) then {KRON_AllRes = KRON_AllRes-[_x]};
}foreach KRON_AllRes;
if ( count KRON_AllRes <= _countResSur ) then {
KRON_UPS_GUER_SURRENDED = true;
publicvariable "KRON_AllRes";
publicvariable "KRON_UPS_GUER_SURRENDED";
};
};
//Exec surrended script
if (KRON_UPS_WEST_SURRENDED && !_WestSur ) then {
_WestSur = true;
[west] spawn UPSMON_surrended;
};
if (KRON_UPS_EAST_SURRENDED && !_EastSur ) then {
_EastSur = true;
[east] spawn UPSMON_surrended;
};
if (KRON_UPS_GUER_SURRENDED && !_ResSur ) then {
_ResSur = true;
[Resistance] spawn UPSMON_surrended;
};
sleep 0.5;
_sharedenemy = 0;
_targets0 = [];
_targets1 = [];
_targets2 = [];
{
if (!isnull _x && alive _x && !captive _x ) then {
_npc = _x;
_targets = [];
switch (side _npc) do {
//West targets
case west: {
_sharedenemy = 0;
_enemyside = [east];
};
//East targets
case east: {
_sharedenemy = 1;
_enemyside = [west];
};
//Resistance targets
case resistance: {
_sharedenemy = 2;
_enemyside = KRON_UPS_Res_enemy;
};
};
if (side _npc in KRON_UPS_Res_enemy) then {
_enemyside = _enemyside + [resistance];
};
//Gets known targets on each leader for comunicating enemy position
//Has better performance with targetsquery
//_targets = _npc nearTargets KRON_UPS_sharedist;
_targets = _npc targetsQuery ["","","","",""];
{
//_target = _x select 4; //Neartargets
_target = _x select 1; //Targetsquery
if ( side _target in _enemyside ) then {
// if (KRON_UPS_Debug>0) then {player globalchat format["%1: knows about %2, enemies=%3",_npc getVariable ("UPSMON_grpid"),_npc knowsabout _target, _npc countEnemy _targets ]};
if (!isnull _target && alive _target && canmove _target && !captive _target && _npc knowsabout _target > R_knowsAboutEnemy
&& ( _target iskindof "Land" || _target iskindof "Air" || _target iskindof "Ship" )
&& !( _target iskindof "Animal")
&& ( _target emptyPositions "Gunner" == 0 && _target emptyPositions "Driver" == 0
|| (!isnull (gunner _target) && canmove (gunner _target))
|| (!isnull (driver _target) && canmove (driver _target)))
) then {
//Saves last known position
//_knownpos = _x select 0; //Neartargets
_knownpos = _x select 4;//Targetsquery
_target setvariable ["UPSMON_lastknownpos", _knownpos, false];
// _npc setVariable ["R_knowsAboutTarget", true, false]; // !R
call (compile format ["_targets%1 = _targets%1 - [_target]",_sharedenemy]);
call (compile format ["_targets%1 = _targets%1 + [_target]",_sharedenemy]);
};
};
sleep 0.01;
} foreach _targets;
};
sleep 0.01;
}foreach KRON_NPCs;
//Share targets
KRON_targets0 = _targets0;
KRON_targets1 = _targets1;
KRON_targets2 = _targets2;
//Target debug console
if (KRON_UPS_Debug>0) then {hintsilent parseText format["%1<br/>--------------------------<br/><t color='#33CC00'>West(A=%2 C=%3 T=%4)</t><br/><t color='#FF0000'>East(A=%5 C=%6 T=%7)</t><br/><t color='#00CCFF'>Res(A=%8 C=%9 T=%10)</t><br/>"
,UPSMON_Version
,KRON_UPS_West_Total, count KRON_AllWest, count KRON_targets0
,KRON_UPS_East_Total, count KRON_AllEast, count KRON_targets1
,KRON_UPS_Guer_Total, count KRON_AllRes, count KRON_targets2 ]};
sleep 0.5;
//Artillery module control
{
_arti = _x select 0;
_rounds = _x select 1;
_range = _x select 2;
_area = _x select 3;
_maxcadence = _x select 4;
_mincadence = _x select 5;
_bullet = _x select 6;
_salvobreak = _x select 7;
if (isnil{_arti getVariable ("timeout")}) then {
_arti setVariable ["timeout", time, false];
sleep 0.1;
};
_timeout = _arti getVariable ("timeout");
if (!isnull (gunner _arti) && canmove (gunner _arti) && (time >= _timeout)) then {
_side = side gunner _arti;
_fire = call (compile format ["KRON_UPS_ARTILLERY_%1_FIRE",_side]);
//If fire enabled gets a known target pos for doing fire if no friendly squads near.
if (_fire) then {
_target = call (compile format ["KRON_UPS_ARTILLERY_%1_TARGET",_side]);
if (isnil "_target" ) then {_target = objnull;};
switch (_side) do {
//West targets
case west: {
_targets = KRON_targets0;
};
//East targets
case east: {
_targets = KRON_targets1;
};
//Resistance targets
case resistance: {
_targets = KRON_targets2;
};
};
//Check if has a target
if (!(_target in _targets ) || isnull _target || !alive _target) then {
_target = objnull;
{
_auxtarget = _x;
_targetPos = _auxtarget getvariable ("UPSMON_lastknownpos");
if (!isnil "_targetPos") then {
//If target in range check no friendly squad near
if (alive _auxtarget && !(_auxtarget iskindof "Air") && (round([position _arti,_targetPos] call KRON_distancePosSqr)) <= _range) then {
_target = _auxtarget;
//Must check if no friendly squad near fire position
{
if (!isnull _x && _side == side _x) then {
if ((round([position _x,_targetPos] call KRON_distancePosSqr)) < (KRON_UPS_safedist * 0.7)) exitwith {_target = objnull;};
};
} foreach KRON_NPCs;
};
};
//If target found exit
if (!isnull _target) exitwith {};
} foreach _targets;
};
//If target fires artillery
if (!isnull _target) then {
//Fix current target
call (compile format ["KRON_UPS_ARTILLERY_%1_TARGET = _target",_side]);
_targetPos = _target getvariable ("UPSMON_lastknownpos");
if (!isnil "_targetPos") then {
_arti removeAllEventHandlers "fired"; sleep 0.01;
// chatch the bullet in the air and delete it
_arti addeventhandler["fired", {deletevehicle (nearestobject[_this select 0, _this select 4])}];
[_arti,_targetPos,_rounds,_area,_maxcadence,_mincadence,_bullet,_salvobreak] spawn MON_artillery_dofire;
};
};
};
};
sleep 0.5;
} foreach KRON_UPS_ARTILLERY_UNITS;
// if (KRON_UPS_Debug>0) then {player globalchat format["Init_upsmon artillery=%1",count KRON_UPS_ARTILLERY_UNITS]};
sleep _cycle;
};
};
};
// ***********************************************************************************************************
// INITIALIZATION OF UPSMON
// ***********************************************************************************************************
_l = allunits + vehicles;
{
if ((_x iskindof "AllVehicles") && (side _x != civilian)) then {
_s = side _x;
switch (_s) do {
case west:
{ KRON_AllWest=KRON_AllWest+[_x]; };
case east:
{ KRON_AllEast=KRON_AllEast+[_x]; };
case resistance:
{ KRON_AllRes=KRON_AllRes+[_x]; };
};
};
} forEach _l;
_l = nil;
if (isNil("KRON_UPS_Debug")) then {KRON_UPS_Debug=0};
KRON_UPS_East_enemies = KRON_AllWest;
KRON_UPS_West_enemies = KRON_AllEast;
if (east in KRON_UPS_Res_enemy ) then {
KRON_UPS_East_enemies = KRON_UPS_East_enemies+KRON_AllRes;
KRON_UPS_Guer_enemies = KRON_AllEast;
} else {
KRON_UPS_East_friends = KRON_UPS_East_friends+KRON_AllRes;
KRON_UPS_Guer_friends = KRON_AllEast;
};
if (west in KRON_UPS_Res_enemy ) then {
KRON_UPS_West_enemies = KRON_UPS_West_enemies+KRON_AllRes;
KRON_UPS_Guer_enemies = KRON_UPS_Guer_enemies+KRON_AllWest;
} else {
KRON_UPS_West_friends = KRON_UPS_West_friends+KRON_AllRes;
KRON_UPS_Guer_friends = KRON_UPS_Guer_friends+KRON_AllWest;
};
KRON_UPS_West_Total = count KRON_AllWest;
KRON_UPS_East_Total = count KRON_AllEast;
KRON_UPS_Guer_Total = count KRON_AllRes;
//Initialization done
KRON_UPS_INIT=1;
//killciv EH
_l = allunits;
{
if (side _x == civilian) then {
_x AddEventHandler ["firedNear", {nul = _this spawn R_SN_EHFIREDNEAR}];
sleep 0.01;
_x AddEventHandler ["killed", {nul = _this spawn R_SN_EHKILLEDCIV}];
sleep 0.01;
};
} forEach _l;
_l = nil;
// ---------------------------------------------------------------------------------------------------------
processInitCommands;
//Executes de main process of server
[] SPAWN MON_MAIN_server;
diag_log "--------------------------------";
diag_log (format["UPSMON started"]);
if(true) exitWith {};
|