View difference between Paste ID: QHjMwQcG and e3xurPug
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