//Patrol script by Lost 05.07.2007, ver 1.1 //Юнит патруля
_men = _this select 0;
//Лист врагов
_list_enemy = _this select 1;
//Сохраняем позицию патруля перед скриптом
_posOld = getpos (leader _men);
//Определяем группу и блокируем их вейпойнты, если есть
_grp = group _men;
_grp lockWP true;
/*Каким то неведомым образом, массив переданный через thisList, через N-ный промежуток времени, просто исчезает (полтергейст :-D), тогда записываем обнаруженные юниты в другой массив и работаем с ним, теперь массив "не исчезнет"*/
_save_list_enemy = [];
_save_list_enemy = _save_list_enemy + _list_enemy;
//Таймаут
_movedelay=20;
_t=time - _movedelay;
//Приоритетная цель
_c=0;
//Нужно для подсчёта
_count = count _save_list_enemy;
_n = _count - 1;
try {
waituntil {
//Если лидера убили, то назначаем нового лидера
_leader = leader _grp;
//Выбираем приоритетную цель
_target = (_save_list_enemy select _c);
//Проверяем к какому классу относится цель, если техника, то включается обработка оружия
if(!(_target isKindOf "Man" || _target isKindOf "Car")) then {
//Массив оружия;
_array_weap = [];
//Массив магазинов;
_array_mag = [];
//Массив юнитов
_array_unit = [];
//Массив группы
_array_grp = [];
//Вносим в массив всех юнитов группы
for [{_i = 0}, {_i < count units _grp}, {_i = _i + 1}] do {
_array_grp = _array_grp + [units _grp select _i]
};
for [{_u = 0}, {_u < count _array_grp}, {_u = _u + 1}] do {
_unit = _array_grp select _u;
//Цикл на проверку всего оружия игрока
for [{_i = 0}, {_i < (count weapons _unit)}, {_i = _i + 1}] do {
_weapon = (weapons _unit select _i);
//Ищем ракетное оружие, и вносим в массив
if(getText (configFile >> "CfgWeapons">>_weapon>>"recoil") == "launcherBase") then {
_array_weap = _array_weap + [_weapon];
_array_unit = _array_unit + [_unit]
};
};
//Наше искомое оружие
_weapon = (_array_weap select 0);
_magazines = getArray (configFile >> "CfgWeapons">>_weapon>>"magazines");
_array_mag = _array_mag + _magazines;
for [{_i = 0}, {_i <= (count _magazines) - 1}, {_i = _i + 1}] do {
if(!((magazines _unit) find (_magazines select _i) > -1)) then {
_array_mag = _array_mag - [_magazines select _i];
_array_unit = _array_unit - [_unit];
};
};
};
//Проверка на кол-во юнитов с ракетным оружием и с магазинами к нему
if(count _array_unit == 0) then {throw "tar_vehicle"};
};
//Если патруль потерял извиду врага, выход
if((_leader knowsAbout _target) <= 0.15 || _leader distance _target > (500 + ceil(random 250))) then {throw "ushel"};
//Собсно само преследование
if({alive _x} count _save_list_enemy > 0 && time-_t >= _movedelay) then {
{_x doMove position _target} forEach units _leader;
{_x getSpeed "FAST"} forEach units _leader;
_t=time
};
//Если патруль убил врага, выход
if({alive _x} count _save_list_enemy == 0) then {throw "killed"};
//Скрипт прервётся, если кол-во живых юнитов группы патруля равно 0
{alive _x} count units _grp == 0
};
throw "exit"
}
catch {
switch (_exception) do {
case "ushel" : {
{_x doFollow _leader} forEach units _leader - [_leader];
{_x getSpeed "AUTO"} forEach units _leader;
_grp lockWP false
};
case "killed" : {
{_x doFollow _leader} forEach units _leader - [_leader];
{_x getSpeed "AUTO"} forEach units _leader;
_grp lockWP false
};
case "tar_vehicle" : {
{_x doFollow _leader} forEach units _leader - [_leader];
{_x getSpeed "AUTO"} forEach units _leader;
_grp lockWP false
};
case "exit" : {}
};
};