Advertisement
Guest User

Untitled

a guest
Jan 26th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.93 KB | None | 0 0
  1. /*
  2. * Pos_fnc6.sqf
  3.  
  4. * Author: Dimon UA
  5.  
  6. *
  7. Description:
  8. The function of the search positions with a variety of additional conditions
  9.  
  10. *
  11. Example:
  12. arx=[getmarkerpos "m2", [1000,1200], 0.1, [0, 0], [10, 10], 0.1, [0,false], [2,objNull, objNull], [["Static"],20],3000] call Pos_fnc6;
  13.  
  14.  
  15. * _onroad:
  16. [0,objNull,objNull] - дороги не должно быть
  17. [1,objNull,objNull] - все равно
  18. [2,objNull,objNull] - только на дороге
  19. [3,20,objNull] - дороги не должно быть, но в пределах радиус от дороги
  20. [4,20,objNull] - дорога должна быть или допустимый радиус от дороги.
  21. [5,20,60] - дороги не должно быть и мин радиус от дороги где не должно быть, + радиус от дороги где можно разместить
  22. [6,40,objNull] - дороги не должно быть и радиус от дороги где не должно быть
  23.  
  24. Returns:
  25. Array - format PositionATL
  26. */
  27.  
  28. #define cn !(isOnRoad _testPos)
  29. #define ucn (isOnRoad _testPos)
  30. #define tn (count (_testPos nearRoads _xr) == 0)
  31. #define utn (count (_testPos nearRoads _xr) > 0)
  32. #define uctn (count (_testPos nearRoads _xrm) > 0)
  33. #define mn (count (nearestObjects [ _testPos , _neartype, _xdistance]) == 0)
  34. #define sw (surfaceIsWater _testPos)
  35.  
  36. //scopeName "main";
  37.  
  38. private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onShore","_onroad",
  39. "_xr","_xc","_xrm","_posfind","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"];
  40.  
  41. _pos = _this select 0; // центр радиуса размещения обьекта
  42. _minDist = ((_this select 1) select 0);
  43. _maxDist = ((_this select 1) select 1);
  44. _minDistance = _this select 2; // минимально допустимая дистанция до ближайшего объекта. 0 - по дефолту
  45. _minradius = ((_this select 3) select 0); // минимальный радиус поиска площадки вокруг обьекта
  46. _maxradius = ((_this select 3) select 1); // максимальный радиус поиска площадки вокруг обьекта
  47. _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
  48. _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
  49. _gradientRadius = _this select 5; // радиус окружности, в пределах которой учитывается _minGradient
  50. _waterMode=((_this select 6) select 0);
  51. _onShore=((_this select 6) select 1); // true если необходима вода в радиусе 25 метров
  52. _onroad=((_this select 7) select 0);
  53. _xr=((_this select 7) select 1); // 1 радиус в котором ищется наличие дороги.
  54. _xrm=((_this select 7) select 2); // 2 радиус в котором ищется наличие дороги.
  55. _neartype=((_this select 8) select 0); // массив обьектов возле которых при заданной дистанции от обьекта нельзя ставить обьект.
  56. _xdistance=((_this select 8) select 1); // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
  57. _xc = _this select 9; // кол-во проверок позиций
  58. _blacklist = [];
  59. if ((count _this) > 10) then { _blacklist = _this select 10;};
  60.  
  61. if (_waterMode == 2) then { _onroad = 7;};
  62. //_debug = false;
  63. _debug = false;
  64. private ["_newPos", "_posX", "_posY"];
  65. _newPos = [];
  66. _posX = _pos select 0;
  67. _posY = _pos select 1;
  68.  
  69. private ["_xcountx"];
  70.  
  71. _xradius = (_maxradius - _minradius) / _xc;
  72. _xGradient = (_maxGradient - _minGradient) / _xc;
  73. _xcountx = 0;
  74. _array = [];
  75. for "_xcountx" from 1 to _xc step 1 do
  76. {
  77. private ["_newX", "_newY", "_testPos"];
  78. _newX = _posX + (_maxDist - (random (_maxDist * 2)));
  79. _newY = _posY + (_maxDist - (random (_maxDist * 2)));
  80. _testPos = [_newX, _newY];
  81.  
  82. if (!([_testPos, _blacklist] call BIS_fnc_isPosBlacklisted) && {(_pos distance _testPos) >= _minDist} && {!((count (_testPos isFlatEmpty [_minDistance, _minradius, _minGradient, _gradientRadius, 0, _onShore, objNull])) == 0)}) then
  83. {
  84. call
  85. {
  86. if ((_onroad == 1) && {mn}) exitwith
  87. {
  88. _newPos = _testPos;
  89. _array set [count _array, _newPos];
  90. };
  91. if ( (_onroad == 0) && {cn} && {tn} && {mn}) exitwith
  92. {
  93. _newPos = _testPos;
  94. _array set [count _array, _newPos];
  95. };
  96. if ( (_onroad == 2) && {ucn} && {mn}) exitwith
  97. {
  98. _newPos = _testPos;
  99. _array set [count _array, _newPos];
  100. };
  101. if ( (_onroad == 3) && {cn} && {utn} && {mn}) exitwith
  102. {
  103. _newPos = _testPos;
  104. _array set [count _array, _newPos];
  105. };
  106. if ( (_onroad == 4) && {( ucn || {utn})} && {mn}) exitwith
  107. {
  108. _newPos = _testPos;
  109. _array set [count _array, _newPos];
  110. };
  111. if ( (_onroad == 5) && {cn} && {tn} && {uctn} && {mn}) exitwith
  112. {
  113. _newPos = _testPos;
  114. _array set [count _array, _newPos];
  115. };
  116. if ( (_onroad == 6) && {cn} && {tn} && {mn}) exitwith
  117. {
  118. _newPos = _testPos;
  119. _array set [count _array, _newPos];
  120. };
  121. };
  122. };
  123. _minradius = _minradius + _xradius;
  124. _minGradient = _minGradient + _xGradient;
  125. };
  126. if _debug then
  127. {
  128. {
  129. call compile format ["
  130. _m%1 = createMarker[""markerblue%1"",[ _x select 0,_x select 1]];
  131. _m%1 setMarkerShape ""ICON"";
  132. _m%1 setMarkerType ""DOT"";
  133. _m%1 setmarkercolor ""Colorblue""; ",_forEachIndex];
  134. } foreach _array;
  135. };
  136. _array
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement