Друзья, представляю вашему вниманию рабочее решение для «самодельных» мультиплеерных миссий «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-архив, сначала распакуйте):
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 — не единственный случай, где можно использовать данный скрипт в мультиплеере: «обозвав» цель определённым образом и прописав «частоты», можно, например, организовать «отслеживание машины наркоторговцев с помощью подложенного радиомаячка с целью обнаружения их базы», «преследование автоугонщика», «поиск чёрного ящика разбитого самолёта» и т.д. — варианты применения ограничены только возможностью вашей фантазии.
Благодарю за внимание!