Advertisement
Guest User

Untitled

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