Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Pos_fnc3.sqf
- * POS_FNC3 = compile preprocessFile "Pos_fnc3.sqf";
- * Dimon UA Find position SCRIPT 3.
- *
- * пример:
- _newPos=[getpos player, [0,400], 1, [100, 100], [10, 10], 0.1, [0,true], [1, 20, 60], [[],0],1500] call POS_FNC3;
- * _onroad:
- 0 - дороги не должно быть
- 1 - все равно
- 2 - только на дороге
- 3 - дороги не должно быть, но в пределах радиус от дороги
- 4 - дорога должна быть или допустимый радиус от дороги.
- 5 - дороги не должно быть и мин радиус от дороги где не должно быть, + радиус от дороги где можно разместить
- 6 - дороги не должно быть и радиус от дороги где не должно быть
- */
- #define cn !(isOnRoad _testPos)
- #define ucn (isOnRoad _testPos)
- #define tn (count (_testPos nearRoads _xr) == 0)
- #define utn (count (_testPos nearRoads _xr) > 0)
- #define uctn (count (_testPos nearRoads _xrm) > 0)
- #define mn (count (nearestObjects [ _testPos , _neartype, _xdistance]) == 0)
- #define sw (surfaceIsWater _testPos)
- scopeName "main";
- private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onShore","_onroad",
- "_xr","_xc","_xrm","_posfind","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"];
- _pos = _this select 0; // центр радиуса размещения обьекта
- _minDist = ((_this select 1) select 0);
- _maxDist = ((_this select 1) select 1);
- _minDistance = _this select 2; // минимально допустимая дистанция до ближайшего объекта. 0 - по дефолту
- _minradius = ((_this select 3) select 0); // минимальный радиус поиска площадки вокруг обьекта
- _maxradius = ((_this select 3) select 1); // максимальный радиус поиска площадки вокруг обьекта
- _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
- _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
- _gradientRadius = _this select 5; // радиус окружности, в пределах которой учитывается _minGradient
- _waterMode=((_this select 6) select 0);
- _onShore=((_this select 6) select 1); // true если необходима вода в радиусе 25 метров
- _onroad=((_this select 7) select 0);
- _xr=((_this select 7) select 1); // 1 радиус в котором ищется наличие дороги.
- _xrm=((_this select 7) select 2); // 2 радиус в котором ищется наличие дороги.
- _neartype=((_this select 8) select 0); // массив обьектов возле которых при заданной дистанции от обьекта нельзя ставить обьект.
- _xdistance=((_this select 8) select 1); // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
- _xc = _this select 9; // кол-во проверок позиций
- _blacklist = [];
- if ((count _this) > 10) then { _blacklist = _this select 10;};
- _defaultPos = [];
- if ((count _this) > 11) then { _defaultPos = _this select 11;};
- if (_waterMode == 2) then { _onroad = 7;};
- private ["_newPos", "_posX", "_posY"];
- _newPos = [];
- _posX = _pos select 0;
- _posY = _pos select 1;
- private ["_xcountx"];
- _xradius = (_maxradius - _minradius) / _xc;
- _xGradient = (_maxGradient - _minGradient) / _xc;
- _xcountx = 0;
- _isFlat = [];
- while {_xcountx < _xc} do
- {
- sleep 0.01;
- private ["_newX", "_newY", "_testPos"];
- _newX = _posX + (_maxDist - (random (_maxDist * 2)));
- _newY = _posY + (_maxDist - (random (_maxDist * 2)));
- _testPos = [_newX, _newY];
- if (!([_testPos, _blacklist] call BIS_fnc_isPosBlacklisted)) then
- {
- if ((_pos distance _testPos) >= _minDist) then
- {
- if (!((count (_testPos isFlatEmpty [_minDistance, _minradius, _minGradient, _gradientRadius, 0, _onShore, objNull])) == 0)) then
- {
- if ((_onroad == 1) && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 0) && cn && tn && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 2) && ucn && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 3) && cn && utn && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 4) && (ucn || utn) && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 5) && cn && tn && uctn && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- if ( (_onroad == 6) && cn && tn && mn) then
- {
- _newPos = _testPos;
- breakTo "main";
- };
- };
- };
- };
- _xcountx = _xcountx + 1;
- _minradius = _minradius + _xradius;
- _minGradient = _minGradient + _xGradient;
- };
- if ((count _newPos) == 0) then
- {
- if (_waterMode == 0) then
- {
- if ((count _defaultPos) > 0) then
- {
- _newPos = _defaultPos select 0;
- }
- else
- {
- //Use world Armory default position:
- _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "Armory" >> "positionStart");
- };
- }
- else
- {
- if ((count _defaultPos) > 1) then
- {
- _newPos = _defaultPos select 1;
- }
- else
- {
- //Use world Armory default water position:
- _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "Armory" >> "positionStartWater");
- };
- };
- };
- if ((count _newPos) == 0) then
- {
- //Still nothing was found, use world center positions.
- _newPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
- };
- _newPos
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement