Advertisement
Guest User

Untitled

a guest
Sep 28th, 2014
438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. * Pos_fnc3.sqf
  3. * POS_FNC3 = compile preprocessFile "Pos_fnc3.sqf";
  4. * Dimon UA Find position SCRIPT 3.
  5. *
  6. * пример:
  7.     _newPos=[getpos player, [0,400], 1, [100, 100], [10, 10], 0.1, [0,true], [1, 20, 60], [[],0],1500] call POS_FNC3;
  8. * _onroad:
  9.   0 - дороги не должно быть
  10.   1 - все равно
  11.   2 - только на дороге
  12.   3 - дороги не должно быть, но в пределах радиус от дороги
  13.   4 - дорога должна быть или допустимый радиус от дороги.
  14.   5 - дороги не должно быть и мин радиус от дороги где не должно быть, + радиус от дороги где можно разместить
  15.   6 - дороги не должно быть и радиус от дороги где не должно быть
  16. */
  17.  
  18. #define cn !(isOnRoad _testPos)
  19. #define ucn (isOnRoad _testPos)
  20. #define tn (count (_testPos nearRoads _xr) == 0)
  21. #define utn (count (_testPos nearRoads _xr) > 0)
  22. #define uctn (count (_testPos nearRoads _xrm) > 0)
  23. #define mn (count (nearestObjects [ _testPos , _neartype, _xdistance]) == 0)
  24. #define sw (surfaceIsWater _testPos)
  25.  
  26. scopeName "main";
  27.  
  28. private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onShore","_onroad",
  29.         "_xr","_xc","_xrm","_posfind","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"];
  30.  
  31. _pos = _this select 0;      // центр радиуса размещения обьекта
  32. _minDist = ((_this select 1) select 0);
  33. _maxDist = ((_this select 1) select 1);
  34. _minDistance = _this select 2;              // минимально допустимая дистанция до ближайшего объекта. 0 - по дефолту
  35. _minradius = ((_this select 3) select 0);   // минимальный радиус поиска площадки вокруг обьекта
  36. _maxradius = ((_this select 3) select 1);   // максимальный радиус поиска площадки вокруг обьекта
  37. _minGradient=((_this select 4) select 0);   // минимальное значение максимального допустимого наклона (разница высот) площадки
  38. _maxGradient=((_this select 4) select 1);   // максимальное значение максимального допустимого наклона (разница высот) площадки
  39. _gradientRadius = _this select 5;           // радиус окружности, в пределах которой учитывается _minGradient
  40. _waterMode=((_this select 6) select 0);
  41. _onShore=((_this select 6) select 1);                   // true если необходима вода в радиусе 25 метров
  42. _onroad=((_this select 7) select 0);       
  43. _xr=((_this select 7) select 1);        // 1 радиус в котором ищется наличие дороги.
  44. _xrm=((_this select 7) select 2);       // 2 радиус в котором ищется наличие дороги.
  45. _neartype=((_this select 8) select 0);      // массив обьектов возле которых при заданной дистанции от обьекта нельзя ставить обьект.
  46. _xdistance=((_this select 8) select 1);     // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
  47. _xc = _this select 9; // кол-во проверок позиций
  48. _blacklist = [];
  49. if ((count _this) > 10) then { _blacklist = _this select 10;};
  50. _defaultPos = [];
  51. if ((count _this) > 11) then { _defaultPos = _this select 11;};
  52.  
  53. if (_waterMode == 2) then { _onroad = 7;};
  54.  
  55. private ["_newPos", "_posX", "_posY"];
  56. _newPos = [];
  57. _posX = _pos select 0;
  58. _posY = _pos select 1;
  59.  
  60. private ["_xcountx"];
  61.  
  62. _xradius = (_maxradius - _minradius) / _xc;
  63. _xGradient = (_maxGradient - _minGradient) / _xc;
  64. _xcountx = 0;
  65. _isFlat = [];
  66. while {_xcountx < _xc} do
  67. {
  68.     sleep 0.01;
  69.     private ["_newX", "_newY", "_testPos"];
  70.     _newX = _posX + (_maxDist - (random (_maxDist * 2)));
  71.     _newY = _posY + (_maxDist - (random (_maxDist * 2)));
  72.     _testPos = [_newX, _newY];
  73.  
  74.     if (!([_testPos, _blacklist] call BIS_fnc_isPosBlacklisted)) then
  75.     {
  76.         if ((_pos distance _testPos) >= _minDist) then
  77.         {
  78.             if (!((count (_testPos isFlatEmpty [_minDistance, _minradius, _minGradient, _gradientRadius, 0, _onShore, objNull])) == 0)) then
  79.             {      
  80.                 if ((_onroad == 1) && mn) then  
  81.                 {
  82.                     _newPos = _testPos;
  83.                     breakTo "main";
  84.                 };
  85.                 if ( (_onroad == 0) && cn && tn && mn) then  
  86.                 {
  87.                     _newPos = _testPos;
  88.                     breakTo "main";
  89.                 };
  90.                 if ( (_onroad == 2) && ucn && mn) then  
  91.                 {
  92.                     _newPos = _testPos;
  93.                     breakTo "main";
  94.                 };
  95.                 if ( (_onroad == 3) && cn && utn && mn) then  
  96.                 {
  97.                     _newPos = _testPos;
  98.                     breakTo "main";
  99.                 };
  100.                 if ( (_onroad == 4) && (ucn || utn) && mn) then  
  101.                 {
  102.                     _newPos = _testPos;
  103.                     breakTo "main";
  104.                 };
  105.                 if ( (_onroad == 5) && cn && tn && uctn && mn) then  
  106.                 {
  107.                     _newPos = _testPos;
  108.                     breakTo "main";
  109.                 };
  110.                 if ( (_onroad == 6) && cn && tn && mn) then  
  111.                 {
  112.                     _newPos = _testPos;
  113.                     breakTo "main";
  114.                 };             
  115.             };
  116.         };
  117.     };
  118.     _xcountx = _xcountx + 1;
  119.     _minradius = _minradius + _xradius;
  120.     _minGradient = _minGradient + _xGradient;
  121. };
  122.  
  123. if ((count _newPos) == 0) then
  124. {
  125.     if (_waterMode == 0) then
  126.     {
  127.         if ((count _defaultPos) > 0) then
  128.         {
  129.             _newPos = _defaultPos select 0;
  130.         }
  131.         else
  132.         {
  133.             //Use world Armory default position:
  134.             _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "Armory" >> "positionStart");
  135.         };
  136.     }
  137.     else
  138.     {
  139.         if ((count _defaultPos) > 1) then
  140.         {
  141.             _newPos = _defaultPos select 1;
  142.         }
  143.         else
  144.         {
  145.             //Use world Armory default water position:
  146.             _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "Armory" >> "positionStartWater");
  147.         };
  148.     };
  149. };
  150.  
  151. if ((count _newPos) == 0) then
  152. {
  153.     //Still nothing was found, use world center positions.
  154.     _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
  155. };
  156.  
  157. _newPos
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement