SHARE
TWEET

Air Traffic

Pwner-Actual Feb 28th, 2019 (edited) 167 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // =======================================================================================
  2. // =======================================  SETUP  =======================================
  3. // =======================================================================================
  4. // INSTRUCTIONS
  5. // =======================================================================================
  6. /*
  7.     USAGE   :   Server only.
  8.     PURPOSE :   Spawn random aircraft to fly over selected unit or object.
  9.                 Aircraft will not shoot nor be shot at.
  10.                 The script is looped and dependent on random sleep timers.
  11.                
  12.     EXAMPLE :   nul = [[p_1,p_2],1250,["C_Plane_Civil_01_F","I_Heli_light_03_F"],[25,80],[30,90],0] execVM "UAF\airTraffic.sqf";
  13.     EXAMPLE :   nul = [allPlayers - entities "HeadlessClient_F",2000,["O_Plane_CAS_02_F","O_Plane_Fighter_02_F"],[40,100],[60,120],0] execVM "UAF\airTraffic.sqf";
  14.    
  15.     FORMAT  :   nul = [[A],B,["C"],[D,E],[F,G],H] execVM "UAF\airTraffic.sqf";
  16.     A =         Array of unit or object names that can be chosen as origin points to be flown over.
  17.                 An origin is randomly selected each time.
  18.                 If it's an object, make sure it is alive.
  19.                 Make sure the units exist (i.e. no disabled playable AI).
  20.     B =         Spawn and removal distance in meters from origin point argument A.
  21.     C =         Array of strings of classnames of aircraft that can be randomly spawned.
  22.                 Find your aircraft (airplane or helicopter) here : https://community.bistudio.com/wiki/Arma_3_Assets
  23.     D =         1st element of Height array.
  24.                 The aircraft will fly in between this height and the maximum height (argument E).
  25.     E =         2nd element of Height array.
  26.                 The aircraft will fly in between this height and the minimum height (argument D).
  27.     F =         1st element of Wait array.
  28.                 Minimum amount of seconds to wait before spawning a new aircraft when the previous one is deleted.
  29.     G =         2nd element of Wait array.
  30.                 Maximum amount of seconds to wait before spawning a new aircraft when the previous one is deleted.
  31.     H =         Number (1 or 0)
  32.                 If number is 1 : debug is enabled — markers as well as hints will show details.
  33.                 If number is 0 : debug is deactivated.
  34. */
  35. // =======================================================================================
  36. // SERVER ONLY
  37. // =======================================================================================
  38. if (!isServer) exitWith {};
  39. // =======================================================================================
  40. // DEFINE & DECLARE VARIABLES
  41. // =======================================================================================
  42. //      VARS & VALUES THRU ARGUMENTS
  43. // =======================================================================================
  44. private _origList   = _this select 0;               // A
  45. private _rad        = _this select 1;               // B
  46. private _crafts     = _this select 2;               // C
  47. private _minH       = (_this select 3) select 0;    // D
  48. private _maxH       = (_this select 3) select 1;    // E
  49. private _minRest    = (_this select 4) select 0;    // F
  50. private _maxRest    = (_this select 4) select 1;    // G
  51. private _debug      = _this select 5;               // H
  52. // =======================================================================================
  53. //      VARS & VALUES THRU SCRIPT
  54. // =======================================================================================
  55. private     [   "_targetPos","_height","_pos","_ang","_pos2","_pos3","_craft","_vehSide",
  56.                 "_relDir","_grp","_veh","_crew","_wp","_spawnMkr","_wpMkr","_radMkr",
  57.                 "_craftMkr","_oriMkr","_despMkr"
  58.             ];
  59. // =======================================================================================
  60. // ====================================  SCRIPT  =========================================
  61. // =======================================================================================
  62. //  CONTINUOUS LOOP
  63. // =======================================================================================
  64. while {true} do {
  65. // =======================================================================================
  66. // DEFINE & DECLARE VARS & VALUES (to avoid undefined errors)
  67. // =======================================================================================
  68. private _aliveOri   = [];
  69. _height             = (_minH+(random(_maxH-_minH)));                // select random altitude from arguments
  70. // =======================================================================================
  71. //  CHECK CONDITION(S) TO CALCULATE SPAWN COORDINATES
  72. // =======================================================================================
  73. while {count _aliveOri < 1}                                         // no origins alive
  74. // =======================================================================================
  75. //      KEEP CALCULATING
  76. // =======================================================================================
  77. do {
  78.     _aliveOri = _origList select {alive _x};                        // get list of alive origin points
  79.     if      (count _aliveOri >= 1)                                  // if there are origins then plot a spawn position
  80.     then    {
  81.             _targetPos  = getPos (selectRandom _aliveOri);          // select random origin and get its position
  82.             _ang        = random 360;                               // define random angle
  83.             // choose random point on circumference
  84.             _pos        = [(_targetPos select 0)+_rad*cos(_ang),(_targetPos select 1)+_rad*sin(_ang),_height];
  85.             };
  86.     sleep 1;
  87.     }; 
  88. // =======================================================================================
  89. //  SPAWN A CRAFT
  90. // =======================================================================================
  91. // =======================================================================================
  92. //      SELECT A RANDOM A CRAFT FROM ARGUMENT LIST AND SET ATTRIBUTES
  93. // =======================================================================================
  94. _craft      = selectRandom _crafts;                                     // select random aircraft
  95. _vehSide    = createGroup Civilian;                                     // avoid shooting / being shot at
  96. _relDir     = _pos getDir _targetPos;                                   // spawn with good heading
  97. _arr        = [_pos,_relDir,_craft,_vehSide] call BIS_fnc_spawnVehicle; // create flying aircraft
  98. _veh        = _arr select 0;                                            // get vehicle object
  99. _crew       = _arr select 1;                                            // get vehicle crew
  100. _grp        = _arr select 2;                                            // get group object
  101. _veh flyInHeight    _height;                                            // flight altitude
  102. _veh setVehicleLock "LOCKED";                                           // avoid taking control if it lands and survives
  103. _veh allowDamage false;
  104. clearWeaponCargoGlobal      _veh;                                       // clear its cargo space
  105. clearMagazineCargoGlobal    _veh;
  106. clearItemCargoGlobal        _veh;
  107. clearBackpackCargoGlobal    _veh;
  108. // =======================================================================================
  109. //      SET GROUP / CREW ATTRIBUTES
  110. // =======================================================================================
  111. _grp deleteGroupWhenEmpty true;
  112. (units _grp) apply  {
  113.                     _x setCaptive true; _x setskill ["courage",1]; _x allowFleeing 0;
  114.                     _x disableAI "FSM"; _x disableAI "TARGET"; _x disableAI "AUTOTARGET"; _x disableAI "AUTOCOMBAT";
  115.                     };
  116. [_grp, 0]   setWaypointCombatMode "BLUE";
  117. [_grp, 0]   setWaypointBehaviour "CARELESS";
  118. [_grp, 0]   setWaypointSpeed (selectRandom ["NORMAL","FULL"]);
  119. // =======================================================================================
  120. //      CREATE A "MOVE" WAYPOINT AT DESPAWN POSITION IN A STRAIGHT LINE
  121. // =======================================================================================
  122. // choose random point on circumference across from spawn point straight thru center origin (debug marker _pos2)
  123. _pos2 = [(_targetPos select 0)+_rad*cos(180+_ang),(_targetPos select 1)+_rad*sin(180+_ang),_height];
  124. // double the distance to avoid slowing down when nearing waypoint (waypoint _pos3)
  125. _pos3 = [(_targetPos select 0)+(_rad*2)*cos(180+_ang),(_targetPos select 1)+(_rad*2)*sin(180+_ang),_height];
  126. // =======================================================================================
  127. //      MAKE THE VEHICLE MOVE
  128. // =======================================================================================
  129. _wp         = _grp addWaypoint [_pos3, 0];                              // set WP position
  130. _wp         setWaypointPosition [_pos3, 0];                             // precise placement
  131. _wp         setWaypointType "MOVE";                                     // move to WP
  132. // =======================================================================================
  133. //  DEBUG STATIC MARKERS
  134. // =======================================================================================
  135. if      (_debug == 1)
  136. then    {
  137.         // origin point marker
  138.         _oriMkrN    = format ["marker_%1",floor(random 1000)];
  139.         _oriMkr     = createMarker [_oriMkrN, _targetPos];
  140.         _oriMkr     setMarkerShape "ICON";
  141.         _oriMkr     setMarkerType "hd_dot";
  142.         _oriMkr     setMarkerColor "ColorBlack";
  143.         _oriMkr     setMarkerText "ORIGIN";
  144.         // spawn and despawn radius from origin
  145.         _radMkrN    = format ["marker_%1",floor(random 1000)];
  146.         _radMkr     = createMarker [_radMkrN, _targetPos];
  147.         _radMkr     setMarkerShape "ELLIPSE";
  148.         _radMkr     setMarkerSize [_rad,_rad];
  149.         _radMkr     setMarkerBrush "Vertical";
  150.         _radMkr     setMarkerAlpha 1;
  151.         _radMkr     setMarkerColor "ColorYellow";
  152.         // spawn point
  153.         _spawnMkrN = format ["marker_%1",floor(random 1000)];
  154.         _spawnMkr   = createMarker [_spawnMkrN, _pos];
  155.         _spawnMkr   setMarkerShape "ICON";
  156.         _spawnMkr   setMarkerType "hd_dot";
  157.         _spawnMkr   setMarkerColor "ColorGreen";
  158.         _spawnMkr   setMarkerText "SPAWN";
  159.         // despawn
  160.         _despMkrN   = format ["marker_%1",floor(random 1000)];
  161.         _despMkr    = createMarker [_despMkrN, _pos2];
  162.         _despMkr    setMarkerShape "ICON";
  163.         _despMkr    setMarkerType "hd_dot";
  164.         _despMkr    setMarkerColor "ColorRed";
  165.         _despMkr    setMarkerText "DESPAWN";
  166.         // waypoint
  167.         _wpMkrN     = format ["marker_%1",floor(random 1000)];
  168.         _wpMkr      = createMarker [_wpMkrN, _pos3];
  169.         _wpMkr      setMarkerShape "ICON";
  170.         _wpMkr      setMarkerType "hd_dot";
  171.         _wpMkr      setMarkerColor "ColorPink";
  172.         _wpMkr      setMarkerText "WAYPOINT";
  173.         // aircraft marker
  174.         _craftMkrN  = format ["marker_%1",floor(random 1000)];
  175.         _craftMkr   = createMarker [_craftMkrN, _pos];
  176.         _craftMkr   setMarkerShape "ICON";
  177.         _craftMkr   setMarkerType "hd_dot";
  178.         _craftMkr   setMarkerColor "ColorBlue";
  179.         _craftMkr   setMarkerText _craft;
  180.         };
  181. // =======================================================================================
  182. //  WAIT FOR GROUP'S DEATH OR TOO GREAT A DISTANCE FROM TARGETS
  183. // =======================================================================================
  184. while
  185.     {
  186.     sleep 2;
  187.     ({alive _x} count units _grp >= 1)              // crew is still alive
  188.     and
  189.     (damage _veh < 0.01)                            // craft is still in service
  190.     and
  191.     (position _veh distance _targetPos <= _rad)     // despawn waypoint incomplete
  192.     }
  193. do  {
  194.     if      (_debug == 1)                           // if debug enabled
  195.     then    {
  196.             _craftMkr setMarkerPos (getPos _veh);   // follow aircraft position
  197.             };
  198.     };
  199. // =======================================================================================
  200. //  RESET
  201. // =======================================================================================
  202. //      DELETE CREW & AIRCRAFT & WAYPOINT
  203. // =======================================================================================
  204. (crew _veh)     apply {deleteVehicle _x};           // delete crew
  205. (units _grp)   apply {deleteVehicle _x};           // delete group
  206. deleteVehicle   _veh;                               // delete vehicle
  207. deleteWaypoint  _wp;                                // remove waypoint
  208. // =======================================================================================
  209. //      DELETE MARKERS IF DEBUG ENABLED
  210. // =======================================================================================
  211. if      (_debug == 1)
  212. then    {
  213.         _markers = [_oriMkr,_spawnMkr,_wpMkr,_radMkr,_craftMkr,_despMkr];
  214.         _markers apply {deleteMarker _x};
  215.         };
  216. // =======================================================================================
  217. //  REST TIME BETWEEN SPAWNS
  218. // =======================================================================================
  219. _wait = (_minRest)+(floor(random(_maxRest - _minRest)));    // random sleep relative to arguments
  220. // =======================================================================================
  221. //      DEBUG ON — HINT TIME REMAINING
  222. // =======================================================================================
  223. if      (_debug == 1)
  224. then    {
  225.         while   {_wait > 0}
  226.         do      {
  227.                 if      (_wait == 1)
  228.                 then    {hint "Next aircraft flyover in 1 second";}
  229.                 else    {hint format ["Next aircraft flyover in %1 seconds", _wait];};             
  230.                 sleep 1;
  231.                 _wait = _wait - 1;             
  232.                 };
  233.         hint "";
  234.         }
  235. // =======================================================================================
  236. //      DEBUG OFF
  237. // =======================================================================================
  238. else    {sleep _wait;};
  239. // =======================================================================================
  240. //  RESTART
  241. // =======================================================================================
  242. };  // loop
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top