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