tinboye

Exile Convoy

Mar 26th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.53 KB | None | 0 0
  1. //===========================================================================
  2. //THIS VERSION IS FOR ARMA 3: ANDRE CONVOYS / Updated by Tinboye for ExileMod
  3. //===========================================================================
  4.  
  5. if (isServer) then {
  6. //=======================
  7. //BASIC KONFIGURATION 1!
  8. //=======================
  9.  
  10. //Vehicles: Its ok to repeate the same car with different configuration.
  11. donn_carsConvy = [
  12. //(0) Crew: 2 / Armed
  13. ["Exile_Car_Offroad_Armed_Guerilla12",0,["100Rnd_127x99_mag_Tracer_Yellow"]],
  14. //(1) Crew: 3 / Armed
  15. ["Exile_Car_Offroad_Armed_Guerilla03",1,["100Rnd_127x99_mag_Tracer_Yellow"]],
  16. //(2) Crew: 4 / Armored
  17. ["Exile_Car_Strider",2,["200Rnd_127x99_mag_Tracer_Yellow"]],
  18. //(3) Crew: 4 / Armored
  19. ["Exile_Car_SUV_Armed_Black",3,[]],
  20. //(4) Crew: 2 / Armored
  21. ["Exile_Car_Zamak",1,[]],
  22. //(5) Crew: 6 / Uncovered Truck
  23. ["Exile_Car_HMMWV_M134_Desert",5,[]],
  24. //(6) Crew: 8 / Covered Truck
  25. ["Exile_Car_Zamak",7,[]]
  26. ];
  27.  
  28. //Soldier of the Convoys
  29. donn_soldierSkin = ["B_Soldier_F","B_Soldier_lite_F","B_Soldier_SL_F","B_Soldier_TL_F"];
  30.  
  31. //=======================
  32. //BASIC KONFIGURATION 2!
  33. //=======================
  34.  
  35. //CONVOY CONFIGURATION
  36.  
  37. //Time between each consecutive spawn
  38. _timeBetweenSpawns = 160;
  39.  
  40. //Cars in each convoy (refere to donn_carsConvy)
  41. _convoyFormation = [
  42. [0,5],
  43. [3,4],
  44. [1,3],
  45. [6],
  46. [1,6],
  47. [3,3],
  48. [4,5],
  49. [3,3]
  50. ];
  51.  
  52. //Crew Skill (driver, cargors and turreters)
  53. _driverManSkill = 0.8; //Skill of the driver, from 0 to 1
  54. _cargoMansSkill = 0.8; //Skill of the cargo ocupants, from 0 to 1
  55. _turretMansSkill = 0.1; //Skill ot the turret operators, from 0 to 1
  56.  
  57. //RUNNER BOMBER MAN CONFIG - Percentage of bomberman AI in car disembarks: 0 is 0% and 1 is 100%
  58. //Those bomberman will not fight and search for a player to explode right after disembark
  59. //0.2 means 1 runner bomber each 5 vehicle disembark (1/0.2 = 5)
  60. donn_runnerBomberManPerc = 0.2;
  61.  
  62. //Others
  63. _lootCutter = 2; //Number of loot piles in veh are divided by this number (minimum of 1 loot pile)
  64. _showCrewNumber = true; //Show crew number on the vehicle icon on map?
  65.  
  66. //====================
  67. //MAP CONFIGURATION
  68. //====================
  69.  
  70. // 0 - Altis; 1 - Chernarus; 2 - Bornholm; 3 - Napf
  71. _myMapIs = 3;
  72.  
  73. //Select Spawns Based on _myMapIs
  74. //VEHICLES SPAWN: [[vehicle spawn position],[nothing],spawn angle,spawn radius]
  75. _spawns = [
  76. //Altis (0)
  77. [
  78. [[10648,15920,0.2],[],174,15],
  79. [[16514,15674,0.2],[],20,15],
  80. [[21484,7850,0.2],[],108,15],
  81. [[5797,13747,0.2],[],335,15]
  82. ],
  83. //Chernarus (1)
  84. [
  85. [[2296,15313,0.1],[],152,15],
  86. [[9732,13466,0.1],[],184,15],
  87. [[13361,5430,0.1],[],269,15],
  88. [[33,1589,0.1],[],82,15]
  89. ],
  90. //Bornholm (2)
  91. [
  92. [[14870,2816,0.2],[],0,15],
  93. [[3477,7397,0.2],[],180,15],
  94. [[10308,10118,0.2],[],0,15],
  95. [[5797,13747,0.2],[],0,15]
  96. ],
  97. //Napf (3)
  98. [
  99. [[5086.517,14879.507,0],[],229.051,15]
  100. ]
  101. ] select _myMapIs;
  102.  
  103. //=====================
  104. //EXTRA KONFIGURATION!
  105. //=====================
  106.  
  107. //LOOT IN VEHICLE
  108. _loot1 = [
  109. [["addWeaponCargoGlobal","Srifle_GM6_F",[1,1,2]],["addMagazineCargoGlobal","5Rnd_127x108_Mag",[4,4,5]]], //Maried Loot
  110. [["addWeaponCargoGlobal","Exile_Weapon_LeeEnfield",[1,1,2]],["addMagazineCargoGlobal","Exile_Magazine_10Rnd_303",[2,3,4]]], //Maried Loot
  111. [["addWeaponCargoGlobal","srifle_DMR_01_F",[1,1,2]],["addMagazineCargoGlobal","10Rnd_762x51_Mag",[4,4,5]]], //Maried Loot
  112. [["addWeaponCargoGlobal","Exile_Weapon_AK107",[1,1,2]],["addMagazineCargoGlobal","Exile_Magazine_30Rnd_762x39_AK", [3,4,5]]], //Maried Loot
  113. [["addWeaponCargoGlobal","Srifle_LRR_F",[1,1,2]],["addMagazineCargoGlobal","7Rnd_408_Mag",[4,4,5]]], //Maried Loot
  114. [["addWeaponCargoGlobal","ItemCompass",[1,2,3]]],
  115. [["addWeaponCargoGlobal","ItemWatch",[1,2,3]]],
  116. [["addWeaponCargoGlobal","Binocular",[1,2,3]]],
  117. [["addWeaponCargoGlobal","acc_flashlight",[1,2,3]]],
  118. [["addMagazineCargoGlobal","Exile_Item_Foolbox",[2,3,4]]],
  119. [["addMagazineCargoGlobal","Exile_Item_Matches",[2,3,4]]],
  120. [["addMagazineCargoGlobal","Exile_Item_EMRE",[4,5,6]]],
  121. [["addMagazineCargoGlobal","Exile_Item_Cement",[4,5,6]]],
  122. [["addMagazineCargoGlobal","Exile_Item_ConcreteWallKit",[4,5,6]]],
  123. [["addMagazineCargoGlobal","Exile_Item_FuelCanisterFull",[2,3,4]]],
  124. [["addMagazineCargoGlobal","B_IR_Grenade",[4,6,8]]],
  125. [["addBackpackCargoGlobal","B_Kitbag_mcamo",[1,2,2]]],
  126. [["addBackpackCargoGlobal","B_TacticalPack_mcamo",[1,2,2]]],
  127. [["addBackpackCargoGlobal","B_AssaultPack_mcamo",[1,2,2]]],
  128. [["addBackpackCargoGlobal","B_FieldPack_ocamo",[1,2,2]]],
  129. [["addBackpackCargoGlobal","B_FieldPack_cbr",[1,2,2]]]
  130. ];
  131.  
  132. //AI WEAPONS & AMMO
  133. _donn_weapons = [
  134. ["Exile_Weapon_AKS_Gold","Exile_Magazine_75Rnd_545x39_RPK_Green"],
  135. ["Exile_Weapon_SVDCamo","Exile_Magazine_10Rnd_762x54"],
  136. ["LMG_Mk200_F","200Rnd_65x39_cased_Box_Tracer"],
  137. ["Arifle_MX_SW_F","100Rnd_65x39_caseless_mag_Tracer"],
  138. ["Arifle_MX_SW_Black_F","100Rnd_65x39_caseless_mag_Tracer"],
  139. ["LMG_Zafir_F","150Rnd_762x51_Box_Tracer"],
  140. ["Exile_Weapon_M1014","Exile_Magazine_8Rnd_74Pellets"],
  141. ["Exile_Weapon_TaurusGold","Exile_Magazine_8Rnd_74Slug"],
  142. ["srifle_EBR_F","20Rnd_762x51_Mag"],
  143. ["srifle_DMR_01_F","10Rnd_762x51_Mag"],
  144. ["arifle_MXM_F","30Rnd_65x39_caseless_mag_Tracer"],
  145. ["arifle_MXM_Black_F","30Rnd_65x39_caseless_mag_Tracer"]
  146. ];
  147.  
  148. //=========================
  149. //END OF KONFIGURATION
  150. //=========================
  151.  
  152. //==============================================================================================================
  153. //==============================================================================================================
  154. //==============================================================================================================
  155. //==============================================================================================================
  156.  
  157. //=================================================================
  158. //Generate Function Begin =========================================
  159. //=================================================================
  160.  
  161. //Find Roads Intersections (can be separated by water)
  162. donn_find_intersections = {
  163. _minDist = _this select 0;
  164. _roads = [0,0,0] nearRoads 50000;
  165. _donn_wps = [];
  166. {
  167. _road = _x;
  168. if (count roadsConnectedTo _x > 2) then {
  169. _alone = true;
  170. {
  171. if (_road distance _x < _minDist) exitWith {
  172. _alone = false;
  173. };
  174. } forEach _donn_wps;
  175. if (_alone) then {
  176. _donn_wps = _donn_wps + [position _x];
  177. };
  178. };
  179. } forEach _roads;
  180. _donn_wps
  181. };
  182.  
  183. //AI handle damage Event Handler
  184. donn_casca_unit_HD = {
  185. _hurtedOne = _this select 0;
  186. _partDamage = _this select 1;
  187. _damage = _this select 2;
  188. _ofender = _this select 3;
  189. if (isPlayer _ofender) then {
  190. _dist = _ofender distance _hurtedOne; //MANY
  191. _groupShoted = group _hurtedOne; //MANY
  192. _groupShoted setVariable ["donn_pshot",true,false]; //MANY
  193. if (_dist < 300) then {_groupShoted reveal [_this select 3,4];}; //MANY
  194. } else {
  195. if (_hurtedOne != _ofender) then {_damage = 0;};
  196. };
  197. _damage
  198. };
  199.  
  200. //BomberMan handle damage
  201. donn_casca_unit_HD_bomber = {
  202. _hurtedOne = _this select 0;
  203. _partDamage = _this select 1;
  204. _damage = _this select 2;
  205. _ofender = _this select 3;
  206. if (isPlayer _ofender) then {
  207. if (_partDamage == "body" && _damage > 1) then {
  208. _uPos = position _hurtedOne;
  209. "HelicopterExploSmall" createVehicle _uPos;
  210. _hurtedOne setPos [0,0,0];
  211. deleteVehicle _hurtedOne;
  212. };
  213. } else {
  214. if (_hurtedOne != _ofender) then {_damage = 0;};
  215. };
  216. _damage
  217. };
  218.  
  219. //Vehicle Handle Damage
  220. donn_casca_veh_HD = {
  221. _motor = _this select 0;
  222. _dist = (_this select 3) distance _motor;
  223. _groupShoted = _motor getVariable ["car_group",GrpNull];
  224. _inWar = _groupShoted getVariable ["donn_inWar",false];
  225. if (!_inWar) then {
  226. _crew = crew _motor;
  227. if (count _crew > 0) then {
  228. _groupShoted setVariable ["donn_pshot",true,false];
  229. if (_dist < 120) then {_groupShoted reveal [_this select 3,4];};
  230. };
  231. };
  232. if (_inWar) then {_groupShoted setVariable ["donn_pshot",true,false]; if (_dist < 120) then {_groupShoted reveal [_this select 3,4];};};
  233. };
  234.  
  235. //Clean AI on death and re-assign a new driver
  236. donn_cleanUnit = {
  237. _unit = _this select 0;
  238. _motor = assignedVehicle _unit;
  239. _role = assignedVehicleRole _unit;
  240. _unit removeAllEventHandlers "handleDamage";
  241. if (_role select 0 == "Driver") then {_unit call donn_roll_driver;};
  242. {_unit removeMagazine _x;} forEach magazines _unit;
  243. if (random 100 > 60) then {
  244. {_unit removeWeapon _x;} forEach weapons _unit;
  245. };
  246. donn_units_motor = donn_units_motor - [_unit];
  247. };
  248.  
  249. //Loot Selection Function
  250. donn_selectLoot = {
  251. _lootsOriginal = _this select 0;
  252. _qtd = _this select 1;
  253. _loots = +_lootsOriginal;
  254. _qtd = _qtd min 8;
  255. _return = [];
  256. for "_x" from 0 to (_qtd - 1) do {
  257. _rnd = (ceil (random (count _loots))) - 1;
  258. _rnd = _rnd max 0;
  259. _return = _return + [_loots select _rnd];
  260. _loots set [_rnd,"delme"];
  261. _loots = _loots - ["delme"];
  262. if (count _loots == 0) then {_loots = +_lootsOriginal;};
  263. };
  264. _return
  265. };
  266.  
  267. //Add or Remove Turret Ammo - Function
  268. donn_cascar_tuAmmo = {
  269. _ammos = _this select 0;
  270. _motor = _this select 1;
  271. _action = _this select 2;
  272. if (_action == "add") then {
  273. {
  274. _ammo = _x;
  275. for "_a" from 1 to 8 do {
  276. _motor addMagazineTurret [_ammo,[_forEachIndex]];
  277. };
  278. } forEach _ammos;
  279. };
  280. if (_action == "remove") then {
  281. {
  282. _motor removeMagazinesTurret [_x,[_forEachIndex]];
  283. } forEach _ammos;
  284. };
  285. };
  286.  
  287. //Select a new driver
  288. donn_roll_driver = {
  289. _unit = _this;
  290. _assignedVehDrv = assignedVehicle _unit;
  291. _unitsGrp = units group _unit;
  292. _newDriver = ObjNull;
  293. {
  294. if (alive _x) then {
  295. if (assignedVehicle _x == _assignedVehDrv) then {
  296. if (isNull _newDriver) then {
  297. _newDriver = _x;
  298. } else {
  299. if ((assignedVehicleRole _newDriver) select 0 == "Turret") then {
  300. _newDriver = _x;
  301. };
  302. };
  303. };
  304. };
  305. } forEach (_unitsGrp - [_unit]);
  306. if (!isNull _newDriver) then {
  307. unassignVehicle _unit;
  308. _newDriver assignAsDriver _assignedVehDrv;
  309. if ((group _newDriver) getVariable "donn_inWar") then {
  310. if ((assignedVehicleRole _newDriver) select 0 == "Turret") then {
  311. [_newDriver] orderGetIn false;
  312. [_newDriver] allowGetIn false;
  313. _newDriver setSkill 1;
  314. };
  315. };
  316. };
  317. };
  318.  
  319. //Protect Vehicles from players until all crew is off
  320. donn_casca_getIn = {
  321. _motor = _this select 0;
  322. _unit = _this select 2;
  323. if (isPlayer _unit) then {
  324. _carGroup = _motor getVariable ["car_group",GrpNull];
  325. _allOff = true;
  326. {if (alive _x && assignedVehicle _x == _motor) then {_allOff = false;};} forEach units _carGroup;
  327. if (!_allOff) then {_unit action ['getOut', _motor];};
  328. if (_allOff) then {
  329. _motor removeAllEventHandlers "handleDamage";
  330. _motor removeAllEventHandlers "getIn";
  331. _motor removeAllEventHandlers "getOut";
  332. _motor setFuel 0.5;
  333. };
  334. };
  335. };
  336.  
  337. //Make bomber man on disembark
  338. donn_disembarkCount = 0;
  339. donn_casca_getOut = {
  340. _unit = _this select 2;
  341. if (!isPlayer _unit) then {
  342. donn_disembarkCount = donn_disembarkCount + 1;
  343. if (donn_disembarkCount mod (round (1/(donn_runnerBomberManPerc max 0.001))) == 0) then {
  344. _agentPos = position assignedVehicle _unit;
  345. _agent = createAgent ["B_Soldier_exp_F",_agentPos,[],0,"NONE"];
  346. _agent removeAllEventHandlers "handleDamage";
  347. _agent addEventHandler ["handleDamage",{_this call donn_casca_unit_HD_bomber}];
  348. [objNull,_agent, group _unit] execFSM "andre_convoy_bomber.fsm";
  349. };
  350. };
  351. };
  352.  
  353. //Route Maker
  354. donn_makeroute = {
  355. _origin = _this select 0;
  356. _rosa_group = _this select 1;
  357. _speed = _this select 2;
  358. _posBefore = _origin;
  359. _posNow = _origin;
  360. _wp = _rosa_group addWaypoint [_posNow,0,0];
  361. _wp setWaypointCompletionRadius 15;
  362. _wp setWaypointType "MOVE";
  363. _wp setWaypointSpeed _speed;
  364. _posNext = [0,0,0];
  365. for "_c" from 1 to 5 do {
  366. _distToBefore = 0;
  367. _distToNext = 0;
  368. _found = false;
  369. for "_x" from 1 to 200 do {
  370. _posNext = donn_wps call BIS_fnc_selectRandom;
  371. _distToNext = _posNow distance _posNext;
  372. _distToBefore = _posNext distance _posBefore;
  373. _otherIsland = false;
  374. if (_distToNext > 2500 && _distToNext < 5000 && _distToBefore > 2000) then {
  375. _found = true;
  376. _distUnits = _distToNext/20;
  377. _dltX = ((_posNext select 0) - (_posNow select 0))/_distUnits;
  378. _dltY = ((_posNext select 1) - (_posNow select 1))/_distUnits;
  379. for "_i" from 1 to _distUnits do {
  380. _travelPos = [(_posNow select 0)+_i*_dltX,(_posNow select 1)+_i*_dltX];
  381. if (surfaceIsWater _travelPos) exitWith {_found = false;};
  382. };
  383. };
  384. if (_found) exitWith {};
  385. sleep 0.001;
  386. };
  387. if (!_found) then {_posNext = donn_wps call BIS_fnc_selectRandom;};
  388. _wp = _rosa_group addWaypoint [_posNext,0,_c];
  389. _wp setWaypointCompletionRadius 15;
  390. _wp setWaypointType "MOVE";
  391. _wp setWaypointSpeed _speed;
  392. _posNow = _posNext;
  393. };
  394. _wp = _rosa_group addWaypoint [_origin,0,6];
  395. _wp setWaypointCompletionRadius 15;
  396. _wp setWaypointType "CYCLE";
  397. _wp setWaypointSpeed _speed;
  398. };
  399.  
  400. //MoveTo unit to vehcile
  401. donn_moveTB_veh = {
  402. {
  403. _role = assignedVehicleRole _x;
  404. if (count _role > 0) then {
  405. _roleTxt = _role select 0;
  406. if (_roleTxt == "CARGO") then {
  407. _x action ["moveToCargo", assignedVehicle _x];
  408. };
  409. if (_roleTxt == "DRIVER") then {
  410. _x action ["moveToDriver", assignedVehicle _x];
  411. };
  412. if (_roleTxt == "TURRET") then {
  413. _rolePos = _role select 1;
  414. _x action ["moveToTurret", assignedVehicle _x,_rolePos];
  415. };
  416. };
  417. } forEach _this;
  418. };
  419.  
  420. //=================================================================
  421. //Generate Function End ===========================================
  422. //=================================================================
  423.  
  424. //Find Waypoints: Automatic find street waypoints
  425. donn_wps = [1200] call donn_find_intersections;
  426.  
  427. //Show Spawn Icons on Map / refuel Vehicles / Show convoy icons on map
  428. donn_motor = [];
  429. donn_units_motor = [];
  430. [_spawns,_showCrewNumber] spawn {
  431. //Convoy Icons on Map Iniciate variables
  432. _showCrewNumber = _this select 1;
  433. _add = [];
  434. _remove = [];
  435. _update = [];
  436. _donn_units_motor_icon_old = [];
  437. //Add Icon Function
  438. _addIcon = {
  439. _iName = _this select 0;
  440. _iPos = _this select 1;
  441. _iColor = _this select 2;
  442. _iText = _this select 3;
  443. _mark = createMarker [_iName, _iPos];
  444. _mark setMarkerColor _iColor;
  445. _mark setMarkerShape "Icon";
  446. _mark setMarkerType "mil_dot";
  447. _mark setMarkerText _iText;
  448. };
  449.  
  450. //Spawn icons on map iniciate variables
  451. _spawns = _this select 0;
  452. _donn_casca_icons = [];
  453. {_donn_casca_icons = _donn_casca_icons + [[_x select 0,"Convoy Spawn " + str (_forEachIndex + 1)]];} forEach _spawns;
  454.  
  455. //While: Spawn icons / Convoy Icons / Refuel
  456. _sleep_a = 0;
  457. _sleep_b = 0;
  458. _sleep_c = 0;
  459. while {true} do {
  460. //Spawn Icons Add
  461. if (_sleep_a == 0) then {
  462. {
  463. _mark = createMarker ["Donn_Spawn_" + str _forEachIndex, _x select 0];
  464. _mark setMarkerShape "Icon";
  465. _mark setMarkerText (_x select 1);
  466. _mark setMarkerType "mil_dot";
  467. _mark setMarkerColor "ColorPink";
  468. } forEach _donn_casca_icons;
  469. };
  470.  
  471. //Refual Vehicles each 180 seconds
  472. if (_sleep_b >= 200) then {
  473. _sleep_b = 0;{_x setFuel 1;} forEach donn_motor;
  474. };
  475.  
  476. //Convoy Icons
  477. {
  478. deleteMarker vehicleVarName _x;
  479. } forEach _remove;
  480. {
  481. _color = "";
  482. if (_x isKindOf "LandVehicle") then {
  483. if (_x getVariable ["donn_tu",false]) then {_color = "ColorRed";} else {_color = "ColorBlue";};
  484. } else {
  485. _color = "ColorYellow";
  486. };
  487. _array = [vehicleVarName _x,position _x,_color,""];
  488. _array call _addIcon;
  489. } forEach _add;
  490. {
  491. _posXY = position _x;
  492. _marker = vehicleVarName _x;
  493. _marker setMarkerPos (getPosATL _x);
  494. if (_x isKindOf "LandVehicle") then {
  495. if (_showCrewNumber) then {_marker setMarkerText str ({alive _x} count crew _x);};
  496. };
  497.  
  498. } forEach _update;
  499. _donn_units_motor_icon = [];
  500. _vehIcon = [];
  501. {
  502. _veh = vehicle _x;
  503. _assigned = assignedVehicle _x;
  504. if (_veh != _x) then {
  505. if !(_veh in _vehIcon) then {
  506. _vehIcon = _vehIcon + [_veh];
  507. _donn_units_motor_icon = _donn_units_motor_icon + [_veh];
  508. };
  509. } else {
  510. _donn_units_motor_icon = _donn_units_motor_icon + [_x];
  511. };
  512. if !(_assigned in _vehIcon) then {
  513. _vehIcon = _vehIcon + [_assigned];
  514. _donn_units_motor_icon = _donn_units_motor_icon + [_assigned];
  515. };
  516. } forEach donn_units_motor;
  517. if (_sleep_c >= 20) then {
  518. _add = _donn_units_motor_icon;
  519. _remove = _donn_units_motor_icon_old;
  520. _donn_units_motor_icon_old = _donn_units_motor_icon;
  521. _sleep_c = 0;
  522. } else {
  523. _add = _donn_units_motor_icon - _donn_units_motor_icon_old;
  524. _remove = _donn_units_motor_icon_old - _donn_units_motor_icon;
  525. _update = _donn_units_motor_icon - _add;
  526. _donn_units_motor_icon_old = _donn_units_motor_icon;
  527. };
  528.  
  529. //Sleep Divisor of all
  530. _sleepTime = 2.5;
  531. sleep _sleepTime;
  532. _sleep_a = _sleep_a + _sleepTime;
  533. _sleep_b = _sleep_b + _sleepTime;
  534. _sleep_c = _sleep_c + _sleepTime;
  535.  
  536. //Spawn Icons Remove
  537. if (_sleep_a == 15) then {
  538. _sleep_a = 0;
  539. {deleteMarker ("Donn_Spawn_" + str _forEachIndex);} forEach _donn_casca_icons;
  540. };
  541. };
  542. };
  543.  
  544. //Safe Sleep
  545. sleep 15;
  546.  
  547. //Spawn Casca Units/Cars
  548. for "_cs" from 1 to (count _convoyFormation) do {
  549. diag_log ("[CASCA CONVOY] Initialized Spawn! " + str _cs);
  550.  
  551. //Inicialization
  552. _spawn = _spawns select ((_cs + ((count _spawns)-1)) mod (count _spawns));
  553. _origin = _spawn select 0;
  554. _rad = _spawn select 3;
  555. _rosa_group = createGroup east;
  556. _convoy = _convoyFormation select (_cs-1);
  557. _behaviorSafe = "CARELESS";
  558. _speed = "NORMAL";
  559. _qtd = count _convoy;
  560. _cars = [];
  561. {
  562. _cars = _cars + [donn_carsConvy select _x];
  563. } forEach _convoy;
  564. for "_n" from 1 to _qtd do {
  565.  
  566. //Spawn Car
  567. _car = _cars select (_n - 1);
  568. _motor = createVehicle [_car select 0,_origin,[],_rad,"NONE"];
  569. _motor allowDamage false;
  570. _motor setVehicleVarName ("CASCA_CAR_" + str _cs + "_" + str _n);
  571. _motor setVariable ["car_group",_rosa_group,false];
  572. _motor removeAllEventHandlers "HandleDamage";
  573. _motor addEventHandler ["HandleDamage",{_this call donn_casca_veh_HD}];
  574. _motor setDir (_spawn select 2);
  575. _motor setFuel 1;
  576. donn_motor = donn_motor + [_motor];
  577. _motor addEventHandler ["GetIn",{_this call donn_casca_getIn;}];
  578. _motor addEventHandler ["GetOut",{_this call donn_casca_getOut;}];
  579.  
  580. //Add Vehicle Ammo
  581. _ammos = _car select 2;
  582. if (count _ammos > 0) then {
  583. [_ammos,_motor,"add"] call donn_cascar_tuAmmo;
  584. _motor setVariable ["donn_tu",true,true];
  585. };
  586.  
  587. //count Crew
  588. _driverCount = 1;
  589. _turreterCount = count _ammos;
  590. _cargorsCount = _car select 1;
  591. _crewCount = _driverCount + _turreterCount + _cargorsCount;
  592.  
  593. //Put Loot in the Car
  594. clearWeaponCargoGlobal _motor;
  595. clearMagazineCargoGlobal _motor;
  596. {
  597. {call compile format ["_motor %1 ['%2',%3];",_x select 0,_x select 1,_x select 2 select ((_qtd - 1) min 2)];} forEach _x;
  598. } forEach ([_loot1,ceil (_crewCount/_lootCutter)] call donn_selectLoot);
  599.  
  600. //Spawn Soldiers
  601. _gunnerPos = 0;
  602. for "_y" from 1 to _crewCount do {
  603.  
  604. //Create Soldier
  605. _skin = donn_soldierSkin call BIS_fnc_selectRandom;
  606. _unit = _rosa_group createUnit [_skin,[50,50,50],[],50,"PRIVATE"];
  607. _unit setVehicleVarName ("CASCA_AI_" + str _cs + "_" + str _n + "_" + str _y);
  608. [_unit] joinSilent _rosa_group;
  609. _unit addEventHandler ["Killed",{_this call donn_cleanUnit;}];
  610. _unit addEventHandler ["HandleDamage",{_this call donn_casca_unit_HD}];
  611. donn_units_motor = donn_units_motor + [_unit];
  612. _unit disableAi "TARGET";
  613. _unit disableAi "AUTOTARGET";
  614.  
  615. //Give Soldier Weapon and Ammo
  616. removeAllWeapons _unit;
  617. {_unit removeMagazine _x} forEach magazines _unit;
  618. _weap_mag = _donn_weapons call BIS_fnc_selectRandom;
  619. _weapon = _weap_mag select 0;
  620. _magazine = _weap_mag select 1;
  621. _unit addWeapon _weapon;
  622. _unit selectWeapon _weapon;
  623. for "_pa" from 1 to 8 do {
  624. _unit addMagazine _magazine;
  625. };
  626.  
  627. //Put AI in the car
  628. if (_y == 1) then {
  629. //Driver
  630. _unit assignAsDriver _motor;
  631. _unit moveInDriver _motor;
  632. _unit setSkill _driverManSkill;
  633. };
  634. if (_y > 1 && _y <= 1 + _turreterCount) then {
  635. //Turreters
  636. _unit assignAsGunner _motor;
  637. _unit moveInTurret [_motor,[_gunnerPos]];
  638. _unit setSkill _turretMansSkill;
  639. _gunnerPos = _gunnerPos + 1;
  640. };
  641. if (_y > 1 + _turreterCount) then {
  642. //Cargors
  643. _unit assignAsCargo _motor;
  644. _unit moveInCargo _motor;
  645. _unit setSkill _cargoMansSkill;
  646. };
  647. };
  648. _rosa_group setCombatMode "BLUE";
  649. _rosa_group setBehaviour _behaviorSafe;
  650. _rosa_group setVariable ["donn_pshot",false,false];
  651. _rosa_group setVariable ["donn_inWar",false,false];
  652. {_x allowFleeing 0} forEach units _rosa_group;
  653. {[_x] allowGetIn true;sleep 0.2;} forEach units _rosa_group;
  654. {[_x] orderGetIn true;sleep 0.2;} forEach units _rosa_group;
  655. };
  656.  
  657. //Make Units leave or Embark car
  658. [_rosa_group,_behaviorSafe] spawn {
  659. _rosa_group = _this select 0;
  660. _behaviorSafe = _this select 1;
  661. _noHurtTime = 0;
  662. _tm = 1;
  663. _targetOff = true;
  664. while {!isNil "_rosa_group"} do {
  665. _newHurt = _rosa_group getVariable ["donn_pshot",false];
  666. if (isNil "_newHurt") then {_newHurt = false;};
  667. if (_newHurt) then {
  668. _noHurtTime = 0;
  669. _rosa_group setVariable ["donn_pshot",false,false];
  670. if (_targetOff) then {
  671. _targetOff = false;
  672. _rosa_group setVariable ["donn_inWar",true,false];
  673. {_x enableAi "TARGET";sleep 0.025;} forEach units _rosa_group;
  674. {_x enableAi "AUTOTARGET";sleep 0.025;} forEach units _rosa_group;
  675. sleep 0.5;
  676. _rosa_group setBehaviour "COMBAT";
  677. _rosa_group setCombatMode "RED";
  678. sleep 0.5;
  679. _turreters = [];
  680. {if ((assignedVehicleRole _x) select 0 == "Turret") then {_turreters = _turreters + [_x];};} forEach units _rosa_group;
  681. _leaveToFight = (units _rosa_group) - _turreters;
  682. {[_x] orderGetIn false;sleep 0.05;} forEach _leaveToFight;
  683. {[_x] allowGetIn false;sleep 0.05;} forEach _leaveToFight;
  684. _tm = 15;
  685. };
  686. } else {
  687. _noHurtTime = _noHurtTime + _tm;
  688. if (_noHurtTime > 120) then {
  689. _noDangerFell = true;
  690. {if (_rosa_group knowsAbout _x > 0) exitWith {_noDangerFell = false;};} forEach playableUnits;
  691. if (_noDangerFell) then {
  692. _targetOff = true;
  693. _rosa_group setVariable ["donn_inWar",false,false];
  694. {_x disableAi "TARGET";} forEach units _rosa_group;
  695. {_x disableAi "AUTOTARGET";} forEach units _rosa_group;
  696. sleep 1;
  697. _rosa_group setBehaviour _behaviorSafe;
  698. _rosa_group setCombatMode "BLUE";
  699. sleep 2;
  700. {[_x] allowGetIn true;sleep 0.2;} forEach units _rosa_group;
  701. {[_x] orderGetIn true;sleep 0.2;} forEach units _rosa_group;
  702. _tm = 1;
  703. };
  704. };
  705. };
  706. sleep _tm;
  707. };
  708. };
  709.  
  710. //Make Convoy Route
  711. [_spawn select 0,_rosa_group,_speed,donn_wps] call donn_makeroute;
  712.  
  713. //Sleep Before Next Spawn
  714. sleep _timeBetweenSpawns;
  715. };
  716. };
Add Comment
Please, Sign In to add comment