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

private [
			"_target","_basePos","_random","_entry","_group","_unit","_waitTime","_artiAmmo",
			"_t","_r","_p","_a","_d","_b","_m","_ma","_mb","_mc","_l","_na","_n","_np","_oldTime",
			"_color","_conditions","_ca","_artiUnit","_mark","_artiArray","_count","_run","_aid",
			"_val1","_val2","_val3","_val4","_val7","_val8","_val5","_val6","_Apara","_aMC","_val9","_sc",
			"_c","_s","_z","_repeat","_hold","_fs","_side","_articolor","_cv","_cw","_h","_nextPos","_tempA"
		];
		
_unit = _this select 0;_target = _this select 1;_group = group _unit;_basePos = position DAC_StartDummy;_random = random 100;_n = 0;
_b = 0;_waitTime = 0;_r = 0;_t = 0.1;_d = 0;_a = "";_h = "";_oldTime = 0;_conditions = [];_aid = _this select 2;_sc = 0;_color = "";
_ca = 0;_run = true;_mark = "logic" createvehiclelocal [0,0,0];_artiAmmo = "";_c = 0;_mc = "";_val9 = 0;_tempA = [];
_s = 0;_u = 0;_val1 = 0;_val2 = 0;_val3 = 0;_val4 = 0;_val7 = 0;_val8 = 0;_val5 = 0;_val6 = 0;_Apara = [4,5,7];_artiArray = [];
if(DAC_Marker > 0) then {_articolor = DAC_Marker_Val select 14} else {_articolor = []};_side = ["EAST","WEST","GUER","CIV"];_cv = 0;_cw = 1;_z = 0;_aMC = [];_fs = "";_count = 0;

_mark setpos position DAC_StartDummy;_p = position _mark;_artiUnit = objNull;


if(!(isServer)) then
{
	if(format["%1",DAC_Support_Logic] == scalar) then
	{
		player sidechat "DAC_Support_Logic not found. Support for Players not available.";
	}
	else
	{
		if((DAC_Support_Logic getVariable "arti_count") >= (DAC_Player_Support select 0)) then
		{
			player sidechat "Call arti support aborted - Max count arti support reached";
		}
		else
		{
			_val1 = _this select 0;_val2 = _this select 1;_val3 = _this select 2;_val4 = _this select 3;
			DAC_Player_Arti = str([_val1,_val2,_val3,_val4,player]);publicvariable "DAC_Player_Arti";
			_m  = format["_awp%1%2",_group,time];_ma = createmarkerlocal [_m, _val2];_ma setMarkerShapelocal "ELLIPSE";
			_ma setMarkerSizelocal [(_val4 / 2),(_val4 / 2)];_ma setMarkerColorlocal "ColorBlack";_ma setMarkerBrushlocal "DiagGrid";
			sleep 5;
			deletemarkerlocal _ma;
		};
	};
}
else
{
	_fs = _side find format["%1",side (leader _group)];
	_artiArray = [_aid] call DAC_fConfigArti;
	sleep 0.1;
	if(count _artiArray > 0) then
	{			
		{if(alive _x) then {_c = _c + 1;_s = _s + (skill _x)}} foreach (units _group);
		if(_c > 0) then
		{
			_s = (_s / _c);
			while {_cv < count _Apara} do
			{
				if(((_artiArray select (_Apara select _cv)) select 2) == 0) then {_z = 1} else {_z = _s};;
				call compile format["_val%1 = (((_artiArray select (_Apara select _cv)) select 0) / _z)",_cw];
				call compile format["_val%1 = (((_artiArray select (_Apara select _cv)) select 1) / _z)",(_cw + 1)];
				_cv = _cv + 1;_cw = _cw + 2;
			};
			_count  = ((_artiArray select 1) select 4);
			_rtime  = ((_artiArray select 1) select 5);
			_repeat = ((_artiArray select 2) select 5);
			_hold   = ((_artiArray select 0) select 3);
			_condi	= (_artiArray select 9);
			_val9 = ((_artiArray select 6) select 1);
			if(DAC_Marker > 0) then {if(_fs == -1) then {_color = (_articolor select 4)} else {_color = (_articolor select _fs)}} else {_color = ""};
			if((typeName _target) == "ARRAY") then
			{
				if(format["%1",DAC_Support_Logic] == scalar) then
				{
					player sidechat "DAC_Support_Logic not found. Support for Players not available.";_count = -1;_condi = [];
				}
				else
				{
					DAC_Support_Logic setpos _target;_d = _this select 3;
					_target = DAC_Support_Logic;_entry = (group _target);
					[7,player] spawn DAC_fAIRadio;
				};
			}
			else
			{
				_entry = (group _target);_d = _val3 + random (_val4 - _val3);
			};
			
			if(count _condi > 0) then
			{
				if(call compile (_condi select 0)) then
				{
					if(count _condi > 1) then
					{
						if((DAC_Com_Values select 0) > 0) then {DAC_StartDummy globalchat (_condi select 1)};
						if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", (_condi select 1), true]};
						sleep 1;
						if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", -1, true]};
					};
				}
				else
				{
					if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", 11, true]};
					if((DAC_Com_Values select 0) > 0) then {if((side _unit) != "CIV") then {DAC_StartDummy globalchat format["Call arti support [%2] aborted - reason %1",11,side _unit]}};_count = 0;
					sleep 1;
					if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", -1, true]};
				};
			};
			while {_count > 0} do
			{
				_conditions = [_group,_entry,_artiArray,_color,_target,_d] call DAC_fArtiConditions;
				sleep 0.1;
				if(count _conditions == 0) then
				{
					if(count _this < 5) then
					{
						_count = 0;
						if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", 14, true]};
						sleep 1;
						if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", -1, true]};
					}
					else
					{
						_count = _count - 1;_run = true;
						_oldTime = time + _rtime;
						while {_run} do
						{
							sleep 1;
							if((({alive _x} count units _entry) == 0)
							|| (({alive _x} count units _group) == 0)
							|| (!(_group in DAC_Fire_Groups))) then {_run = false;_count = 0};
							if(time > _oldTime) then {_run = false};
						};
					};
				}
				else
				{
					[_entry,_hold] spawn DAC_fHoldArtiGroup;
					_basePos = (_conditions select 0);
					_mark setpos _basePos;
					if(DAC_Marker > 0) then
					{
						if((DAC_Marker_Val select 12) > 0) then
						{
							_n = ((_artiArray select 5) select 1);
							_m  = format["_bwp%1%2",_group,time];_mb = createmarkerlocal [_m, [0,0]];_mb setMarkerShapelocal "RECTANGLE";
							_mb setMarkerSizelocal [0,0];_mb setMarkerColorlocal _color;
							_m  = format["_awp%1%2",_group,time];_ma = createmarkerlocal [_m, _basePos];_ma setMarkerShapelocal "ELLIPSE";
							_ma setMarkerSizelocal [0,0];_ma setMarkerColorlocal "ColorBlack";_ma setMarkerBrushlocal "DiagGrid";
							if(count _this < 5) then
							{
								_ma setMarkerSizelocal [_d,_d];_r = random 360;
								_p = [(_basePos Select 0) + (Sin (_r) * _d),(_basePos Select 1) + (Cos (_r) * _d),0];
								_mb setMarkerSizelocal [(_d / 3),(_d / 8)];
							}
							else
							{
								_d = _val9;
								_ma setMarkerSizelocal [_d,_d];_r = random 360;_l = random _d;
								_p = [(_basePos Select 0) + (Sin (_r) * _l),(_basePos Select 1) + (Cos (_r) * _l),0];
								_mb setMarkerSizelocal [(_d / 3),(_d / 8)];
							};
							[[_mb,_ma,_artiArray,_mark,_n],7,_basePos,_d] spawn DAC_fFlashMarker;
						};
					};
					_waitTime = time + (_val1 + random (_val2 - _val1));
					sleep 1;
					if(!(isNil "DAC_Support_Logic")) then {DAC_Support_Logic setVariable ["arti_error", -1, true]};
					while{time < _waitTime} do
					{
						sleep 0.1;
					};
					while{_ca < count (_conditions select 1)} do
					{
						_artiUnit = (((_conditions select 1) select _ca) select 0);
						_artiAmmo = (((_conditions select 1) select _ca) select 1);
						if(((_artiArray select 6) select 2) == 0) then
						{
							_val7 = ((_artiArray select 6) select 0);
							_val8 = ((_artiArray select 6) select 1);
						}
						else
						{
							if((skill (gunner _artiUnit)) < 0.1) then {_s = 0.1} else {_s = (skill (gunner _artiUnit))};
							_val7 = (((_artiArray select 6) select 0) / _s);
							_val8 = (((_artiArray select 6) select 1) / _s);
						};
						_r = random 360;_l = random _d;_p = [(_basePos Select 0) + (Sin (_r) * _l),(_basePos Select 1) + (Cos (_r) * _l),0];
						_t = _val5 + random (_val6 - _val5);_b = _val7 + random (_val8 - _val7);_r = random 360;
						_nextPos = [(_p Select 0) + (Sin (_r) * _b),(_p Select 1) + (Cos (_r) * _b),0];_u = ((_artiArray select 6) select 2);
						if(DAC_Marker > 0) then
						{
							if((DAC_Marker_Val select 12) > 0) then
							{
								_m = format["_h%1%2",_artiUnit,time];_mc = createmarkerlocal [_m, [0,0]];_mc setMarkerTypelocal "mil_destroy";
								_mc setMarkerSizelocal [0,0];_mc setMarkerColorlocal "ColorBlack";_aMC set [count _aMC,_mc];
							};
						};
						[_artiUnit,_nextPos,_mark,_repeat,_artiAmmo,_b,_u,_mc] spawn DAC_fArtiFire;
						_ca = _ca + 1;_tempA set [count _tempA,_artiUnit];
						if(count _tempA == 1) then
						{
							if(!(isNil "DAC_Support_Logic")) then
							{
								_sc = ((DAC_Support_Logic getVariable "arti_count") + 1);
								DAC_Support_Logic setVariable ["arti_count", _sc, true];
							};
						};
						sleep _t;
					};
					_count = -1;
				};
			};
		};
		if(count _aMC > 0) then
		{
			sleep 1;
			_waitTime = time + 30;
			waituntil {(({(getMarkerType _x) != ""} count _aMC) == 0) || (time > _waittime)};
		};
		if(_count == 0) then
		{
			if(DAC_Marker > 0) then
			{
				if((DAC_Marker_Val select 12) > 0) then
				{
					_m  = format["_awp%1%2",_group,time];_ma = createmarkerlocal [_m, position _target];_ma setMarkerShapelocal "ELLIPSE";
					_ma setMarkerSizelocal [_d,_d];_ma setMarkerColorlocal "ColorRed";_ma setMarkerBrushlocal "DiagGrid";
					_t = ((getMarkerSize _ma) select 0);
					while{_t > 0} do
					{
						_t = _t - 2;
						_ma setMarkerSizelocal [_t,_t];
						sleep 0.03;
					};
					deletemarkerlocal _ma;
				};
			};
		};
	}
	else
	{
		DAC_StartDummy globalchat "ERROR: arti config not found.";
	};
};
if(count _tempA > 0) then
{
	waituntil{(({_x in DAC_Arti_Veh} count _tempA) == 0)};
	deletevehicle _mark;
}
else
{
	deletevehicle _mark;
};