Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2014
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. * Pos_fnc.sqf
  3. * POS_FNC = compile preprocessFile "Pos_fnc.sqf";
  4. * Dimon UA Find position SCRIPT.
  5. *FFA_ENEMYFORTFN=["WarfareBCamp","WarfareBDepot","Land_Fort_Watchtower","Land_fortified_nest_big","Land_fortified_nest_small"];
  6. * пример:
  7.     [[FFA_ENEMYFORTFN, 1000], [getpos player, [500,600]], 0, [200, 300], [10, 10], 0.3, false, [0, 15], [FFA_ENEMYFORTFN, 20], false] call POS_FNC;
  8.  
  9. *   _minDistance = _this select 2;              // минимально допустимая дистанция до ближайшего объекта.
  10.     если значение 0 то:
  11.     _minDistance = sizeOf typeOf vehicle;
  12.     _gradientRadius = sizeOf typeOf vehicle * _gradientRadius;
  13.     _xdistance = sizeOf typeOf vehicle * 1.1;
  14. */
  15.  
  16. #define cn !(isOnRoad _isFlat)
  17. #define ucn (isOnRoad _isFlat)
  18. #define tn (count (_isFlat nearRoads _xroads) == 0)
  19. #define mn (count (nearestObjects [ _isFlat , _neartype, _xdistance]) == 0)
  20. #define sn sizeOf typeOf _veh
  21.  
  22.  
  23. private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onWater","_onShore","_onroad",
  24.         "_xroads","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient",
  25.         "_xcountx","_cnt","_isFlat","_poss","_veh"];
  26.  
  27.     _type = ((_this select 0) select 0);        // массив обьектов
  28.     _count = ((_this select 0) select 1);       // кол-во обьектов
  29.     _marker = ((_this select 1) select 0);      // центр радиуса размещения обьекта
  30.     _radius1 = (((_this select 1) select 1) select 0);  // радиус размещения обьекта
  31.     _radius2 = (((_this select 1) select 1) select 1);
  32.     _minDistance = _this select 2;    // минимально допустимая дистанция до ближайшего объекта.
  33.     _minradius = ((_this select 3) select 0);   // минимальный радиус поиска площадки вокруг обьекта
  34.     _maxradius = ((_this select 3) select 1);   // максимальный радиус поиска площадки вокруг обьекта
  35.     _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
  36.     _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
  37.     _gradientRadius = _this select 5;           // радиус окружности, в пределах которой учитывается _minGradient
  38.     _onShore=_this select 6;                    // true если необходима вода в радиусе 25 метров
  39.     _onroad=((_this select 7) select 0);        // 0 если дороги не должно быть, 1 если все равно, 2 если дорога требуется.
  40.     _xroads=((_this select 7) select 1);        // значение в метрах радиуса в котором ищется наличие дороги.
  41.     _neartype=((_this select 8) select 0);      // массив обьектов возле которых при заданной дистанции нельзя ставить обьект.
  42.     _xdistance=((_this select 8) select 1);     // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
  43.     _damage = _this select 9;   // true если обьект разрушаем, false если обьект неразрушаем.
  44.  
  45.     _xradius = (_maxradius - _minradius) / 100;
  46.     _xGradient = (_maxGradient - _minGradient) / 100;
  47.    
  48.     for "_cnt" from 0 to (_count-1) step 1 do
  49.     {
  50.         _typecount=(count _type)-1;
  51.         _unittype=_type select (round random _typecount);
  52.         _xcountx = 0;
  53.         _isFlat = [];
  54.  
  55.             _veh=createVehicle [_unittype, _marker, [], _radius1, "CAN_COLLIDE"];
  56.             if (_minDistance == 0) then
  57.             {
  58.                 _minDistance = sn * 1;
  59.                 _gradientRadius = sn * _gradientRadius;
  60.                 _xdistance = sn * 1.1;
  61.             };         
  62.             _isFlat = (position _veh) isFlatEmpty [_minDistance , _minradius, _minGradient, _gradientRadius, 0, _onShore, _veh];
  63.             if (count _isFlat > 0) then
  64.             {
  65.                 _isFlat set [2, 0];
  66.                 if ( _onroad == 1) then  
  67.                 {
  68.                     if (mn) then
  69.                     {
  70.                         _poss = _isFlat;
  71.                         _poss set [2, 0];
  72.                         call compile format ["
  73.                         _m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
  74.                         _m%1 setMarkerShape ""ICON"";
  75.                         _m%1 setMarkerType ""DOT"";
  76.                         _m%1 setmarkercolor ""colorred"";
  77.                         ",_cnt];
  78.                         _veh setPos _poss;     
  79.                         _veh setVectorUp (surfaceNormal (position _veh));
  80.                         _veh allowDamage _damage;
  81.                     } else {
  82.                         deletevehicle _veh;
  83.                         _isFlat = [];
  84.                     };
  85.                 } else {
  86.                     if ( _onroad == 0) then  
  87.                     {
  88.                         if ( cn && tn && mn) then
  89.                         {
  90.                             _poss = _isFlat;
  91.                        
  92.                             _poss set [2, 0];
  93.                             call compile format ["
  94.                             _m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
  95.                             _m%1 setMarkerShape ""ICON"";
  96.                             _m%1 setMarkerType ""DOT"";
  97.                             _m%1 setmarkercolor ""colorred"";
  98.                             ",_cnt];                               
  99.                             _veh setPos _poss;     
  100.                             _veh setVectorUp (surfaceNormal (position _veh));
  101.                             _veh allowDamage _damage;
  102.                         } else {
  103.                             deletevehicle _veh;
  104.                             _isFlat = [];
  105.                         };
  106.                     } else {
  107.                         if ( ucn && mn) then
  108.                         {
  109.                             _poss = _isFlat;
  110.                                
  111.                             _poss set [2, 0];
  112.                             call compile format ["
  113.                             _m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
  114.                             _m%1 setMarkerShape ""ICON"";
  115.                             _m%1 setMarkerType ""DOT"";
  116.                             _m%1 setmarkercolor ""colorred"";
  117.                             ",_cnt];                                                   
  118.                             _veh setPos _poss;     
  119.                             _veh setVectorUp (surfaceNormal (position _veh));
  120.                             _veh allowDamage _damage;
  121.                         } else {
  122.                             deletevehicle _veh;
  123.                             _isFlat = [];
  124.                         };
  125.                     };
  126.                 };
  127.             } else {
  128.                 if (count _isFlat == 0) then { deletevehicle _veh };
  129.                 _isFlat = [];
  130.             };
  131.        
  132.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement