sreVassigngear.sqfV®JMÀbriefing.htmlV®JMsbriefing.sqfV®JMdescription.extV®JMQendhandler.sqfV®JMõgroupmerge.sqfV®JMŒgroupmergeaction.sqfV®JMEinit.sqfV®JM°markeralpha.sqfV®JMmission.sqm¶­JMÖ onPlayerRespawnAsSeagull.sqsV®JM#preinit.sqfV®JMÀscripts\Init_UPSMON.sqfV®JMsUscripts\UPSMON\actions\followme.sqfV®JM° scripts\UPSMON\common\MON_functions.sqfV®JMscripts\UPSMON\MON_artillery_add.sqfV®JM‰ scripts\UPSMON\MON_spawn.sqfV®JMùscripts\UPSMON\MON_surrended.sqfV®JM,scripts\UPSMON.sqfV®JMÎ?scripts\upsmon.txtV®JML?serverinit.sqfV®JMv$unitmarkers.sqfV®JMú_unit = _this select 0; _strLoadout = _this select 1; if (!isServer) exitWith {}; removeAllWeapons _unit; removeBackPack _unit; if (_strLoadout == "random") then { _strLoadout = ["AKM", "RPK", "AK74PSO", "AKMGL"] select (floor (random 4)); }; switch (_strLoadout) do { case "CMD": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; {_unit addMagazine "1Rnd_HE_M203"} forEach [1,2,3,4]; {_unit addMagazine "ACE_HuntIR_M203"} forEach [1,2,3,4]; _unit addWeapon "ACE_SOC_M4A1_RCO_GL"; _unit addMagazine "HandGrenade_West"; _unit addMagazine "SmokeShell"; {_unit addMagazine "ACE_C4_M";} forEach [1,2]; _unit addWeapon "ACE_HuntIR_monitor"; }; case "TL": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "M4A3_CCO_EP1"; _unit addMagazine "HandGrenade_West"; _unit addMagazine "SmokeShell"; {_unit addMagazine "ACE_C4_M";} forEach [1,2]; _unit addWeapon "ACE_HuntIR_monitor"; _unit addWeapon "ACE_M72A2"; }; case "medic": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "M4A3_CCO_EP1"; _unit addMagazine "HandGrenade_West"; _unit addMagazine "SmokeShell"; {_unit addMagazine "SmokeShellGreen";} forEach [1,2]; }; case "demo": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "M4A3_CCO_EP1"; _unit addMagazine "HandGrenade_West"; _unit addMagazine "SmokeShell"; {_unit addMagazine "PipeBomb";} forEach [1,2]; }; case "Mark": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "ACE_M4A1_ACOG"; _unit addMagazine "HandGrenade_West"; {_unit addMagazine "SmokeShell";} forEach [1,2]; }; case "Mark1": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "ACE_SOC_M4A1_SHORTDOT"; _unit addMagazine "HandGrenade_West"; {_unit addMagazine "SmokeShell";} forEach [1,2]; }; case "M203": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7,8]; {_unit addMagazine "1Rnd_HE_M203"} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "ACE_SOC_M4A1_GL_AIMPOINT"; _unit addMagazine "HandGrenade_West"; _unit addMagazine "SmokeShell"; }; case "M249": { {_unit addMagazine "200Rnd_556x45_M249";} forEach [1,2,3,4]; _unit addWeapon "M249_EP1"; _unit addMagazine "HandGrenade_West"; }; case "M249scope": { {_unit addMagazine "200Rnd_556x45_M249";} forEach [1,2,3,4]; _unit addWeapon "M249_m145_EP1"; _unit addMagazine "HandGrenade_West"; }; case "M24": { _unit addWeapon "M24"; {_unit addMagazine "SmokeShell";} forEach [1,2]; {_unit addMagazine "5Rnd_762x51_M24"} forEach [1,2,3,4,5,6,7,8,9,10]; }; case "spotter": { {_unit addMagazine "30Rnd_556x45_Stanag";} forEach [1,2,3,4,5,6,7]; _unit addWeapon "M4A3_CCO_EP1"; {_unit addMagazine "SmokeShell";} forEach [1,2,3]; _unit addMagazine "HandGrenade_West"; _unit addWeapon "ACE_Rangefinder_OD"; _unit addMagazine "ACE_Battery_Rangefinder"; _unit addWeapon "ACE_Spottingscope"; _unit addWeapon "ACE_Kestrel4500"; }; case "AKM": { {_unit addMagazine "30Rnd_762x39_AK47";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "ACE_AKM"; {_unit addMagazine "HandGrenade_East";} forEach [1,2]; _unit addMagazine "SmokeShell"; _unit addMagazine "SmokeShellBlue"; }; case "RPG7": { {_unit addMagazine "30Rnd_762x39_AK47";} forEach [1,2,3,4,5,6,7]; {_unit addMagazine "PG7VL";} forEach [1,2]; _unit addWeapon "ACE_AKMS"; _unit addWeapon "RPG7V"; _unit addMagazine "HandGrenade_East"; }; case "AKMGL": { {_unit addMagazine "30Rnd_762x39_AK47";} forEach [1,2,3,4,5,6,7,8]; {_unit addMagazine "1Rnd_HE_GP25";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "ACE_AKM_GL"; {_unit addMagazine "HandGrenade_East";} forEach [1,2]; {_unit addMagazine "SmokeShell";} forEach [1,2]; }; case "AK74PSO": { {_unit addMagazine "30Rnd_545x39_AK";} forEach [1,2,3,4,5,6,7,8]; _unit addWeapon "AKS_74_pso"; {_unit addMagazine "HandGrenade_East";} forEach [1,2]; {_unit addMagazine "SmokeShell";} forEach [1,2]; }; case "RPK": { {_unit addMagazine "ACE_75Rnd_762x39_B_AK47";} forEach [1,2,3,4,5,6,7]; {_unit addMagazine "HandGrenade_East";} forEach [1,2]; _unit addMagazine "SmokeShell"; _unit addWeapon "ACE_RPK"; }; case "FAL": { {_unit addMagazine "20Rnd_762x51_FNFAL";} forEach [1,2,3,4,5,6,7,8]; {_unit addMagazine "HandGrenade_East";} forEach [1,2]; _unit addMagazine "SmokeShell"; _unit addMagazine "SmokeShellBlue"; _unit addWeapon "FN_FAL"; }; }; if (!(_unit hasWeapon "itemGPS")) then { _unit addWeapon "itemGPS"; }; if (!(_unit hasWeapon "LaserDesignator" || _unit hasWeapon "Binocular_Vector" || _unit hasWeapon "ACE_MX2A" || _unit hasWeapon "ACE_Rangefinder_OD" || _unit hasWeapon "Binocular")) then { _unit addWeapon "binocular"; }; if (!(_unit hasWeapon "ACE_Earplugs")) then { _unit addWeapon "ACE_Earplugs"; }; _unit addWeapon "ACE_GlassesLHD_glasses"; _primaryWeapon = primaryWeapon _unit; _unit selectweapon _primaryWeapon; // Fix for weapons with grenade launcher _muzzles = getArray(configFile>>"cfgWeapons" >> _primaryWeapon >> "muzzles"); _unit selectWeapon (_muzzles select 0); breifing.html/title> </head> <body bgcolor="#FFFFFF"> <! --- -----------------------------> <! --- DEBRIEFINGS --> <! --- -----------------------------> <hr> <br> <h2><a name="Debriefing:End1">Mission complete</a></h2> <br> <p> Villa secued! </p> <br> <hr> <br> <h2><a name="Debriefing:End2">Mission failed</a></h2> <br> <p> Too many good men have died today. </p> <br> <hr> <br> <h2><a name="Debriefing:End3">Mission failed</a></h2> <br> <p> We ran out of time. </p> <br> <hr> <br> <h2><a name="Debriefing:End4">Mission failed</a></h2> <br> <p> We killed too many civilians. </p> <br> <hr> <br> <h2><a name="Debriefing:End5">Ending #5</a></h2> <br> <p> *** Insert debriefing #5 here. *** </p> <br> <hr> <br> <h2><a name="Debriefing:End6">Ending #6</a></h2> <br> <p> *** Insert debriefing #6 here. *** </p> <br> <hr> <! --- -----------------------------> <! --- End of DEBRIEFINGS --> <! --- -----------------------------> </body> </html>waitUntil {!isNull player}; { _x createDiaryRecord ["Diary", ["Credits", "Mission by GalZohar"]]; _x createDiaryRecord ["Diary", ["Enemy forces", format ["About %1 Takistani infantrymen.", briefingEnemycount]]]; _x createDiaryRecord ["Diary", ["Friendly forces", format ["%1 US SF infantrymen.", blueforCount]]]; _x createDiaryRecord ["Diary", ["Mission", "Start <marker name='mrkStart'>here</marker> and take over the <marker name='mrkObj'>Villa</marker>. You have 30 minutes (until 12:30)."]]; } forEach blueforUnits;disabledAI=1; respawn=BIRD; class Header { gameType = COOP; minPlayers = 1; maxPlayers = 10; }; class params { class ViewDistance { title = "View Distance"; values[] = {500, 750, 1000, 1300, 1500, 1700, 2000, 2300, 2600, 3000, 3500, 4000}; texts[] = {"500", "750", "1000", "1300", "1500", "1700", "2000", "2300", "2600", "3000", "3500", "4000"}; default = 1500; }; class Difficulty { title = "Difficulty"; values[] = {1, 2, 3, 4, 5, 6}; texts[] = {"Extremely easy", "Very easy", "Easy", "Medium", "Hard", "Very hard"}; default = 4; } };if (!isServer) then { "end1" addPublicVariableEventHandler { if (dialog) then { closeDialog 0; }; endMission "END1"; }; "end2" addPublicVariableEventHandler { if (dialog) then { closeDialog 0; }; endMission "END2"; }; "end3" addPublicVariableEventHandler { if (dialog) then { closeDialog 0; }; endMission "END3"; }; "end4" addPublicVariableEventHandler { if (dialog) then { closeDialog 0; }; endMission "END4"; }; } else { minBlueforCount = blueforCount/2; bClear1=false; bClear2=false; [] spawn { waitUntil {bClear1 && bClear2}; sleep 3; if ({alive _x} count blueforUnits < minBlueforCount) exitWith {}; end1=true; publicVariable "end1"; if (dialog) then { closeDialog 0; }; sleep 5; endMission "END1"; }; [] spawn { waitUntil {{alive _x} count blueforUnits < minBlueforCount}; end2=true; publicVariable "end2"; if (dialog) then { closeDialog 0; }; sleep 5; endMission "END2"; }; [] spawn { _endTime = time + 30 * 60; waitUntil {time>_endTime}; end3=true; publicVariable "end3"; if (dialog) then { closeDialog 0; }; sleep 5; endMission "END3"; }; };disableSerialization; groupMergeMenu=false; groupMergeGroups = []; actionArray = []; // Mike's function to remove the B from group names groupMerge_fnc_properGroupName = { private ["_group", "_groupName", "_trimmedGroupName"]; _group = _this select 0; _groupName = toArray(str(_group)); _trimmedGroupName = []; for [ { _i = 2 }, { _i < count(_groupName) }, { _i = _i + 1 }] do { _trimmedGroupName set [count _trimmedGroupName, _groupName select _i]; }; toString(_trimmedGroupName) }; // Function to create/remove join group action menu items groupMerge_fnc_menu = { groupMergeMenu = !groupMergeMenu; if (groupMergeMenu) then { groupMergeGroups = []; { _unit = _x; if (isPlayer _unit && (playerSide == side _unit) && (!(_unit in (units (group player))))) then { _addx = true; { if (_unit in (units _x)) then { _addx = false; }; } forEach groupMergeGroups; if (_addx) then { groupMergeGroups set [count groupMergeGroups, group _unit]; }; }; } forEach allUnits; { _action = player addAction [format ["Join %1", [_x] call groupMerge_fnc_properGroupName], "groupmergeaction.sqf", [_x]]; actionArray set [count actionArray, _action]; } forEach groupMergeGroups; hint "Choose group to join in action menu or press the teamswitch key again to cancel"; } else { {player removeAction _x} forEach actionArray; actionArray=[]; }; }; // function to handle key press to detect player hitting the "team switch" button groupMerge_fnc_key = { private['_handled']; _handled = false; _key = _this select 1; if (_key in (actionKeys 'TeamSwitch')) then { _handled=true; call groupMerge_fnc_menu; }; _handled; }; // create key eventhandler waitUntil {!isNull (findDisplay 46)}; (findDisplay 46) displayAddEventHandler ["KeyDown", "call groupMerge_fnc_key"];[player] join ((_this select 3) select 0); call groupMerge_fnc_menu;if (!isNil "param1") then { setViewDistance param1; }; if (isServer) then { execVM "scripts\Init_UPSMON.sqf"; deadCivCount=0; { _x addEventHandler ["killed", "if (side (_this select 1) == WEST) then {deadCivCount=deadCivCount+1;};"]; } forEach civUnits; }; [] spawn { while {true} do { waitUntil {sideEnemy countSide allUnits > 0}; { if (side _X == sideEnemy) then { _X addRating (-(rating _X)); }; } forEach allUnits; }; }; execVM "briefing.sqf"; execVM "endhandler.sqf"; execVM "unitmarkers.sqf"; if (!isDedicated) then { [] spawn { waitUntil {!isNil "groupCMD"}; groupCMD setGroupID ["CMD"]; }; [] spawn { waitUntil {!isNil "groupA"}; groupA setGroupID ["A"]; }; [] spawn { waitUntil {!isNil "groupB"}; groupB setGroupID ["B"]; }; execVM "groupmerge.sqf"; }; waitUntil {!isNil "objPos"}; "mrkObj" setMarkerPos objPos;"mrkUPS1" setMarkerAlpha 0; "mrkUPS2" setMarkerAlpha 0; "mrkUPS3" setMarkerAlpha 0; "mrkUPS4" setMarkerAlpha 0; "mrkUPS5" setMarkerAlpha 0;version=11; class Mission { addOns[]= { "zargabad", "camisc3", "CAMisc", "cadata", "cawheeled_e_suv", "cawheeled_e_v3s", "warfarebuildings", "camp_armory_misc_laptop", "ca_modules_functions", "ace_c_weapon", "ace_sys_aitalk", "cacharacters_e", "ca_missions_battlefieldclearance", "ca_missions_alternativeinjurysimulation" }; addOnsAuto[]= { "ca_modules_functions", "ace_sys_aitalk", "cacharacters_e", "ca_missions_battlefieldclearance", "ca_missions_alternativeinjurysimulation", "CAMisc", "camisc3", "cadata", "cawheeled_e_suv", "cawheeled_e_v3s", "warfarebuildings", "zargabad" }; randomSeed=11001232; class Intel { briefingName="ACE co 16 Fortified Vila 1.00"; briefingDescription="US SF takes over the villa. Mission scales. Group merging possible by using teamswitch key."; startWeather=1; startFog=0.33000001; forecastWeather=1; forecastFog=0.33000001; month=8; day=30; hour=12; minute=0; }; class Groups { items=104; class Item0 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={4846.5771,45.464115,4603.9121}; azimut=90; id=64; side="LOGIC"; vehicle="LocationLogic"; leader=1; skill=1; init="building1 = nearestBuilding this; hNil = [] call compile preprocessFile ""preinit.sqf"";"; }; }; }; class Item1 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={5112.6963,37.525032,4830.6753}; id=65; side="LOGIC"; vehicle="ACE_AITalk_Logic"; leader=1; lock="UNLOCKED"; skill=0.60000002; }; }; }; class Item2 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4925.3154,38.988052,4586.6846}; azimut=124.89172; id=66; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard1"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item3 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4937.0547,39.090729,4642.5454}; azimut=63.230465; id=67; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard2"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item4 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4947.3203,25.50836,4526.2031}; azimut=141.51598; id=68; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard3"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item5 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4911.8643,43.687996,4710.1689}; azimut=19.436806; id=69; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard4"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item6 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4871.2534,42.620731,4711.6006}; azimut=3.01984; id=70; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard5"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item7 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4766.7539,26.409733,4618.6421}; azimut=-85.067665; id=71; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard6"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item8 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4805.5757,26.266846,4497.3745}; azimut=-187.56799; id=72; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="guard0"; init="hNil = [this, ""random""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item9 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4833.9185,37.881973,4582.5439}; azimut=-187.56799; id=73; side="EAST"; vehicle="TK_Soldier_Officer_EP1"; leader=1; skill=1; text="e0"; init="hNil = [this, ""FAL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item10 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4830.9575,37.921215,4584.7437}; azimut=-187.56799; id=74; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e1"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item11 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4837.1069,37.793953,4581.2544}; azimut=-187.56799; id=75; side="EAST"; vehicle="TK_Soldier_GL_EP1"; leader=1; skill=1; text="e2"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item12 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4840.9683,37.674652,4577.7207}; id=76; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e3"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item13 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4838.5444,37.705097,4575.8242}; id=77; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e4"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item14 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4836.0688,37.847397,4578.2021}; id=78; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e5"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item15 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4832.9707,37.889294,4579.7998}; id=79; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e6"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item16 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4827.5483,37.979725,4582.6851}; id=80; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e7"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item17 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4832.5991,37.93531,4576.4478}; id=81; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e8"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item18 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4830.7305,37.924263,4573.8291}; id=82; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e9"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item19 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4836.7065,37.816109,4574.0601}; id=83; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e10"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item20 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4828.187,37.986965,4578.0854}; id=84; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e11"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item21 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4833.9629,37.921711,4573.4473}; id=85; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e12"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item22 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4827.4497,37.990566,4587.3418}; id=86; side="EAST"; vehicle="TK_Soldier_Officer_EP1"; leader=1; skill=1; text="e13"; init="hNil = [this, ""FAL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item23 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4825.0791,38.003429,4588.7891}; id=87; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e14"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item24 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4825.0781,37.961075,4583.9282}; id=88; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e15"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item25 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4736.48,18.737797,4691.8188}; id=89; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge0 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4733.2871,18.844042,4687.7671}; id=90; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4739.7866,19.312586,4687.6909}; id=91; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4736.6938,19.070105,4687.8047}; id=92; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item26 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4736.5991,19.425781,4683.6406}; id=93; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge1 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4733.4063,19.52813,4679.5889}; id=94; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4739.9058,20.015335,4679.5127}; id=95; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4736.813,19.765692,4679.6265}; id=96; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item27 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4736.8374,20.130436,4674.5151}; id=97; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge2 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4733.6445,20.210093,4670.4634}; id=98; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.144,20.795883,4670.3872}; id=99; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.0513,20.479185,4670.501}; id=100; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item28 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.312,20.896519,4665.5073}; id=101; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge3 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.1191,20.897898,4661.4556}; id=102; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.6187,21.570438,4661.3794}; id=103; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.5259,21.241962,4661.4932}; id=104; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item29 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.4307,21.611988,4656.6191}; id=105; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge4 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.2378,21.549736,4652.5674}; id=106; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.7373,22.199615,4652.4912}; id=107; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.6445,21.879932,4652.605}; id=108; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item30 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.1934,22.209242,4647.8481}; id=109; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge5 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.0005,22.121756,4643.7964}; id=110; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.5,22.794838,4643.7202}; id=111; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.1167,22.439232,4643.7637}; id=112; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item31 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.1934,22.60548,4641.0923}; id=113; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge6 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.0005,22.507818,4637.0405}; id=114; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.5,23.171694,4636.9644}; id=115; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.4072,22.841427,4637.0781}; id=116; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item32 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.5977,23.041832,4633.708}; id=117; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge7 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.4048,22.928064,4629.6563}; id=118; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.9043,23.557228,4629.5801}; id=119; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.8115,23.250107,4629.6938}; id=120; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item33 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.5977,23.367762,4625.9775}; id=121; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge8 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.4048,23.246239,4621.9258}; id=122; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.9043,23.796753,4621.8496}; id=123; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.8115,23.536766,4621.9634}; id=124; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item34 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4738.2285,23.690313,4617.8843}; id=125; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge9 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4735.0356,23.698954,4613.8325}; id=126; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4741.5352,24.020267,4613.7563}; id=127; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4738.4424,23.84783,4613.8701}; id=128; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item35 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.9121,24.310947,4608.3174}; id=129; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge10 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.7192,24.177362,4604.2656}; id=130; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4741.2188,24.474966,4604.1895}; id=131; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4738.126,24.304564,4604.3032}; id=132; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item36 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.9121,24.562103,4599.8027}; id=133; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge11 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.7192,24.721956,4595.751}; id=134; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4741.2188,24.966793,4595.6748}; id=135; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4738.126,24.826212,4595.7886}; id=136; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item37 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.8071,25.200825,4590.8677}; id=137; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge12 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4734.6143,25.481031,4586.8159}; id=138; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4741.1138,25.555393,4586.7397}; id=139; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4738.021,25.558958,4586.8535}; id=140; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item38 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4736.9658,25.788799,4583.1943}; id=141; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge13 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4733.7729,25.973181,4579.1426}; id=142; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.2725,26.026529,4579.0664}; id=143; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.1797,26.009344,4579.1802}; id=144; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item39 { side="EAST"; class Vehicles { items=4; class Item0 { position[]={4737.0713,26.146631,4574.7847}; id=145; side="EAST"; vehicle="TK_Soldier_SL_EP1"; leader=1; skill=1; init="ge14 = group this; hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item1 { position[]={4733.8784,26.246447,4570.7329}; id=146; side="EAST"; vehicle="TK_Soldier_GL_EP1"; skill=1; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item2 { position[]={4740.0625,26.198099,4570.7622}; id=147; side="EAST"; vehicle="TK_Soldier_EP1"; skill=1; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; class Item3 { position[]={4737.2852,26.22559,4570.7705}; id=148; side="EAST"; vehicle="TK_Soldier_AR_EP1"; skill=1; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item40 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4824.8486,38.006336,4586.6479}; id=149; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e16"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item41 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4825.2881,37.998993,4580.0894}; id=150; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e17"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item42 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4823.7275,37.974613,4582.0518}; id=151; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e18"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item43 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4825.4702,37.952747,4577.2412}; id=152; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e19"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item44 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4822.8799,37.986885,4580.063}; id=153; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e20"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item45 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4815.6455,37.049221,4586.9888}; id=154; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e21"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item46 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4818.5464,37.612274,4587.5581}; id=155; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e22"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item47 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4818.7568,37.725677,4584.8188}; id=156; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e23"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item48 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4816.4536,37.450676,4584.4639}; id=157; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e24"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item49 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4815.8398,37.508244,4581.7271}; id=158; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e25"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item50 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4816.4521,37.128887,4590.1069}; id=159; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e26"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item51 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4816.4277,37.135044,4593.3042}; id=160; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e27"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item52 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4844.3926,37.855888,4577.1152}; id=161; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e28"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item53 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4844.1558,37.911888,4572.7305}; id=162; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e29"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item54 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4839.9316,37.611454,4573.0488}; id=163; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e30"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item55 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4847.7495,37.956642,4574.4492}; id=164; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e31"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item56 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4851.394,37.864147,4573.9658}; id=165; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e32"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item57 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4848.2534,37.619343,4567.4121}; id=166; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e33"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item58 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4851.0117,37.840595,4568.0083}; id=167; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e34"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item59 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4845.5625,37.100143,4565.686}; id=168; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e35"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item60 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4850.5181,37.050259,4565.6914}; id=169; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e36"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item61 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4854.9424,37.802197,4573.3667}; id=170; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e37"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item62 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4854.7427,37.834766,4570.7173}; id=171; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e38"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item63 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4854.7144,37.842976,4568.8726}; id=172; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e39"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item64 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4852.9028,37.481602,4566.8501}; id=173; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e40"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item65 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4855.3345,37.43856,4566.7266}; id=174; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e41"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item66 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4857.9937,37.509491,4566.8872}; id=175; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e42"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item67 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4811.0444,37.140434,4607.4766}; id=176; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e43"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item68 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4811.3433,36.219967,4604.8232}; id=177; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e44"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item69 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4813.0771,36.436451,4603.1201}; id=178; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e45"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item70 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4814.834,37.025768,4601.2852}; id=179; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e46"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item71 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4815.8511,37.225704,4598.2129}; id=180; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e47"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item72 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4815.314,36.876747,4595.7979}; id=181; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e48"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item73 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4813.9995,36.47197,4596.8428}; id=182; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e49"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item74 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4812.9854,36.239635,4599.1382}; id=183; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e50"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item75 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4810.4761,35.769535,4601.9751}; id=184; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e51"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item76 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4807.7646,35.801235,4605.1616}; id=185; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e52"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item77 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4808.209,36.709301,4607.8823}; id=186; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e53"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item78 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4805.8213,36.219162,4607.0742}; id=187; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e54"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item79 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4816.9795,37.77557,4612.0957}; id=188; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e55"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item80 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4817.2144,37.70385,4615.1108}; id=189; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e56"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item81 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4817.5352,37.711693,4617.606}; id=190; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e57"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item82 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4815.1787,37.723843,4617.3232}; id=191; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e58"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item83 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4814.9922,37.754421,4614.1255}; id=192; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e59"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item84 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4814.9243,37.786552,4611.2075}; id=193; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e60"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item85 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4818.4043,37.818031,4609.481}; id=194; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e61"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item86 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4825.8125,37.490181,4620.8701}; id=195; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e62"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item87 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4826.0977,37.541164,4624.5767}; id=196; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e63"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item88 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4828.9785,37.485123,4622.4663}; id=197; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e64"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item89 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4828.6074,37.535789,4625.6167}; id=198; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e65"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item90 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4860.7129,37.266529,4631.1621}; id=199; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e66"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item91 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4860.7129,37.350643,4626.7764}; id=200; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e67"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item92 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4862.4126,37.255371,4629.3564}; id=201; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e68"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item93 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4863.4888,37.357544,4625.5049}; id=202; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e69"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item94 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4856.7197,37.335033,4630.6094}; id=203; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e70"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item95 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4854.9023,37.362072,4628.3418}; id=204; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e71"; init="hNil = [this, ""AKMGL""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item96 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4855.2559,37.36372,4626.0605}; id=205; side="EAST"; vehicle="TK_Soldier_AR_EP1"; leader=1; skill=1; text="e72"; init="hNil = [this, ""RPK""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item97 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4857.2622,37.368771,4623.8032}; id=206; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e73"; init="hNil = [this, ""AKM""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item98 { side="EAST"; class Vehicles { items=1; class Item0 { position[]={4858.5078,37.338444,4628.3667}; id=207; side="EAST"; vehicle="TK_Soldier_EP1"; leader=1; skill=1; text="e74"; init="hNil = [this, ""AK74PSO""] call compile preprocessFile ""assigngear.sqf"";"; }; }; }; class Item99 { side="WEST"; class Vehicles { items=2; class Item0 { position[]={5103.1904,23.50806,4898.2021}; azimut=230; special="NONE"; id=208; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAYER COMMANDER"; leader=1; rank="MAJOR"; skill=1; init="groupCMD = group this; hNil = [this, ""CMD""] call compile preprocessFile ""assigngear.sqf"";"; description="Commander (HuntIR M203 + monitor)"; synchronizations[]={224,225}; }; class Item1 { position[]={5106.479,23.20583,4898.5986}; azimut=230; special="NONE"; id=209; side="WEST"; vehicle="US_Delta_Force_Medic_EP1"; player="PLAY CDG"; skill=1; init="groupCMD = group this; hNil = [this, ""medic""] call compile preprocessFile ""assigngear.sqf"";"; synchronizations[]={224,225}; }; }; }; class Item100 { side="WEST"; class Vehicles { items=7; class Item0 { position[]={5100.8677,24.354181,4907.1753}; azimut=230; id=210; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; leader=1; rank="CAPTAIN"; skill=1; init="groupA = group this; hNil = [this, ""TL""] call compile preprocessFile ""assigngear.sqf"";"; description="A Team Leader (HuntIR monitor + LAW)"; synchronizations[]={224,225}; }; class Item1 { position[]={5100.7144,23.858145,4912.3179}; azimut=230; special="NONE"; id=211; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; rank="LIEUTENANT"; skill=1; init="groupA = group this; hNil = [this, ""TL""] call compile preprocessFile ""assigngear.sqf"";"; description="A1 Leader (HuntIR monitor + LAW)"; synchronizations[]={224,225}; }; class Item2 { position[]={5101.8687,22.991859,4914.7769}; azimut=230; special="NONE"; id=212; side="WEST"; vehicle="US_Delta_Force_Marksman_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupA = group this; hNil = [this, ""Mark""] call compile preprocessFile ""assigngear.sqf"";"; description="Marksman (M4A1 ACOG)"; synchronizations[]={224,225}; }; class Item3 { position[]={5103.6045,21.7178,4916.731}; azimut=230; special="NONE"; id=216; side="WEST"; vehicle="US_Delta_Force_AR_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupA = group this; hNil = [this, ""M249scope""] call compile preprocessFile ""assigngear.sqf"";"; description="Automatic Rifleman (scoped)"; synchronizations[]={224,225}; }; class Item4 { position[]={5105.7603,21.734501,4909.3931}; azimut=230; special="NONE"; id=214; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; rank="SERGEANT"; skill=1; init="groupA = group this; hNil = [this, ""M203""] call compile preprocessFile ""assigngear.sqf"";"; description="A2 Leader (M203)"; synchronizations[]={224,225}; }; class Item5 { position[]={5106.8408,20.982042,4911.0762}; azimut=230; special="NONE"; id=215; side="WEST"; vehicle="US_Delta_Force_Marksman_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupA = group this; hNil = [this, ""Mark1""] call compile preprocessFile ""assigngear.sqf"";"; description="Marksman (M4A1 Shortdot)"; synchronizations[]={224,225}; }; class Item6 { position[]={5108.2773,19.97455,4913.3784}; azimut=230; special="NONE"; id=213; side="WEST"; vehicle="US_Delta_Force_AR_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupA = group this; hNil = [this, ""M249""] call compile preprocessFile ""assigngear.sqf"";"; synchronizations[]={224,225}; }; }; }; class Item101 { side="WEST"; class Vehicles { items=7; class Item0 { position[]={5111.1406,22.35453,4903.0039}; azimut=230; id=217; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; leader=1; rank="CAPTAIN"; skill=1; init="groupB = group this; hNil = [this, ""TL""] call compile preprocessFile ""assigngear.sqf"";"; description="B Team Leader (HuntIR monitor + LAW)"; synchronizations[]={224,225}; }; class Item1 { position[]={5110.9873,21.231531,4908.1465}; azimut=230; special="NONE"; id=218; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; rank="LIEUTENANT"; skill=1; init="groupB = group this; hNil = [this, ""TL""] call compile preprocessFile ""assigngear.sqf"";"; description="B1 Leader (HuntIR monitor + LAW)"; synchronizations[]={224,225}; }; class Item2 { position[]={5112.1416,20.433578,4910.6055}; azimut=230; special="NONE"; id=219; side="WEST"; vehicle="US_Delta_Force_Marksman_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupB = group this; hNil = [this, ""Mark""] call compile preprocessFile ""assigngear.sqf"";"; description="Marksman (M4A1 ACOG)"; synchronizations[]={224,225}; }; class Item3 { position[]={5113.25,19.912113,4912.6704}; azimut=230; special="NONE"; id=223; side="WEST"; vehicle="US_Delta_Force_AR_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupB = group this; hNil = [this, ""M249scope""] call compile preprocessFile ""assigngear.sqf"";"; description="Automatic Rifleman (scoped)"; synchronizations[]={224,225}; }; class Item4 { position[]={5116.0332,22.235382,4905.2217}; azimut=230; special="NONE"; id=221; side="WEST"; vehicle="US_Delta_Force_TL_EP1"; player="PLAY CDG"; rank="SERGEANT"; skill=1; init="groupB = group this; hNil = [this, ""M203""] call compile preprocessFile ""assigngear.sqf"";"; description="B2 Leader (M203)"; synchronizations[]={224,225}; }; class Item5 { position[]={5117.1138,21.909409,4906.9048}; azimut=230; special="NONE"; id=222; side="WEST"; vehicle="US_Delta_Force_Marksman_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupB = group this; hNil = [this, ""Mark1""] call compile preprocessFile ""assigngear.sqf"";"; description="Marksman (M4A1 Shortdot)"; synchronizations[]={224,225}; }; class Item6 { position[]={5118.5137,21.355667,4908.5425}; azimut=230; special="NONE"; id=220; side="WEST"; vehicle="US_Delta_Force_AR_EP1"; player="PLAY CDG"; rank="CORPORAL"; skill=1; init="groupB = group this; hNil = [this, ""M249""] call compile preprocessFile ""assigngear.sqf"";"; synchronizations[]={224,225}; }; }; }; class Item102 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={5128.7871,31.500273,4898.0313}; id=225; side="LOGIC"; vehicle="BattleFieldClearance"; leader=1; lock="UNLOCKED"; skill=0.60000002; synchronizations[]={208,209,217,221,222,220,218,219,223,210,214,215,213,211,212,216}; }; }; }; class Item103 { side="LOGIC"; class Vehicles { items=1; class Item0 { position[]={5120.9346,28.152876,4890.7983}; id=224; side="LOGIC"; vehicle="AlternativeInjurySimulation"; leader=1; lock="UNLOCKED"; skill=0.60000002; synchronizations[]={208,209,217,221,222,220,218,219,223,210,214,215,213,211,212,216}; }; }; }; }; class Vehicles { items=64; class Item0 { position[]={4924.3291,39.026581,4593.4434}; azimut=90; id=0; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item1 { position[]={4923.5146,39.012486,4596.6162}; azimut=90; id=1; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item2 { position[]={4922.7432,38.966583,4593.4487}; azimut=90; id=2; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item3 { position[]={4924.3032,39.026066,4595.0972}; azimut=90; id=3; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item4 { position[]={4922.7441,38.966625,4595.0889}; azimut=90; id=4; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item5 { position[]={4922.6709,39.043915,4600.9048}; azimut=90; id=5; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item6 { position[]={4922.6719,39.075764,4602.4209}; azimut=90; id=6; side="EMPTY"; vehicle="Barrels"; skill=0.60000002; }; class Item7 { position[]={4885.561,39.172989,4596.0903}; azimut=90; id=7; side="EMPTY"; vehicle="HumpsDirt"; skill=0.60000002; init="this allowDamage false;"; }; class Item8 { position[]={4881.2007,44.435776,4684.7686}; azimut=90; id=8; side="EMPTY"; vehicle="Mi8Wreck"; skill=0.60000002; health=0; fuel=0; ammo=0; }; class Item9 { position[]={4880.0786,37.668621,4617.064}; azimut=172.237; id=9; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item10 { position[]={4883.3682,37.558994,4613.3999}; azimut=172.237; id=10; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item11 { position[]={4876.8301,37.67252,4620.0137}; azimut=172.237; id=11; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item12 { position[]={4851.3721,34.142632,4556.6675}; azimut=95; id=12; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item13 { position[]={4846.5635,34.553986,4557.1387}; azimut=90; id=13; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item14 { position[]={4867.8613,37.353344,4627.5908}; azimut=110; id=14; side="EMPTY"; vehicle="SUV_TK_CIV_EP1"; leader=1; skill=1; health=0; fuel=0; ammo=0; text="veh3"; }; class Item15 { position[]={4871.252,37.162437,4634.0469}; azimut=129.498; id=15; side="EMPTY"; vehicle="SUV_TK_CIV_EP1"; leader=1; skill=1; health=0; fuel=0; ammo=0; text="veh2"; }; class Item16 { position[]={4877.5562,37.342682,4637.3813}; azimut=157.98599; id=16; side="EMPTY"; vehicle="V3S_Open_TK_CIV_EP1"; leader=1; skill=1; health=0; fuel=0; ammo=0; text="veh1"; }; class Item17 { position[]={4874.853,37.336121,4644.4741}; azimut=177.39; id=17; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item18 { position[]={4864.2593,37.324883,4642.5693}; azimut=163.326; id=18; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item19 { position[]={4855.0435,37.261127,4636.7485}; azimut=134.71201; id=19; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item20 { position[]={4883.752,37.459156,4639.1821}; azimut=235.34; id=20; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item21 { position[]={4850.2764,37.362762,4627.751}; azimut=96.610001; id=21; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item22 { position[]={4867.8696,44.866169,4669.0742}; azimut=370.88657; id=22; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item23 { position[]={4864.9053,44.884132,4669.6533}; azimut=370.88657; id=23; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item24 { position[]={4870.8325,44.829933,4668.5054}; azimut=370.88657; id=24; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item25 { position[]={4879.7612,44.776646,4667.1553}; azimut=184.77; id=25; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item26 { position[]={4892.6338,44.759243,4666.6406}; azimut=180.075; id=26; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item27 { position[]={4884.5054,44.226826,4699.7573}; azimut=540.25604; id=27; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item28 { position[]={4887.5278,44.249763,4699.7358}; azimut=540.25604; id=28; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item29 { position[]={4881.4902,44.216614,4699.769}; azimut=540.25604; id=29; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item30 { position[]={4895.4771,44.351318,4696.6069}; azimut=386.03601; id=30; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item31 { position[]={4873.3442,44.234837,4698.5508}; azimut=357.06; id=31; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item32 { position[]={4828.6177,37.964176,4571.2632}; azimut=749.47577; id=32; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item33 { position[]={4825.9912,37.904202,4572.7568}; azimut=749.47601; id=33; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item34 { position[]={4831.2437,37.93541,4569.7827}; azimut=749.47577; id=34; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item35 { position[]={4820.6152,37.955803,4577.3892}; azimut=601.52301; id=35; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item36 { position[]={4837.8423,37.811859,4567.729}; azimut=529.966; id=36; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item37 { position[]={4821.7402,37.998989,4595.0718}; azimut=644.74701; id=37; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item38 { position[]={4820.5479,37.95121,4584.5859}; azimut=816.711; id=38; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item39 { position[]={4820.9082,37.922314,4587.5884}; azimut=816.71143; id=39; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item40 { position[]={4841.6191,37.72554,4583.7666}; azimut=757.22736; id=40; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item41 { position[]={4839.2197,37.751541,4585.5996}; azimut=757.22736; id=41; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item42 { position[]={4844.022,37.825748,4581.9443}; azimut=757.22736; id=42; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item43 { position[]={4834.3989,37.928844,4589.2642}; azimut=757.22736; id=43; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item44 { position[]={4831.9971,37.942307,4591.0967}; azimut=757.22736; id=44; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item45 { position[]={4836.8008,37.879639,4587.4414}; azimut=757.22736; id=45; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item46 { position[]={4829.5684,38.003799,4592.9443}; azimut=757.22736; id=46; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item47 { position[]={4827.1665,38.068314,4594.7769}; azimut=757.22736; id=47; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item48 { position[]={4846.4619,37.854885,4580.1016}; azimut=757.22736; id=48; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item49 { position[]={4848.8647,37.862053,4578.2793}; azimut=757.22736; id=49; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item50 { position[]={4811.502,37.758823,4615.2158}; azimut=640.90399; id=50; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item51 { position[]={4816.8916,37.842457,4605.75}; azimut=588.81799; id=51; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item52 { position[]={4819.2261,37.755917,4622.3062}; azimut=703.60699; id=52; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item53 { position[]={4861.981,37.722252,4570.7866}; azimut=539.52142; id=53; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item54 { position[]={4871.0493,37.489506,4583.73}; azimut=449.53699; id=54; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item55 { position[]={4851.5483,37.89209,4571.2031}; azimut=86.071938; id=55; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item56 { position[]={4846.6997,37.925552,4570.688}; azimut=78.292831; id=56; side="EMPTY"; vehicle="Land_Ind_BoardsPack1"; skill=0.60000002; init="this allowDamage false;"; }; class Item57 { position[]={4855.0557,37.521332,4614.627}; azimut=45; id=57; side="EMPTY"; vehicle="Base_WarfareBBarrier10xTall"; skill=0.60000002; init="this allowDamage false;"; }; class Item58 { position[]={4865.7886,37.486629,4604.7119}; azimut=45; id=58; side="EMPTY"; vehicle="Land_HBarrier_large"; skill=0.60000002; init="this allowDamage false;"; }; class Item59 { position[]={4850.1821,38.274101,4610.9043}; azimut=45; id=59; side="EMPTY"; vehicle="Land_HBarrier1"; skill=0.60000002; init="this allowDamage false; if (isServer) then {this setposASL [(getposASL this) select 0, (getposASL this) select 1, 38.2747];};"; }; class Item60 { position[]={4841.561,37.56707,4619.5771}; id=60; side="EMPTY"; vehicle="Land_HBarrier_large"; leader=1; skill=1; init="this allowDamage false;"; }; class Item61 { position[]={4862.1558,45.463802,4598.9849}; azimut=90; id=61; side="EMPTY"; vehicle="Land_HBarrier1"; skill=0.60000002; init="this allowDamage false; if (isServer) then {this setposASL [(getposASL this) select 0, (getposASL this) select 1, 38.2693];};"; }; class Item62 { position[]={4868.291,37.558949,4573.6543}; azimut=666.2608; id=62; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; class Item63 { position[]={4870.0752,37.528824,4576.085}; azimut=666.2608; id=63; side="EMPTY"; vehicle="Land_fort_bagfence_long"; skill=1; init="this allowDamage false;"; }; }; class Markers { items=7; class Item0 { position[]={4846.2866,45.462582,4603.2642}; name="mrkObj"; type="mil_objective"; colorName="ColorRed"; }; class Item1 { position[]={4871.6816,37.452354,4615.0869}; name="mrkUPS1"; markerType="ELLIPSE"; type="Empty"; a=150; b=150; }; class Item2 { position[]={4848.8892,43.954712,4667.1763}; name="mrkUPS2"; markerType="ELLIPSE"; type="Empty"; a=70; b=40; angle=-35.327736; }; class Item3 { position[]={4840.5884,37.690079,4583.9233}; name="mrkUPS3"; markerType="ELLIPSE"; type="Empty"; a=30; b=18; angle=28.159044; }; class Item4 { position[]={4919.7261,39.249325,4611.9663}; name="mrkUPS4"; markerType="ELLIPSE"; type="Empty"; a=50; b=70; angle=-8.9593496; }; class Item5 { position[]={4841.0688,34.906631,4556.2788}; name="mrkUPS5"; markerType="ELLIPSE"; type="Empty"; a=70; b=50; angle=18.692118; }; class Item6 { position[]={5106.0972,22.737921,4903.1211}; name="mrkStart"; type="mil_start"; colorName="ColorGreen"; a=1.1; b=1.1; angle=-135; }; }; class Sensors { items=2; class Item0 { position[]={4849.1387,48.201683,4599.52}; a=45; b=45; activationBy="EAST"; activationType="NOT PRESENT"; repeating=1; timeoutMin=30; timeoutMid=45; timeoutMax=70; interruptable=1; age="UNKNOWN"; expActiv="bClear1=true;"; expDesactiv="bClear1=false;"; class Effects { }; }; class Item1 { position[]={4866.8696,37.441498,4613.7363}; a=150; b=150; activationBy="WEST SEIZED"; repeating=1; timeoutMin=10; timeoutMax=60; interruptable=1; age="UNKNOWN"; expActiv="bClear2=true;"; expDesactiv="bClear2=false;"; class Effects { }; }; }; }; class Intro { addOns[]= { "zargabad" }; addOnsAuto[]= { "zargabad" }; randomSeed=8016619; class Intel { startWeather=0.25; forecastWeather=0; year=2009; day=29; hour=11; }; }; class OutroWin { addOns[]= { "zargabad" }; addOnsAuto[]= { "zargabad" }; randomSeed=3119300; class Intel { startWeather=0.25; forecastWeather=0; year=2009; day=29; hour=11; }; }; class OutroLoose { addOns[]= { "zargabad" }; addOnsAuto[]= { "zargabad" }; randomSeed=6483467; class Intel { startWeather=0.25; forecastWeather=0; year=2009; day=29; hour=11; }; }; _this spawn ace_fnc_startSpectator;// Create a mission entry for the server and client RPT file, easier to debug when you know what mission created the error diag_log text ""; diag_log text format["|============================= %1 =============================|", missionName]; // stamp mission name diag_log text ""; difficulty = 6; if (!isNil "paramsArray") then { for [{_i = 0}, {_i < count(paramsArray)}, {_i = _i + 1 }] do { switch (configName ((missionConfigFile >> "Params") select _i)) do { case "Difficulty": { difficulty = (paramsArray select _i); }; }; }; }; call compile preprocessFile "markeralpha.sqf"; blueforUnits = []; blueforCount=0; opforUnits = []; opforCount=0; indUnits = []; civCount = 0; civUnits = []; indCount=0; { if (side _x == WEST) then { blueforUnits set [blueforCount, _x]; blueforCount = blueforCount + 1; }; if (side _x == EAST) then { opforUnits set [opforCount, _x]; opforCount = opforCount + 1; }; if (side _x == RESISTANCE) then { indUnits set [indCount, _x]; indCount = indCount + 1; }; if (side _x == CIVILIAN) then { civUnits set [civCount, _x]; civCount = civCount + 1; }; } forEach allUnits; enemyCount = round ((difficulty/6) * (9 + (blueforCount / 16) * 88) * (0.94 + random 0.06)); briefingEnemycount = round ((difficulty/6) * (9 + (blueforCount / 16) * 88)); if (isServer) then { call compile preprocessFileLineNumbers "serverinit.sqf"; };// ========================================================================================================= // UPSMON - Urban Patrol Script Mon // Version: 5.0.7 // Author: Monsada (chs.monsada@gmail.com) // Comunidad Hispana de Simulación: // http://www.simulacion-esp.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) // --------------------------------------------------------------------------------------------------------- //Adding eventhandlers "KRON_UPS_EAST_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[east] execvm "scripts\UPSMON\MON_surrended.sqf";};}; "KRON_UPS_WEST_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[west] execvm "scripts\UPSMON\MON_surrended.sqf";};}; "KRON_UPS_GUER_SURRENDED" addPublicVariableEventHandler { if (_this select 1) then { nul=[resistance] execvm "scripts\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 {}; //1=Enable or 0=disable debug. in debug could see a mark positioning de leader and another mark of the destinity of movement, very useful for editing mision KRON_UPS_Debug = 0; //Time that lider wait until doing another movement, this time reduced dinamically under fire, and on new targets KRON_UPS_react = 60; //Min time to wait for doing another reaction KRON_UPS_minreact = 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 = 75; // how close unit has to be to target to generate a new one target or to enter stealth mode KRON_UPS_closeenough = 50; // how close units have to be to each other to share information, over this, will lose target KRON_UPS_sharedist = 100; //If enabled IA comunicating between them with radio defined sharedist distance, KRON_UPS_comradio = 2; //Sides that are enemies of resistance KRON_UPS_Res_enemy = []; //Frequency for doin calculations for each squad. KRON_UPS_Cycle = 20; //Height that heli will fly this input will be randomiced in a 10% KRON_UPS_flyInHeight = 100; //Max distance to target for doing paradrop, will be randomiced between 0 and 100% of this value. KRON_UPS_paradropdist = 250; //Enables or disables AI to use static weapons KRON_UPS_useStatics = true; //Enables or disables AI to put mines if armored enemies near KRON_UPS_useMines = false; //Distance from destination for seraching vehicles KRON_UPS_searchVehicledist = 1200; //Percentage of units to surrender. KRON_UPS_EAST_SURRENDER = 0; KRON_UPS_WEST_SURRENDER = 0; KRON_UPS_GUER_SURRENDER = 0; //Efective distance for doing perfect ambush (max distance is this x2) KRON_UPS_ambushdist = 45; //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 //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Initialization of public Variables used in script, do not touch //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 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 "scripts\UPSMON\common\MON_functions.sqf"; //scripts initialization UPSMON = compile preprocessFile "scripts\UPSMON.sqf"; UPSMON_surrended = compile preprocessFile "scripts\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_OnRoad = {private["_p","_w","_i","_lst"];_p=_this select 0; _w=_this select 1; _i=_this select 2; _lst=_p nearObjects ["House",12]; if ((count _lst==0) && (_w || !(surfaceIsWater _p))) then {_i=99}; (_i+1)}; 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(((round((_this select 0) select 0)-round((_this select 1) select 0))^2 + (round((_this select 0) select 1)-round((_this select 1) select 1))^2)^0.5)}; //KRON_distancePosSqr = {((((_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_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"]; _cycle = 20; //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 {diag_log format["%1: %2 _enemyside=%3 _target=%4 %5 enemies=%6",_npc getVariable ("UPSMON_grpid"),_npc,_enemyside, typeof _target,side _target,_npc countEnemy _targets ]}; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: %2 _enemyside=%3 _target=%4 %5 enemies=%6",_npc getVariable ("UPSMON_grpid"),_npc,_enemyside, typeof _target,side _target,_npc countEnemy _targets ]}; if (!isnull _target && alive _target && canmove _target && !captive _target && _npc knowsabout _target > 0.5 && ( _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]; call (compile format ["_targets%1 = _targets%1 - [_target]",_sharedenemy]); call (compile format ["_targets%1 = _targets%1 + [_target]",_sharedenemy]); }; }; }foreach _targets; }; sleep 0.5; }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["<t color='#33CC00'>West(A=%1 C=%2 T=%3)</t><br/><t color='#FF0000'>East(A=%4 C=%5 T=%6)</t><br/><t color='#00CCFF'>Res(A=%7 C=%8 T=%9)</t><br/>" ,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; if (!isnull (gunner _arti) && canmove (gunner _arti)) 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) 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 { [_targetPos,_rounds,_area,_maxcadence,_mincadence,_bullet] 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 %2",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; }; // --------------------------------------------------------------------------------------------------------- processInitCommands; //Executes de main process of server [] SPAWN MON_MAIN_server; diag_log "--------------------------------"; diag_log (format["UPSMON started"]); if(true) exitWith {}; // ========================================================================================================= // Script for action follow me when surrended, adds the soldier to player squad in a random choice. // Version: 1.0 // Author: Monsada (smirall@hotmail.com) // --------------------------------------------------------------------------------------------------------- private ["_obj","_caller","_id","_objtype","_rnd","_join","_direction"]; _npc = _this select 0; _caller = _this select 1; _id = _this select 2; _rnd = 0; _join=true; _npc switchmove ""; _direction = ((getpos _caller select 0) - (getpos _npc select 0)) atan2 ((getpos _caller select 1) - (getpos _npc select 1)); //If positive values are needed then use: if(_direction < 0) then {_direction = _direction + 360}; _npc setdir _direction; _npc dowatch _caller; _npc setSpeedMode "LIMITED"; _npc domove position _caller; sleep 0.5; _rnd = random 100; _npc setmimic "Sad"; if (_rnd <= 30 ) then { _npc globalchat "Ok"; }; if (_rnd > 30 && _rnd <= 50) then { _npc globalchat "Yes"; }; if (_rnd > 50 && _rnd <= 100) then { _join=false; _rnd = random 100; if (_rnd < 20) then { _npc setmimic "angry"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle31rejpaniVnose"; _npc globalchat "Kiss my ass"; }; if (_rnd > 20 && _rnd <= 40) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle33rejpaniVzadku"; sleep 3; _npc globalchat "Que te den"; }; if (_rnd > 40 && _rnd <= 60) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle33rejpaniVzadku"; sleep 1; _npc globalchat "Fuck you"; }; if (_rnd > 60 && _rnd <= 80) then { _npc setmimic "Agresive"; _npc switchmove "CtsPercMstpSnonWnonDnon_idle32podrbaniNanose"; sleep 0.5; _npc globalchat "Follow your mother"; }; if (_rnd > 80 && _rnd <= 100) then { _npc setmimic "angry"; sleep 0.1; _npc switchmove "CtsPercMstpSnonWnonDnon_idle32podrbaniNanose"; _npc globalchat "Fuck you"; }; }; if (_join) then { // remove the action once it is activated _npc stop false; if (_npc == leader _npc) then { _npc globalchat "All follow that man"; { _x switchmove ""; [_x] joinSilent _caller; }foreach units _npc; } else { _npc removeAction _id; [_npc] joinSilent _caller; }; }; if (true) exitWith {}; // ========================================================================================================= // Biblioteca de funciones comunes // Version: 5.0.7 // Author: Monsada (smirall@hotmail.com) // http://www.simulacion-esp.com/ // Comunidad Hispana de Simulación // ========================================================================================================= MON_bugged_vehicles = ["BIS_alice_emptydoor","ACE_Grenade_Geometry"]; // --------------------------------------------------------------------------------------------------------- //Función que permite posicionar objetos a la altura definida //param1: objeto //param2: altura MON_subir = { if (!isserver) exitwith{}; private ["_object","_altura","_pos","_x","_y","_z","_bld","_bldpos"]; _object = _this select 0; _altura = _this select 1; _x = 0; _y = 0; _z = 0; _pos =0; _bld = objnull; _bldpos =0; _pos = getposasl _object; _x = _pos select 0; _y = ( _pos select 1 ); _z = ( _pos select 2 ) + _altura; _object setposasl [_x,_y ,_z]; }; //Retorna la dirección entre dos posiciones MON_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}; // --------------------------------------------------------------------------------------------------------- //Función de borra unidades que han sido matadas //param1: objeto a borrar cuando muera //param2: tiempo a esperar antes de borrar el objeto MON_deleteDead = {private["_u","_s"];_u=_this select 0; _s= _this select 1; _u removeAllEventHandlers "killed"; sleep _s; deletevehicle _u}; MON_deleteDeadDist = {private["_u","_s","_dist","_OCercanos","_cicle","_deleted","_isplayer"]; _i = 0; _cicle = 10; _deleted = false; _isplayer = false; _u = _this select 0; _s = _this select 1; _dist = _this select 2; _u removeAllEventHandlers "killed"; sleep _s; while {!_deleted} do { _isplayer = false; //Buscamos objetos cercanos _OCercanos = nearestObjects [_u, ["Man"] , _dist]; //Validamos si alguno de los soldados cerca es un jugador y está vivo {if (isplayer _x && alive _x) exitwith {_isplayer = true;}}foreach _OCercanos; if (!_isplayer) then { deletevehicle _u; _deleted = true; }; sleep _cicle; }; }; // --------------------------------------------------------------------------------------------------------- //Función tomada de UPS, busca el comando en la lista y devuelve el siguiente elemento //param1: comando a buscar //param2: valor por defecto del comando //param3: array con los comandos //Retorna valor del comando encontrado o valor por defecto MON_getArg = {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}; // --------------------------------------------------------------------------------------------------------- //Función que devuelve una posición en 3D a partir de otra, una dirección y una distancia //param1: posición //param2: dirección //param3: distancia //Retorna vector de posicion en 3D [0,0,0] MON_GetPos = { private ["_pos","_dir","_dist","_cosU","_cosT","_relTX","_sinU","_sinT","_relTY","_newPos","_newPosX","_newPosY", "_targetZ" ]; _pos = _this select 0; _dir = _this select 1; _dist = _this select 2; _targetX = _pos select 0; _targetY = _pos select 1; _targetZ = _pos select 2; //Calculamos posición _cosU = [_dir] call MON_GetCOS; _sinU = [_dir] call MON_GetSIN; _cosT = abs cos(_dir); _sinT = abs sin(_dir); _relTX = _sinT * _dist * _cosU; _relTY = _cosT * _dist * _sinU; _newPosX = _targetX + _relTX; _newPosY = _targetY + _relTY; _newPos = [_newPosX,_newPosY,_targetZ]; _newPos; }; // --------------------------------------------------------------------------------------------------------- //Función que devuelve una posición en 2D a partir de otra, una dirección y una distancia //param1: posición //param2: dirección //param3: distancia //Retorna vector de posicion en 2D [0,0] MON_GetPos2D = { private ["_pos","_dir","_dist","_cosU","_cosT","_relTX","_sinU","_sinT","_relTY","_newPos","_newPosX","_newPosY" ]; _pos = _this select 0; _dir = _this select 1; _dist = _this select 2; _targetX = _pos select 0; _targetY = _pos select 1; //Calculamos posición _cosU = [_dir] call MON_GetCOS; _sinU = [_dir] call MON_GetSIN; _cosT = abs cos(_dir); _sinT = abs sin(_dir); _relTX = _sinT * _dist * _cosU; _relTY = _cosT * _dist * _sinU; _newPosX = _targetX + _relTX; _newPosY = _targetY + _relTY; _newPos = [_newPosX,_newPosY]; _newPos; }; // --------------------------------------------------------------------------------------------------------- //Función que devuelve las posiciones que se pueden ocupar dentro de un edificio //param1: objeto location //Retorna numero de posiciones que tiene el edificio MON_BldPos = {private ["_bld","_bldpos"]; _bld=_this; _bldpos = 1; while {format ["%1", _bld buildingPos _bldpos] != "[0,0,0]"} do {_bldpos = _bldpos + 1;}; _bldpos = _bldpos - 1; _bldpos;}; // --------------------------------------------------------------------------------------------------------- //Función que devuelve la casa que hay más cerca del objeto param1 y las posiciones que se pueden ocupar dentro de ella. //param1: objeto //Retorna vector con [objeto location, posiciones que tiene] MON_PosInfo = { private["_obj","_bld","_bldpos"]; _obj=_this; _bld = nearestbuilding _obj; _bldpos= _bld call MON_BldPos; [_bld,_bldpos]; }; // --------------------------------------------------------------------------------------------------------- //Función que devuelve el valor negativo o positivo del seno en base a un angulo MON_GetSIN = { private["_dir","_sin","_cos"]; _dir=_this select 0; if (_dir<90) then { _sin=1; } else { if (_dir<180) then { _sin=-1; } else { if (_dir<270) then { _sin=-1; } else { _sin=1; }; }; }; _sin }; // --------------------------------------------------------------------------------------------------------- //Función que devuelve el valor negativo o positivo del coseno en base a un angulo MON_GetCOS = { private["_dir","_cos"]; _dir=_this select 0; if (_dir<90) then { _cos=1; } else { if (_dir<180) then { _cos=1; } else { if (_dir<270) then { _cos=-1; } else { _cos=-1; }; }; }; _cos }; //Función que busca vehiculos cercanos y hace entrar a las unidades del lider //Parámeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestVehicles = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin"]; _grpid = _this select 0; _npc = _this select 1; _vehicles=[[]]; _air=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; _unitsIn = _units; //First catch combat vehicles if ( (count _units) > 0) then { _air = [_npc,200] call MON_NearestsAirTransports; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _air = _air - [_x]};}foreach _air; _units = [_grpid, _units, _air, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 1) then { _vehicles = [_npc,200,true] call MON_NearestsLandCombat; {if (_npc knowsabout(_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 0) then { _vehicles = [_npc,200] call MON_NearestsLandTransports; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 0 && (count _vehicles) > 0) then { sleep 1; _vehicles = _vehicles + _air; _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; sleep 0.05; _unitsIn = _unitsIn - _units; _unitsIn; //sleep 0.05; }; //Función que busca vehiculos cercanos y hace entrar a las unidades del lider //Parámeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestCombat = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_dist","_all"]; _grpid = _this select 0; _npc = _this select 1; _dist = _this select 2; _all = _this select 3; _vehicles=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; //If suficient units leader will not get in if (!all) then { if (count _units > 2 ) then {_units = _units - [leader _npc]}; }; _unitsIn = _units; //We need 2 units available if not any leave vehicle to another squad if ( (count _units) > 1) then { _vehicles = [_npc,_dist,_all] call MON_NearestsAirCombat; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; sleep 0.05; if ( (count _units) > 1) then { _vehicles = [_npc,_dist,_all] call MON_NearestsLandCombat; {if (_npc knowsabout(_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Función que busca vehiculos cercanos y hace entrar a las unidades del lider //Parámeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestBoat = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_dist"]; _grpid = _this select 0; _npc = _this select 1; _dist = _this select 2; _vehicles=[[]]; _units = []; _unitsIn = []; _getin=false; if (leader _npc == _npc) then { _units = units _npc; } else { _units = _units + [_npc]; }; { if ( (_x!= vehicle _x && !((vehicle _x) iskindof "StaticWeapon" )) || !(_x iskindof "Man") || !alive _x || !canmove _x || !canstand _x) then {_units = _units-[_x];}; }foreach _units; _unitsIn = _units; //We need 2 units available if not any leave vehicle to another squad if ( (count _units) > 0) then { _vehicles = [_npc,_dist] call MON_Nearestsboats; {if (_npc knowsabout (_x select 0) <= 0.5) then{ _vehicles = _vehicles - [_x]};}foreach _vehicles; _units = [_grpid, _units, _vehicles, false] call MON_selectvehicles; }; if ( (count _units) > 1 && (count _vehicles) > 0) then { sleep 1; _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Función que busca staticos cercanos y hace entrar a las unidades del lider //Parámeters: [_grpid,_npc] // <- _grpid: id of group to assign to vehicle // <- _npc: lider // -> _getin: true if any getin MON_GetIn_NearestStatic = { private["_vehicles","_npc","_units","_unitsIn","_grpid","_getin","_count"]; _grpid = _this select 0; _npc = _this select 1; _count = 0; _distance = 100; if ((count _this) > 2) then {_distance = _this select 2;}; _vehicles=[]; _units = []; _unitsIn = []; _getin=false; //Buscamos staticos cerca _vehicles = [_npc,_distance] call MON_NearestsStaticWeapons; if ( count _vehicles == 0) exitwith {_unitsIn;}; if (leader _npc == _npc) then { _units = (units _npc) - [_npc]; } else { _units = _units + [_npc]; }; //Solo tomamos las unidades vivas y que no estén en vehiculo { if ( (_x iskindof "Man") && _x == vehicle _x && alive _x && canmove _x && canstand _x) then { _unitsIn = _unitsIn + [_x]; }; }foreach _units; //Intentamos tomar solo las que estén disponibles _units = []; { if (unitready _x) then { _units = _units + [_x]; }; }foreach _unitsin; //Si hay unidades disponibles las usamos if (count _units > 0) then { _unitsIn = _units; }; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Found %2 estatic weapons %3 men available",_grpid,count _vehicles, count _unitsIn]}; _units = _unitsIn; if ( count _unitsIn > 0) then { _units = [_grpid, _units, _vehicles, true] call MON_selectvehicles; }; _unitsIn = _unitsIn - _units; _unitsIn; }; //Function to assign units to vehicles //Parámeters: [_grpid,_unitsin,_vehicle] // <- _grpid: id of group to assign to vehicle // <- _units: array of units to getin // <- _vehicles: array of vehicles to use // -> _untis: array of units getin MON_selectvehicles = { private["_vehicles","_emptypositions","_units","_unitsIn","_i","_grpid","_vehgrpid","_unit","_wp","_any","_index","_cargo"]; _grpid = _this select 0; _units = _this select 1; _vehicles = _this select 2; _any = _this select 3; //meter en cualquier vehiculo _wp = []; _vehicle = []; _unitsIn = []; _emptypositions = 0; _i = 0; _vehgrpid = 0; _unit = objnull; _index = 0; _cargo = []; { if ((count _units) == 0 ) exitwith {}; _vehicle = _x select 0 ; _emptypositions = _x select 1; _unitsIn = []; _i = 0; _vehgrpid = _vehicle getvariable ("UPSMON_grpid"); _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_vehgrpid") ) then {_vehgrpid = 0;}; if ( isNil("_cargo") ) then {_cargo = [];}; //Asignamos el vehiculo a a la escuadra si contiene las posiciones justas if (_vehgrpid == 0) then { _vehicle setVariable ["UPSMON_grpid", _grpid, false]; _vehicle setVariable ["UPSMON_cargo", _unitsIn, false]; _vehgrpid = _grpid; }; { if (!alive _x || !canmove _x) then {_cargo = _cargo - [_x]; }; }foreach _cargo; _emptypositions = _emptypositions - (count _cargo - count ( crew _vehicle) ); //if (KRON_UPS_Debug>0) then {player sidechat format["%1 %2 positions=%3 cargo=%4 crew=%5",_grpid, typeof _vehicle, _emptypositions, count _cargo,count (crew _vehicle)]}; //ahora buscamos en cualquier vehiculo if ( _vehgrpid == _grpid || (_emptypositions > 0 && _any)) then { while {_i < _emptypositions && _i < count _units} do { _unit = _units select _i; _unitsIn = _unitsIn + [_unit]; _i = _i + 1; }; _units = _units - _unitsIn; if ( (count _unitsIn) > 0) then { //Metemos las unidades en el vehiculo [_grpid,_unitsIn,_vehicle] spawn MON_UnitsGetIn; if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Get in %2 %3 units of %4 available",_grpid,typeof _vehicle,count _unitsIn,_emptypositions]}; //if (KRON_UPS_Debug>0 ) then {diag_log format["%1: Moving %3 units into %2 with %4 positions",_grpid,typeof _vehicle,count _unitsIn,_emptypositions]}; }; }; _index = _index + 1; sleep 0.05; } foreach _vehicles; _units; }; //Funcion que mete la tropa en el vehiculo //Parámeters: [_grpid,_unitsin,_vehicle] // <- _grpid: id of group to assign to vehicle // <- _unitsin: array of units to getin // <- _vehicle MON_UnitsGetIn = { private["_grpid","_vehicle","_npc","_driver","_gunner", "_unitsin", "_units" , "_Commandercount","_Drivercount","_Gunnercount","_cargo", "_Cargocount","_emptypositions","_Commander","_vehgrpid","_cargo"]; _grpid = _this select 0; _unitsin = _this select 1; _vehicle = _this select 2; _units = _unitsin; _driver = objnull; _gunner = objnull; _Commander = objnull; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; _cargo = []; _Cargocount = (_vehicle) emptyPositions "Cargo"; _Gunnercount = (_vehicle) emptyPositions "Gunner"; _Commandercount = (_vehicle) emptyPositions "Commander"; _Drivercount = (_vehicle) emptyPositions "Driver"; //Obtenemos el identificador del vehiculo _vehgrpid = _vehicle getvariable ("UPSMON_grpid"); _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_vehgrpid") ) then {_vehgrpid = 0;}; if ( isNil("_cargo") ) then {_cargo = [];}; _cargo = _cargo - _unitsin; //Para evitar duplicados _cargo = _cargo + _unitsin; //Añadimos a la carga _vehicle setVariable ["UPSMON_cargo", _cargo, false]; //Hablitamos a la IA para entrar en el vehiculo { [_x,0] call MON_dostop; if ("StaticWeapon" countType [vehicle (_x)]>0) then { _x spawn MON_doGetOut; }; unassignVehicle _x; _x spawn MON_Allowgetin; }foreach _units; //Asignamos al lider como comandante o carga { if ( _vehgrpid == _grpid && _x == leader _x && _Commandercount > 0 ) exitwith { _Commandercount = 0; _Commander = _x; _Commander assignAsCommander _vehicle; _units = _units - [_x]; [_x] orderGetIn true; }; if ( _x == leader _x && _Cargocount > 0 ) exitwith { _x assignAsCargo _vehicle; _units = _units - [_x]; _Cargocount = _Cargocount - 1; [_x] orderGetIn true; }; }foreach _units; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: _vehgrpid %2 ,_Gunnercount %3, %4",_grpid,_vehgrpid,_Gunnercount,count _units]}; //Si el vehiculo pertenece al grupo asignamos posiciones de piloto, sinó solo de carga if ( _vehgrpid == _grpid ) then { //Asignamos el conductor if ( _Drivercount > 0 && count (_units) > 0 ) then { _driver = _units select (count _units - 1); [_driver,_vehicle,0] spawn MON_assignasdriver; _units = _units - [_driver]; }; //Asignamos el artillero if ( _Gunnercount > 0 && count (_units) > 0 ) then { _gunner = [_vehicle,_units] call MON_getNearestSoldier; [_gunner,_vehicle] spawn MON_assignasgunner; _units = _units - [_gunner]; }; }; //if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: _vehgrpid=%2 units=%4",_grpid,_vehgrpid,_cargocount,count _units]}; //Movemos el resto como carga if ( _Cargocount > 0 && count (_units) > 0 ) then { { _x assignAsCargo _vehicle; [_x] orderGetIn true; sleep 0.05; } forEach _units; }; { [_x] spawn MON_avoidDissembark; } forEach _unitsin - [_driver] - [_gunner]; }; MON_getNearestSoldier = { private["_units","_obj","_near"]; _obj = _this select 0; _units = _this select 1; _near = objnull; { if (isnull _near) then { _near = _x; } else { if ( _x distance _obj < _near distance _obj ) then {_near = _x;}; }; }foreach _units; _near; }; MON_avoidDissembark = { private["_npc","_vehicle","_timeout"]; _npc = _this select 0; _vehicle = vehicle _npc ; _timeout = 120; _timeout = time + _timeout; while {_npc == vehicle _npc && alive _npc && canmove _npc && time < _timeout} do { sleep 1; }; if (!alive _npc || !canmove _npc || time >= _timeout || driver vehicle _npc == _npc) exitwith{}; _npc stop true; while {_npc != vehicle _npc && alive _npc && canmove _npc} do {sleep 1;}; _npc stop false; sleep 0.5; if (!alive _npc || !canmove _npc) exitwith{}; }; //Función que devuelve un vehiculo de transporte cercano //Parámeters: [_npc] // <- _npc: object for position search // -> _vehicle: vehicle MON_NearestLandTransport = { private["_vehicle","_npc","_transportSoldier","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount"]; _npc = _this; _OCercanos = []; _transportSoldier = 0; _vehicle = objnull; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , 150]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _transportSoldier = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && canMove _x && _transportSoldier >= count (units _npc) && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) exitwith {_vehicle = _x;}; }foreach _OCercanos; _vehicle; }; //Función que devuelve un array con los vehiculos terrestres más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsLandTransports = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función que devuelve un array con los vehiculos terrestres más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsLandCombat = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance","_all"]; _npc = _this select 0; _distance = _this select 1; _all = _this select 2; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Car","TANK","Truck","Motorcycle"] , _distance]; { if (_all) then { _Cargocount = (_x) emptyPositions "Cargo"; }; _Gunnercount = (_x) emptyPositions "Gunner"; _Drivercount = (_x) emptyPositions "Driver"; _Commandercount = (_x) emptyPositions "Commander"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _Gunnercount > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función que devuelve un array con los vehiculos aereos más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsAirTransports = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Helicopter"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función que devuelve un array con los vehiculos aereos más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsAirCombat = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance","_all"]; _npc = _this select 0; _distance = _this select 1; _all = _this select 2; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Helicopter"] , _distance]; { if (_all) then { _Cargocount = (_x) emptyPositions "Cargo"; }; _Gunnercount = (_x) emptyPositions "Gunner"; _Drivercount = (_x) emptyPositions "Driver"; _Commandercount = (_x) emptyPositions "Commander"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _Gunnercount > 0 && canMove _x && !(typeof _x in MON_bugged_vehicles) && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función que devuelve un array con los vehiculos staticos más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_NearestsStaticWeapons = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["StaticWeapon"] , _distance]; { _Gunnercount = (_x) emptyPositions "Gunner"; _emptypositions = _Gunnercount; if (!locked _x && alive _x && _emptypositions > 0 && !(typeof _x in MON_bugged_vehicles) ) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función que devuelve un array con los vehiculos marinos más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_Nearestsboats = { private["_vehicles","_npc","_emptypositions","_OCercanos","_driver", "_Commandercount","_Drivercount","_Gunnercount","_Cargocount","_distance"]; _npc = _this select 0; _distance = _this select 1; _OCercanos = []; _emptypositions = 0; _vehicles = []; _Cargocount = 0; _Gunnercount = 0; _Commandercount = 0; _Drivercount = 0; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Ship"] , _distance]; { _Cargocount = (_x) emptyPositions "Cargo"; _Gunnercount = (_x) emptyPositions "Gunner"; _Commandercount = (_x) emptyPositions "Commander"; _Drivercount = (_x) emptyPositions "Driver"; _emptypositions = _Cargocount + _Gunnercount + _Commandercount + _Drivercount; if (!locked _x && _emptypositions > 0 && canMove _x && (_drivercount > 0 || side _npc == side _x )) then { _vehicles = _vehicles + [[_x,_emptypositions]];}; }foreach _OCercanos; _vehicles; }; //Función para retardar la toma del volante, así no se va el vehiculo y da tiempo a subir MON_assignasdriver = { private["_vehicle","_driver","_wait"]; _driver = _this select 0; _vehicle = _this select 1; _wait = _this select 2; [_driver,_wait] spawn MON_dostop; unassignVehicle _driver; _driver assignasdriver _vehicle; [_driver] orderGetIn true; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: assigning to driver of %2 ",_driver, typeof _vehicle]}; }; MON_assignasgunner = { private["_vehicle","_gunner","_dist"]; _gunner = _this select 0; _vehicle = _this select 1; _dist=0; _gunner assignasgunner _vehicle; [_gunner] orderGetIn true; waituntil { _gunner != vehicle _gunner || !alive _gunner || !canmove _gunner ||!alive _vehicle || !canfire _vehicle}; if ( alive _gunner && alive _vehicle && canmove _gunner && canfire _vehicle) then { _dist = _gunner distance _vehicle; if (_dist < 3) then { _gunner moveInTurret [_vehicle, [0,0]] ; }; }; }; //Allow getin MON_Allowgetin = { //Hablitamos a la IA para entrar en el vehiculo [_this] allowGetIn true; }; //Función que ordena al soldado salir si se encuentra en un vehiculo y a la distancia indicada //Parámeters: [_heli,_targetPos,_atdist] // <- _npc: unit in vehicle // <- _targetPos: position for exiting(if no waypoint used) // <- _atdist: distance for doing paradrop or landing // -> _getout: true if getout MON_GetOutDist = { private["_vehicle","_npc","_target","_atdist","_getout","_dogetout","_driver","_commander","_targetpos","_dist","_vehpos","_vehicles"]; _npc = _this select 0; _targetpos = _this select 1; _atdist = _this select 2; _getout = false; _dogetout = []; _vehicles = []; sleep 0.05; if (!alive _npc) exitwith{}; _vehicle = vehicle _npc; _vehpos = getpos _vehicle; _dist = round([_vehpos,_targetpos] call KRON_distancePosSqr); //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Getoutdist dist=%2 atdist=%3 ",typeof _vehicle,_dist, _atdist]}; if ( _vehicle != _npc || !(_npc iskindof "Man")) then { if ( (_dist) <= _atdist ) then { { if (( vehicle _x != _x || !(_x iskindof "Man")) && !((vehicle _x) in _vehicles)) then { _vehicles = _vehicles + [vehicle _x]; }; }foreach units _npc; { _vehicle = _x; _dogetout = crew _vehicle; _driver = driver _vehicle; _gunner = gunner _vehicle; //Si hay artillero no sacarenos ni al piloto ni al artillero ni al comandante if ( alive _gunner && canmove _gunner ) then { _dogetout = _dogetout - [_gunner] - [_driver]; }; if ( count _dogetout > 0 ) then { _getout = true; //Paramos el vehiculo y esperamos 5 segundos [_vehicle,10] spawn MON_doStop; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Getoutdist dist=%2 atdist=%3 ",typeof _vehicle,_dist, _atdist]}; { _x spawn MON_GetOut; sleep 0.5; }foreach _dogetout; //Quitamos el id al vehiculo para que pueda ser reutilizado _vehicle setVariable ["UPSMON_grpid", 0, false]; _vehicle setVariable ["UPSMON_cargo", [], false]; [_npc,_vehicle, _driver] spawn MON_checkleaveVehicle; }; } foreach _vehicles; }; }; _dogetout; }; //Evalua si han salido todas las unidades para abandonar el vehiculo MON_checkleaveVehicle={ _npc = _this select 0; _vehicle = _this select 1; _driver = _this select 2; _in = false; //Damos tiempo a que todas las unidades salgan sleep 10; { if (_x != vehicle _x) then {_in = true}; }foreach units _npc; if (!_in) then { _driver enableAI "MOVE"; sleep 1; _driver stop false; sleep 1; _driver leaveVehicle _vehicle; sleep 1; }; }; //Function for order a unit to exit if no gunner //Parámeters: [_npc] // <- _npc: MON_GetOut = { private["_vehicle","_npc","_getout" ,"_gunner"]; _npc = _this; _vehicle = vehicle (_npc); _gunner = objnull; _gunner = gunner _vehicle; sleep 0.05; if (!alive _npc) exitwith{}; //Si no hay artillero abandonamos el vehiculo if ( isnull _gunner || !alive _gunner || !canmove _gunner || (_gunner != _npc && driver _vehicle != _npc && commander _vehicle != _npc) ) then { [_npc] allowGetIn false; _npc spawn MON_doGetOut; unassignVehicle _npc; //sleep 0.2; }; }; //Function for order a unit to exit //Parámeters: [_npc] // <- _npc: MON_doGetOut = { private["_vehicle","_npc","_getout" ,"_gunner","_groupOne","_timeout","_dir"]; _npc = _this; _vehicle = vehicle (_npc); sleep 0.05; if (_vehicle == _npc) exitwith{}; //Wait until vehicle is stopped waituntil {!alive _npc || !canmove _npc || !alive _vehicle || ((velocity _vehicle select 0) <= 0 && (velocity _vehicle select 1) <= 0 ) || ( _vehicle iskindof "Air" && ((position _vehicle) select 2) <= 1)}; if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc action ["getOut", _vehicle]; doGetOut _npc; [_npc] spawn MON_cancelstop; waituntil {!alive _npc || !canmove _npc || vehicle _npc == _npc}; if (!alive _npc || !canmove _npc) exitwith{}; if (leader _npc != _npc) then { //Moves out with dispersion of 45º _dir = getDir _npc; _dir = _dir + 45 - (random 90); [_npc,25,_dir] spawn MON_domove; //if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 Moving away from %2 %2º",_npc, typeof _vehicle,_dir];}; }; }; //Function for exiting of heli //Parámeters: [_heli,_targetPos,_atdist] // <- _heli: // <- _targetPos: position for exiting(if no waypoint used) // <- _atdist: distance for doing paradrop or landing MON_doParadrop = { private["_heli","_npc","_getout" ,"_gunner","_targetpos","_helipos","_dist","_index","_grp","_wp","_targetPosWp","_targetP","_units","_crew","_timeout"]; _heli = _this select 0; _targetPos = [0,0]; _atdist = 250; _flyingheigh = 90; _landonBeh = ["CARELESS","SAFE"]; _timeout=0; //Gets optional parameters if ((count _this) > 1) then {_targetPos = _this select 1;}; if ((count _this) > 2) then {_atdist = _this select 2;}; if ((count _this) > 3) then {_flyingheigh = _this select 3;}; _helipos = [0,0]; _targetposWp = [0,0]; _gunner = objnull; _gunner = gunner _heli; _dist = 1000000; _index = 0; _grp = GRPNULL; _wp = []; _units =[]; _crew =[]; if (_flyingheigh < 90) then {_flyingheigh = 90}; waituntil {count crew _heli > 0 || !alive _heli || !canmove _heli}; _grp = group ((crew _heli) select 0); _npc = leader ((crew _heli) select 0); _units = units _npc; while { (_dist >= _atdist || _dist < 10) && alive _heli && canmove _heli && count crew _heli > 0} do { _heli flyInHeight _flyingheigh; //Take last waypoint _index = (count waypoints _grp) - 1; _wp = [_grp,_index]; _targetPosWp = waypointPosition _wp; if (format ["%1", _targetPosWp] == "[0,0,0]") then {_targetPosWp = _targetPos}; _helipos = position _heli; _dist = round([_helipos,_targetPosWp] call KRON_distancePosSqr); //if (KRON_UPS_Debug>0 ) then {hintsilent format["flying heigh=%1 dist=%2 jump at=%3",(position _heli) select 2,_dist,_atdist];}; sleep 1; }; if (!alive _heli || count crew _heli == 0) exitwith{}; _crew = crew _heli; //Jump if (((position _heli) select 2) >= 60 && !surfaceIsWater position _heli && !(toupper (behaviour _npc) IN _landonBeh)) then { //moving hely for avoiding stuck [_heli,1000] spawn MON_domove; if (KRON_UPS_Debug>0 ) then {_heli globalchat format["doing paradrop high %1 dist=%2",(position _heli) select 2,_dist,_atdist];}; //Do paradrop { if( (assignedVehicleRole _x) select 0 == "Cargo")then { unassignVehicle _x; _x action ["EJECT", _heli] ; _x stop false; [_x] spawn MON_ACE_Watersurvival; }; sleep 0.5; } forEach crew _heli - [gunner _heli] - [driver _heli]; //Clear Hely vars _heli setVariable ["UPSMON_grpid", 0, false]; _heli setVariable ["UPSMON_cargo", [], false]; //Waits until all units are down _timeout = time + 60; { waituntil {(_x == vehicle _x ) || !alive _x || !canmove _x || isnull _x || time > _timeout}; //Fix bug of ACE that sometimes AI gets in stand animation //_x switchMove "AmovPercMsprSlowWrflDf_AmovPpneMstpSrasWrflDnon_2"; }foreach (_crew - [driver _heli]) - [gunner _heli]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 after paradrop",_npc]}; if (alive _npc && canmove _npc) then { _npc move _targetPosWp; }else{ {if (alive _x && canmove _x) exitwith { _x move _targetPosWp;}}foreach _crew; }; //If only pilot land heli if (count crew _heli <=1) then { [_heli] spawn MON_landHely; }; } else { //land if ( !surfaceIsWater _helipos && ((random 100)<20 || !canmove _heli || (toupper (behaviour _npc) IN _landonBeh))) then { [_heli] spawn MON_landHely; } else { If (alive _heli && canmove _heli && count crew _heli > 0) then { if (KRON_UPS_Debug>0 ) then {_heli globalchat format["%1 failed paradrop, trying another time",typeof _heli];}; //Try another time _heli flyInHeight _flyingheigh; sleep 3; [_heli, _targetPos, _atdist*1.5,_flyingheigh] spawn MON_doParadrop; }; }; }; }; //Lands hely MON_landHely = { private["_heli","_npc","_crew","_NearestEnemy","_timeout","_landing","_targetpos"]; _heli = _this select 0; _crew =[]; _targetpos=[0,0]; _timeout = 0; _landing = false; sleep 0.05; if (!alive _heli || !canmove _heli ) exitwith{}; _crew = crew _heli; _npc = leader (_crew select 0); //Checks hely is already landing _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (_landing) exitwith {}; //Orders to land heli _heli land "LAND"; if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 is landing",typeof _heli];}; //Puts a mark for knowing hely is landing _heli setVariable ["UPSMON_landing", true, false]; //Waits for land position waituntil {!alive _heli || toUpper(landResult _heli) != "NOTREADY" }; if (alive _heli && (toUpper(landResult _heli) == "NOTFOUND")) exitwith { if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 no landing zone, doing paradrop",typeof _heli];}; _heli setVariable ["UPSMON_landing", false, false]; [_heli] spawn MON_doparadrop; }; //1rt try-Waits until velocity and heigh are good for getting out _timeout = 60 + time; waituntil {!alive _heli || time > _timeout || ((velocity _heli select 2) <= 1 && ((position _heli) select 2) <= 2)}; //2nd try-Waits until velocity and heigh are good for getting out if (((position _heli) select 2) > 2 && ((position _heli) select 2) < 30 && !surfaceiswater position _heli) then { _heli land "LAND"; _timeout = 30 + time; waituntil {!alive _heli || time > _timeout || ((position _heli) select 2) > 30 || ((velocity _heli select 2) <= 1 && ((position _heli) select 2) <= 2)}; //Failed landing doing paradrop if ( ((position _heli) select 2) > 30) exitwith { if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 landing timeout, doing paradrop",typeof _heli];}; _heli setVariable ["UPSMON_landing", false, false]; sleep 5; [_heli] spawn MON_doparadrop; }; }; //Chechs if alive before continuing if (!alive _heli) exitwith{}; //dogetout each soldier { _x spawn MON_doGetOut; sleep 0.2; }forEach crew _heli; _timeout = 30 + time; //Waits until all getout of heli { waituntil {vehicle _x == _x || !canmove _x || !alive _x || movetofailed _x || time > _timeout }; }forEach _crew; // If leader alive sets combat mode if (alive _npc && canmove _npc) then { //Gets nearest known enemy for putting in combat mode _NearestEnemy = _npc findNearestEnemy _npc; if (!isnull _NearestEnemy ) then { _npc setBehaviour "AWARE"; _groupOne = group _npc; _groupOne setFormation "DIAMOND"; }; //Moves to current target Position _grpid = _npc getvariable "UPSMON_grpid"; if !(isnil "_grpid") then { _targetpos =(KRON_targetsPos select _grpid); _npc move _targetpos; if (KRON_UPS_Debug>0 ) then { player globalchat format["%1 landed, moving to %2 %3",_grpid,_targetpos,count KRON_targetsPos];}; }; }; //Quitamos el id al vehiculo para que pueda ser reutilizado _heli setVariable ["UPSMON_grpid", 0, false]; _heli setVariable ["UPSMON_cargo", [], false]; _heli setVariable ["UPSMON_landing", false, false]; }; //Controls that heli not stoped flying MON_HeliStuckcontrol = { private["_heli","_landing","_stuckcontrol","_dir1","_targetPos","_lastpos"]; _heli = _this select 0; _landing = false; _stuckcontrol = false; _targetPos=[0,0,0]; _dir1 = 0; sleep 0.05; if ( !alive _heli || !canmove _heli ) exitwith{}; //Checks stuckcontrol not active _stuckcontrol = _heli getVariable "UPSMON_stuckcontrol"; if (isnil ("_stuckcontrol")) then {_stuckcontrol=false}; if (_stuckcontrol) exitwith {}; _heli setVariable ["UPSMON_stuckcontrol", true, false]; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 stuck control begins",typeof _heli];}; //Stuck loop control while { alive _heli } do { sleep 5; if ((velocity _heli select 0) <= 3 && (velocity _heli select 1) <= 3 && (velocity _heli select 2) <= 3 && ((position _heli) select 2) >= 25) then { _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (!_landing) then { //moving hely for avoiding stuck [_heli,1000] spawn MON_domove; if (KRON_UPS_Debug>0 ) then {player GLOBALCHAT format["%1 stucked at %2m height, moving",typeof _heli,(position _heli) select 2];}; sleep 30; }; }; }; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 exits from stuck control",typeof _heli];}; _heli setVariable ["UPSMON_stuckcontrol", false, false]; }; //Function that checks is gunner is alive, if not moves a cargo MON_Gunnercontrol = { private["_vehicle","_gunnercontrol","_hasgunner","_crew","_crew2"]; _vehicle = _this select 0; _targetPos=[0,0,0]; _dir1 = 0; _gunnercontrol = false; _hasgunner = (_vehicle) emptyPositions "Gunner" > 0 || !isnull gunner _vehicle; _crew = []; _crew2 = []; //Without driver and gunner sleep 0.05; if ( !alive _vehicle || !canmove _vehicle ) exitwith{}; //Checks stuckcontrol not active _gunnercontrol = _vehicle getVariable "UPSMON_gunnercontrol"; if (isnil ("_gunnercontrol")) then {_gunnercontrol=false}; if (_gunnercontrol) exitwith {}; _vehicle setVariable ["UPSMON_gunnercontrol", true, false]; _crew = crew _vehicle; //gunner and driver loop control while { alive _vehicle && canmove _vehicle && count _crew > 0} do { _crew = crew _vehicle; { if (!canmove _x || !alive _x) then {_crew = _crew -[_x];}; }foreach _crew; //Driver control if ((isnull (driver _vehicle) || !alive (driver _vehicle) || !canmove (driver _vehicle)) && count _crew > 0) then { _crew2 = _crew - [gunner _vehicle]; if (count _crew2 > 0) then { (_crew2 select (count _crew2 - 1)) spawn MON_movetodriver; }; }; //Gunner control if ( _hasgunner && (isnull (gunner _vehicle) || !alive (gunner _vehicle) || !canmove (gunner _vehicle)) && count _crew > 1) then { _crew2 = _crew - [driver _vehicle]; if (count _crew2 > 0) then { (_crew2 select (count _crew2 - 1)) spawn MON_movetogunner; }else{ (_crew select 0) spawn MON_movetogunner; }; }; sleep 20; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 crew=%2",typeof _vehicle, count _crew];}; }; //if (KRON_UPS_Debug>0 ) then {player globalchat format["%1 exits from gunner control",typeof _vehicle];}; _vehicle setVariable ["UPSMON_gunnercontrol", false, false]; }; //Mueve a todo el grupo adelante MON_move = { private["_npc","_dir1","_targetPos","_dist"]; _npc = _this select 0; _dist = _this select 1; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; _dir1 = getDir _npc; _targetPos = [position _npc,_dir1, _dist] call MON_GetPos2D; _npc move _targetPos; }; //Mueve al soldado adelante MON_domove = { private["_npc","_dir1","_targetPos","_dist"]; _npc = _this select 0; _dist = _this select 1; if ((count _this) > 2) then {_dir1 = _this select 2;} else{_dir1 = getDir _npc;}; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; _targetPos = [position _npc,_dir1, _dist] call MON_GetPos2D; //If position water and not boat not go if (surfaceIsWater _targetPos && !(_npc iskindof "boat" || _npc iskindof "air") ) exitwith {}; _npc domove _targetPos; }; //Función que detiene al soldado y lo hace esperar x segundos MON_doStop = { private["_sleep","_npc"]; _npc = _this select 0; _sleep = _this select 1; sleep 0.05; if (!alive _npc || !canmove _npc ) exitwith{}; if ( _sleep == 0 ) then {_sleep = 0.001}; //Restauramos valores por defecto de movimiento //_npc disableAI "MOVE"; dostop _npc ; sleep _sleep; [_npc] spawn MON_cancelstop; }; //Función que detiene al soldado y lo hace esperar x segundos MON_cancelstop = { private["_npc"]; _npc = _this select 0; _npc stop false; }; //Realiza la animación de esquivar granada MON_evadeGrenade = { if (!alive _this || (vehicle _this) != _this || !canmove _this) exitwith{}; _this playmovenow "AmovPercMstpSlowWrflDnon_ActsPpneMstpSlowWrflDr_GrenadeEscape"; sleep 8; if (!alive _this || (vehicle _this) != _this || !canmove _this) exitwith{}; _this switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr"; //croqueta _this playmovenow "AmovPpneMstpSrasWrflDnon"; //prone }; //Realiza la animación de la croqueta MON_animCroqueta = { if (!alive _this || (vehicle _this) != _this || !canmove _this || !(_this iskindof "Man")) exitwith{}; if ((random 1)<=.50) then { _x switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDl"; //croqueta } else { _x switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr"; //croqueta }; }; //Lanza una granada MON_throw_grenade = { private["_target","_npc"]; _npc = _this select 0; _target = _this select 1; sleep 0.5; if (!alive _npc || (vehicle _npc) != _npc || !canmove _npc) exitwith{}; _npc addMagazine "SmokeShell"; [_npc,_target] spawn MON_dowatch; _npc selectWeapon "throw"; sleep .1; _npc fire ["SmokeShellMuzzle","SmokeShellMuzzle","SmokeShell"]; sleep 4; }; //Establece el tipo de posición MON_setUnitPos = { private["_pos","_npc"]; _npc = _this select 0; _pos = _this select 1; sleep 0.5; if (!alive _npc || !canmove _npc || _npc != vehicle _npc || !(_npc iskindof "Man")) exitwith{}; _npc setUnitPos _pos; sleep 1; }; //Establece el tipo de posición MON_setUnitPosTime = { private["_pos","_npc"]; _npc = _this select 0; _pos = _this select 1; _time = _this select 2; if (!alive _npc || !canmove _npc) exitwith{}; _npc setUnitPos _pos; sleep _time; _npc setUnitPos "AUTO"; sleep 1; }; // Función para mirar en una dirección MON_dowatch = { private["_target","_npc"]; _npc = _this select 0; _target = _this select 1; if (!alive _npc) exitwith{}; _npc dowatch _target; sleep 1; }; //Función que mueve al soldado a la posición de conductor //Parámeters: [_npc,_vehicle] // <- _npc: unit to move to driver pos // <- _vehicle MON_movetoDriver = { private["_vehicle","_npc"]; _npc = _this ; _vehicle = vehicle _npc; //Si está muerto if (vehicle _npc == _npc || !alive _npc || !canmove _npc || !(_npc iskindof "Man")) exitwith{}; if (isnull(driver _vehicle) || !alive(driver _vehicle) || !canmove(driver _vehicle)) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to driver of %2 ",_npc,typeof _vehicle]}; _npc action ["getOut", _vehicle]; doGetOut _npc; WaitUntil {vehicle _npc==_npc || !alive _npc || !canmove _npc}; //Si está muerto if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc assignasdriver _vehicle; _npc moveindriver _vehicle; }; }; //Función que mueve al soldado a la posición de conductor //Parámeters: [_npc,_vehicle] // <- _npc: unit to move to driver pos // <- _vehicle MON_movetogunner = { private["_vehicle","_npc"]; _npc = _this ; _vehicle = vehicle _npc; sleep 0.05; //Si está muerto if (vehicle _npc == _npc || !alive _npc || !canmove _npc || !(_npc iskindof "Man")) exitwith{}; if (isnull(gunner _vehicle) || !alive(gunner _vehicle) || !canmove(gunner _vehicle)) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to gunner of %2 ",_npc,typeof _vehicle]}; _npc action ["getOut", _vehicle]; doGetOut _npc; WaitUntil {vehicle _npc==_npc || !alive _npc || !canmove _npc}; //Si está muerto if (!alive _npc || !canmove _npc) exitwith{}; unassignVehicle _npc; _npc assignasgunner _vehicle; _npc moveingunner _vehicle; }; }; //Función que retorna array de arrays con edificios y sus plantas //Parámeters: [_object,(_distance,_minfloors)] // <- _object: soldier to get near buildings // <- _distance: distance to search buildings (optional, 25 by default) // <- _minfloors: min floors of building (optional) if not especified min floors is 2 // -> [_bld,_bldpos] MON_GetNearestBuildings = { private ["_object","_altura","_pos","_bld","_bldpos","_posinfo","_minfloors","_OCercanos","_distance","_blds"]; _distance = 25; _minfloors = 2; _altura = 0; _blds = []; _object = _this select 0; if ((count _this) > 1) then {_distance = _this select 1;}; if ((count _this) > 2) then {_minfloors = _this select 2;}; _pos =0; _bld = objnull; _bldpos =0; _posinfo=[]; //La altura mínima es 2 porque hay muchos edificios q devuelven 2 de altura pero no se puede entrar en ellos. if ( minfloors == 0 ) then { minfloors = 2; }; // _posinfo: [0,0]=no house near, [obj,0]=house near, but no roof positions, [obj,pos]=house near, with roof pos //_posinfo= _object call MON_PosInfo; _OCercanos = nearestObjects [_object, ["house","building"] , _distance]; { _bldpos = _x call MON_BldPos; if ( _bldpos >= _minfloors && damage _x <= 0 ) then { _blds = _blds + [[_x,_bldpos]];}; //player sidechat format["%1 cerca de edificio con %2 plantas %5",typeof _object,_bldpos]; }foreach _OCercanos; _blds; }; //Function to move al units of squad to near buildings //Parámeters: [_npc,(_patrol,_minfloors)] // <- _npc: lider // <- _distance: distance to search buildings (optional, 25 by default) // <- _patrol: wheter must patrol or not MON_moveNearestBuildings = { private ["_npc","_altura","_pos","_bld","_bldpos","_posinfo","_blds","_distance","_cntobjs1","_bldunitin","_blddist","_patrol","_wait","_all"]; _distance = 30; _altura = 0; _patrol = false; _wait=60; _all = false; _npc = _this select 0; if ((count _this) > 1) then {_distance = _this select 1;}; if ((count _this) > 2) then {_patrol = _this select 2;}; if ((count _this) > 3) then {_wait = _this select 3;}; if ((count _this) > 4) then {_all = _this select 4;}; _pos =0; _bld = objnull; _bldpos =0; _cntobjs1=0; _bldunitsin=[]; _units=[]; _blds=[]; //If all soldiers move leader too if (_all) then { _units = (units _npc); }else{ _units = (units _npc) - [_npc]; }; sleep 0.05; { if (_x iskindof "Man" && unitReady _x && _x == vehicle _x && canmove _x && alive _x && canstand _x) then {_bldunitsin = _bldunitsin + [_x]} }foreach _units; if (count _bldunitsin == 0) exitwith {}; //Obtenemos los edificios cercanos al lider _blds = [_npc,_distance] call MON_GetNearestBuildings; if (count _blds==0) exitwith {}; //Movemos a la unidades a los edificios cercanos. [_bldunitsin, _blds, _patrol,_wait,_all] spawn MON_moveBuildings; }; //Function to move al units of squad to near buildings //Parámeters: [_npc,(_patrol,_minfloors)] // <- _units: array of units // <- _blds: array of buildingsinfo [_bld,pos] // <- _patrol: wheter must patrol or not // -> _bldunitsin: array of units moved to builidings MON_moveBuildings = { private ["_npc","_altura","_pos","_bld","_bldpos","_posinfo","_blds","_cntobjs1","_bldunitin","_blddist","_i","_patrol","_wait","_all","_minpos","_blds2"]; _patrol = false; _wait = 60; _minpos = 2; _all = false; _units = _this select 0; _blds = _this select 1; if ((count _this) > 2) then {_patrol = _this select 2;}; if ((count _this) > 3) then {_wait = _this select 3;}; if ((count _this) > 4) then {_all = _this select 4;}; if ((count _this) > 5) then {_minpos = _this select 5;}; _altura = 0; _pos =0; _bld = objnull; _bldpos =0; _cntobjs1=0; _bldunitsin=[]; _movein=[]; _blds2 =[]; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_moveBuildings _units=%1 _blds=%2",count _units, count _blds]; }; //if (KRON_UPS_Debug>0) then {diag_log format["MON_moveBuildings _units=%1 _blds=%2",count _units, count _blds];}; { _bld = _x select 0; _bldpos = _x select 1; if ( _bldpos >= _minpos ) then { _cntobjs1 = 1; _movein = []; _i = 0; if (_patrol) then { if (_bldpos >= 8) then { _cntobjs1 = 2 }; } else { if (_bldpos >= 8) then { _cntobjs1 = round(random 3) + 1;}; }; //Buscamos una unidad cercana para recorrerlo { if (_x iskindof "Man" && unitReady _x && canmove _x && alive _x && vehicle _x == _x && _i < _cntobjs1) then{ _movein = _movein + [_x]; _i = _i + 1; }; } foreach _units; //if (KRON_UPS_Debug>0) then {player globalchat format["_units=%3 _bldunitsin %4 _movein=%1",_movein, typeof _bld, count _units, count _bldunitsin];} //if (KRON_UPS_Debug>0) then {diag_log format["_units=%3 _bldunitsin %4 _movein=%1 %2 %5",_movein, typeof _bld, count _units, count _bldunitsin,_x];}; if (count _movein > 0) then { _bldunitsin = _bldunitsin + _movein; _units = _units - _bldunitsin; if (_patrol) then { { [_x,_bld,_bldpos] spawn MON_patrolBuilding; }foreach _movein; } else { { _altura = floor(random(_bldpos)); if (_altura<2) then {_altura = _minpos}; [_x,_bld,_altura,_wait] spawn MON_movetoBuilding; }foreach _movein; }; }; }; if (count _units == 0) exitwith {}; }foreach _blds; //If need to enter all units in building and rest try with a superior lvl if ( _all && count _units > 0 ) then { _blds2 = []; _minpos = _minpos + 3; { if ( (_x select 1) >= _minpos) then { _blds2 = _blds2 + [_x]; }; }foreach _blds; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_moveBuildings exit _units=%1 _blds=%2",count _units, count _blds2]; }; //if (KRON_UPS_Debug>0) then {diag_log format["MON_moveBuildings exit _units=%1 _blds=%2",count _units, count _blds2];}; if (count _blds2 > 0 ) then { [_units, _blds2, _patrol,_wait,_all,_minpos] call MON_moveBuildings; }; _bldunitsin = _bldunitsin + _units; }; _bldunitsin; }; //Function to move a unit to a position in a building //Parámeters: [_npc,(_patrol,_minfloors)] // <- _npc: soldier // <- _bld: building // <- _altura: building // <- _wait: time to wait in position MON_movetoBuilding = { private ["_npc","_altura","_bld","_wait","_dist","_retry","_soldiers"]; _wait = 60; _timeout = 120; _dist = 0; _retry = false; _npc = _this select 0; _bld = _this select 1; _altura = _this select 2; if ((count _this) > 3) then {_wait = _this select 3;}; //Si está en un vehiculo ignoramos la orden if (vehicle _npc != _npc || !alive _npc || !canmove _npc) exitwith{}; //Si ya está en un edificio ignoramos la orden _inbuilding = _npc getvariable ("UPSMON_inbuilding"); if ( isNil("_inbuilding") ) then {_inbuilding = false;}; if (_inbuilding) exitwith{}; _npc domove (_bld buildingPos _altura); _npc setVariable ["UPSMON_inbuilding", _inbuilding, false]; _npc setvariable ["UPSMON_buildingpos", nil, false]; _timeout = time + _timeout; //if (KRON_UPS_Debug>0) then {player globalchat format["%4|_bld=%1 | %2 | %3",typeof _bld, _npc, typeof _npc ,_altura];}; //if (KRON_UPS_Debug>0) then {diag_log format["%4|_bld=%1 | %2 | %3",typeof _bld, _npc, typeof _npc ,_altura];}; waitUntil {moveToCompleted _npc || moveToFailed _npc || !alive _npc || !canmove _npc || _timeout < time}; if (moveToCompleted _npc && alive _npc && canmove _npc) then { _dist = [position _npc,_bld buildingPos _altura] call KRON_distancePosSqr; _soldiers = [_npc,1] call MON_nearestSoldiers; //If more soldiers in same floor see to keep or goout. if (count _soldiers > 0) then { { if (!isnil{_x getvariable ("UPSMON_buildingpos")}) exitwith {_retry = true}; }foreach _soldiers; }; if (!_retry && _dist <= 2) then { _npc setvariable ["UPSMON_buildingpos", _altura, false]; sleep 0.1; [_npc,_wait] spawn MON_dostop; }; }; if (!alive _npc || !canmove _npc) exitwith{}; _npc setVariable ["UPSMON_inbuilding", false, false]; //Down one position. if (_retry ) then { _altura = _altura + 1; _bldpos = _bld call MON_BldPos; if (_altura <= _bldpos) then { [_npc,_bld,_altura] spawn MON_movetoBuilding; }; }; }; //Función para mover a una unidad al edificio más cercano //Parámeters: [_npc,_bld,(_BldPos)] // <- _npc: soldier to move // <- _bld:building to patrol // <- _BldPos: positions of builiding (optional) MON_patrolBuilding = { private ["_npc","_bld","_bldpos","_posinfo","_minfloors","_OCercanos","_distance","_timeout","_pos","_inbuilding","_rnd","_NearestEnemy","_patrolto","_time"]; _bldpos = 0; _pos = 0; _timeout = 0; _i = 1; _inbuilding = false; _rnd = 0; _patrolto = 0; _NearestEnemy = objnull; _time = 0; _npc = _this select 0; _bld = _this select 1; if ((count _this) > 2) then {_bldpos = _this select 2;} else {_bldpos = _x call MON_BldPos;}; if (_i > _bldpos) then {_i = _bldpos}; _patrolto = round ( 10 + random (_bldpos) ); if (_patrolto > _bldpos) then {_patrolto = _bldpos}; //Si ya está muerto o no se puede mover se ignora if (!(_npc iskindof "Man") || !alive _npc || !canmove _npc) exitwith{}; //Si ya está en un edificio ignoramos la orden _inbuilding = _npc getvariable ("UPSMON_inbuilding"); if ( isNil("_inbuilding") ) then {_inbuilding = false;}; //Asignamos el vehiculo a a la escuadra si contiene las posiciones justas if (!_inbuilding) then { _inbuilding = true; _npc setVariable ["UPSMON_inbuilding", _inbuilding, false]; [_npc,"Middle"] spawn MON_setUnitPos; _timeout = time + 60; //player sidechat format["%1 patrol building %2 from %3 to %4",typeof _npc, typeof _bld,_i, _patrolto]; while { _i <= _patrolto && alive _npc && canmove _npc} do{ _npc domove (_bld buildingPos _i); _time = time + 30; waitUntil {moveToCompleted _npc or moveToFailed _npc or !alive _npc or _time < time}; if (moveToCompleted _npc) then { _timeout = time + 60; _i = _i + 1; } else { if (moveToFailed _npc || !canmove _npc || !alive _npc || _timeout < time) then { //player sidechat format["%1 Cancelando patrulla en %2",_npc, typeof _bld]; _i = _patrolto + 1; }; }; sleep 0.05; }; //Si está en un vehiculo ignoramos la orden if (!alive _npc || !canmove _npc) exitwith{}; //Volvemos con el lider _npc domove (position leader _npc); //Marcamos que ya hemos finalizado sleep 60; //Damos tiempo para salir del edificio _npc setVariable ["UPSMON_inbuilding", false, false]; }; }; //Function to put a mine //Parámeters: [_npc,(_position)] // <- _npc: leader // <- _position:location for mine (optional) MON_CreateMine = { private ["_npc","_rnd","_soldier","_mine","_dir","_position"]; _soldier = _this select 0; if ((count _this) > 1) then {_position = _this select 1;} else {_position = [0,0];}; _mine = objnull; _rnd = 0; _dir = 0; _npc = leader _soldier; if (_soldier == _npc ) then { _rnd = round (random ( count ((units _npc)))); _soldier = (units _npc) select _rnd; }; //leader only control not work //Si está en un vehiculo ignoramos la orden if (!(_x iskindof "Man" ) || _soldier == _npc || _soldier!=vehicle _soldier || !alive _soldier || !canmove _soldier) exitwith {false}; //Animación para montar el arma if ((count _this) > 1) then { [_soldier,_position] spawn MON_doCreateMine; }else{ [_soldier] spawn MON_doCreateMine; }; true; }; MON_doCreateMine = { private ["_npc","_rnd","_soldier","_mine","_dir","_position"]; _position = [0,0]; _soldier = _this select 0; if ((count _this) > 1) then {_position = _this select 1;}; //If not is Man or dead exit if (!(_x iskindof "Man" ) || _soldier!=vehicle _soldier || !alive _soldier || !canmove _soldier) exitwith {false}; _soldier stop false; [_soldier,"AUTO"] spawn MON_setUnitPos; if ((count _this) > 1) then { _soldier domove _position; waituntil {unitReady _soldier || moveToCompleted _soldier || moveToFailed _soldier || !alive _soldier || !canmove _soldier}; }; if (moveToFailed _soldier || !alive _soldier || _soldier != vehicle _soldier || !canmove _soldier) exitwith {false}; //Crouche _soldier playMovenow "ainvpknlmstpslaywrfldnon_1"; sleep 1; if (!alive _soldier || !canmove _soldier) exitwith{}; _dir = getdir _soldier; _position = [position _soldier,_dir, 0.5] call MON_GetPos2D; _mine = createMine ["MineMine", _position , [], 0]; //Prepare mine _soldier playMoveNow "AinvPknlMstpSlayWrflDnon_medic"; sleep 5; //Return to formation _soldier domove position ( leader _soldier ); }; //Function to surrender AI soldier //Parámeters: [_npc] // <- _npc: soldier to surrender MON_surrender = { private ["_npc","_vehicle"]; _npc = _this select 0; if (!alive _npc || !canmove _npc) exitwith {}; _npc addrating -1000; _npc setcaptive true; sleep 0.5; _vehicle = vehicle _npc; if ( _npc != _vehicle || !(_npc iskindof "Man" )) then { _vehicle setcaptive true; if ( "Air" countType [_vehicle]>0) then { //Si acaba de entrar en el heli se define punto de aterrizaje if (_npc == driver _vehicle ) then { [_vehicle] call MON_landHely; }; } else { _npc spawn MON_doGetOut; }; //Esperamos a que esté parado waituntil {_npc == vehicle _npc || !alive _npc}; }; if (!alive _npc || !canmove _npc) exitwith {}; _npc setcaptive true; _npc stop true; [_npc,"UP"] call MON_setUnitPos; removeAllWeapons _npc; sleep 1; _npc playMoveNow "AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon"; }; //Returns leader if was dead MON_getleader = { private ["_npc","_members"]; _npc = _this select 0; _members = _this select 1; sleep 0.05; if (!alive _npc ) then { //takes commder a soldier not in vehicle { if (alive _x && canmove _x && _x == vehicle _x && !isplayer _x) exitwith { _npc = _x; }; }foreach _members; //if no soldier out of vehicle takes any if (!alive _npc ) then { { if (alive _x && canmove _x) exitwith {_npc = _x;}; }foreach _members; }; //If not alive or already leader or is player exits if (isPlayer _npc || !alive _npc || !canmove _npc ) then { { if (alive _x && !isPlayer _x) exitwith {_npc = [_npc, _members] call MON_getleader;}; }foreach _members; _npc; }; if (leader _npc == _npc) exitwith {_npc}; //Set new _npc as leader group _npc selectLeader _npc; }; _npc; }; MON_ACE_Watersurvival = { private ["_lb","_pos","_ejector","_in","_grpid","_rnd"]; _in =[]; _rnd = 0; _ejector = _this select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_ACE_Watersurvival %1",typeof _ejector]}; waitUntil { !canmove _ejector || !alive _ejector || isnull (_ejector) || ((getPos vehicle _ejector) select 2 < 1) }; if ( !surfaceIsWater (getpos _ejector) || !canmove _ejector || !alive _ejector || isnull (_ejector) ) exitWith {}; //Miramos de entrar en un barco cercano _grpid = _ejector getvariable "UPSMON_grpid"; if (isnil "_grpid") then {_grpid = 0}; _in = [_grpid,_ejector,30] call MON_GetIn_NearestBoat; //If no boat near creates a zodiac if (count _in <= 0) then { if (!(isNil "ace_main")) then { _lb = "ACE_Lifeboat_US" createVehicle getposASL _ejector; }else{ _lb = "Zodiac" createVehicle getposASL _ejector; }; _pos = getposASL _ejector; _pos set [0, ((_pos select 0) + 2)]; _pos set [1, ((_pos select 1) + 2)]; //_pos set [2, 0]; _lb setPos _pos; //Moves in boat if !(isPlayer _ejector) then { [_ejector,_lb,0] call MON_assignasdriver; }; }; //Wait until reached eart waitUntil { !canmove _ejector || !alive _ejector || isnull (_ejector) || !surfaceIsWater (position _ejector) }; if (KRON_UPS_Debug>0) then {player globalchat format["Exit from boat%1",typeof _lb]}; _ejector spawn MON_dogetout; }; //Function to do artillery //Parámeters: [_position,(_rounds,_area,_cadence,_mincadence)] // <- _position: center of fire create artillery // <- _rounds: rounds of fire // <- _area: Dispersion area // <- _maxcadence: Cadence of fire, is random between min // <- _mincadence: Minimum cadence // <- _bullet: class of bullet to fire, default ARTY_Sh_81_HE MON_artillery_dofire = { if (!isserver) exitWith {}; private ["_smoke1","_i","_area","_position","_maxcadence","_mincadence","_sleep","_rounds"]; _area = 150; _maxcadence = 10; _mincadence = 5; _sleep = 0; _rounds = 5; _bullet = "ARTY_Sh_81_HE"; _position =[]; //_bullet = "ARTY_Sh_105_HE"; //_bullet = "ARTY_Sh_122_HE"; _position = _this select 0; if ((count _this) > 1) then {_rounds = _this select 1;}; if ((count _this) > 2) then {_area = _this select 2;}; if ((count _this) > 3) then {_maxcadence = _this select 3;}; if ((count _this) > 4) then {_mincadence = _this select 4;}; if ((count _this) > 5) then {_bullet = _this select 5;}; _area2 = _area * 2; if (KRON_UPS_Debug>0) then {player globalchat format["artillery doing fire on %1",_position]}; for [{_i=0}, {_i<_rounds}, {_i=_i+1}] do { _sleep = random _maxcadence; if (_sleep < _mincadence) then {_sleep = _mincadence}; sleep _sleep; _smoke1 = _bullet createVehicle [(_position select 0)+ random _area2 - _area, (_position select 1)+ random _area2 - _area, (_position select 2)+ 20]; }; }; //Función que devuelve un array con los vehiculos terrestres más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_deadbodies = { private["_vehicles","_npc","_bodies","_OCercanos","_distance","_side"]; _npc = _this select 0; _distance = _this select 1; //_side = _this select 2; _OCercanos = []; _bodies = []; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Man"] , _distance]; { if (_npc knowsabout _x >0.5 && (!canmove _x || !alive _x)) then { _bodies = _bodies + [_x];}; }foreach _OCercanos; _bodies; }; //Función que devuelve un array con los vehiculos terrestres más cercanos //Parámeters: [_npc,_distance] // <- _npc: object for position search // <- _distance: max distance from npc // -> _vehicles: array of vehicles MON_nearestSoldiers = { private["_vehicles","_npc","_soldiers","_OCercanos","_distance","_side"]; _npc = _this select 0; _distance = _this select 1; if (isnull _npc) exitwith {}; _OCercanos = []; _soldiers = []; //Buscamos objetos cercanos _OCercanos = nearestObjects [_npc, ["Man"] , _distance]; _OCercanos = _OCercanos - [_npc]; { if ( alive _x && canmove _x ) then { _soldiers = _soldiers + [_x];}; }foreach _OCercanos; _soldiers; }; /* ===================================================================================================== MON_spawn.sqf Author: Monsada (chs.monsada@gmail.com) Comunidad Hispana de Simulación: http://www.simulacion-esp.com ===================================================================================================== Parámeters: [_artillery,(_range,_rounds,_area,_cadence,_mincadence)] execvm "scripts\UPSMON\MON_artillery_add.sqf"; <- _artillery object to attach artillery script, must be an object with gunner. <- ( _rounds ) rounds to fire each time, default 1 <- ( _range ) range of artillery, default 800 <- ( _area ) Dispersion area, 150m by default <- ( _maxcadence ) Cadence of fire, is random between min, default 10s <- ( _mincadence ) Minimum cadence, default 5s <- ( _bullet ) Class of bullet to fire, default ARTY_Sh_81_HE ===================================================================================================== 1. Place a static weapon on map. 2. Exec module in int of static weapon nul=[this] execVM "scripts\UPSMON\MON_artillery_add.sqf"; 1. Be sure static weapon has a gunner or place a "fortify" squad near, this will make squad to take static weapon. 2. Create a trigger in your mission for setting when to fire. Set side artillery variable to true: KRON_UPS_ARTILLERY_EAST_FIRE = true; This sample will do east artilleries to fire on known enemies position, when you want to stop fire set to false. For more info: http://dev-heaven.net/projects/upsmon/wiki/Artillery_module =====================================================================================================*/ if (!isserver) exitWith {}; //Waits until UPSMON is init waitUntil {!isNil("KRON_UPS_INIT")}; waitUntil {KRON_UPS_INIT==1}; private ["_artillery","_smoke1","_i","_area","_position","_maxcadence","_mincadence","_sleep","_rounds"]; _range = 800; _area = 150; _maxcadence = 10; _mincadence = 5; _sleep = 0; _rounds = 1; _bullet = "ARTY_Sh_81_HE"; _vector =[]; _artillery = _this select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["MON_artillery_add before %1 %2 %3",isnull _artillery,alive _artillery]}; if (isnull _artillery || !alive _artillery) exitwith{}; if ((count _this) > 1) then {_rounds = _this select 1;}; if ((count _this) > 2) then {_range = _this select 2;}; if ((count _this) > 3) then {_area = _this select 3;}; if ((count _this) > 4) then {_maxcadence = _this select 4;}; if ((count _this) > 5) then {_mincadence = _this select 5;}; if ((count _this) > 6) then {_bullet = _this select 6;}; //Add artillery to array of artilleries _vector = [_artillery,_rounds,_range,_area,_maxcadence,_mincadence,_bullet]; if (isnil "KRON_UPS_ARTILLERY_UNITS" ) then {KRON_UPS_ARTILLERY_UNITS = []}; KRON_UPS_ARTILLERY_UNITS = KRON_UPS_ARTILLERY_UNITS + [_vector]; if (true) exitwith{}; /* ===================================================================================================== MON_spawn.sqf Author: Monsada (chs.monsada@gmail.com) Comunidad Hispana de Simulación: http://www.simulacion-esp.com ===================================================================================================== Parámeters: [Param1,Param2,Param3,[Param4]] EXECVM "SCRIPTS\UPSMON\MON_SPAWN.SQF"; <- Param1 Id of the template to copy. <- Param2 Position to create new squad. <- Param3 Nº of squads to create <- Param4 Array of parameters of UPSMON, first must be name of marc to patrol ===================================================================================================== Function that allows to spawn UPSMON squads. 1- create a squad in editor. Exec UPSMON and set TEMPLATE id, this will save members of squad, not equipement. nul = [this,"town","TEMPLATE:",1] execVM "scripts\upsmon.sqf"; 2- Exec MON_spawn on trigger or where you want telling the copy of the template to create and the position. nul = [1,[0,0,0],3,[mark, upsmon optional params]] EXECVM "SCRIPTS\UPSMON\MON_SPAWN.SQF"; =====================================================================================================*/ if (!isserver) exitWith {}; //Waits until UPSMON is init waitUntil {!isNil("KRON_UPS_INIT")}; waitUntil {KRON_UPS_INIT==1}; private ["_template","_position","_params","_copies","_membertypes","_unittype","_side","_UCthis","_initstr","_grp","_lead","_newunit","_i","_newpos","_vehicle","_initlstr"]; //Parameter reading _template = _this select 0; _position = _this select 1; _copies = _this select 2; _params = _this select 3; //Initialization _membertypes = []; _side = ""; _UCthis = []; _initstr = ""; _initlstr = ""; _grp = grpnull; _lead = objnull; _newunit = objnull; _newpos=[]; _vehicle=[]; //Gets parameters of UPSMON for [{_i=0},{_i<count _params},{_i=_i+1}] do {_e=_params select _i; if (typeName _e=="STRING") then {_e=toUpper(_e)};_UCthis set [_i,_e]}; _initstr = ["INIT:","",_UCthis] call KRON_UPSgetArg; _initlstr = ["INITL:","",_UCthis] call KRON_UPSgetArg; _initlstr = _initlstr + _initstr; _spawned= if ("SPAWNED" in _UCthis) then {true} else {false}; if (!_spawned) then {_UCthis = _UCthis + ["SPAWNED"]}; if (KRON_UPS_Debug>0) then {player globalchat format["Spawning %3 copies of template %1",_template,_position,_copies,count KRON_UPS_TEMPLATES]}; //if (KRON_UPS_Debug>0) then {diag_log format["Spawning %3 copies of template %1 on %2 templates %4",_template,_position,_copies,count KRON_UPS_TEMPLATES]}; //Search if any template { if ((_x select 0) == _template) then { _side = _x select 1; _membertypes = _x select 2; _vehicletypes = _x select 3; //Gets leader type _unittype= _membertypes select 0; //if (KRON_UPS_Debug>0) then {player globalchat format["template %1:%2 ",_template,_membertypes]}; for [{_i=1},{_i<=_copies},{_i=_i+1}] do { // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup _side; _lead = _grp createUnit [_unittype, _position, [], 0, "form"]; _lead setVehicleInit _initlstr; [_lead] join _grp; _grp selectLeader _lead; sleep 1; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newpos = _position findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_newpos = _position}; _newunit = _grp createUnit [_x, _newpos, [],0,"form"]; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _membertypes; { _newpos = _position findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_newpos = _position}; _newunit = _x createvehicle (_newpos); } foreach _vehicletypes; //Set new parameters _params = [_lead] + _UCthis; //Exec UPSMON script _params SPAWN UPSMON; processInitCommands; }; }; }foreach KRON_UPS_TEMPLATES; if (true) exitwith{}; // ========================================================================================================= // Script for adding the action of follow player. // Version: 1.0 // Author: Monsada (smirall@hotmail.com) // --------------------------------------------------------------------------------------------------------- private ["_side","_soldiers"]; _side = _this select 0; _soldiers = switch (_side) do { case west: {KRON_AllWest}; case east: {KRON_AllEast}; case resistance: {KRON_AllRes}; }; { if ( leader _x == _x ) then { _x addaction ["Order your men to follow me", "scripts\UPSMON\actions\followme.sqf", [], 1, false]; } else { _x addaction ["Follow me", "scripts\UPSMON\actions\followme.sqf", [], 1, false]; }; }foreach _soldiers; if (true) exitWith {}; // ========================================================================================================= // UPSMON - Urban Patrol Script Mon // Version: 5.0.7 Beta 4 // Author: Monsada (chs.monsada@gmail.com) // Comunidad Hispana de Simulación: // http://www.simulacion-esp.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) // --------------------------------------------------------------------------------------------------------- // Required parameters: // unit = Unit to patrol area (1st argument) // markername = Name of marker that covers the active area. (2nd argument) // // Patrol squad samples: // nul=[this,"town"] execVM "upsmon.sqf"; // // defensive squad samples: // nul=[this,"town","nomove"] execVM "scripts\upsmon.sqf"; // // Optional parameters: _ // random = Place unit at random start position. // randomdn = Only use random positions on ground level. // randomup = Only use random positions at top building positions. // min:n/max:n = Create a random number (between min and max) of 'clones'. // init:string = Custom init string for created clones. // nomove = Unit will stay at start position until enemy is spotted. // nofollow = Unit will only follow an enemy within the marker area. // delete:n = Delete dead units after 'n' seconds. // nowait = Do not wait at patrol end points. // noslow = Keep default behaviour of unit (don't change to "safe" and "limited"). // noai = Don't use enhanced AI for evasive and flanking maneuvers. // showmarker = Display the area marker. // trigger = Display a message when no more units are left in sector. // empty:n = Consider area empty, even if 'n' units are left. // track = Display a position and destination marker for each unit. // reinforcement = Makes squad as reinforcement, when alarm KRON_UPS_reinforcement==true this squad will go where enemy were. // reinforcement:x = Makes squad as reinforcement id, when alarm KRON_UPS_reinforcementx==true this squad will go where enemy were. // fortify = makes leader order to take positions on nearly buildings at distance 200 meters, squad fortified moves less than "nomove" // spawned = use only with squads created in runtime, this feature will add squad to UPSMON correctly. // nowp = No waypoints will be created for this squad UNTIL ENEMY DETECTED, this squad will comunicate enemies but will not be moved by UPSMON until enemy detected, after that upsmon takes control of squad // nowp2 = No waypoints will be created for this squad UNTIL ENEMY DETECTED and damaged, this squad will comunicate enemies but will not be moved by UPSMON until enemy detected and damaged, after that upsmon takes control of squad // nowp3 = No waypoints will be created for this squad in any way, this squad will comunicate enemies but will not be moved by UPSMON. // ambush = Ambush squad will not move until in combat, will lay mines if enabled and wait for incoming enemies stealth and ambush when near or discovered. // ambush2 = Ambush squad will not move until in combat, will NOT LAY MINES and wait for incoming enemies stealth and ambush when near or discovered. // ambush:n = Creates an anbush and wait maximun the especified time n in seconds. you can put 0 seconds for putting mines and go away if combined with "move" for example // ambush2:n = Same as ambush:n but without laying mines. // aware,combat,stealth,careless defines default behaviour of squad // respawn = allow squad to respawn when all members are dead and no targets near // respawn:x = allows to define the number of times squad may respawn. // ----------------------------------------------------------------------------- // Modified: 08.04.2010 // ----------------------------------------------------------------------------- // Changes in version: // ----------------------------------------------------------------------------- // Added: // nowp = No waypoints will be created for this squad UNTIL ENEMY DETECTED // nowp2 = No waypoints will be created for this squad UNTIL ENEMY DETECTED AND DAMAGED // nowp3 = No waypoints will be created for this squad in any way. // Ambush2 Same as ambush but without using mines // Added spawn support for vehicles in squad // Modified: // FORTIFY moves leader too and prevents from moving when hurt // Solved bug in targetting of resistance // Solved bug when respawning a template squad were creating a new template // Solved bug that did exiting AI form vehicle when upsmon begins // Solved bug of squads loosing group and gets stucked // Avoid to take same position on buildings // ----------------------------------------------------------------------------- if (!isServer) exitWith {}; // ----------------------------------------------------------------------------- if (isNil("KRON_UPS_INIT")) then { KRON_UPS_INIT=0; }; waitUntil {KRON_UPS_INIT==1}; // convert argument list to uppercase _UCthis = []; for [{_i=0},{_i<count _this},{_i=_i+1}] do {_e=_this select _i; if (typeName _e=="STRING") then {_e=toUpper(_e)};_UCthis set [_i,_e]}; if ((count _this)<2) exitWith { if (format["%1",_this]!="INIT") then {hint "UPS: Unit and marker name have to be defined!"}; }; // Postioning private["_targetX","_targetY","_relTX","_relTY","_relUX","_relUY","_waiting","_pursue","_react","_newpos","_currPos","_orgPos","_targetPos","_attackPos","_flankPos","_avoidPos", "_speedmode"]; private["_dist","_lastdist","_lastmove1","_lastmove2","_gothit", "_supressed" , "_flankdist","_nBuilding","_nBuildingt","_distnbuid","_distnbuidt"]; private["_objsflankPos1","_cntobjs1","_objsflankPos2","_cntobjs2","_targettext","_dir1","_dir2","_dir3","_dd","_timeontarget","_newdamage","_dirf1","_dirf2","_fightmode", "_flankPos2","_cosU","_sinU","_cosT","_sinT","_reinforcement","_reinforcementsent","_target","_targets","_flankdir","_prov","_lastpos","_newtarget","_planta","_nomove", "_newflankAngle","_sharedist" ,"_targetPosOld","_fldest","_grpidx","_grpid","_i","_unitpos","_Behaviour", "_incar", "_inheli" , "_inboat","_gunner","_driver" ,"_vehicle","_minreact","_lastreact","_CombatMode","_rnd","_GetOutDist","_GetOut","_GetIn_NearestVehicles","_makenewtarget","_index","_wp","_grp","_wptype","_wpformation","_i" ,"_targetdead","_frontPos","_GetIn","_dist1","_dist2","_dist3","_fldestfront","_fldest2","_bld","_blddist","_bldunitin","_flyInHeight","_fortify","_buildingdist","_rfid","_rfidcalled","_Mines" ,"_enemytanks","_enemytanksnear","_friendlytanksnear","_mineposition","_enemytanknear","_roads","_timeout","_lastcurrpos","_wait","_countfriends","_side","_SURRENDER","_spawned","_nowp","_unitsIn" ,"_ambush","_ambushed","_ambushdist","_friendside","_enemyside","_newattackPos","_fixedtargetpos","_NearestEnemy","_targetdist","_cargo","_targetsnear","_landing","_ambushwait" ,"_membertypes","_respawn","_respawnmax","_lead","_safemode","_vehicles","_dist3","_lastwptype","_template","_unittype","_initstr","_fortifyorig","_nowpType","_ambushtype" ,"_vehicletypes"]; _grpid =0; _exit = false; _fldest = 0; _unitpos = "AUTO"; _vehicle = objnull; _minreact = KRON_UPS_minreact; _lastreact = KRON_UPS_minreact; _rnd = 0.0; _GetOutDist = 0; _GetOut=false; _index = 0; _wp=[]; _wptype="HOLD"; _wpformation = "WEDGE"; _targetdead = false; _GetIn=false; _dist3 = 0; _fldestfront = 0; _fldest2=0; _bld = objnull; _flyInHeight = 0; _rfid = 0; _rfidcalled = false; _Mines = 3; _enemytanks = []; _friendlytanks =[]; _enemytanksnear = false; _friendlytanksnear = false; _mineposition = [0,0,0]; _enemytanknear = objnull; _NearestEnemy = objnull; _roads = []; _timeout = 0; _wait=90; _countfriends = 0; _side=""; _friendside=[]; _enemyside=[]; _SURRENDER = 0; _surrended = false; _inheli = false; spawned = false; _nowp = false; _unitsIn = []; _ambush = false; _ambushed = false; _ambushdist = KRON_UPS_ambushdist; _dist2 = 0; _targetdist = 10000; _cargo = []; _targetsnear = false; _landing=false; _ambushwait = 10000; _membertypes = []; _vehicletypes =[]; _respawn = false; _respawnmax = 10000; _lead=objnull; _safemode=["CARELESS","SAFE"]; _vehicles = []; _dist3=0; _lastwptype = ""; _unittype = ""; _initstr = ""; _fortifyorig= false; // unit that's moving _obj = _this select 0; _npc = _obj; KRON_UPS_Instances = KRON_UPS_Instances + 1; // give this group a unique index _grpid = KRON_UPS_Instances; _grpidx = format["%1",_grpid]; _grpname = format["%1_%2",(side _npc),_grpidx]; _side = side _npc; //Para que no se ejecuten todas al mismo tiempo esperamos tantos segundos como id tenga _rnd = _grpid; sleep _rnd ; { _x setVariable ["UPSMON_grpid", _grpid, false]; sleep 0.05; }foreach units _npc; //is is vehicle will not be in units so must set manually if (isnil {_npc getVariable ("UPSMON_grpid")}) then { _npc setVariable ["UPSMON_grpid", _grpid, false]; }; if (KRON_UPS_Debug>0) then {player sidechat format["%1: New instance %2 %3 %4",_grpidx,_npc getVariable ("UPSMON_grpid")]}; //Is ACE mod installed and loaded? //_ace = isClass(configFile >> "CfgPatches" >> "ace_main"); //Did ACE scripting start? //if (KRON_UPS_Debug>0) then {player sidechat format["_ACE=%1 ACE=%2",_ace,!(isNil "ace_main")]}; // get name of area marker _areamarker = _this select 1; if (isNil ("_areamarker")) exitWith { hint "UPS: Area marker not defined.\n(Typo, or name not enclosed in quotation marks?)"; }; // remember center position of area marker _centerpos = getMarkerPos _areamarker; _centerX = abs(_centerpos select 0); _centerY = abs(_centerpos select 1); _centerpos = [_centerX,_centerY]; // show area marker _showmarker = if ("SHOWMARKER" in _UCthis) then {"SHOWMARKER"} else {"HIDEMARKER"}; if (_showmarker=="HIDEMARKER") then { //_areamarker setMarkerCondition "false"; // VBS2 _areamarker setMarkerPos [-abs(_centerX),-abs(_centerY)]; }; // is anybody alive in the group? _exit = true; if (typename _npc=="OBJECT") then { if (!isnull group _npc) then { _npc = [_npc,units (group _npc)] call MON_getleader; }else{ _vehicles = [_npc,2] call MON_nearestSoldiers; if (count _vehicles>0) then { _npc = [_vehicles select 0,units (_vehicles select 0)] call MON_getleader; }; }; } else { if (count _obj>0) then { _npc = [_obj,count _obj] call MON_getleader; }; }; if (!(_npc iskindof "Man")) then { if (!isnull(commander _npc) ) then { _npc = commander _npc; }else{ if (!isnull(driver _npc) ) then { _npc = driver _npc; }else{ _npc = gunner _npc; }; }; group _npc selectLeader _npc; }; if (alive _npc) then {_exit = false;}; if (KRON_UPS_Debug>0 && _exit) then {player sidechat format["%1 There is no alive members %1 %2 %3",_grpidx,typename _npc,typeof _npc, count units _npc]}; // exit if something went wrong during initialization (or if unit is on roof) if (_exit) exitWith { if (KRON_UPS_DEBUG>0) then {hint "Initialization aborted"}; }; // remember the original group members, so we can later find a new leader, in case he dies _members = units _npc; KRON_UPS_Total = KRON_UPS_Total + (count _members); //Fills member soldier types _vehicles = []; { if (vehicle _x != _x ) then { _vehicles = _vehicles - [vehicle _x]; _vehicles = _vehicles + [vehicle _x]; }; _membertypes = _membertypes + [typeof _x]; }foreach _members; //Fills member vehicle types { _vehicletypes = _vehicletypes + [typeof _x]; }foreach _vehicles; // what type of "vehicle" is unit ? _isman = "Man" countType [_npc]>0; _iscar = "LandVehicle" countType [_npc]>0; _isboat = "Ship" countType [_npc]>0; _isplane = "Air" countType [_npc]>0; // we just have to brute-force it for now, and declare *everyone* an enemy who isn't a civilian _issoldier = _side != civilian; _friends=[]; _enemies=[]; _sharedenemy=0; if (_issoldier) then { switch (_side) do { case west: { _sharedenemy=0; _friendside = [west]; _enemyside = [east]; }; case east: { _sharedenemy=1; _friendside = [east]; _enemyside = [west]; }; case resistance: { _sharedenemy=2; _enemyside = KRON_UPS_Res_enemy; if (!(east in _enemyside)) then { _friendside = [east]; }; if (!(west in _enemyside)) then { _friendside = [west]; }; }; }; }; if (_side in KRON_UPS_Res_enemy) then { _enemyside = _enemyside + [resistance]; }else { _friendside = _friendside + [resistance]; }; sleep .05; //Sets min units alive for surrender _surrender = call (compile format ["KRON_UPS_%1_SURRENDER",_side]); // Tanks friendlys are contabiliced { if ( side _x in _friendside && ( _x iskindof "Tank" || _x iskindof "Wheeled_APC" )) then { _friendlytanks = _friendlytanks + [_x]; }; }foreach vehicles; // global unit variable to externally influence script //call compile format ["KRON_UPS_%1=1",_npcname]; // X/Y range of target area _areasize = getMarkerSize _areamarker; _rangeX = _areasize select 0; _rangeY = _areasize select 1; _area = abs((_rangeX * _rangeY) ^ 0.5); // marker orientation (needed as negative value!) _areadir = (markerDir _areamarker) * -1; // store some trig calculations _cosdir=cos(_areadir); _sindir=sin(_areadir); // minimum distance of new target position _mindist=(_rangeX^2+_rangeY^2)/3; if (_rangeX==0) exitWith { hint format["UPS: Cannot patrol Sector: %1\nArea Marker doesn't exist",_areamarker]; }; //hint format["%1,%2,%3,%4",_areamarker,isNil ("_areamarker"),_rangeX,_rangeY]; // remember the original mode & speed _orgMode = behaviour _npc; _orgSpeed = speedmode _npc; // set first target to current position (so we'll generate a new one right away) _currPos = getpos _npc; _orgPos = _currPos; _orgDir = getDir _npc; _orgWatch=[_currPos,50,_orgDir] call KRON_relPos; _lastpos = _currPos; _avoidPos = [0,0]; _flankPos = [0,0]; _attackPos = [0,0]; _newattackPos = [0,0]; _fixedtargetpos = [0,0]; _frontPos = [0,0]; _dirf1 = 0;_dirf2=0;_flankPos2=[0,0]; _dist = 10000; _lastdist = 0; _lastmove1 = 0; _lastmove2 = 0; _maxmove=0; _moved=0; _damm=0; _dammchg=0; _lastdamm = 0; _timeontarget = 0; _fightmode = "walk"; _fm=0; _gothit = false; _pursue=false; _hitPos=[0,0,0]; _react = 0; _lastdamage = 0; _lastknown = 0; _opfknowval = 0; _sin0=1; _sin90=1; _cos90=0; _sin270=-1; _cos270=0; _targetX =0; _targetY=0; _relTX=0;_relTY=0; _relUX=0;_relUY=0; _supressed = false; _flankdist=0; _nBuilding=nil; _nBuildingt =nil; _speedmode="Limited"; _distnbuid = 0; _distnbuidt = 0; _objsflankPos1 = []; _cntobjs1 = 0; _objsflankPos2 = []; _cntobjs2 = 0; _targettext =""; _dir1 =0;_dir2=0;_dir3=0;_dd=0; _timeontarget=0; _newdamage =0; _reinforcement =""; _reinforcementsent = false; _target = objnull; _newtarget=objnull; _flankdir=0; //1 tendencia a flankpos1, 2 tendencia a flankpos2 _prov=0; _targets=[]; _planta=0; //Indice de plantas en edificios _newflankAngle = 0; _closeenough = KRON_UPS_closeenough; _gunner = objnull; _driver = objnull; _fortify = false; _buildingdist= 60;//Distance to search buildings near _Behaviour = "CARELESS"; _grp = grpnull; _grp = group _npc; _template = 0; _nowpType = 1; _ambushtype = 1; // set target tolerance high for choppers & planes if (_isplane) then {_closeenough=KRON_UPS_closeenough * 2}; // ***************************************** optional arguments ***************************************** // wait at patrol end points _pause = if ("NOWAIT" in _UCthis) then {"NOWAIT"} else {"WAIT"}; // don't move until an enemy is spotted _nomove = if ("NOMOVE" in _UCthis) then {"NOMOVE"} else {"MOVE"}; //fortify group in near places _fortify= if ("FORTIFY" in _UCthis) then {true} else {false}; _fortifyorig = _fortify; if (_fortify) then { _nomove="NOMOVE"; _minreact = KRON_UPS_minreact * 3; _buildingdist = _buildingdist * 2; _makenewtarget = true; _wait = 3000; }; // don't follow outside of marker area _nowp = if ("NOWP" in _UCthis) then {true} else {false}; _nowp = if ("NOWP2" in _UCthis) then {true} else {_nowp}; _nowp = if ("NOWP3" in _UCthis) then {true} else {_nowp}; _nowpType = if ("NOWP2" in _UCthis) then {2} else {_nowpType}; _nowpType = if ("NOWP3" in _UCthis) then {3} else {_nowpType}; _orignowp = _nowp; //Ambush squad will no move until in combat or so close enemy _ambush= if ("AMBUSH" in _UCthis) then {true} else {false}; _ambush= if ("AMBUSH:" in _UCthis) then {true} else {_ambush}; _ambush= if ("AMBUSH2" in _UCthis) then {true} else {_ambush}; _ambushwait = ["AMBUSH:",_ambushwait,_UCthis] call KRON_UPSgetArg; _ambushwait = ["AMBUSH2:",_ambushwait,_UCthis] call KRON_UPSgetArg; _ambushType = if ("AMBUSH2" in _UCthis) then {2} else {_ambushType}; _ambushType = if ("AMBUSH2:" in _UCthis) then {2} else {_ambushType}; // don't follow outside of marker area _respawn = if ("RESPAWN" in _UCthis) then {true} else {false}; _respawn = if ("RESPAWN:" in _UCthis) then {true} else {_respawn}; _respawnmax = ["RESPAWN:",_respawnmax,_UCthis] call KRON_UPSgetArg; if (!_respawn) then {_respawnmax = 0}; // any init strings? _initstr = ["INIT:","",_UCthis] call KRON_UPSgetArg; // don't follow outside of marker area _nofollow = if ("NOFOLLOW" in _UCthis) then {"NOFOLLOW"} else {"FOLLOW"}; // share enemy info _shareinfo = if ("NOSHARE" in _UCthis) then {"NOSHARE"} else {"SHARE"}; // "area cleared" trigger activator _areatrigger = if ("TRIGGER" in _UCthis) then {"TRIGGER"} else {if ("NOTRIGGER" in _UCthis) then {"NOTRIGGER"} else {"SILENTTRIGGER"}}; // suppress fight behaviour if ("NOAI" in _UCthis) then {_issoldier=false}; // adjust cycle delay _cycle = ["CYCLE:",KRON_UPS_Cycle,_UCthis] call KRON_UPSgetArg; _currcycle=_cycle; //spawned for squads createds in runtime _spawned= if ("SPAWNED" in _UCthis) then {true} else {false}; if (_spawned) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: squad has been spawned, respawns %2",_grpidx,_respawnmax]}; switch (side _npc) do { case west: { KRON_AllWest=KRON_AllWest + units _npc; }; case east: { KRON_AllEast=KRON_AllEast + units _npc; }; case resistance: { KRON_AllRes=KRON_AllRes + units _npc; if (east in KRON_UPS_Res_enemy ) then { KRON_UPS_East_enemies = KRON_UPS_East_enemies+units _npc; } else { KRON_UPS_East_friends = KRON_UPS_East_friends+units _npc; }; if (west in KRON_UPS_Res_enemy ) then { KRON_UPS_West_enemies = KRON_UPS_West_enemies+units _npc; } else { KRON_UPS_West_friends = KRON_UPS_West_friends+units _npc; }; }; }; call (compile format ["KRON_UPS_%1_Total = KRON_UPS_%1_Total + count (units _npc)",side _npc]); }; // drop units at random positions _initpos = "ORIGINAL"; if ("RANDOM" in _UCthis) then {_initpos = "RANDOM"}; if ("RANDOMUP" in _UCthis) then {_initpos = "RANDOMUP"}; if ("RANDOMDN" in _UCthis) then {_initpos = "RANDOMDN"}; // don't position groups or vehicles on rooftops if ((_initpos!="ORIGINAL") && ((!_isman) || (count _members)>1)) then {_initpos="RANDOMDN"}; // set behaviour modes (or not) _orgMode = "SAFE"; if ("CARELESS" in _UCthis) then {_orgMode = "CARELESS"}; if ("AWARE" in _UCthis) then {_orgMode = "AWARE"}; if ("COMBAT" in _UCthis) then {_orgMode = "COMBAT"}; if ("STEALTH" in _UCthis) then {_orgMode = "STEALTH"}; _Behaviour = _orgMode; _npc setbehaviour _Behaviour; //Sets initial speed _noslow = if ("NOSLOW" in _UCthis) then {"NOSLOW"} else {"SLOW"}; if (_noslow!="NOSLOW") then { _orgSpeed = "limited"; } else { _orgSpeed = "FULL"; }; _speedmode = _orgSpeed; _npc setspeedmode _speedmode; // If enemy detected reinforcements will be sent _reinforcement= if ("REINFORCEMENT" in _UCthis) then {"REINFORCEMENT"} else {"NOREINFORCEMENT"}; _rfid = ["REINFORCEMENT:",0,_UCthis] call KRON_UPSgetArg; if (_rfid>0) then { _reinforcement="REINFORCEMENT"; //if (KRON_UPS_Debug>0) then {hintsilent format["%1: reinforcement group %2",_grpidx,_rfid,_rfidcalled,_reinforcement]}; }; //Is a template for spawn module? _template = ["TEMPLATE:",_template,_UCthis] call KRON_UPSgetArg; //Fills template array for spawn if (_template > 0 && !_spawned) then { KRON_UPS_TEMPLATES = KRON_UPS_TEMPLATES + ( [[_template]+[_side]+[_membertypes]+[_vehicletypes]] ); //if (KRON_UPS_Debug>0) then {diag_log format["%1 Adding TEMPLATE %2 _spawned %3",_grpidx,_template,_spawned]}; //if (KRON_UPS_Debug>0) then {player globalchat format["KRON_UPS_TEMPLATES %1",count KRON_UPS_TEMPLATES]}; }; // make start position random if (_initpos!="ORIGINAL") then { // find a random position (try a max of 20 positions) _try=0; _bld=0; _bldpos=0; while {_try<20} do { _currPos=[_centerX,_centerY,_rangeX,_rangeY,_cosdir,_sindir,_areadir] call KRON_randomPos; _posinfo=[_currPos] call KRON_PosInfo3; // _posinfo: [0,0]=no house near, [obj,-1]=house near, but no roof positions, [obj,pos]=house near, with roof pos _bld=_posinfo select 0; _bldpos=_posinfo select 1; if (_isplane || _isboat || !(surfaceiswater _currPos)) then { if (((_initpos=="RANDOM") || (_initpos=="RANDOMUP")) && (_bldpos>0)) then {_try=99}; if (((_initpos=="RANDOM") || (_initpos=="RANDOMDN")) && (_bldpos==0)) then {_try=99}; }; _try=_try+1; //sleep .05; }; if (_bldpos==0) then { if (_isman) then { {_x setpos _currPos} foreach units _npc; } else { _npc setpos _currPos; }; } else { // put the unit on top of a building _npc setPos (_bld buildingPos _bldpos); _currPos = getPos _npc; _nowp=true; // don't move if on roof }; sleep .05; }; // track unit _track = if (("TRACK" in _UCthis) || (KRON_UPS_Debug>0)) then {"TRACK"} else {"NOTRACK"}; _trackername = ""; _destname = ""; if (_track=="TRACK") then { _track = "TRACK"; _trackername=format["trk_%1",_grpidx]; _markerobj = createMarker[_trackername,[0,0]]; _markerobj setMarkerShape "ICON"; _markertype = if (isClass(configFile >> "cfgMarkers" >> "WTF_Dot")) then {"WTF_DOT"} else {"DOT"}; _trackername setMarkerType _markertype; _markercolor = switch (side _npc) do { case west: {"ColorGreen"}; case east: {"ColorRed"}; case resistance: {"ColorBlue"}; default {"ColorBlack"}; }; _trackername setMarkerColor _markercolor; _trackername setMarkerText format["%1",_grpidx]; _trackername setmarkerpos _currPos; _destname=format["dest_%1",_grpidx]; _markerobj = createMarker[_destname,[0,0]]; _markerobj setMarkerShape "ICON"; _markertype = if (isClass(configFile >> "cfgMarkers" >> "WTF_Flag")) then {"WTF_FLAG"} else {"FLAG"}; _destname setMarkerType _markertype; _destname setMarkerColor _markercolor; _destname setMarkerText format["%1",_grpidx]; _destname setMarkerSize [.5,.5]; }; // delete dead units _deletedead = ["DELETE:",0,_UCthis] call KRON_UPSgetArg; if (_deletedead>0) then { {_x addEventHandler['killed',format["[_this select 0,%1] spawn KRON_deleteDead",_deletedead]]; }forEach _members; }; // how many group clones? // TBD: add to global side arrays? _mincopies = ["MIN:",0,_UCthis] call KRON_UPSgetArg; _maxcopies = ["MAX:",0,_UCthis] call KRON_UPSgetArg; if (_mincopies>_maxcopies) then {_maxcopies=_mincopies}; if (_maxcopies>140) exitWith {hint "Cannot create more than 140 groups!"}; if (_maxcopies>0) then { _copies=_mincopies+random (_maxcopies-_mincopies); // create the clones for "_grpcnt" from 1 to _copies do { // copy groups if (isNil ("KRON_grpindex")) then {KRON_grpindex = 0}; KRON_grpindex = KRON_grpindex+1; // copy group leader _unittype = typeof _npc; // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup side _npc; _lead = _grp createUnit [_unittype, getpos _npc, [], 0, "form"]; _lead setVehicleVarName format["l%1",KRON_grpindex]; call compile format["l%1=_lead",KRON_grpindex]; _lead setBehaviour _orgMode; _lead setSpeedmode _orgSpeed; _lead setSkill skill _npc; _lead setVehicleInit _initstr; [_lead] join _grp; _grp selectLeader _lead; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newunit = _grp createUnit [typeof _x, getpos _x, [],0,"form"]; _newunit setBehaviour _orgMode; _newunit setSpeedMode _orgSpeed; _newunit setSkill skill _x; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _members; _nul=[_lead,_areamarker,_pause,_noslow,_nomove,_nofollow,_initpos,_track,_showmarker,_shareinfo,"DELETE:",_deletedead] execVM "scripts\upsmon.sqf"; //sleep .05; }; processInitCommands; sleep .05; }; // units that can be left for area to be "cleared" _zoneempty = ["EMPTY:",0,_UCthis] call KRON_UPSgetArg; // create area trigger if (_areatrigger!="NOTRIGGER") then { _trgside = switch (side _npc) do { case west: {"WEST"}; case east: {"EAST"}; case resistance: {"GUER"}; case civilian: {"CIV"};}; //_trgside = switch (side _npc) do { case west: {"EAST"}; case east: {"WEST"}; case resistance: {"ANY"}; case civilian: {"ANY"};}; _trgname="KRON_Trig_"+_trgside+"_"+_areamarker; _flgname="KRON_Cleared_"+_areamarker; // has the trigger been created already? KRON_TRGFlag=-1; call compile format["%1=false",_flgname]; call compile format["KRON_TRGFlag=%1",_trgname]; if (isNil ("KRON_TRGFlag")) then { // trigger doesn't exist yet, so create one (make it a bit bigger than the marker, to catch path finding 'excursions' and flanking moves) call compile format["%1=createTrigger['EmptyDetector',_centerpos]",_trgname]; call compile format["%1 setTriggerArea[_rangeX*1.5,_rangeY*1.5,markerDir _areamarker,true]",_trgname]; call compile format["%1 setTriggerActivation[_trgside,'PRESENT',true]",_trgname]; call compile format["%1 setEffectCondition 'true'",_trgname]; call compile format["%1 setTriggerTimeout [5,7,10,true]",_trgname]; if (_areatrigger!="SILENTTRIGGER") then { call compile format["%1 setTriggerStatements['count thislist<=%6', 'titletext [''SECTOR <%2> LIMPIO'',''PLAIN''];''%2'' setmarkerpos [-%4,-%5];%3=true;', 'titletext [''SECTOR <%2> HA SIDO REOCUPADO'',''PLAIN''];''%2'' setmarkerpos [%4,%5];%3=false;']", _trgname,_areamarker,_flgname,_centerX,_centerY,_zoneempty]; } else { call compile format["%1 setTriggerStatements['count thislist<=%3', '%2=true;', '%2=false;']", _trgname,_flgname,_zoneempty]; }; //Si quieres que ejecute tu script descomenta estas lineas //message = format["_trgside=%1, _npc=%2",_trgside, _npc]; //call compile format["%1 setTriggerStatements['this', 'nul = [%1,%3,thisList] execvm ''mon\enemydetected.sqF'';', '%2=false;'];", _trgname,_flgname,_trgside]; //setTriggerStatements['this', 'nul = [thislist,_trgside] execvm "mon\enemydetectedd.sqF"';, 'ok = false'] }; sleep .05; }; //Si algún soldado tiene un edificio util cerca lo toma if ( _nomove=="NOMOVE" ) then { sleep 10; _unitsIn = [_grpid,_npc,150] call MON_GetIn_NearestStatic; if ( count _unitsIn > 0 ) then { sleep 10}; [_npc, _buildingdist,false,_wait,true] spawn MON_moveNearestBuildings; }; // init done _makenewtarget=true; _newpos=false; _targetPos = [0,0,0];//_currPos; _targettext ="_currPos"; _swimming = false; _waiting = if (_nomove=="NOMOVE") then {9999} else {0}; _sharedist = if (_nomove=="NOMOVE") then {KRON_UPS_sharedist} else {KRON_UPS_sharedist*1.5}; //Gets position of waypoint if no targetpos if (format ["%1", _targetPos] == "[0,0,0]") then { _index = (count waypoints _grp) - 1; _wp = [_grp,_index]; _targetPos = waypointPosition _wp; if (([_currpos,_targetPos] call KRON_distancePosSqr)<= 20) then {_targetPos = [0,0,0];}; }; // *********************************************************************************************************** // ************************************************ MAIN LOOP ************************************************ // *********************************************************************************************************** _loop=true; scopeName "main"; while {_loop} do { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: _cycle=%2 _currcycle=%3 _react=%4 _waiting=%5",_grpidx,_cycle,_currcycle,_react,_waiting]}; _timeontarget=_timeontarget+_currcycle; _react=_react+_currcycle; _waiting = _waiting - _currcycle; _lastreact = _lastreact+_currcycle; _newpos = false; // did anybody in the group got hit? _newdamage=0; { if((damage _x)>0.2) then { _newdamage=_newdamage+(damage _x); // damage has increased since last round if (_newdamage>_lastdamage) then { _lastdamage=_newdamage; _gothit=true; }; }; if (!alive _x || !canmove _x) then { _members=_members-[_x]; }; } foreach _members; // nobody left alive, exit routine if (count _members==0) then { _exit=true; } else { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; }; //exits from loop if (_exit) exitwith {}; //Checks if surrender is enabled if ( _surrender > 0 ) then { _surrended = call (compile format ["KRON_UPS_%1_SURRENDED",_side]); }; //If surrended exits from script if (_surrended) exitwith { { [_x] spawn MON_surrender; }foreach _members; if (KRON_UPS_Debug>0) then {_npc globalchat format["%1: %2 SURRENDED",_grpidx,_side]}; }; //Asignamos el lider actual del grupo en el array de lideres de grupos KRON_NPCs set [_grpid,_npc]; // current position _currPos = getpos _npc; _currX = _currPos select 0; _currY = _currPos select 1; if (_track=="TRACK" || KRON_UPS_Debug>0) then { _trackername setmarkerpos _currPos; }; // if the AI is a civilian we don't have to bother checking for enemy encounters if ((_issoldier) && !(_exit)) then { _pursue=false; //_Behaviour = Behaviour _npc; //Variables para saber si estamos en un vehiculo _incar = "LandVehicle" countType [vehicle (_npc)]>0; _inheli = "Air" countType [vehicle (_npc)]>0; _inboat = "Ship" countType [vehicle (_npc)]>0; //Si el grupo es un refuerzo y se han detectado los enemigos se envian al objetivo if (_rfid > 0 ) then { _rfidcalled = call (compile format ["KRON_UPS_reinforcement%1",_rfid]); if (isnil "_rfidcalled") then {_rfidcalled=false}; _fixedtargetPos = call (compile format ["KRON_UPS_reinforcement%1_pos",_rfid]); if (isnil "_fixedtargetPos") then { _fixedtargetPos=[0,0]; }else{ _fixedtargetPos = [abs(_fixedtargetPos select 0),abs(_fixedtargetPos select 1)]; _target = objnull; }; }; //Reinforcement control if (_reinforcement=="REINFORCEMENT") then { if ( (KRON_UPS_reinforcement || _rfidcalled) && (!_reinforcementsent)) then { _reinforcementsent=true; _fortify = false; _minreact = KRON_UPS_minreact; _buildingdist = 60; _react = _react + 100; _waiting = -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1 called for reinforcement %2",_grpidx,_fixedtargetPos]}; }else{ if ( !(KRON_UPS_reinforcement || _rfidcalled) && (_reinforcementsent)) then { _fixedtargetPos = [0,0]; _attackPos = [0,0]; _fortify = _fortifyorig; _reinforcementsent=false; _nowp = _orignowp; if (_rfid > 0 ) then { call (compile format ["KRON_UPS_reinforcement%1_pos = [0,0]",_rfid]); call (compile format ["KRON_UPS_reinforcement%1 = false",_rfid]); }; if (KRON_UPS_Debug>0) then {player sidechat format["%1 reinforcement canceled",_grpidx]}; }; }; }; //Gets targets from radio _targets = call (compile format ["KRON_targets%1",_sharedenemy]); //Reveal targets found by members to leader { _NearestEnemy = assignedTarget _x; //_NearestEnemy = _x findnearestenemy _x; if (_x knowsabout _NearestEnemy > 0.5 && (_npc knowsabout _NearestEnemy <= 0.5 || count _targets <= 0 )) then { if (_npc knowsabout _NearestEnemy <= 0.5 ) then { _npc reveal _NearestEnemy; if (KRON_UPS_Debug>0) then {player globalchat format["%1: %2 reveals target %3 to leader",_grpidx,typeof _x, typeof _NearestEnemy]}; }; //If no targets adds this if (count _targets <= 0) then { //_target = _NearestEnemy; _targets = _targets + [_NearestEnemy]; _NearestEnemy setvariable ["UPSMON_lastknownpos", position _NearestEnemy, false]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: %3 added to targets",_grpidx,typeof _x, typeof _target]}; }; }; }foreach units _npc; //Resets distance to target _dist = 10000; //Gets current known position of target and distance if ( !isNull (_target) && alive _target ) then { _newattackPos = _target getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _attackPos=_newattackPos; //Gets distance to target known pos _dist = ([_currpos,_attackPos] call KRON_distancePosSqr); }; }; //Initialization for geting new targets //Si el objetivo actual está muerto o no existe se limpia el conocimiento anterior if (isNull (_target) || !alive _target || !canmove _target ) then { _lastknown = 0; _opfknowval = 0; _target = objnull; }; //_maxknowledge=0; _newtarget = _target; if ((_shareinfo=="SHARE")) then { // if the leader comes across another unit that's either injured or dead, go into combat mode as well. // If the other person is still alive, share enemy information. //Solicita por radio la posición del enemigo, si está dentro del radio de acción actua if ((KRON_UPS_comradio == 2)) then { _targetsnear = false; //I we have a close target alive do not search another if (!alive _target || !canmove _target || _dist > _closeenough) then { { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: targets=%2 tg=%3 newtg=%4 dist=%5 %6 %7 %8 %9",_grpidx,count _targets,typeof _x,_newtarget, _dist,_knows, _maxknowledge,_dist2,_attackPos]}; if ( !isnull _x && canmove _x && alive _x ) then { _newattackPos = _x getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _dist3 = ([_currpos,_newattackPos] call KRON_distancePosSqr); //Sets if near targets to begin warning IF ( _dist3 <= (_closeenough + KRON_UPS_safedist)) then { _targetsnear = true }; //Sets new target if ( ( isnull (_newtarget) || captive _newtarget|| !alive _newtarget|| !canmove _newtarget || _dist3 < _dist ) && ( _dist3 <= _sharedist || _reinforcementsent ) && ( !(_x iskindof "Air") || (_x iskindof "Air" && _isplane )) && ( !(_x iskindof "Ship") || (_x iskindof "Ship" && _isboat )) && ( _x emptyPositions "Gunner" == 0 && _x emptyPositions "Driver" == 0 || (!isnull (gunner _x) && canmove (gunner _x)) || (!isnull (driver _x) && canmove (driver _x))) ) then { _newtarget = _x; _opfknowval = _npc knowsabout _x; _dist = _dist3; if (_dist < _closeenough) exitWith {}; }; }; }; } foreach _targets; sleep 0.5; }; }; //Si cambia el target cambiamos inicializamos la dirección de flanqueo if ( !isNull (_newtarget) && alive _newtarget && canmove _newtarget && (_newtarget != _target || isNull (_target)) ) then { _timeontarget = 0; _targetdead = false; _flankdir= if (random 100 <= 10) then {0} else {_flankdir}; _target = _newtarget; }; }; //Gets current known position of target and distance if ( !isNull (_target) && alive _target ) then { //Enemy detected if (_fightmode != "fight" ) then { _fightmode = "fight"; _react = KRON_UPS_react; if (KRON_UPS_Debug>0) then {player sidechat format["%1: Enemy detected %2",_grpidx, typeof _target]}; if (_nowpType == 1) then {_nowp = false}; }; _newattackPos = _target getvariable ("UPSMON_lastknownpos"); if ( !isnil "_newattackPos" ) then { _attackPos=_newattackPos; //Gets distance to target known pos _dist = ([_currpos,_attackPos] call KRON_distancePosSqr); //Looks at target known pos _members lookat _attackPos; }; }; //Si el enemigo se ha alejado de la covertura de rádio y no es un refuerzo enviado habremos perdido la pista if ( _fightmode != "walk" && !isnull(_target) && _dist < 15 && _npc knowsabout _target < 0.5 ) then { //If squad is near last position and no target clear position of target if (KRON_UPS_Debug>0) then {player sidechat format["%1: Target lost",_grpidx]}; _fightmode="walk"; _speedmode = _orgSpeed; _target = objnull; _Behaviour = _orgMode; _waiting = -1; _unitpos = "AUTO"; _pursue=false; _nowp = _orignowp; _targetdead = true; _makenewtarget = true; //Volvemos a la posición original }; //Si aumenta el conocimiento del target aceleramos la reacción if (_opfknowval>_lastknown ) then { _react = _react + 20; }; // if spotted an enemy or got shot, so start pursuit, if in combat and exceed time to react or movecompleted if (_fightmode != "walk" && ((_react >= KRON_UPS_react && _lastreact >=_minreact) || moveToCompleted _npc )) then { _pursue=true; }; //Ambush if (_ambush && !_ambushed) then { _ambushed = true; _nowp = true; _currcycle = 2; _grp setFormation "LINE"; _npc setBehaviour "STEALTH"; _npc setSpeedMode "FULL"; sleep 10; { [_x,"DOWN"] spawn MON_setUnitPos; _x stop true; }foreach units _npc; //Puts a mine if near road if ( KRON_UPS_useMines && _ambushType == 1 ) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: Puting mine for ambush",_grpidx]}; _npc setBehaviour "careless"; _dir1 = getDir _npc; _mineposition = [position _npc,_dir1, 25] call MON_GetPos2D; _roads = _mineposition nearroads KRON_UPS_ambushdist; if (count _roads > 0) then { _mineposition = position (_roads select 0); if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; if (count _roads > 3) then { _mineposition = position (_roads select 3); if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; }; } else { _mineposition = [position _npc,(_dir1-30)mod 360, KRON_UPS_ambushdist + random 15] call MON_GetPos2D; if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _mineposition = [position _npc,(_dir1+30)mod 360, KRON_UPS_ambushdist + random 15] call MON_GetPos2D; if (_Mines > 0 && [_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; }; _mineposition = [position _npc,_dir1, KRON_UPS_ambushdist + random 20] call MON_GetPos2D; if ([_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _mineposition = [position _npc,_dir1-15, KRON_UPS_ambushdist + random 10] call MON_GetPos2D; if ([_npc,_mineposition] call MON_CreateMine) then {_Mines = _Mines -1;}; _npc setBehaviour "careless"; sleep 30; { if (!stopped _x) then { _x domove position _npc; waituntil {moveToCompleted _x || moveToFailed _x || !alive _x || !canmove _x || _x distance _npc <= 5}; }; }foreach units _npc; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; _npc setBehaviour "STEALTH"; _grp setFormation "LINE"; sleep 10; { [_x,"DOWN"] spawn MON_setUnitPos; _x stop true; _x setUnitPos "DOWN"; }foreach units _npc; }; //Ambus enemy is nearly aproach //_ambushdist = 50; if (_ambush) then { _prov = ((_ambushdist*2 - (_npc distance _target))*3) - 40; //if (KRON_UPS_Debug>0) then {player sidechat format["%1:%6 _ambushdist=%5 last=%2 dist=%3 prov=%4",_grpidx,_lastdist,_npc distance _target,_prov,_ambushdist,typeof _target]}; if (_gothit || _reinforcementsent || time > _ambushwait || ( "Air" countType [_target]<=0 && ( _npc distance _target <= _ambushdist + random 10 || (!isNull (_target) && (( random 100 <= _prov && _npc distance _target > _lastdist) || _npc distance _target > _ambushdist*3 && _lastdist < _ambushdist*3 && _lastdist > 0)) )) ) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1: FIREEEEEEEEE!!!",_grpidx]}; _nowp = _orignowp; _ambush = false; _ambushed = false; _currcycle = _cycle; { _x stop false; _x setUnitPos "Middle"; } foreach _members; //No engage yet _pursue = false; }; //Sets distance to target _lastdist = _npc distance _target; }; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: _nowp=%2 in vehicle=%3 _inheli=%4 _npc=%5",_grpidx,_nowp,vehicle (_npc) ,_inheli,typeof _npc ]}; //If in vehicle take driver if not controlled by user if (alive _npc && !_nowp) then { if (!_isman || (vehicle (_npc) != _npc && !_inboat && !(vehicle (_npc) iskindof "StaticWeapon"))) then { //If new target is close enough leaves vehicle _unitsin = []; if (!_inheli) then { if (_fightmode == "walk") then { _GetOutDist = _area / 20; }else{ _GetOutDist = _closeenough * ((random .4) + 0.6); }; //If near target or stuck getout of vehicle and lock or gothit exits inmediately if (_gothit || _dist <= _closeenough * 1.5 || (_lastcurrpos select 0 == _currpos select 0 && _lastcurrpos select 1 == _currpos select 1 && moveToFailed (vehicle (_npc))) || moveTocompleted (vehicle (_npc))) then { _GetOutDist = 10000; }; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: vehicle=%2 _npc=%3",_grpidx,vehicle (_npc) ,typeof _npc ]}; _unitsin = [_npc,_targetpos,_GetOutDist] call MON_GetOutDist; sleep 0.05; }else{ _GetOutDist = 0; }; if (count _unitsin > 0) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Geting out of vehicle, dist=%2 atdist=%3 _area=%4",_grpidx,([_currpos,_targetpos] call KRON_distancePosSqr),_GetOutDist,_area]}; _timeout = time + 15; { waituntil {vehicle _x == _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x }; }foreach _unitsin; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; if (_fightmode == "fight" || _gothit) then { _npc setBehaviour "AWARE"; _groupOne = group _npc; _groupOne setFormation "DIAMOND"; [_npc,50] call MON_move; }; if (_fightmode == "fight") then { _pursue = true; }else { _pursue = false; _makenewtarget=true; }; }; }; }; //Si bajo ataque o aumenta el conocimiento se acelera la respuesta y se retoma el control de la AI if (_gothit ) then { _react = if (!_supressed) then {_react + 30}; if (_fightmode != "walk") then { if (_nowpType == 2) then {_nowp = false}; }; }; //Si no hay objetivo se anula la orden de persecución if ((isNull (_target) || !alive _target )) then { _pursue=false; if (_gothit && !_fortify) then { if (_fightmode == "walk") then { //Podría tratarse de un sniper, mejor estar alerta y moverse por si acaso _Behaviour = "AWARE"; _speedmode = "FULL"; _unitpos = "AUTO"; _gothit = false; _makenewtarget = true; _waiting = -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1: Have been damaged moving",_grpidx,_makenewtarget]}; } else { if (_react >= KRON_UPS_react && _lastreact >=_minreact && count _targets <= 0) then { //Nos disparan y no tenemos target, nos movemos de posición if (KRON_UPS_Debug>0) then {player sidechat format["%1: Under fire by unkown target, moving to newpos",_grpidx]}; //Cubre al grupo con una granada de humo if (!_supressed && (random 100)<80) then { [_npc,_target] spawn MON_throw_grenade; }; _gothit = false; _makenewtarget = true; _waiting = -1; _pause="NOWAIT"; _speedmode = "FULL"; _unitpos = "middle"; _Behaviour = "AWARE"; }else{ if (_lastreact >=_minreact && !_targetdead) then { _targetdead = true; _pursue = true; //Nos hemos qdado sin objetivos continuamos la búsqueda if (KRON_UPS_Debug>0) then {player sidechat format["%1: Target defeated, searching",_grpidx]}; }; }; }; }; }; //If no fixed target check if current target is available if (format ["%1",_fixedtargetPos] != "[0,0]") then { //If fixed target check if close enough or near enemy and gothit if (([_currpos,_fixedtargetpos] call KRON_distancePosSqr) <= _closeenough || (_dist <= _closeenough && _gothit)) then { _fixedtargetPos = [0,0]; }else{ _pursue = false; _attackPos=_fixedtargetPos; if (_react >= KRON_UPS_react && _lastreact >=_minreact) then { _makenewtarget = true; _unitpos = "AUTO"; _speed = "FULL"; }; }; }; //If captive or surrended do not pursue if ( isnil "_attackPos") then {_pursue = false;}; if ( captive _target || format ["%1", _attackPos] == "[0,0]") then {_pursue = false;}; //If no waypoint do not move if (_nowp) then { _makenewtarget = false; _pursue = false; }; if (_inheli) then { _landing = _heli getVariable "UPSMON_landing"; if (isnil ("_landing")) then {_landing=false;}; if (_landing) then { _pursue = false; }; }; sleep 0.5; //********************************************************************************************************************** // PURSUE: SE INICIA LA PERSECUCIÓN DEL OBJETIVO //********************************************************************************************************************** //if (KRON_UPS_Debug>0) then {diag_log format["%1:pursue=%3 _react=%9 timeon=%4 targets=%5 _target=%6 captive=%11 _attackPos=%7 nowp=%8 _inheli=%10 _fixedtargetPos=%12 _fightmode=%13",_grpidx,_dist,_pursue,_timeontarget,count _targets, _target,_attackPos,_nowp,_react,_inheli,captive _target,_fixedtargetPos,_fightmode]}; if (_pursue) then { _pursue = false; _newpos = true; _react = 0; _lastreact = 0; _timeontarget = 0; _makenewtarget = false; _fm = 1; //Cancel supress effect when reaction time _supressed = false; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; // get position of spotted unit in player group, and watch that spot _targetPos = _attackPos; _targetX = _targetPos select 0; _targetY = _targetPos select 1; _currPos = getpos _npc; // also go into "combat mode" _pause="NOWAIT"; _waiting=0; // angle from unit to target _dir1 = [_currPos,_targetPos] call KRON_getDirPos; // angle from target to unit (reverse direction) _dir2 = (_dir1+180) mod 360; //Establecemos una distancia de flanqueo _flankdist = ((random 0.5)+0.7)*KRON_UPS_safedist; //La distancia de flanqueo no puede ser superior a la distancia del objetivo o nos pordría pillar por la espalda _flankdist = if ((_flankdist*1.40) >= _dist) then {_dist*.65} else {_flankdist}; if (_inheli) then {_flankdist = _flankdist / 2;}; // avoidance position (right or left of unit) _avoidPos = [_currPos,_dir2, KRON_UPS_safedist] call MON_GetPos2D; //Calculamos posición de avance frontal _frontPos = [_targetPos,_dir2, _flankdist] call MON_GetPos2D; //Adaptamos el ángulo de flanqueo a la distancia _newflankAngle = ((random(KRON_UPS_flankAngle)+1) * 2 * (_flankdist / KRON_UPS_safedist )) + (KRON_UPS_flankAngle/1.4) ; if (_newflankAngle > KRON_UPS_flankAngle) then {_newflankAngle = KRON_UPS_flankAngle}; //Calculamos posición de flanqueo 1 45º _dirf1 = (_dir2+_newflankAngle) mod 360; _flankPos = [_targetPos,_dirf1, _flankdist] call MON_GetPos2D; //Calculamos posición de flanqueo 2 -45º _dirf2 = (_dir2-_newflankAngle+360) mod 360; _flankPos2 = [_targetPos,_dirf2, _flankdist] call MON_GetPos2D; if (KRON_UPS_Debug>0) then { "flank1" setmarkerpos _flankPos; "flank2" setmarkerpos _flankPos2; "target" setmarkerpos _attackPos; }; //Decidir por el mejor punto de flanqueo //Contamos las posiciones de destino de otros grupos más alejadas _fldest = 0; _fldest2 = 0; _fldestfront = 0; _i = 0; { if (_i != _grpid && format ["%1", _x] != "[0,0]") then { _dist1 = [_x,_flankPos] call KRON_distancePosSqr; _dist2 = [_x,_flankPos2] call KRON_distancePosSqr; _dist3 = [_x,_frontPos] call KRON_distancePosSqr; if (_dist1 <= _flankdist/1.5 || _dist2 <= _flankdist/1.5 || _dist3 <= _flankdist/1.5) then { if (_dist1 < _dist2 && _dist1 < _dist3) then {_fldest = _fldest + 1;}; if (_dist2 < _dist1 && _dist2 < _dist3) then {_fldest2 = _fldest2 + 1;}; if (_dist3 < _dist1 && _dist3 < _dist2) then {_fldestfront = _fldestfront + 1;}; }; }; _i = _i + 1; }foreach KRON_targetsPos; //sleep 0.05; //Contamos las posiciones de otros grupos más alejadas _i = 0; { if (_i != _grpid && !isnull(_x)) then { _dist1 = [getpos(_x),_flankPos] call KRON_distancePosSqr; _dist2 = [getpos(_x),_flankPos2] call KRON_distancePosSqr; _dist3 = [getpos(_x),_frontPos] call KRON_distancePosSqr; if (_dist1 <= _flankdist/1.5 || _dist2 <= _flankdist/1.5 || _dist3 <= _flankdist/1.5) then { if (_dist1 < _dist2 && _dist1 < _dist3) then {_fldest = _fldest + 1;}; if (_dist2 < _dist1 && _dist2 < _dist3) then {_fldest2 = _fldest2 + 1;}; if (_dist3 < _dist1 && _dist3 < _dist2) then {_fldestfront = _fldestfront + 1;}; }; }; _i = _i + 1; }foreach KRON_NPCs; //sleep 0.05; //La preferencia es la elección inicial de dirección switch (_flankdir) do { case 1: {_prov = 125}; case 2: {_prov = -25}; default {_prov = 50}; }; //Si es positivo significa que hay más destinos existentes lejanos a la posicion de flanqueo1, tomamos primariamente este if (_fldest<_fldest2) then {_prov = _prov + 50;}; if (_fldest2<_fldest) then {_prov = _prov - 50;}; //Si la provablilidad es negativa indica que tomará el flank2 por lo tanto la provabilidad de coger 1 es 0 if (_prov<0) then {_prov = 0;}; //Evaluamos la dirección en base a la provablilidad calculada if ((random 100)<=_prov) then { _flankdir =1; _flankPos = _flankPos; _targettext = "_flankPos"; } else { _flankdir =2; _flankPos = _flankPos2; _targettext = "_flankPos2"; }; //Posición de ataque por defecto el flanco _targetPos = _flankPos; _targettext = "_flankPos"; if ((surfaceIsWater _flankPos && !(_isplane || _isboat)) ) then { _targetPos = _attackPos;_targettext ="_attackPos"; _flankdir =0; } else { if (_fldestfront < _fldest && _fldestfront < _fldest2) then { _targetPos = _frontPos;_targettext ="_frontPos"; }; }; //Establecemos tipo de waypoint //con DESTROY tiene peor comportamiento y a veces no se mueven _wptype = "MOVE"; //Establecer velocidad y modo de combate _rnd = random 100; if ( _dist <= _closeenough ) then { //Si estamos muy cerca damos prioridad a fuego a discrección if ( _dist <= _closeenough/2 ) then { //Modo combate cerrado _speedmode = "LIMITED"; _wpformation = "LINE"; _unitpos = "Middle"; _react = _react + KRON_UPS_react / 2; _minreact = KRON_UPS_minreact / 2; if ((_nomove == "NOMOVE" && _rnd < 25) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "STEALTH"; _wptype = "HOLD"; } else { _Behaviour = "COMBAT"; _wptype = "MOVE"; } }else{ //Si la tropa tiene el rol de no moverse tenderá a mantener la posición _speedmode = "FULL"; _wpformation = "WEDGE"; _unitpos = "Middle"; _minreact = KRON_UPS_minreact / 1.5; if ((_nomove == "NOMOVE" && _rnd < 50) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "COMBAT"; _wptype = "HOLD"; } else { _Behaviour = "AWARE"; _wptype = "MOVE"; }; }; } else { if (( _dist <= (_closeenough + KRON_UPS_safedist))) then { _speedmode = "FULL"; _wpformation = "WEDGE"; _unitpos = if (_rnd < 90) then {"Middle"}else{"AUTO"}; _minreact = KRON_UPS_minreact; if ((_nomove=="NOMOVE" && _rnd < 75) && !_reinforcementsent) then { //Combate defensivo _Behaviour = "AWARE"; _wptype = "HOLD"; }else{ //Movimiento con precaución (más rápido) _Behaviour = "AWARE"; _wptype = "MOVE"; }; } else { //In distance of radio patrol may act. if (( _dist < KRON_UPS_sharedist )) then { //Pelotón lejos del objetivo hay que desplazarse rápido y directo al punto _Behaviour = "AWARE"; _speedmode = "FULL"; _unitpos = if (_rnd < 60) then {"Middle"}else{"AUTO"}; _minreact = KRON_UPS_minreact * 2; if ((_nomove=="NOMOVE" && _rnd < 95) && !_reinforcementsent) then { _wptype = "HOLD"; _wpformation = "WEDGE"; }else{ _wptype = "MOVE"; _wpformation = "WEDGE"; }; } else { //Pelotón muy muy lejos del objetivo si es rol nomove no se moverán _Behaviour = "SAFE"; _speedmode = "FULL"; _unitpos = "AUTO"; _minreact = KRON_UPS_minreact * 3; if (((_nomove=="NOMOVE") || (_nomove=="MOVE" && _rnd < 70)) && !_reinforcementsent) then { _wptype = "HOLD"; _wpformation = "WEDGE"; }else{ _wptype = "MOVE"; _wpformation = "COLUMN"; }; }; }; }; //Las escuadras fortificadas mantienen siempre la posición if ( _fortify && (random 100)<99) then {_wptype = "HOLD"}; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //If leader is in vehicle will move in anyway if (vehicle (_npc) != _npc || !_isman) then { _wptype = "MOVE"; _Behaviour = "AWARE"; if ( _inheli ) then { _speedmode = "FULL"; _unitpos = "AUTO"; if ( (random 100)<60 ) then { _targetPos = _AttackPos; }; }; }; //Establecemos el target KRON_targetsPos set [_grpid,_targetPos]; sleep .05; //If use statics are enabled leader searches for static weapons near. // Tanks enemies are contabiliced if ( KRON_UPS_useMines && _Mines > 0 ) then { _enemytanksnear = false; { if ( ("Tank" countType [_x] > 0 || "Wheeled_APC" countType [_x] >0 || "Tank" countType [vehicle _x] > 0 || "Wheeled_APC" countType [vehicle _x] >0 ) && alive _x && canMove _x && _npc distance _x <= _closeenough + KRON_UPS_safedist ) exitwith { _enemytanksnear = true; _enemytanknear = _x;}; }foreach _targets; //If use mines are enabled and enemy armors near and no friendly armor put mine. if ( _enemytanksnear && !isnull _enemytanknear && alive _enemytanknear ) then { _friendlytanksnear = false; { if (!( alive _x && canMove _x)) then {_friendlytanks = _friendlytanks - [_x]}; if (alive _x && canMove _x && _npc distance _x <= _closeenough + KRON_UPS_safedist ) exitwith { _friendlytanksnear = true;}; }foreach _friendlytanks; if (!_friendlytanksnear && random(100)<30 ) then { _dir1 = [_currPos,position _enemytanknear] call KRON_getDirPos; _mineposition = [position _npc,_dir1, 25] call MON_GetPos2D; _roads = _mineposition nearroads 50; if (count _roads > 0) then {_mineposition = position (_roads select 0);}; if ([_npc,_mineposition] call MON_CreateMine) then { _Mines = _Mines -1; if (KRON_UPS_Debug>0) then {player sidechat format["%1: %3 puting mine for %2",_grpidx,typeof _enemytanknear, side _npc]}; }; }; }; }; //Si es unidad de refuerzo siempre acosará al enemigo if (_reinforcementsent) then { _wptype="MOVE"; _newpos=true; _makenewtarget = false; }; if (_nofollow=="NOFOLLOW" && _wptype != "HOLD") then { _targetPos = [_targetPos,_centerpos,_rangeX,_rangeY,_areadir] call KRON_stayInside; _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; if ( _targetdist <= 1 ) then { _wptype="HOLD"; }; }; if (_wptype == "HOLD") then { _targetPos = _currPos; _targettext ="_currPos"; }; _lastknown = _opfknowval; //Se actualiza con el último valor, por si cambia el target //Si por el motivo que sea se cancela la nueva posición se deben limpiar los parámetros que hacen entrar en pursuit if (!_newpos) then { //Si la unidad ha decidio mantener posición pero está siendo atacada está siendo suprimida, debe tener la oportunidad de reaccionar _newpos = _gothit; if (!_newpos) then { _targetPos=_lastpos; if (KRON_UPS_Debug>0) then {player sidechat format["%1 Mantaining orders %2",_grpidx,_nomove]}; }; }; if (KRON_UPS_Debug>=1) then { "avoid" setmarkerpos _avoidPos; "flank" setmarkerpos _flankPos; _destname setMarkerPos _targetPos; }; }; //END PURSUE }; //((_issoldier) && ((count _enemies)>0) sleep 0.5; //********************************************************************************************************************** // SIN NOVEDADES //********************************************************************************************************************** if !(_newpos) then { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; // calculate new distance // if we're waiting at a waypoint, no calculating necessary _currpos = getpos _npc; //Sets behaviour of squad if nearly changes of target if (_targetsnear) then{ if( toUpper(_Behaviour) IN _safemode) then { _Behaviour = "AWARE"; _npc setBehaviour _Behaviour; }; }; //If in safe mode if find dead bodies change behaviour if( toUpper(_Behaviour) IN _safemode) then { _unitsin = [_npc,_buildingdist] call MON_deadbodies; if (count _unitsin > 0) then { _Behaviour = "AWARE"; _react = _react + 30; _npc setBehaviour _Behaviour; if (KRON_UPS_Debug>0) then {player sidechat format["%1 dead bodies found! set %2",_grpidx,_Behaviour, count _targets]}; }; }; //Stuck control if (!_nowp && alive _npc && canmove _npc && _wptype == "MOVE" && _timeontarget >= 60 && _lastcurrpos select 0 == _currpos select 0 && _lastcurrpos select 1 == _currpos select 1) then { [_npc] call MON_cancelstop; _makenewtarget = true; if (KRON_UPS_Debug>0) then {player sidechat format["%1 stucked, moving",_grpidx]}; }; _lastpos = _targetPos; _lastcurrpos = _currpos; //sets last currpos for avoiding stuk if (_waiting<0) then { //Gets distance to targetpos _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; //Se evalua si se ha excedido el tiempo máximo de espera y el objetivo ya está abatido para retornar a la posición inicial. if (_fightmode!="walk") then { if (_timeontarget > KRON_UPS_alerttime && count _targets <= 0 && ( isNull (_target) || !alive (_target) || captive _target)) then { _pursue = false; _gothit = false; _targetdead = true; _fightmode = "walk"; _speedmode = _orgSpeed; _targetPos = _currPos; _reinforcementsent = false; _nowp = _orignowp; _target = objnull; _fixedtargetPos = [0,0]; _Behaviour = _orgMode; _waiting = -1; _unitpos = "AUTO"; _wpformation = "WEDGE"; KRON_UPS_reinforcement = false; //ya no hay amenaza if (_rfid > 0 ) then { call (compile format ["KRON_UPS_reinforcement%1 = false;",_rfid]); }; {[_x,"AUTO"] spawn MON_setUnitPos;} foreach units _npc; _npc setBehaviour _orgMode; if (KRON_UPS_Debug>0) then {player sidechat format["%1 Without objectives, leaving combat mode",_grpidx]}; }; }; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 _targetdist %2 atdist=%3 dist=%4",_grpidx, _targetdist, _area/8,_dist]}; // if not in combat and we're either close enough, seem to be stuck, or are getting damaged, so find a new target if (!_nowp && (!_gothit) && (!_swimming) && (_fightmode == "walk") && (( _targetdist <= (_area/4) || moveToFailed _npc) && (_timeontarget > KRON_UPS_maxwaiting))) then { _makenewtarget=true; _unitpos = "AUTO"; _Behaviour = _orgMode; }; // make new target if (_makenewtarget) then { _gothit=false; _react = 0; _lastreact = 0; _makenewtarget = false; _gothit=false; _timeontarget = 0; _wptype = "MOVE"; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 _fixedtargetPos %2 dist %3 ",_grpidx,_fixedtargetPos,_dist]}; if (format ["%1",_fixedtargetPos] !="[0,0]") then { _targetPos = _fixedtargetPos; _targettext ="Reinforcement"; }else{ if (KRON_UPS_Debug>0) then {player sidechat format["%1 Patrol to new position",_grpidx]}; if ((_nomove=="NOMOVE") && (_timeontarget>KRON_UPS_alerttime)) then { if (([_currPos,_orgPos] call KRON_distancePosSqr)<_closeenough) then { _newpos = false; _wptype = "HOLD"; _waiting = 9999; if (_fortify) then { _minreact = KRON_UPS_minreact * 3; _buildingdist = _buildingdist * 2; _wait = 3000; }; } else { _targetPos=_orgPos; _targettext ="_orgPos"; }; } else { // re-read marker position/size _centerpos = getMarkerPos _areamarker; _centerX = abs(_centerpos select 0); _centerY = abs(_centerpos select 1); _centerpos = [_centerX,_centerY]; _areasize = getMarkerSize _areamarker; _rangeX = _areasize select 0; _rangeY = _areasize select 1; _areadir = (markerDir _areamarker) * -1; // find a new target that's not too close to the current position _targetPos=_currPos; _targettext ="newTarget"; _tries=0; while {((([_currPos,_targetPos] call KRON_distancePosSqr) < _mindist)) && (_tries<20)} do { _tries=_tries+1; // generate new target position (on the road) _road=0; while {_road<20} do { _targetPos=[_centerX,_centerY,_rangeX,_rangeY,_cosdir,_sindir,_areadir] call KRON_randomPos; _road=[_targetPos,(_isplane||_isboat),_road] call KRON_OnRoad; }; }; }; }; sleep 0.05; // distance to target position _avoidPos = [0,0]; _flankPos = [0,0]; _attackPos = [0,0]; _frontPos = [0,0]; _fm=0; _newpos=true; }; }; }; // if in water, get right back out of it again if (surfaceIsWater _currPos) then { if (_isman && !_swimming) then { _drydist=999; // look around, to find a dry spot for [{_a=0}, {_a<=270}, {_a=_a+90}] do { _dp=[_currPos,30,_a] call KRON_relPos; if !(surfaceIsWater _dp) then {_targetPos=_dp}; }; _newpos=true; _swimming=true; }; } else { _swimming=false; }; sleep 0.5; //********************************************************************************************************************** // NEWPOS: SE EJECUTA LA ORDEN DE MOVIMIENTO //********************************************************************************************************************** // if (KRON_UPS_Debug>0) then {player sidechat format["%1 rea=%2 wai=%3 tim=%4 tg=%5 %6",_grpidx,_react,_waiting,_timeontarget,typeof _target,alive _target]}; if ((_waiting<=0) && _newpos) then { // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; _currPos = getpos _npc; _newpos = false; _waiting = -1; _swimming=false; _GetIn_NearestVehicles = false; //Gets distance to targetpos _targetdist = [_currPos,_targetPos] call KRON_distancePosSqr; //If gothit and not in vehicle if (_gothit && _npc == vehicle (_npc) && alive _npc ) then { //Unidad suprimida if ((random 100)<50) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1 supressed by fire",_grpidx]}; //La unidad está suprimida, borramos el waypoint actual _supressed = true; _targetPos = _currPos; _targettext ="SUPRESSED"; _wptype = "HOLD"; //Cuerpo a tierra { //Se anula el movimiento if ( _x iskindof "Man" && canmove _x && alive _x) then { if ((random 100)<40 || (primaryWeapon _x ) in KRON_UPS_MG_WEAPONS) then {[_x,"DOWN",20] spawn MON_setUnitPosTime; }else{ [_x,"Middle"] spawn MON_setUnitPos;}; }; } foreach units _npc; sleep 0.05; //Retirada!! if ((random 100)<=60 && morale _npc < 0) then { _targetPos = _avoidPos;_targettext = "_avoidPos"; _wptype = "MOVE"; _flankdir = 0; if (!_newpos && KRON_UPS_Debug>0) then {player sidechat format["%1 All Retreat!!!",_grpidx]}; }; }; //Animación croqueta { if ( (random 100)<20) then { _x spawn MON_animCroqueta; }; } foreach units _npc; //Cubre al grupo con una granada de humo if ((random 100)<30 || _targettext == "_avoidPos") then { //[_npc,_target] call MON_throw_grenade; }; sleep 0.5; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Si no ha sido suprimida continuamos el avance if (alive _npc) then { _currPos = getpos _npc; if ( _wptype == "MOVE") then { //Try to avoid stucked soldiers out of vehicles if ( _npc == vehicle _npc) then { { if (alive _x && canmove _x) then { //[_x] spawn MON_cancelstop; [_x] dofollow _npc; }; }foreach _members; }; sleep 0.05; //Search for vehicle if (!_gothit && _targetdist >= ( KRON_UPS_searchVehicledist )) then { if ( vehicle _npc == _npc && _dist > _closeenough ) then { _unitsIn = [_grpid,_npc] call MON_GetIn_NearestVehicles; if ( count _unitsIn > 0) then { _GetIn_NearestVehicles = true; _speedmode = "FULL"; _unitpos = "AUTO"; _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; _timeout = time + 60; _vehicle = objnull; _vehicles = []; { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; if ( vehicle _x != _x && (isnull _vehicle || _vehicle != vehicle _x)) then { _vehicle = vehicle _x ; _vehicles = _vehicles + [_vehicle] }; }foreach _unitsIn; sleep 1; { _vehicle = _x; _cargo = _vehicle getvariable ("UPSMON_cargo"); if ( isNil("_cargo")) then {_cargo = [];}; _cargo ordergetin true; //Wait for other groups to getin { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _cargo; //Starts gunner control [_vehicle] spawn MON_Gunnercontrol; } foreach _vehicles; //Cheks if leader has dead until wait _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc) exitwith {exit=true;}; if ( "Air" countType [vehicle (_npc)]>0) then { _rnd = (random 2) * 0.1; _flyInHeight = round(KRON_UPS_flyInHeight * (0.9 + _rnd)); vehicle _npc flyInHeight _flyInHeight; //Si acaba de entrar en el heli se define punto de aterrizaje if (_GetIn_NearestVehicles) then { _GetOutDist = round(((KRON_UPS_paradropdist ) * (random 100) / 100 ) + 150); [vehicle _npc, _TargetPos, _GetOutDist,_flyInHeight] spawn MON_doParadrop; //Execute control stuck for helys [vehicle _npc] spawn MON_HeliStuckcontrol; if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: flyingheiht=%2 paradrop at dist=%3",_grpidx, _flyInHeight, _GetOutDist,_rnd]}; }; }; }; }; }; }; sleep 0.05; //Get in combat vehicles if (!_gothit && !_GetIn_NearestVehicles && _fightmode != "walk" ) then { _dist2 = _dist / 4; if ( _dist2 <= 100 ) then { _unitsIn = []; _unitsIn = [_grpid,_npc,_dist2,false] call MON_GetIn_NearestCombat; _timeout = time + (_dist2/2); if ( count _unitsIn > 0) then { if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Geting in combat vehicle targetdist=%2",_grpidx,_npc distance _target]}; _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; { waituntil {vehicle _x != _x || !canmove _x || !canstand _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Return to combat mode _npc setbehaviour _Behaviour; _timeout = time + 180; { waituntil {vehicle _x != _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; { if ( vehicle _x iskindof "Air") then { //moving hely for avoiding stuck if (driver vehicle _x == _x) then { _vehicle = vehicle (_x); [_vehicle,1000] spawn MON_domove; //Execute control stuck for helys [_vehicle] spawn MON_HeliStuckcontrol; if (KRON_UPS_Debug>0 ) then {player sidechat format["%1: Geting in combat vehicle after",_grpidx,_npc distance _target]}; }; }; if (driver vehicle _x == _x) then { //Starts gunner control [vehicle _x] spawn MON_Gunnercontrol; }; }foreach _unitsIn; }; sleep 0.05; }; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //If use statics are enabled leader searches for static weapons near. if (KRON_UPS_useStatics && (vehicle _npc == _npc) && !_GetIn_NearestVehicles && ((_wptype == "HOLD" && (random 100) < 80) || (_wptype != "HOLD" && (random 100) < 60))) then { _unitsIn = [_grpid,_npc,_buildingdist] call MON_GetIn_NearestStatic; if ( count _unitsIn > 0) then { _npc setbehaviour "CARELESS"; _npc setspeedmode "FULL"; _timeout = time + 60; { waituntil {vehicle _x != _x || !canmove _x || !alive _x || time > _timeout || movetofailed _x}; }foreach _unitsIn; }; sleep 0.05; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc || isplayer _npc ) exitwith {exit=true;}; //Buildings usage. if (!_GetIn_NearestVehicles) then { if ( _wptype == "HOLD" && vehicle _npc == _npc && ( _fortify ||(random 100) < 60) ) then { //if (KRON_UPS_Debug>0) then {player sidechat format["%1: Moving to nearest buildings",_grpidx]}; [_npc,_buildingdist,false,_wait] spawn MON_moveNearestBuildings; } else { //If we are close enough patrol in buildings for searching enemies if ((( _wptype != "HOLD" && vehicle _npc == _npc && (random 100) < 90 ) && _npc == vehicle _npc && _dist <= ( _closeenough ))) then { [_npc,_buildingdist,true] spawn MON_moveNearestBuildings; }; }; sleep 0.05; }; // did the leader die? _npc = [_npc,_members] call MON_getleader; if (!alive _npc || !canmove _npc) exitwith {exit=true;}; if (isnull _grp || _grp != group _npc) then { _grp = group _npc; }; _index = currentWaypoint _grp; //Si el waypoing es distinto del que tiene o es diferente de hold lo establecemos IF (_wptype != "HOLD" || _lastwptype != _wptype) then { //No haq waypoints o están completados //_index = 1 Waypoint por defecto, no usar. if ( _index == 1 || _index > count waypoints _grp && !isnull _grp) then { _wp = _grp addWaypoint [_targetPos, 0]; _index = _wp select 1; //if (KRON_UPS_Debug>0) then {player sidechat format["%1: created wp %2 index %3",_grpidx,_wp, _index]}; } else { _wp = [_grp,_index]; //if (KRON_UPS_Debug>0) then {player globalchat format["%1: not created wp %2 index %3 %4",_grpidx,_wp, _index,_targetPos]}; }; }; _wp = [_grp,_index]; //Definimos los parámetros del nuevo waypoint _wp setWaypointType _wptype; _wp setWaypointPosition [_targetPos, 0]; _wp setWaypointFormation _wpformation; _wp setWaypointSpeed _speedmode; _lastwptype = _wptype; //Si tiene más de 2 waypoints borramos los obsoletos { if ( _x select 1 < _index ) then { deleteWaypoint _x; }; }foreach waypoints _grp; sleep 0.05; //if (KRON_UPS_Debug>0) then {diag_log format["%1: waypoints %2 %3 %4 %5",_grpidx,count waypoints _grp, _grp, group _npc, group (leader _npc)]}; //Sets behaviour if (toupper(behaviour _npc) != toupper (_Behaviour)) then { _npc setBehaviour _Behaviour; }; //Refresh position vector KRON_targetsPos set [_grpid,_targetPos]; //Aunque haya predefinido un tipo de movimiento se dejará un pequeño porcentaje para variar a nivel individual { if ((random 100)<95 && _x == vehicle _x && _x iskindof "Man" && !((primaryWeapon _x ) in KRON_UPS_MG_WEAPONS)) then { [_x,_unitpos] spawn MON_setUnitPos; }else{ [_x,"AUTO"] spawn MON_setUnitPos; }; } foreach units _npc; //If closeenough will leave some soldiers doing supress fire if (_gothit || _dist <= _closeenough) then { { if (!canStand _x || ((primaryWeapon _x ) in KRON_UPS_MG_WEAPONS) || (vehicle _x == _x && _x iskindof "Man" && (random 100) < 50) ) then { _x suppressFor 20; }; } foreach units _npc; }; }; _gothit=false; //moving //if (KRON_UPS_Debug>0) then {player sidechat format["%1: %2 %3 %4 %5 %6 %7 %8 %9 %10",_grpidx, _wptype, _targettext,_dist, _speedmode, _unitpos, _Behaviour, _wpformation,_fightmode,count waypoints _grp];}; };//if ((_waiting<=0) && _newpos) then { if (_track=="TRACK") then { switch (_fm) do { case 1: {_destname setmarkerSize [.4,.4]}; case 2: {_destname setmarkerSize [.6,.6]}; default {_destname setmarkerSize [.5,.5]}; }; _destname setMarkerPos _targetPos; }; //If in hely calculations must done faster if (_isplane || _inheli) then {_currcycle = _cycle/2}; if ((_exit) || (isNil("_npc"))) then { _loop=false; } else { // slowly increase the cycle duration after an incident sleep _currcycle; }; };//while {_loop} if (KRON_UPS_Debug>0) then {hint format["%1 exiting mainloop",_grpidx]}; //Limpiamos variables globales de este grupo KRON_targetsPos set [_grpid,[0,0]]; KRON_NPCs set [_grpid,objnull]; KRON_UPS_Exited=KRON_UPS_Exited+1; if (_track=="TRACK") then { //_trackername setMarkerType "Dot"; _trackername setMarkerType "Empty"; _destname setMarkerType "Empty"; }; //Gets dist from orinal pos if (!isnull _target) then { _dist = ([_orgpos,position _target] call KRON_distancePosSqr); }; if (KRON_UPS_Debug>0) then {player sidechat format["%1 _dist=%2 _closeenough=%3",_grpidx,_dist,_closeenough]}; //does respawn of group if (_respawn && _respawnmax > 0 && !_surrended && _dist > _closeenough) then { if (KRON_UPS_Debug>0) then {player sidechat format["%1 doing respawn",_grpidx]}; // copy group leader _unittype = _membertypes select 0; // make the clones civilians // use random Civilian models for single unit groups if ((_unittype=="Civilian") && (count _members==1)) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}}; _grp=createGroup _side; _lead = _grp createUnit [_unittype, _orgpos, [], 0, "form"]; _lead setVehicleInit _initstr; [_lead] join _grp; _grp selectLeader _lead; //sleep 1; // copy team members (skip the leader) _c=0; { _c=_c+1; if (_c>1) then { _newunit = _grp createUnit [_x, _orgpos, [],0,"form"]; _newunit setVehicleInit _initstr; [_newunit] join _grp; }; } foreach _membertypes; { _targetpos = _orgpos findEmptyPosition [10, 200]; sleep .4; if (count _newpos <= 0) then {_targetpos = _orgpos}; //if (KRON_UPS_Debug>0) then {player globalchat format["%1 create vehicle _newpos %2 ",_x,_targetpos]}; _newunit = _x createvehicle (_targetpos); } foreach _vehicletypes; //Set new parameters if (!_spawned) then {_UCthis = _UCthis + ["SPAWNED"]}; _UCthis set [0,_lead]; _respawnmax = _respawnmax - 1; _UCthis = ["RESPAWN:",_respawnmax,_UCthis] call KRON_UPSsetArg; //Exec UPSMON script _UCthis SPAWN UPSMON; processInitCommands; }; _friends=nil; _enemies=nil; _enemytanks = nil; _friendlytanks = nil; _roads = nil; _targets = nil; _members = nil; _membertypes = nil; _UCthis = nil; if (!alive _npc) then { deleteGroup _grp; }; if(true) exitWith {}; // --------------------------------------------------------------------------------------------------------- // Autor: Monsada (SMM) 27.11.2009 // (smirall@hotmail.com) // http://www.simulacion-esp.com/ // Comunidad Hispana de Simulación // --------------------------------------------------------------------------------------------------------- Para más información y descarga de las últimas versiones o si quieres aportarme alguna idea, visita la página de la comunidad hispana de simulación: http://www.simulacion-esp.com/v3/topic/18360-urban-patrol-script-version-monsada/ //------------------------------------------------------------------------------------------------------------- Historial de modificaciones: // --------------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------- //Version: 5.0.6 // ----------------------------------------------------------------------------- // Added: // Parameter "RESPAWN" for alowing respawn UPSMON squads when all are dead // "aware","combat","stealth" and "careless" added as a parameter so you can define default behaviour of squad // Added AI stuff for water // AI aware if find dead bodies // Added fixed positions for reinforcement squads, those squads that have a reinforcement ID can be set reinforcement position by seting KRON_UPS_reinforcement"x"_pos = position; sample // reinforcement: http://dev-heaven.net/projects/upsmon/wiki/Reinforcement // Added Artillery module: http://dev-heaven.net/projects/upsmon/wiki/Artillery_module // Added spawn module: http://dev-heaven.net/projects/upsmon/wiki/MON_spawn // Modified: // Solved bug in SPAWNED that not refreshed correctly army counters // If in walk mode and safe will land hely. // When Hely in squad column formation can not be used, last member assigned as driver // Detected bug with VEE formation, some times AI don't change vehaviour, changed to wedge // Folder estructure modified to gather upsmon scripts this will no affect already missions. // Improved AI response under Supress fire in combat situation // Avoid hurt soldiers than can not stand to get in vehicles and buildings // Avoid to patrol in damaged buildings // avoid bugged clases such as "BIS_alice_emptydoor"; // AI try to get in combat vehicles // Performance optimization. // Realistic reaction of squads depending on distance to target // ----------------------------------------------------------------------------- //Version: 5.0.5 // ----------------------------------------------------------------------------- // Added // Parameter "AMBUSH:",3000 you can set max time to wait for ambush // Modified: // Ambush squads exits if called for reinforcement so you can force exit creating a especific reinforcement group for this ex: setting "reinforcement:",100 // you can force exit ambush setting KRON_UPS_reinforcement100 = true // you can put 0 seconds for putting mines and go away if combined with "move" for example // Solved bug that sets reinforcement to false on init of scritp // Improved getout and landheli algoritm // Improved target debug console A=all units C=current alive units T=targets knonw by this side // Improved movement with vehicles, now they go in safe until near known enemies // adjusted flanking algorithm // ----------------------------------------------------------------------------- //Version: 5.0.4 // Added // Implemented: It also would be great if they use smoke-grenades when ai is under fire by targets they dont see well. One example: I lay on a moutain with my squad and shoot with sniperrifles from the hill down at the ai in a village. The ai should throw smoke and try to get cover. That would be great. // Feature #9559: parameter "spawned" = use only with squads created in runtime, this feature will add squad to UPSMON correctly. // Feature #9558 parameter "nowp" = No waypoints will be created for this squad, so this squad will comunicate enemies but will not be moved, so you can do what you want with them using waypoints. // Feature #9503 parameter "ambush" = Ambush squad will not move until in combat, will wait for incoming enemies stealth and ambush when near or discovered. // Parameter "RFLOCK", if especified when reinforcement is called, target position is locked until reached reinforcement point // Added surrended client control so now is no necesary create any trigger in mission to launch surrended.sqf // Added stuck control to avoid that helis stopping flying // New target sistem control based in last known positions instead of real position of targets // Modified: // Bug #9666 fixed:AI Cheats with UPSMON - Groups always Flank Real Position instead of last known // Bug #9662 fixed: Reinforcement Group returning home, does not get out of Vehicles (if used) // Bug #9639 fixed: Reinforcement Group can get stuck if Transportvehicle back to Patrolmarker gets destroyed// // Set DIAMOND formation when exiting vehicle // bug with NOSLOW solved. // solved other bugs such as no patrol without enemies. // --------------------------------------------------------------------------------------------------------- //Version: 5.0.3 // Added // KRON_UPS_searchVehicledist = 800 // KRON_UPS_EAST_SURRENDER, KRON_UPS_WEST_SURRENDER,KRON_UPS_GUER_SURRENDER // Set percentaje of forces for surrender. // Main control for all squads, doing comon proceses and saving performance. // sample followme.sqf script for enabling AI surrended to join your squad, must // be executed in each client when KRON_UPS_EAST_SURRENDED or KRON_UPS_WEST_SURRENDED // or KRON_UPS_GUER_SURRENDED // Modified: // Fixed Bug with resistance forces detected as enemies when not parametriced as enemy // Fixed bug check if dead leader before moving. // Fixed bug, "alive" not always returns someone is dead instanctly so controlled with canmove. // Fixed bug, error _vehicle object expected. // Controled not doing paradroop on water. //------------------------------------------------------------------------------------------------------------- //Version: 5.0.2 // Added // KRON_UPS_useStatics, enables AI to use Static weapons. // KRON_UPS_useMines, enables AI to put mines when enemy armored vehicles near // Now vehicles can be used for patrol, not only with target. // Modified: // Fixed Bug that do not sent reinforcement if parameter "reinforcement" // Fixed bug with random 1 ocasiolly has been returned more than 1. // Fixed bug that eventually do not change dead leader //------------------------------------------------------------------------------------------------------------- //Version: 5.0.1 // Added // Mulitiple reinforcement reinforcement:x, now you can put an id of reinforcement for calling only this groups later: // nul=[this,"town", "move","reinforcement:",1, "delete:",600] execVM "scripts\upsmon.sqf"; // nul=[this,"town", "move","reinforcement:",2, "delete:",600] execVM "scripts\upsmon.sqf"; // Modified: // Fixed fortify squads don't get defence positions until known enemys // Fortify squads leave fortify status when called for reinforcement // --------------------------------------------------------------------------------------------------------- //Version: 5.0.0 // Added // KRON_UPS_flyInHeight: Height that heli will fly this input will be randomiced in a 10% // KRON_UPS_paradropdist: Max distance to target for doing paradrop, will be randomiced between 0 and 100% of this value. // parameter "fortify" makes leader order to take positions on nearly buildings at distance 100 meters near leader, // squads with fortify will ignore "MOVE" rol. // Modified: // Fixed bug that eventually stoped hely when paradrops done. // --------------------------------------------------------------------------------------------------------- //Version: 4.2.6 // Added // // Modified: // Fixed bug that leaves a soldier in front of vehicle afte geting out. // Fixed bug that allowed AI to disenbark from heli before arriving objective. //------------------------------------------------------------------------------------------------------------- //Version: 4.2.5 // Added // Air transport // Paratroop air transported units // Improved comunications // Modificaciones: // Updated for an action radio of 1000 meters or avove. // Added some translations to english //------------------------------------------------------------------------------------------------------------- //Version: 4.2.2 // Added // Se ha añadido ataque frontal // Formaciones de combate en función de la situación // La IA puede entrar en los edificios a tomar posiciones de defensa y en ataque puede patrullarlos en busca de enemigos o posiciones de fuego. // Modificaciones: // Mejorado el sistema para localizar, asignar y entrar en vehiculos,. // Optimizado el rendimiento. Se ha mejorado para que se pueda ejecutar cada 20s. // Modificada la parametrización, sharedist incrementado, react reducido, cycle aumentado. // Modificada la actitud e la IA en combate, se ha dado más especialización en función de la situación. // Corregido bug que al enviar refuerzos hacía que dejaran de patrullar si no tenian ningún target // Posiciones de flanqueo más dinámicas. // Las escuadras con rol "NOMOVE" tienden a asegurar la posición y a hacer mayor uso de los edificios del entorno. //------------------------------------------------------------------------------------------------------------- //Version: 4.1.3 // // Modificaciones: // corregidos los problemas al entrar en vehiculos, que hacía que casi siempre alguno se quedara fuera // Optimizado el rendimiento. // Modificada la actitud e la IA en combate, se ha dado más especialización en función de la situación. // //------------------------------------------------------------------------------------------------------------- //Version: 4.1.2 // // Modificaciones: // KRON_UPS_Maxwaiting pasa a ser una variable excluvia para patrullas, indica el tiempo máximo a esperar // para llegar al destino y buscar otro //------------------------------------------------------------------------------------------------------------- //Version: 4.1.0 // Added // Habilitado búsqueda y uso de vehículos de transporte, cuando la IA está lejos del objetivo busca vehiculos con capacidad cerca, ahora ya puedes definir tu base con vehiculos, que si la IA los necesita los coge. // // Modificaciones: // Adaptadas ciertas partes de código para ser usadas en modo multihilo, mejorando los resultados y el rendimiento en general. //------------------------------------------------------------------------------------------------------------- //Version: 4.0.0 // Added // Control de movimiento de la IA, ahora gestionan mejor los tiempos, hacen coverturas de movimiento, avanzan con más precaución cuando están cerca del enemigo. // Añadidas algunas animaciones para darle pinceladas de dramatismo a los movimientos de la IA // // Modificaciones: // Modificación control de detección de movimientos de otros grupos ahora no requiere la lectura de objetos, con lo que mejora el rendimiento. // Adaptado sistema de scripts para poder controlar los grupos de IA y añadir mejoras que requieran la interacción de los grupos. //------------------------------------------------------------------------------- //Version: 3.0.8 // Modificaciones: // Corregido el bug de los buildings, se ha vuelto a implementar el uso de edificios // Mejorada la velocidad de iniciación del script. //------------------------------------------------------------------------------------------------------------- //Version: 3.0.7 // Added // // Modificaciones: // Corregido bud que en dedicado fijaba el objetivo siempre en lugar de los flancos //------------------------------------------------------------------------------------------------------------- //Version: 3.0.6 // Added // // Modificaciones // Corregidos bugs varios, entre ellos uno que ralentizaba la acción de los grupos // Set de parámetros modificados para un comportamiento más óptimo y realista // deshabilitado KRON_UPS_intowndist por comportamientos extraños con algunos objetos builiding // Ahora la IA selecciona los caminos con más cobertura, a ser posible //------------------------------------------------------------------------------------------------------------- //Version: 3.0.5 // Added // // Modificaciones // Corregido bug que evitaba enviar los refuerzos // La distancia de comunicación de objetivos aumenta en función del rol, los nomove * 1.5 // //------------------------------------------------------------------------------------------------------------- //Version: 3.0.4 // Added // Añadidos parámetros para asignar enemigos y aliados a la resistencia // Añadido control anti snipers, si la IA se ve atacada y no sabe de donde se mueve de sitio // Modificaciones // Se ajusta el ángulo de flanqueo en función de la distancia al objetivo // //------------------------------------------------------------------------------------------------------------- // // Modified: Monsada (SMM) 03.11.2009 //Version: 3.0.3 // Added // Multiple targets, now IA can have multiple open targets // La IA ahora usa tamien los edificios para buscar enemigos, protegerse dentro o atacar desde allí. // Modificaciones // La IA pierde el objetivo si lo pierde de vista y está a más de la distancia KRON_UPS_sharedist // //------------------------------------------------------------------------------------------------------------- //Version: 3.0.2 // Added // Se ha añadido la opción de Refuerzos, ahora se pueden definir unas unidades de refuerzos alejados de la zona que se enviarán al detectar enemigos enemigos // si KRON_UPS_reinforcement es true, se puede usar un marcador a modo de alarma para alimentar esta variable cuando se desee. // Las unidades tendrán una predisposición a mantener la posición si tienen el rol NOMOVE // Modificaciones // Se ha corregido la formula par definir los puntos de flanqueo tx = sin x * dist * (signo cos x). // Las unidades con rol NOMOVE tienden a mantener la posición cuanto más alejados estén del enemigo // Se ha mejorado el rendimiento. // //------------------------------------------------------------------------------------------------------------- //Version: 3.0.1 // Added // Sistema de combate urbano. La Ia ajusta el flanjeo y sus movimientos al tipo de superficie. // Modificaciones // Ahora los pelotones verifican la presencia de aliados para determinar otras rutas de flanqueo. // Se ha substituido el algoritmo de determinación de posiciones de flanqueo por un bug con las funciones cos y sin // que retornan aleatoriamente valores positivos o negativos con el mismo ángulo. // //------------------------------------------------------------------------------------------------------------- // Version: 3.0.0 // Added: // Improved IA flanking possitions // Improved IA movements in combat // Now IA can be supressed by fire // IA may use smoke grenades when in fire // Improved performance (this script now runs every 15s and do not need to stress to 1 second) // Implemented comunications simulating radio to know enemy position //Errores corregidos y modificaciones // Corregida la función KRON_distancePosSqr que no devolvia la distancia correcta entre dos puntos // Corregido bug que no alimentaba correctamente el objetivocompartido cuando este fallecia // Corregido control de la distancia al objetivo que hacia que la IA no flanquera // Algoritmo de control de acción y movimiento modificado // =========================================================================================================_posArray = [ [[4823.71,4592.91,37.9746], 218.886], [[4823.28,4586.58,37.983], 278.959], [[4822.99,4579.36,37.9776], 317.113], [[4830.46,4573.26,37.922], 234.987], [[4836.39,4569.44,37.8769], 249.443], [[4839.3,4570.32,37.7206], 103.733], [[4849.14,4571.35,37.9909], 169.628], [[4856.58,4571.81,37.8053], 173.239], [[4862.94,4572.53,37.7023], 91.2371], [[4869.21,4581.15,37.5134], 169.213], [[4869.03,4584.9,37.5067], 11.1101], [[4872.81,4591.06,37.4176], 36.3161], [[4881.28,4614.09,37.5878], 23.8204], [[4878.13,4617.31,37.6476], 13.0163], [[4866,4601.51,37.5444], 113.695], [[4862.93,4604.26,37.5486], 332.575], [[4857.26,4609.45,37.5099], 107.552], [[4850.52,4617.12,37.4616], 325.905], [[4843.37,4617.45,37.5189], 67.2457], [[4839.76,4617.43,37.5763], 288.965], [[4833.26,4622.65,37.508], 350.751], [[4821.23,4620.77,37.6467], 58.3567], [[4817.51,4619.71,37.7091], 273.24], [[4813.27,4616.25,37.7269], 5.62256], [[4812.85,4613.57,37.7543], 184.821], [[4816.84,4608.93,37.8078], 290.018], [[4820.69,4605.96,37.8855], 179.493], [[4826.81,4609.86,38.287], 293.238], [[4828.95,4602.31,38.2859], 251.19], [[4836.77,4602.54,38.2821], 232.065], [[4840.66,4597.74,38.2802], 211.948], [[4838.66,4588.58,37.8587], 213.818], [[4844.35,4590.33,38.2784], 158.966], [[4853.91,4586.86,38.2737], 196.252], [[4854.01,4580.73,38.2737], 166.377], [[4848.27,4580.19,37.8471], 154.902], [[4863.95,4580.85,38.2688], 143.056], [[4862.22,4597.26,38.2697], 58.9591], [[4860.48,4598.52,38.2705], 26.7705], [[4857.51,4598.42,38.272], 48.1135], [[4851.62,4609.35,38.2749], 34.085], [[4849.22,4609.27,38.276], 352.227], [[4840.08,4612.18,38.2805], 11.7656], [[4831.18,4609.73,38.4205], 241.5], [[4834.35,4609.55,38.419], 236.814], [[4834.27,4607.3,38.419], 240.281], [[4834.27,4604.64,38.4192], 222.811], [[4830.46,4604.28,38.421], 322.01], [[4836.04,4607.85,38.4182], 195.753], [[4835.68,4609.91,38.4183], 147.838], [[4840.95,4610.43,38.4157], 212.502], [[4844.26,4610.06,38.4141], 122.044], [[4844.47,4605.53,38.4141], 43.5046], [[4842.64,4602.91,38.4151], 238.951], [[4839.03,4605.31,38.4167], 263.591], [[4846.32,4604.1,38.4134], 230.477], [[4849.43,4606.05,38.4102], 208.155], [[4854.57,4606.99,38.4036], 240.022], [[4856.82,4604.68,38.4013], 235.144], [[4856.17,4600.41,38.4057], 243.057], [[4852.26,4602.74,38.4094], 221.088], [[4854.47,4597.28,38.4091], 188.839], [[4850.46,4592.94,38.4112], 64.9183], [[4847.87,4592.78,38.4124], 274.293], [[4842.72,4597.03,38.4149], 166.537], [[4843.02,4600,38.4148], 15.0212], [[4850.32,4597.39,38.4112], 228.228], [[4847.89,4600.43,38.4124], 218.819], [[4851.4,4604.64,39.2845], 216.481], [[4853.24,4604.64,40.2667], 226.037], [[4854.71,4602.88,41.42], 303.752], [[4853.64,4601.36,41.9922], 231.337], [[4857.06,4601.42,41.9911], 309.88], [[4856.06,4605.8,41.9914], 222.799], [[4853.28,4607.29,41.9929], 222.34], [[4849.23,4605.79,41.9949], 210.06], [[4847.87,4602.77,41.9954], 178.916], [[4844.67,4599.82,41.997], 114.353], [[4845.1,4595.24,41.9966], 60.3115], [[4849.96,4594.48,41.9942], 351.476], [[4852.52,4597.03,41.9929], 283.09], [[4854.83,4596.96,41.9918], 266.128], [[4851.14,4592.83,41.9936], 36.0048], [[4847.18,4593.64,41.9955], 240.628], [[4843.56,4597.18,41.9973], 207.903], [[4843.64,4600.19,41.9975], 5.81016], [[4846.89,4603.83,41.9961], 252.689], [[4846.94,4589.87,41.9957], 159.369], [[4842.53,4590.15,41.9978], 205.659], [[4840.77,4592.7,41.9987], 264.742], [[4840.33,4596.28,41.9989], 279.368], [[4845.21,4606.26,41.9965], 208.599], [[4841.5,4601.89,41.9983], 57.6429], [[4839.41,4603.96,41.9993], 237.43], [[4836.3,4604.99,42.0009], 93.3297], [[4840.94,4606.3,41.9986], 127.35], [[4840.32,4609.22,41.9989], 178.845], [[4844.92,4608.71,41.9966], 262.64], [[4844.67,4610.7,41.9968], 262.64], [[4842.11,4610.6,41.998], 248.19], [[4838.47,4609.64,41.9998], 186.065], [[4835.57,4609.93,42.0012], 109.633], [[4835.81,4608.08,42.0011], 84.8051], [[4833.58,4604.05,42.0022], 47.1605], [[4833.08,4607.68,42.0024], 140.17], [[4834.12,4609.6,42.0019], 222.445], [[4831.13,4609.31,42.0034], 111.899], [[4829.15,4609.01,42.0043], 138.419], [[4829.45,4606.79,42.0042], 103.445], [[4830.23,4604.32,42.0038], 92.5633], [[4851.09,4604.22,42.4321], 217.264], [[4853.39,4604.61,43.886], 236.518], [[4854.55,4602.74,44.9732], 298.6], [[4853.47,4600.9,45.4665], 346.668], [[4849.54,4603.56,45.4588], 35.9118], [[4850.96,4602.54,45.4626], 35.9118], [[4850.43,4598.56,45.4643], 266.475], [[4846.67,4597.97,45.4609], 84.1236], [[4856.15,4599.91,45.466], 81.0784], [[4855.79,4605.6,45.4524], 37.4145], [[4851.45,4606.82,45.4474], 5.23928], [[4846.45,4610.86,45.452], 6.5134], [[4837.54,4610.48,45.4564], 349.003], [[4831.02,4608.06,45.4595], 328.867], [[4827.81,4602.62,45.4611], 211], [[4839.19,4603.3,45.4571], 209.42], [[4843.81,4598.65,45.4574], 248.275], [[4842.09,4590.6,45.4692], 202.983], [[4854.1,4589.72,45.469], 222.539], [[4855.02,4579.18,45.4687], 213.494], [[4862.4,4578.85,45.4651], 122.73], [[4863.41,4589.19,45.4646], 32.2691], [[4859.4,4593.57,45.4646], 26.4809], [[4856.56,4590.22,45.4673], 132.126], [[4857.24,4582.08,45.4676], 39.526], [[4861.11,4583.83,45.4654], 283.685], [[4860.51,4590.74,45.4643], 213.691], [[4855.83,4595.21,38.4085], 58.6406], [[4860.61,4594.75,38.4061], 298.262], [[4853.04,4592.37,38.4099], 135.395], [[4856.09,4588.5,38.4084], 176.946], [[4856.44,4580.67,38.4083], 123.335], [[4861.28,4582.3,38.4058], 209.758], [[4861.3,4588.89,38.4058], 186.751], [[4858.32,4590.1,38.4073], 200.041], [[4848.89,4556.65,34.2274], 33.9021] ]; _staticEnemies = []; _staticEnemiesCount = 0; while {!isNil (format ["e%1", _staticEnemiesCount])} do { _staticEnemies set [_staticEnemiesCount, missionNameSpace getVariable (format ["e%1", _staticEnemiesCount])]; _staticenemiesCount = _staticEnemiesCount + 1; }; _patrolGroups = []; _patrolGroupsCount = 0; while {!isNil (format ["ge%1", _patrolGroupsCount])} do { _patrolGroups set [_patrolGroupsCount, missionNameSpace getVariable (format ["ge%1", _patrolGroupsCount])]; _patrolGroupsCount = _patrolGroupsCount + 1; }; _maxEnemiesInBuildings = floor (enemyCount * (0.55 + (random 0.2))); _enemiesInBuildings=0; _posCount = count _posArray; _posIndexArray=[]; for "_i" from 0 to (_posCount-1) do { _posIndexArray set [_i, _i]; }; while {_enemiesInBuildings < _maxEnemiesInBuildings && _enemiesInBuildings<_posCount} do { _posIndex = _posIndexArray select (floor (random (_posCount-_enemiesInBuildings))); _posIndexArray = _posIndexArray - [_posIndex]; _enemy = _staticEnemies select _enemiesInBuildings; _enemy setPosASL ((_posArray select _posIndex) select 0); _enemy setDir ((_posArray select _posIndex) select 1); [_enemy, "mrkUPS3", "NOWP3"] execVM "scripts\UPSMON.sqf"; _enemiesInBuildings = _enemiesInBuildings + 1; }; _enemiesInTowers = round (7 * (0.50 + random 0.5)); _maxEnemiesInTowers = floor ((0.15 + (random 0.05)) * enemyCount); if (_enemiesInTowers>_maxEnemiesInTowers) then { _enemiesInTowers = _maxEnemiesInTowers; }; _maxEnemiesOutside = enemyCount - _enemiesInBuildings - _enemiesInTowers; if (_maxEnemiesOutside<=0) then { _maxEnemiesOutside=1; }; _enemiesOutside=0; _enemyPatrolGroups=0; _patrolMarkers = ["mrkUPS1", "mrkUPS2", "mrkUPS3", "mrkUPS4", "mrkUPS5"]; _patrolMarkersCount = count _patrolMarkers; while {_enemiesOutside<_maxEnemiesOutside} do { _safePos = [getPos building1, 0, 100, 0, 0, 1, 0, [], [[1,1,1],[1,1,1]]] call BIS_fnc_findSafePos; _group = _patrolGroups select _enemyPatrolGroups; { _x setPos _safePos; } forEach units _group; _groupSize = count units _group; for "_i" from 0 to (_groupSize-1) do { if (_i<2 || _enemiesOutside<_maxEnemiesOutside) then { _enemiesOutside = _enemiesOutside + 1; } else { deleteVehicle ((units _group) select (1 + floor (random ((count units _group) - 1)))); }; }; _params = [units _group select 0, _patrolMarkers select (floor (random _patrolMarkersCount))]; if (random 1 < 0.8) then { _params set [count _params, "NOFOLLOW"]; }; if (random 1 < 0.3) then { _params set [count _params, "NOMOVE"]; }; if (random 1 < 0.4) then { _params set [count _params, "AMBUSH"]; }; _params execVM "scripts\UPSMON.sqf"; _enemyPatrolGroups = _enemyPatrolGroups + 1; }; if (_enemiesOutside>=_maxEnemiesOutside) then { _maxEnemiesOutside = _enemiesOutside+1; }; // delete leftovers while {_enemiesInBuildings < _staticEnemiesCount} do { deleteVehicle (_staticEnemies select _enemiesInBuildings); _enemiesInBuildings = _enemiesInBuildings + 1; }; while {_enemyPatrolGroups < _patrolGroupsCount} do { { deleteVehicle _x; } forEach units (_patrolGroups select _enemyPatrolGroups); _enemyPatrolGroups = _enemyPatrolGroups + 1; }; _guardArray = [guard0, guard1, guard2, guard3, guard4, guard5, guard6]; for "_i" from 0 to (6-_maxEnemiesInTowers) do { _deleteGuard = _guardArray select (floor (random (7-_i))); _guardArray = _guardArray - [_deleteGuard]; deleteVehicle _deleteGuard; }; // Move guards into towers { _x setPos ((nearestBuilding _x) buildingPos 2); [_x, "mrkUPS1", "NOWP2"] execVM "scripts\UPSMON.sqf"; } forEach _guardArray;if (isServer && isNull player) exitWith {}; waitUntil {!isNull player}; _color="ColorRed"; if (side player == WEST) then { _color="ColorBlue"; }; _infUnits = units group player; _infMarkers = []; for "_i" from 0 to 20 do { _currentMarker = createMarkerLocal [format ["mrki%1", _i], [1,1]]; _currentMarker setMarkerShapeLocal "ICON"; _currentMarker setMarkerTypeLocal "mil_triangle"; _currentMarker setMarkerColorLocal _color; _currentMarker setMarkerSizeLocal [0.5,1]; _infMarkers = _infMarkers + [_currentMarker]; }; while {true} do { _infUnits = units group player; _i=0; while {_i<count _infUnits} do { _currentUnit = _infUnits select _i; _currentMarker = _infMarkers select _i; if (alive _currentUnit && vehicle _currentUnit == _currentUnit) then { _currentMarker setMarkerAlphaLocal 1; _currentMarker setMarkerPosLocal [(getPos _currentUnit select 0), (getPos _currentUnit select 1)]; _currentMarker setMarkerDirLocal (direction _currentUnit); if (getDammage _currentUnit > 0.1) then { _currentMarker setMarkerAlphaLocal 0.5; }; if (player == _currentUnit) then { _currentMarker setMarkerColorLocal "ColorGreen"; } else { _currentMarker setMarkerColorLocal _color; }; } else { _currentMarker setMarkerAlphaLocal 0; }; _i=_i+1; }; while {_i<21} do { _currentMarker = _infMarkers select _i; _currentMarker setMarkerAlphaLocal 0; _i=_i+1; }; sleep 1; };�÷× †«ã/0w$ûgsSÆsŒ