Advertisement
Guest User

Untitled

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