View difference between Paste ID: jD3UgtEL and AUhPkK8Q
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","_onWater","_onShore","_onroad",
24
        "_xroads","_neartype","_xdistance","_damage","_typecount","_unittype","_xradius","_xGradient",
25
		"_xcountx","_cnt","_isFlat","_poss","_veh"];
26
27
	_type = ((_this select 0) select 0);        // массив обьектов
28
	_count = ((_this select 0) select 1);       // кол-во обьектов
29
	_marker = ((_this select 1) select 0);      // центр радиуса размещения обьекта
30
	_radius1 = (((_this select 1) select 1) select 0);	// радиус размещения обьекта
31
	_radius2 = (((_this select 1) select 1) select 1);
32-
	_minDistance = _this select 2;     			// минимально допустимая дистанция до ближайшего объекта. если значение 0 то _minDistance = sizeOf typeOf vehicle.
32+
	_minDistance = _this select 2;    // минимально допустимая дистанция до ближайшего объекта. 
33
	_minradius = ((_this select 3) select 0);  	// минимальный радиус поиска площадки вокруг обьекта
34
	_maxradius = ((_this select 3) select 1); 	// максимальный радиус поиска площадки вокруг обьекта
35-
	_minGradient=((_this select 4) select 0);   // минимальное значение максимального допустимого наклона (разница высот) площадки
35+
	_minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
36-
	_maxGradient=((_this select 4) select 1);   // максимальное значение максимального допустимого наклона (разница высот) площадки
36+
	_maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
37
	_gradientRadius = _this select 5;  			// радиус окружности, в пределах которой учитывается _minGradient
38
	_onShore=_this select 6;          			// true если необходима вода в радиусе 25 метров
39
	_onroad=((_this select 7) select 0);  		// 0 если дороги не должно быть, 1 если все равно, 2 если дорога требуется.
40
	_xroads=((_this select 7) select 1); 		// значение в метрах радиуса в котором ищется наличие дороги.
41-
	_neartype=((_this select 8) select 0);      // массив обьектов возле которых при заданной дистанции от обьекта нельзя ставить обьект.
41+
	_neartype=((_this select 8) select 0);      // массив обьектов возле которых при заданной дистанции нельзя ставить обьект.
42
	_xdistance=((_this select 8) select 1);     // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
43-
	_damage = _this select 9;					// true если обьект разрушаем, false если обьект неразрушаем.
43+
	_damage = _this select 9;	// true если обьект разрушаем, false если обьект неразрушаем.
44
45
	_xradius = (_maxradius - _minradius) / 100;
46
	_xGradient = (_maxGradient - _minGradient) / 100;
47
	
48
	for "_cnt" from 0 to (_count-1) step 1 do
49
 	{
50
		_typecount=(count _type)-1;
51
		_unittype=_type select (round random _typecount);
52
		_xcountx = 0;
53
		_isFlat = [];
54
55
			_veh=createVehicle [_unittype, _marker, [], _radius1, "CAN_COLLIDE"];
56
			if (_minDistance == 0) then 
57
			{
58
				_minDistance = sn * 1;
59
				_gradientRadius = sn * _gradientRadius;
60
				_xdistance = sn * 1.1;
61
			};			
62
			_isFlat = (position _veh) isFlatEmpty [_minDistance , _minradius, _minGradient, _gradientRadius, 0, _onShore, _veh];
63
			if (count _isFlat > 0) then 
64
			{
65
				_isFlat set [2, 0];
66
				if ( _onroad == 1) then  
67
				{
68
					if (mn) then
69
					{
70
						_poss = _isFlat;
71
						_poss set [2, 0];
72
						call compile format ["
73
						_m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
74
						_m%1 setMarkerShape ""ICON"";
75
						_m%1 setMarkerType ""DOT"";
76
						_m%1 setmarkercolor ""colorred"";
77
						",_cnt];
78
						_veh setPos _poss;		
79
						_veh setVectorUp (surfaceNormal (position _veh));
80
						_veh allowDamage _damage;
81
					} else {
82
						deletevehicle _veh;
83
						_isFlat = [];
84
					};
85
				} else {
86
					if ( _onroad == 0) then  
87
					{
88
						if ( cn && tn && mn) then
89
						{
90
							_poss = _isFlat;
91
						
92
							_poss set [2, 0];
93
							call compile format ["
94
							_m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
95
							_m%1 setMarkerShape ""ICON"";
96
							_m%1 setMarkerType ""DOT"";
97
							_m%1 setmarkercolor ""colorred"";
98
							",_cnt];								
99
							_veh setPos _poss;		
100
							_veh setVectorUp (surfaceNormal (position _veh));
101
							_veh allowDamage _damage;
102
						} else {
103
							deletevehicle _veh;
104
							_isFlat = [];
105
						};
106
					} else {
107
						if ( ucn && mn) then
108
						{
109
							_poss = _isFlat;
110
								
111
							_poss set [2, 0];
112
							call compile format ["
113
							_m%1 = createMarker[""mySpot%1"",[_poss select 0,_poss select 1]];
114
							_m%1 setMarkerShape ""ICON"";
115
							_m%1 setMarkerType ""DOT"";
116
							_m%1 setmarkercolor ""colorred"";
117
							",_cnt];													
118
							_veh setPos _poss;		
119
							_veh setVectorUp (surfaceNormal (position _veh));
120
							_veh allowDamage _damage;
121
						} else {
122
							deletevehicle _veh;
123
							_isFlat = [];
124
						};
125
					};
126
				};
127
			} else {
128
				if (count _isFlat == 0) then { deletevehicle _veh };
129
				_isFlat = [];
130
			};
131
		
132
	};