A3-Conquest.Altis / DAC / Scripts / DAC_Find_Pos.sqf
DAC_Find_Pos.sqf
Raw
//////////////////////////////
//    Dynamic-AI-Creator    //
//    Version 3.1b - 2014   //
//--------------------------//
//    DAC_Find_Pos          //
//--------------------------//
//    Script by Silola      //
//    silola@freenet.de     //
//////////////////////////////

private [
			"_DAC_WP_Typ","_CheckRadius1","_CheckRadius2","_checkObjH1","_checkObjH2","_checkCount","_DAC_Zone",
			"_XValue","_XValue","_DAC_RadX","_DAC_RadY","_chnr","_relObjects","_allObjects","_Dummy","_wpCNr",
			"_RandomX","_RandomY","_pos","_checkMaxH","_checkMinH","_Null","_wpConfig","_check"
		];
		
			_DAC_WP_Typ = _this select 0;_DAC_Zone = _this select 1;_DAC_RadX = ((_this select 2) select 0);
			_DAC_RadY = ((_this select 2) select 1);_wpCNr = _this select 3;_wpConfig = [_DAC_WP_Typ,_wpCNr] call DAC_fConfigWP;
			_CheckRadius1 = ((_wpConfig select 0) select 0);_CheckRadius2 = ((_wpConfig select 0) select 1);
			_checkObjH1 = ((_wpConfig select 3) select 0);_checkObjH2 = ((_wpConfig select 3) select 1);
			_checkMaxH = _wpConfig select 4;_checkMinH = _wpConfig select 5;_check = 0;_checkCount = _wpConfig select 6;
			_chnr = 0;_relObjects = [];_allObjects = [];_XValue = ((_DAC_Zone select 0) - _DAC_RadX);
			_YValue = ((_DAC_Zone select 1) - _DAC_RadY);_pos = [];
			_Null = "EmptyDetector" createvehiclelocal [0,0,0];
			_Dummy = "logic" createvehiclelocal [0,0,0];

while {_chnr < _checkCount} do
{
	_RandomX = _XValue + random (_DAC_RadX * 2);
	_RandomY = _YValue + random (_DAC_RadY * 2);
	if(surfaceIsWater [_RandomX, _RandomY]) then
	{
		_chnr = _chnr + 1;
	}
	else
	{
		_Dummy setpos [_RandomX,_RandomY,0];_Null setpos [_RandomX,_RandomY,0];
		if((getPosASL _Null select 2 < _checkminh) || (getPosASL _Null select 2 > _checkmaxh)) then
		{
			_chnr = _chnr + 1;
		}
		else
		{
			_allObjects = nearestObjects [[_RandomX,_RandomY], [], _CheckRadius2];_relObjects = [];_check = 0;
			{
				if(((format["%1",typeOf _x]) != "LOGIC")
				&& ((format["%1",typeOf _x]) != "EmptyDetector")
				&& (speed _x == 0)) then
				{
					if(canmove _x) then
					{
						if(((boundingBox _x select 1) select 2) > _checkObjH1) then
						{
							_relObjects set [count _relObjects,_x];
						};
					}
					else
					{
						if(((position _x) select 2) > _checkObjH1) then
						{
							_relObjects set [count _relObjects,_x];
						};
					};
				};
			} 	foreach _allObjects;
			if(count _relObjects > 0) then
			{
				if(({((([_RandomX,_RandomY] distance _x) - ((((boundingBox _x select 1) select 0) + ((boundingBox _x select 1) select 1)) / 4)) < _CheckRadius1)} count _relObjects) > 0) then
				{
					_check = 0;
				}
				else
				{
					_check = 1;
				};
			}
			else
			{
				_check = 1;
			};
			if(_check == 0) then
			{
				_chnr = _chnr + 1;
			}
			else
			{
				_allObjects = nearestObjects [[_RandomX,_RandomY], [], _CheckRadius2];_relObjects = [];
				if(count _allObjects > 0) then
				{
					{
						if(((format["%1",typeOf _x]) != "LOGIC")
						&& ((format["%1",typeOf _x]) != "EmptyDetector")
						&& (speed _x == 0)) then
						{
							if(canmove _x) then
							{
								if((((position _x) select 2) > _checkObjH2) && ((_x distance _Dummy) < _CheckRadius2)) then
								{
									_relObjects set [count _relObjects,_x];
								};
							}
							else
							{
								if((((boundingBox _x select 1) select 2) > _checkObjH2) && ((_x distance _Dummy) < _CheckRadius2)) then
								{
									_relObjects set [count _relObjects,_x];
								};
							};
						};
					}	foreach _allObjects;
					if(count _relObjects > 0) then
					{
						_chnr = _chnr + 1;
					}
					else
					{
						_pos = [_RandomX,_RandomY];_chnr = _checkCount;
					};
				}
				else
				{
					_pos = [_RandomX,_RandomY];_chnr = _checkCount;
				};
			};
		};
	};
};
deletevehicle _Dummy;deletevehicle _Null;
if(count _pos == 0) then
{
	_pos = _DAC_Zone;
};
_pos