Создать задание с одной целью через скрипт

Рассмотрим вариант создания задания с простой целью — войти в область чётко обозначенную границами триггера (конечно же можно и по другому).

Пример 1:

Сначала создаём триггер, который будет контролировать состояние задания. Разумеется предварительно поставив юнитов.
Код в чистом виде:

trg = createTrigger ["EmptyDetector", [26309.9,22023.1,0]];
trg setTriggerArea [5, 5, 0, true, 15];
trg setTriggerActivation ["GUER", "PRESENT", true];
trg setTriggerStatements ["this", " ['BET_recon', 'SUCCEEDED',true] spawn BIS_fnc_taskSetState; execVM 'tasks\BET_clear_road.sqf'", "deleteVehicle trg"];

Код с расшифровкой по основным моментам:

// Создаём триггер, задаём ему тип и позицию. https://community.bistudio.com/wiki/createTrigger
trg = createTrigger ["EmptyDetector", [26309.9,22023.1,0]];
// Задаём зону триггера и его форму (true = прямоугольный, false = эллиптический). https://community.bistudio.com/wiki/setTriggerArea
trg setTriggerArea [5, 5, 0, true, 15];
// Задаём тип активации триггера. https://community.bistudio.com/wiki/setTriggerActivation
trg setTriggerActivation ["GUER", "PRESENT", true];
// Задаём что будет происходить при активации и деактивации триггера https://community.bistudio.com/wiki/setTriggerStatements
trg setTriggerStatements ["this", " ['BET_recon', 'SUCCEEDED',true] spawn BIS_fnc_taskSetState; execVM 'tasks\BET_clear_road.sqf'", "deleteVehicle trg"];
// У меня он при активации переводит статус задания 'BET_recon' в "ВЫПОЛНЕНО", при этом запускает файл "BET_clear_road", а при деактивации удаляет сам себя.

Создаём само задание. Называется оно «Разведка» (BET_recon).

Код в чистом виде:

["BET_recon", true, ["Проследуйте на позицию для изучения обстановки. Пока о вас не знают.","Разведка",""],[26309.9,22023.1,0], "ASSIGNED", 1,true,true,"scout",false] call BIS_fnc_setTask;

Код с расшифровкой по основным моментам:

// Переменная задания, кому назначено, описание, название, координаты, статус, оповещение, кому видно (true = всем), тип (описаны основные моменты)
["BET_recon", true, ["Проследуйте на позицию для изучения обстановки. Пока о вас не знают.","Разведка",""],[26309.9,22023.1,0], "ASSIGNED", 1,true,true,"scout",false] call BIS_fnc_setTask;

Когда оно выполняется — создаётся следующее задание «Зачистить дорогу» (BET_clear_road).

Конечно же можно сделать примерно как во втором примере что чуть ниже, само себе задание, само себе триггер. И поставить условие на обсчёт игроков в этой зоне. Это полезно если вам нужно что бы обязательно 2 или более игроков пришло туда. Например «Собраться в указанной точке».
Но в данном случае, напишем пример, в котором будет три точки, на которых не должно остаться ни одного представителя стороны east.
Ну а сбор на указанной точке можно сделать обратным путём от этого примера.

Например такой код (обсчитывается три разных позиции):
Код в чистом виде:

waitUntil {uiSleep 0.5; ({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0) and ({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0) and ({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0)};
[{hint "Всё чисто";},"BIS_fnc_spawn"] call BIS_fnc_MP;

Код с расшифровкой по основным моментам:

// ждёт пока не выполнится условие, что от указанных координат (можно marker pos) в радиусе 100 метров не окажется ни одного представителя стороны EAST
waitUntil {uiSleep 0.5;
// Первая позиция
({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0)
// Вторая позиция
and ({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0)
// Тертья позиция
and ({_x distance [21646.4,21423.2,0] < 100 and side _x isEqualTo east} count allUnits isEqualTo 0)};
// Если условие выполнено - выдаётся хинт. Ну, или напишите то что надо вам.
[{hint "Всё чисто";},"BIS_fnc_spawn"] call BIS_fnc_MP;

Правда если вам нужен непосредственно контроль здания строго по стенам, или ещё чего то чётко по его размерам — то проще это делать триггером или командой inArea (на мой взгляд).

Пример 2:

Самое себе задание, само себе триггер!
Код в чистом виде:

["BET_destroy_car", true, ["Вам надо уничтожить броневик",
"Уничтожить броневик"," "],[26312.3,22106.8,0], "ASSIGNED", 5,true,true,"Destroy",false] call BIS_fnc_setTask;
car_targ addMPEventHandler ["MPKilled", {
hint "Броневик уничтожен";
(_this select 0) removeMPEventHandler ["MPKilled", 0];
}];
waitUntil {uiSleep 0.5; (!alive car_targ)};
["BET_destroy_car", "SUCCEEDED",true] spawn BIS_fnc_taskSetState;
execVM 'tasks\BET_destroy_towers.sqf';

Код с расшифровкой по основным моментам:

// Переменная задания, кому назначено, описание, название, координаты, статус, оповещение, кому видно (true = всем), тип (описаны основные моменты)
["BET_destroy_car", true, ["Вам надо уничтожить броневик",
"Уничтожить броневик"," "],[26312.3,22106.8,0], "ASSIGNED", 5,true,true,"Destroy",false] call BIS_fnc_setTask;
// Ожидает уничтожения цели, в данном случае броневика. После чего выдаёт хинт.
car_targ addMPEventHandler ["MPKilled", {
hint "Броневик уничтожен";
(_this select 0) removeMPEventHandler ["MPKilled", 0];
}];
waitUntil {uiSleep 0.5; (!alive car_targ)};
// После того как условие было выполнено, переводит статус задания в "ВЫПОЛНЕНО", а после этого запускает следующее задание.
["BET_destroy_car", "SUCCEEDED",true] spawn BIS_fnc_taskSetState;
execVM 'tasks\BET_destroy_towers.sqf';

Обсудить этот метод можно в нашем Discord канале