SHOW:
|
|
- or go back to the newest paste.
| 1 | /* | |
| 2 | - | * Pos_fnc.sqf |
| 2 | + | * Pos_fnc3.sqf |
| 3 | - | * POS_FNC = compile preprocessFile "Pos_fnc.sqf"; |
| 3 | + | * POS_FNC3 = compile preprocessFile "Pos_fnc3.sqf"; |
| 4 | - | * Dimon UA Find position SCRIPT. |
| 4 | + | * Dimon UA Find position SCRIPT 3. |
| 5 | - | *FFA_ENEMYFORTFN=["WarfareBCamp","WarfareBDepot","Land_Fort_Watchtower","Land_fortified_nest_big","Land_fortified_nest_small"]; |
| 5 | + | * |
| 6 | * пример: | |
| 7 | - | [[FFA_ENEMYFORTFN, 1000], [getpos player, [500,600]], 0, [200, 300], [10, 10], 0.3, false, [0, 15], [FFA_ENEMYFORTFN, 20], false] call POS_FNC; |
| 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 | - | * _minDistance = _this select 2; // минимально допустимая дистанция до ближайшего объекта. |
| 9 | + | 0 - дороги не должно быть |
| 10 | - | если значение 0 то: |
| 10 | + | 1 - все равно |
| 11 | - | _minDistance = sizeOf typeOf vehicle; |
| 11 | + | 2 - только на дороге |
| 12 | - | _gradientRadius = sizeOf typeOf vehicle * _gradientRadius; |
| 12 | + | 3 - дороги не должно быть, но в пределах радиус от дороги |
| 13 | - | _xdistance = sizeOf typeOf vehicle * 1.1; |
| 13 | + | 4 - дорога должна быть или допустимый радиус от дороги. |
| 14 | 5 - дороги не должно быть и мин радиус от дороги где не должно быть, + радиус от дороги где можно разместить | |
| 15 | 6 - дороги не должно быть и радиус от дороги где не должно быть | |
| 16 | - | #define cn !(isOnRoad _isFlat) |
| 16 | + | |
| 17 | - | #define ucn (isOnRoad _isFlat) |
| 17 | + | |
| 18 | - | #define tn (count (_isFlat nearRoads _xroads) == 0) |
| 18 | + | #define cn !(isOnRoad _testPos) |
| 19 | - | #define mn (count (nearestObjects [ _isFlat , _neartype, _xdistance]) == 0) |
| 19 | + | #define ucn (isOnRoad _testPos) |
| 20 | - | #define sn sizeOf typeOf _veh |
| 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 | - | private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onShore","_onroad", "_xroads","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"]; |
| 23 | + | #define mn (count (nearestObjects [ _testPos , _neartype, _xdistance]) == 0) |
| 24 | #define sw (surfaceIsWater _testPos) | |
| 25 | - | _type = ((_this select 0) select 0); // массив обьектов |
| 25 | + | |
| 26 | - | _count = ((_this select 0) select 1); // кол-во обьектов |
| 26 | + | scopeName "main"; |
| 27 | - | _marker = ((_this select 1) select 0); // центр радиуса размещения обьекта |
| 27 | + | |
| 28 | - | _radius1 = (((_this select 1) select 1) select 0); // минимальный максимальный радиус размещения обьекта |
| 28 | + | private["_type","_count","_marker","_radius","_minDistance","_minradius","_maxradius","_minGradient","_maxGradient","_gradientRadius","_onShore","_onroad", |
| 29 | - | _radius2 = (((_this select 1) select 1) select 1); // максимальный радиус размещения обьекта |
| 29 | + | "_xr","_xc","_xrm","_posfind","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient", "_xcountx","_cnt","_isFlat","_poss","_veh"]; |
| 30 | - | _minDistance = _this select 2; // минимально допустимая дистанция до ближайшего объекта. |
| 30 | + | |
| 31 | - | _minradius = ((_this select 3) select 0); // минимальный радиус поиска площадки вокруг обьекта |
| 31 | + | _pos = _this select 0; // центр радиуса размещения обьекта |
| 32 | - | _maxradius = ((_this select 3) select 1); // максимальный радиус поиска площадки вокруг обьекта |
| 32 | + | _minDist = ((_this select 1) select 0); |
| 33 | - | _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки |
| 33 | + | _maxDist = ((_this select 1) select 1); |
| 34 | - | _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки |
| 34 | + | _minDistance = _this select 2; // минимально допустимая дистанция до ближайшего объекта. 0 - по дефолту |
| 35 | - | _gradientRadius = _this select 5; // радиус окружности, в пределах которой учитывается _minGradient |
| 35 | + | _minradius = ((_this select 3) select 0); // минимальный радиус поиска площадки вокруг обьекта |
| 36 | - | _onShore=_this select 6; // true если необходима вода в радиусе 25 метров |
| 36 | + | _maxradius = ((_this select 3) select 1); // максимальный радиус поиска площадки вокруг обьекта |
| 37 | - | _onroad=((_this select 7) select 0); // 0 если дороги не должно быть, 1 если все равно, 2 если дорога требуется. |
| 37 | + | _minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки |
| 38 | - | _xroads=((_this select 7) select 1); // значение в метрах радиуса в котором ищется наличие дороги. |
| 38 | + | _maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки |
| 39 | - | _neartype=((_this select 8) select 0); // массив обьектов возле которых при заданной дистанции нельзя ставить обьект. |
| 39 | + | _gradientRadius = _this select 5; // радиус окружности, в пределах которой учитывается _minGradient |
| 40 | - | _xdistance=((_this select 8) select 1); // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы). |
| 40 | + | _waterMode=((_this select 6) select 0); |
| 41 | - | _damage = _this select 9; // true если обьект разрушаем, false если обьект неразрушаем. |
| 41 | + | _onShore=((_this select 6) select 1); // true если необходима вода в радиусе 25 метров |
| 42 | _onroad=((_this select 7) select 0); | |
| 43 | - | _xradius = (_maxradius - _minradius) / 100; |
| 43 | + | _xr=((_this select 7) select 1); // 1 радиус в котором ищется наличие дороги. |
| 44 | - | _xGradient = (_maxGradient - _minGradient) / 100; |
| 44 | + | _xrm=((_this select 7) select 2); // 2 радиус в котором ищется наличие дороги. |
| 45 | - | _xradius1 = (_radius2 - _radius1) / 100; |
| 45 | + | _neartype=((_this select 8) select 0); // массив обьектов возле которых при заданной дистанции от обьекта нельзя ставить обьект. |
| 46 | - | for "_cnt" from 0 to (_count-1) step 1 do |
| 46 | + | _xdistance=((_this select 8) select 1); // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы). |
| 47 | - | {
|
| 47 | + | _xc = _this select 9; // кол-во проверок позиций |
| 48 | - | _typecount=(count _type)-1; |
| 48 | + | _blacklist = []; |
| 49 | - | _unittype=_type select (round random _typecount); |
| 49 | + | if ((count _this) > 10) then { _blacklist = _this select 10;};
|
| 50 | - | _xcountx = 0; |
| 50 | + | _defaultPos = []; |
| 51 | - | _isFlat = []; |
| 51 | + | if ((count _this) > 11) then { _defaultPos = _this select 11;};
|
| 52 | - | while {_xcountx < 100} do
|
| 52 | + | |
| 53 | if (_waterMode == 2) then { _onroad = 7;};
| |
| 54 | - | _veh=createVehicle [_unittype, _marker, [], _radius1, "CAN_COLLIDE"]; |
| 54 | + | |
| 55 | - | if (_minDistance == 0) then |
| 55 | + | private ["_newPos", "_posX", "_posY"]; |
| 56 | - | {
|
| 56 | + | _newPos = []; |
| 57 | - | _minDistance = sn; |
| 57 | + | _posX = _pos select 0; |
| 58 | - | _gradientRadius = sn * _gradientRadius; |
| 58 | + | _posY = _pos select 1; |
| 59 | - | _xdistance = sn * 1.1; |
| 59 | + | |
| 60 | - | }; |
| 60 | + | private ["_xcountx"]; |
| 61 | - | _isFlat = (position _veh) isFlatEmpty [_minDistance , _minradius, _minGradient, _gradientRadius, 0, _onShore, _veh]; |
| 61 | + | |
| 62 | - | if (count _isFlat > 0) then |
| 62 | + | _xradius = (_maxradius - _minradius) / _xc; |
| 63 | - | {
|
| 63 | + | _xGradient = (_maxGradient - _minGradient) / _xc; |
| 64 | - | _isFlat set [2, 0]; |
| 64 | + | _xcountx = 0; |
| 65 | - | if ( _onroad == 1) then |
| 65 | + | _isFlat = []; |
| 66 | while {_xcountx < _xc} do
| |
| 67 | - | if (mn) then |
| 67 | + | {
|
| 68 | - | {
|
| 68 | + | sleep 0.01; |
| 69 | - | _poss = _isFlat; |
| 69 | + | private ["_newX", "_newY", "_testPos"]; |
| 70 | - | _poss set [2, 0]; |
| 70 | + | _newX = _posX + (_maxDist - (random (_maxDist * 2))); |
| 71 | - | _veh setPos _poss; |
| 71 | + | _newY = _posY + (_maxDist - (random (_maxDist * 2))); |
| 72 | - | _veh setVectorUp (surfaceNormal (position _veh)); |
| 72 | + | _testPos = [_newX, _newY]; |
| 73 | - | _veh allowDamage _damage; |
| 73 | + | |
| 74 | - | _xcountx = _xcountx + 100; |
| 74 | + | if (!([_testPos, _blacklist] call BIS_fnc_isPosBlacklisted)) then |
| 75 | - | } else {
|
| 75 | + | {
|
| 76 | - | deletevehicle _veh; |
| 76 | + | if ((_pos distance _testPos) >= _minDist) then |
| 77 | - | _isFlat = []; |
| 77 | + | |
| 78 | - | }; |
| 78 | + | if (!((count (_testPos isFlatEmpty [_minDistance, _minradius, _minGradient, _gradientRadius, 0, _onShore, objNull])) == 0)) then |
| 79 | - | } else {
|
| 79 | + | {
|
| 80 | - | if ( _onroad == 0) then |
| 80 | + | if ((_onroad == 1) && mn) then |
| 81 | - | {
|
| 81 | + | |
| 82 | - | if ( cn && tn && mn) then |
| 82 | + | _newPos = _testPos; |
| 83 | - | {
|
| 83 | + | breakTo "main"; |
| 84 | - | _poss = _isFlat; |
| 84 | + | |
| 85 | - | _poss set [2, 0]; |
| 85 | + | if ( (_onroad == 0) && cn && tn && mn) then |
| 86 | - | _veh setPos _poss; |
| 86 | + | |
| 87 | - | _veh setVectorUp (surfaceNormal (position _veh)); |
| 87 | + | _newPos = _testPos; |
| 88 | - | _veh allowDamage _damage; |
| 88 | + | breakTo "main"; |
| 89 | - | _xcountx = _xcountx + 100; |
| 89 | + | |
| 90 | - | } else {
|
| 90 | + | if ( (_onroad == 2) && ucn && mn) then |
| 91 | - | deletevehicle _veh; |
| 91 | + | |
| 92 | - | _isFlat = []; |
| 92 | + | _newPos = _testPos; |
| 93 | - | }; |
| 93 | + | breakTo "main"; |
| 94 | - | } else {
|
| 94 | + | |
| 95 | - | if ( ucn && mn) then |
| 95 | + | if ( (_onroad == 3) && cn && utn && mn) then |
| 96 | - | {
|
| 96 | + | |
| 97 | - | _poss = _isFlat; |
| 97 | + | _newPos = _testPos; |
| 98 | - | _poss set [2, 0]; |
| 98 | + | breakTo "main"; |
| 99 | - | _veh setPos _poss; |
| 99 | + | |
| 100 | - | _veh setVectorUp (surfaceNormal (position _veh)); |
| 100 | + | if ( (_onroad == 4) && (ucn || utn) && mn) then |
| 101 | - | _veh allowDamage _damage; |
| 101 | + | |
| 102 | - | _xcountx = _xcountx + 100; |
| 102 | + | _newPos = _testPos; |
| 103 | - | } else {
|
| 103 | + | breakTo "main"; |
| 104 | - | deletevehicle _veh; |
| 104 | + | |
| 105 | - | _isFlat = []; |
| 105 | + | if ( (_onroad == 5) && cn && tn && uctn && mn) then |
| 106 | - | }; |
| 106 | + | |
| 107 | - | }; |
| 107 | + | _newPos = _testPos; |
| 108 | breakTo "main"; | |
| 109 | - | } else {
|
| 109 | + | |
| 110 | - | if (count _isFlat == 0) then { deletevehicle _veh };
|
| 110 | + | if ( (_onroad == 6) && cn && tn && mn) then |
| 111 | - | _isFlat = []; |
| 111 | + | |
| 112 | _newPos = _testPos; | |
| 113 | - | _xcountx = _xcountx + 1; |
| 113 | + | breakTo "main"; |
| 114 | - | _minradius = _minradius + _xradius; |
| 114 | + | }; |
| 115 | - | _minGradient = _minGradient + _xGradient; |
| 115 | + | |
| 116 | - | _radius1 = _radius1 + _xradius1; |
| 116 | + | |
| 117 | }; | |
| 118 | - | }; |
| 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 |