Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2014
429
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","_onShore","_onroad", "_xroads","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"];
  24.  
  25.     _type = ((_this select 0) select 0);        // массив обьектов
  26.     _count = ((_this select 0) select 1);       // кол-во обьектов
  27.     _marker = ((_this select 1) select 0);      // центр радиуса размещения обьекта
  28.     _radius1 = (((_this select 1) select 1) select 0);  // минимальный максимальный радиус размещения обьекта
  29.     _radius2 = (((_this select 1) select 1) select 1); // максимальный радиус размещения обьекта
  30.     _minDistance = _this select 2;              // минимально допустимая дистанция до ближайшего объекта.
  31.     _minradius = ((_this select 3) select 0);   // минимальный радиус поиска площадки вокруг обьекта
  32.     _maxradius = ((_this select 3) select 1);   // максимальный радиус поиска площадки вокруг обьекта
  33.     _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
  34.     _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
  35.     _gradientRadius = _this select 5;           // радиус окружности, в пределах которой учитывается _minGradient
  36.     _onShore=_this select 6;                    // true если необходима вода в радиусе 25 метров
  37.     _onroad=((_this select 7) select 0);        // 0 если дороги не должно быть, 1 если все равно, 2 если дорога требуется.
  38.     _xroads=((_this select 7) select 1);        // значение в метрах радиуса в котором ищется наличие дороги.
  39.     _neartype=((_this select 8) select 0);     // массив обьектов возле которых при заданной дистанции  нельзя ставить обьект.
  40.     _xdistance=((_this select 8) select 1);     // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
  41.     _damage = _this select 9;       // true если обьект разрушаем, false если обьект неразрушаем.
  42.  
  43.     _xradius = (_maxradius - _minradius) / 100;
  44.     _xGradient = (_maxGradient - _minGradient) / 100;
  45.     _xradius1 = (_radius2 - _radius1) / 100;
  46.     for "_cnt" from 0 to (_count-1) step 1 do
  47.     {
  48.         _typecount=(count _type)-1;
  49.         _unittype=_type select (round random _typecount);
  50.         _xcountx = 0;
  51.         _isFlat = [];
  52.         while {_xcountx < 100} do
  53.         {
  54.             _veh=createVehicle [_unittype, _marker, [], _radius1, "CAN_COLLIDE"];
  55.             if (_minDistance == 0) then
  56.             {
  57.                 _minDistance = sn;
  58.                 _gradientRadius = sn * _gradientRadius;
  59.                 _xdistance = sn * 1.1;
  60.             };         
  61.             _isFlat = (position _veh) isFlatEmpty [_minDistance , _minradius, _minGradient, _gradientRadius, 0, _onShore, _veh];
  62.             if (count _isFlat > 0) then
  63.             {
  64.                 _isFlat set [2, 0];
  65.                 if ( _onroad == 1) then  
  66.                 {
  67.                     if (mn) then
  68.                     {
  69.                         _poss = _isFlat;
  70.                         _poss set [2, 0];
  71.                         _veh setPos _poss;     
  72.                         _veh setVectorUp (surfaceNormal (position _veh));
  73.                         _veh allowDamage _damage;
  74.                         _xcountx = _xcountx + 100;
  75.                     } else {
  76.                         deletevehicle _veh;
  77.                         _isFlat = [];
  78.                     };
  79.                 } else {
  80.                     if ( _onroad == 0) then  
  81.                     {
  82.                         if ( cn && tn && mn) then
  83.                         {
  84.                             _poss = _isFlat;
  85.                             _poss set [2, 0];
  86.                             _veh setPos _poss;     
  87.                             _veh setVectorUp (surfaceNormal (position _veh));
  88.                             _veh allowDamage _damage;
  89.                             _xcountx = _xcountx + 100;
  90.                         } else {
  91.                             deletevehicle _veh;
  92.                             _isFlat = [];
  93.                         };
  94.                     } else {
  95.                         if ( ucn && mn) then
  96.                         {
  97.                             _poss = _isFlat;
  98.                             _poss set [2, 0];
  99.                             _veh setPos _poss;     
  100.                             _veh setVectorUp (surfaceNormal (position _veh));
  101.                             _veh allowDamage _damage;
  102.                             _xcountx = _xcountx + 100;
  103.                         } else {
  104.                             deletevehicle _veh;
  105.                             _isFlat = [];
  106.                         };
  107.                     };
  108.                 };
  109.             } else {
  110.                 if (count _isFlat == 0) then { deletevehicle _veh };
  111.                 _isFlat = [];
  112.             };
  113.             _xcountx = _xcountx + 1;
  114.             _minradius = _minradius + _xradius;
  115.             _minGradient = _minGradient + _xGradient;
  116.             _radius1 = _radius1 + _xradius1;
  117.         };
  118.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement