Рабочий «анализатор спектра» для миссий Combat Patrol

Друзья, представляю вашему вниманию рабочее решение для «самодельных» мультиплеерных миссий «Combat Patrol», позволяющее отслеживать некоторые виды целей (в зависимости от «рандомной» генерации задания в CombatPatrol) с помощью «анализатора спектра» из DLC «Contact».


За основу взят скрипт отсюда:


Автор исходного скрипта — DayZ Medic, в описании к видео вы найдёте исходный код (не забудьте поправить в нём знаки «>» и «<» с помощью любого текстового редактора, если решите копировать его оттуда, см. «NOTE»  от автора видео), моя же «заслуга» не велика:
изучив оригинальные файлы CombatPatrol, распакованные из .pbo по пути

..\Arma 3\Argo\Addons\functions_f_patrol.pbo

, я обнаружил в скриптах «..\CombatPatrol\Objectives\fn_CPObj1Setup.sqf», «..\CombatPatrol\Objectives\fn_CPObj2Setup.sqf» и «..\CombatPatrol\Objectives\fn_CPObj3Setup.sqf» переменные «BIS_comms» (передатчик «узла связи»), «BIS_CP_objective_vehicle1» и «BIS_CP_objective_vehicle2» (топливозаправщик и грузовик с боеприпасами),  «BIS_HVT» (вражеский офицер) и «BIS_HVTVehicle» (MRAP, на котором офицер поспешно «сматывается», если его преждевременно «спугнуть»), а затем просто указал их в качестве целей, получилось вот что:

/*
  скрипт "Spectrum Device Tracking", модифицированный для Combat Patrol,  автор оригинального скрипта: DayZ Medic, https://www.youtube.com/watch?v=yV0bOgaP5b4 , адаптировал для Combat Patrol: bmv87.brest 
*/
 
missionNamespace setVariable ["#EM_FMin", 140];
missionNamespace setVariable ["#EM_FMax", 143];
missionNamespace setVariable ["#EM_SMin", -60];
missionNamespace setVariable ["#EM_SMax", -10];
missionNamespace setVariable ["#EM_SelMin", 141.6];
missionNamespace setVariable ["#EM_SelMax", 141.9];
 _TargetSigs = [["BIS_comms", 141.8], ["BIS_CP_objective_vehicle1", 141.8], ["BIS_CP_objective_vehicle2", 140.85], ["BIS_HVT", 141.8], ["BIS_HVTVehicle", 140.85]];
 _ScannerRange = 900;
 _DirDifrence = 0;
 _TargetSigsArray = [];
 _Tracker = objNull;
 while{true}do{ 
  {
   if ("hgun_esd_" in handgunWeapon _x) then 
   {
    _Tracker = _x;
   };
  } forEach allPlayers;
  if (isNull _Tracker) then {_dummy = true;}
  else {
   for "_i" from 0 to (count _TargetSigs) -1 do {
    _Target = _TargetSigs select _i;
    _TargetName = _Target select 0;
    _TargetFrq = _Target select 1;
    _TargetObj = missionNamespace getVariable [_TargetName , objNull];
    _DirTgtfromTracker =  _Tracker getDir _TargetObj;
    _TrackerFacingDir = direction  _Tracker;
    if (_TrackerFacingDir < _DirTgtfromTracker) then {
     _DirDifrence = (_DirTgtfromTracker - _TrackerFacingDir);
    } else {
     if (_TrackerFacingDir > _DirTgtfromTracker) then {
      _DirDifrence = (_TrackerFacingDir - _DirTgtfromTracker);
     } else {
      _DirDifrence = 0;
     };   
    };
    if (_DirDifrence < 0) then { _DirDifrence = _DirDifrence*(-1) };
    _Distance =  _Tracker distance _TargetObj;
    _DistanceStrength = round((100 / _ScannerRange) * (_ScannerRange-_Distance));
    _DirectionStrength = round((100 / 180) * (180-_DirDifrence));
    if (_DirectionStrength < 0) then {_DirectionStrength = _DirectionStrength*(-1) };
    _SigStrength = (100-((_DistanceStrength+_DirectionStrength)/2))*(-1);
    _TargetSigsArray append [_TargetFrq, _SigStrength];
   };
  };
  missionNamespace setVariable ["#EM_Values", _TargetSigsArray];
  _TargetSigsArray = [];
  sleep 0.5;
 };

Всё работает в мультиплеере, можно производить триангуляцию, проводя на карте линии при зажатых Ctrl+Shift и определяя местонахождения объектов с довольно высокой точностью, рабочий пример — здесь:

, если желаете опробовать в деле — вот готовая миссия (не забудьте распаковать из zip-архива любым архиватором):

CP_Livonija_MP_RFanalyzer.Enoch.pbo

(анализатор спектра по умолчанию отсутствует в инвентаре, зато есть доступ к «Арсеналу», просто откройте карту и найдите соответствующий пункт «Дневника«, выберите «анализатор спектра» в «пистолетном» разделе и выйдите через «Закрыть«)

Инструкция по подключению к своей миссии для начинающих:

1. Закидываете файл «tracker.sqf» в папку со своей миссией (находится где-нибудь по пути C:\Users\User\Documents\Arma 3 — Other Profiles\<имя Вашего профиля>\mpmissions) (также запакован в zip-архив, сначала распакуйте):

tracker

2. Экипируете любого персонажа миссии «анализатором спектра»

3. Прописываете в «Инициализацию» миссии код запуска скрипта (например, в Редакторе это можно сделать через «Атрибуты» — «Общие» — «Инициализация»):

_starter = execVM "tracker.sqf" ;

4. Всё сохраняете, запускаете в мультиплеере, радуетесь 😉

К вопросу о «реалистичности» работы анализатора спектра: многие могут небезосновательно возразить, что единственной логично обоснованной целью для него является «узел связи», ибо там есть «передатчик, излучающий радиоволны», а что же касается прочих объектов (особенно вражеского офицера), то можно, конечно, вообразить  «радиомаячок, подброшенный дружественными партизанами» / «перехваченный сигнал GPS-трекера на грузовиках» / «частоту рации VIP-цели», но всё равно — правдоподобность этого, мягко говоря, низкая. В таком случае, достаточно лишь отредактировать  строку с перечислением целей и оставить лишь то, что нужно, например, так:

_TargetSigs = [["BIS_comms", 141.8]];

Но можно сделать по-другому, предоставив игроку выбор, что «отслеживать», а что — нет . Для этого просто создадим в папке с миссией  несколько копий нашего файла tracker.sqf, например, tracker1.sqf , tracker2.sqf  и т.д., редактируем их «по вкусу»,  а затем запустим нужный вариант скрипта «вручную», с помощью соответствующего пункта дневниковой записи в меню карты (в «инит» ничего прописывать не придётся). Вот как это делается:

1. Находим в Редакторе модуль «Создать дневниковую запись» в разделе «Шаблоны» (F5 — «Разведка» — «Создать дневниковую запись»):

 

2. Размещаем его на карте и редактируем указанным образом, где самое важное — код, запускающий соответствующий sqf-файл:

Собственно, сам код:

Отслеживание с помощью анализатора спектра грузовика с боеприпасами и топливозаправщика - <execute expression="[] execVM 'tracker4.sqf' ;" >Активировать</execute>

(Как видите, в данном примере будет запущен tracker4.sqf , в котором _TargetSigs = [ [«BIS_CP_objective_vehicle1», 141.8], [«BIS_CP_objective_vehicle2», 140.85] ]; )

3. Теперь подобным образом создаём такие же модули для всех ваших sqf-файлов, синхронизируем их со всеми боевыми единицами, которые, по сюжету вашей миссии могут пользоваться анализатором спектра, сохраняем изменения, запускаем миссию и проверяем работоспособность, заглянув в соответствующий раздел «Дневника» под названием «Анализатор спектра»:

Как видите, достаточно открыть во время игры карту, найти пункт «Анализатор спектра», а в нём — нужный вариант и нажать ссылку «Активировать» — сразу запустится скрипт, который заставит ваш «анализатор спектра» «отслеживать» именно те цели, которые вы считаете подходящими. Правда, не рекомендую нажимать несколько пунктов поочерёдно: показания «анализатора» будут «дёргаться»:

Также обратите внимание на то, что при редактировании «Дневниковой записи» пункт «Инструктаж» должен иметь одинаковое наименование для всех модулей, а вот «Название» — разное: таким образом мы получим в «Дневнике» отдельный раздел с пунктами, что весьма удобно в использовании.

Следует отметить, что Combat Patrol — не единственный случай, где можно использовать данный скрипт в мультиплеере: «обозвав» цель определённым образом и прописав «частоты», можно, например, организовать «отслеживание машины наркоторговцев с помощью подложенного радиомаячка с целью обнаружения их базы», «преследование автоугонщика», «поиск чёрного ящика разбитого самолёта» и т.д. — варианты применения ограничены только возможностью вашей фантазии.

Благодарю за внимание!