View difference between Paste ID: 08hu13vC and e3xurPug
SHOW: | | - or go back to the newest paste.
1-
/*
1+
/* ----------------------------------------------------------------------------
2-
* Pos_fnc.sqf
2+
Function: CBA_fnc_inArea
3-
* POS_FNC = compile preprocessFile "Pos_fnc.sqf";
3+
4-
* Dimon UA Find position SCRIPT.
4+
Description:
5-
*FFA_ENEMYFORTFN=["WarfareBCamp","WarfareBDepot","Land_Fort_Watchtower","Land_fortified_nest_big","Land_fortified_nest_small"];
5+
	A function used to determine if a position is within a zone.
6-
* пример: 
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+
	The "position" can be given as a marker name, an object,
8
	location, group or a position array.
9-
*	_minDistance = _this select 2;     			// минимально допустимая дистанция до ближайшего объекта. 
9+
10-
	если значение 0 то: 
10+
	The zone is specificed either as a marker name or a trigger.
11-
	_minDistance = sizeOf typeOf vehicle;
11+
12-
	_gradientRadius = sizeOf typeOf vehicle * _gradientRadius;
12+
Parameters:
13-
	_xdistance = sizeOf typeOf vehicle * 1.1;
13+
	A two-element array, [ position, zone], where
14-
*/
14+
15
	- position: Marker|Object|Location|Group|Position
16-
#define cn !(isOnRoad _isFlat)
16+
	- zone:     Marker|Trigger
17-
#define ucn (isOnRoad _isFlat)
17+
18-
#define tn (count (_isFlat nearRoads _xroads) == 0)
18+
Example:
19-
#define mn (count (nearestObjects [ _isFlat , _neartype, _xdistance]) == 0)
19+
	(begin example)
20-
#define sn sizeOf typeOf _veh
20+
	// Is the marker "playermarker" inside the "safezone" marker area?
21
	_safe = [ "playermarker", "safezone"] call CBA_fnc_inArea;
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"];
23+
	// is the player within the safe zone marker area?
24
	_pos = getPos player;
25-
	_type = ((_this select 0) select 0);        // массив обьектов
25+
	_safe = [ _pos, "safezone" ] call CBA_fnc_inArea;
26-
	_count = ((_this select 0) select 1);       // кол-во обьектов
26+
27-
	_marker = ((_this select 1) select 0);      // центр радиуса размещения обьекта
27+
	// Deny artillery if target is inside the trigger area
28-
	_radius1 = (((_this select 1) select 1) select 0);	// минимальный максимальный радиус размещения обьекта
28+
	if ([_target, cityTrigger] call CBA_fnc_inArea) then
29-
	_radius2 = (((_this select 1) select 1) select 1); // максимальный радиус размещения обьекта
29+
	{
30-
	_minDistance = _this select 2;     			// минимально допустимая дистанция до ближайшего объекта.
30+
		// deny fire mission
31-
	_minradius = ((_this select 3) select 0);  	// минимальный радиус поиска площадки вокруг обьекта
31+
	}
32-
	_maxradius = ((_this select 3) select 1); 	// максимальный радиус поиска площадки вокруг обьекта
32+
	else
33-
	_minGradient=((_this select 4) select 0); // минимальное значение максимального допустимого наклона (разница высот) площадки
33+
	{
34-
	_maxGradient=((_this select 4) select 1); // максимальное значение максимального допустимого наклона (разница высот) площадки
34+
		// fire away!
35-
	_gradientRadius = _this select 5;  			// радиус окружности, в пределах которой учитывается _minGradient
35+
	};
36-
	_onShore=_this select 6;          			// true если необходима вода в радиусе 25 метров
36+
	(end)	
37-
	_onroad=((_this select 7) select 0);  		// 0 если дороги не должно быть, 1 если все равно, 2 если дорога требуется.
37+
38-
	_xroads=((_this select 7) select 1); 		// значение в метрах радиуса в котором ищется наличие дороги.
38+
Returns:
39-
	_neartype=((_this select 8) select 0);     // массив обьектов возле которых при заданной дистанции  нельзя ставить обьект.
39+
	Boolean
40-
	_xdistance=((_this select 8) select 1);     // дистанция до обьектов возле которых нельзя ставить нужный нам обьект(ы).
40+
41-
	_damage = _this select 9;		// true если обьект разрушаем, false если обьект неразрушаем.
41+
Author:
42
	Rommel
43-
	_xradius = (_maxradius - _minradius) / 100;
43+
44-
	_xGradient = (_maxGradient - _minGradient) / 100;
44+
---------------------------------------------------------------------------- */
45-
	_xradius1 = (_radius2 - _radius1) / 100;
45+
#include "script_component.hpp"
46-
	for "_cnt" from 0 to (_count-1) step 1 do
46+
47-
 	{
47+
PARAMS_2(_position,_zRef);
48-
		_typecount=(count _type)-1;
48+
49-
		_unittype=_type select (round random _typecount);
49+
_position = (_position call CBA_fnc_getpos);
50-
		_xcountx = 0;
50+
51-
		_isFlat = [];
51+
private ["_zSize","_zDir","_zShape","_zPos"];
52-
		while {_xcountx < 100} do 
52+
switch (typename _zRef) do {
53-
		{
53+
	case "STRING" : {
54-
			_veh=createVehicle [_unittype, _marker, [], _radius1, "CAN_COLLIDE"];
54+
		_zSize = markerSize _zRef;
55-
			if (_minDistance == 0) then 
55+
		_zDir = markerDir _zRef;
56-
			{
56+
		_zShape = tolower (markerShape _zRef);
57-
				_minDistance = sn;
57+
		_zPos = (_zRef call CBA_fnc_getpos);
58-
				_gradientRadius = sn * _gradientRadius;
58+
	};
59-
				_xdistance = sn * 1.1;
59+
	case "OBJECT" : {
60-
			};			
60+
		_zSize = triggerArea _zRef;
61-
			_isFlat = (position _veh) isFlatEmpty [_minDistance , _minradius, _minGradient, _gradientRadius, 0, _onShore, _veh];
61+
		_zDir = _zSize select 2;
62-
			if (count _isFlat > 0) then 
62+
		_zShape = if (_zSize select 3) then {"rectangle"} else {"ellipse"};
63-
			{
63+
		_zPos = getpos _zRef;
64-
				_isFlat set [2, 0];
64+
	};
65-
				if ( _onroad == 1) then  
65+
};
66-
				{
66+
67-
					if (mn) then
67+
if (isnil "_zSize") exitwith {false};
68-
					{
68+
69-
						_poss = _isFlat;
69+
_position = [_zPos,_position,_zDir] call CBA_fnc_vectRotate2D;
70-
						_poss set [2, 0];
70+
71-
						_veh setPos _poss;		
71+
private ["_x1","_y1"];
72-
						_veh setVectorUp (surfaceNormal (position _veh));
72+
_x1 = _zpos select 0;
73-
						_veh allowDamage _damage;
73+
_y1 = _zpos select 1;
74-
						_xcountx = _xcountx + 100;
74+
75-
					} else {
75+
private ["_x2","_y2"];
76-
						deletevehicle _veh;
76+
_x2 = _position select 0;
77-
						_isFlat = [];
77+
_y2 = _position select 1;
78-
					};
78+
79-
				} else {
79+
private ["_dx","_dy"];
80-
					if ( _onroad == 0) then  
80+
_dx = _x2 - _x1;
81-
					{
81+
_dy = _y2 - _y1;
82-
						if ( cn && tn && mn) then
82+
83-
						{
83+
private ["_zx","_zy"];
84-
							_poss = _isFlat;
84+
_zx = _zsize select 0;
85-
							_poss set [2, 0];
85+
_zy = _zsize select 1;
86-
							_veh setPos _poss;		
86+
87-
							_veh setVectorUp (surfaceNormal (position _veh));
87+
switch (_zShape) do {
88-
							_veh allowDamage _damage;
88+
	case "ellipse" : {
89-
							_xcountx = _xcountx + 100;
89+
		((_dx^2)/(_zx^2) + (_dy^2)/(_zy^2)) < 1
90-
						} else {
90+
	};
91-
							deletevehicle _veh;
91+
	case "rectangle" : {
92-
							_isFlat = [];
92+
		(abs _dx < _zx) and (abs _dy < _zy)
93-
						};
93+
	};
94-
					} else {
94+
};