Ожидание / Условие

И так, нам надо создать условие, при выполнении которого что-то будет происходить.
И да, те же самые триггеры для этого неплохо подходят. В большинстве случаев, но, не во всех.

Какие бывают нужны варианты:

  1. Игрок приблизился к объекту / координате. (Можно триггером)
  2. Игрок уничтожил цель / объект, или же объект был удалён (как бы собран, как тут). (Можно триггером)
  3. Юнитов меньше чем число X. (Устанешь делать триггерами)
  4. Выполнен ряд условий для срабатывания кода дальше. (Слишком много мороки с триггерами)

А мы будем это делать с помощью кода.

Существуют такие варианты как:

  • waitUntill
  • if / else

waitUntill


В случае с waitUntill мы ожидаем выполнения условия, которое задано в скобках после этой команды.
Например, мы можем установить условие, которое будет ожидать пока все юниты в группе _bravo будут уничтожены.

0 spawn {
// Создаём группу в переменной, для её отслеживания.
_bravo = p1, p2, p3, p4;
// Ждём условие
    waitUntil {
// Пауза 1 секунда. Оптимизация
        sleep 1;
// Сверяем если живые перечисленные в _bravo юниты все убиты - то
        [_bravo] findIf {alive _x} == -1
    };
// Проверочная команда. В связке с remoteExec для выдачи хинта на клиенте, а не только на сервере.
    ["всё, пи**ец.."] remoteExec ["hint"];
};

ВАЖНО!

Если вы поставите команду waitUntill просто по ходу вашего кода — то тогда, ничего после этой строчки не будет исполняться, пока условие(я) прописанное в нём не будет выполнено.
А если поставить внутри 0 spawn {};

 

Команда waitUntil не будет останавливать код в файле после неё, а будет работать параллельно с остальным.

Остановит только ход кода внутри своего блока 0 spawn {};

, пока заданное ей условие не будет удовлетворено.


Кроме того, можно считать сколько кого осталось. Например:

waitUntil {uiSleep 0.5; ({_x distance [4599.06,17172.6,0] < 20 and side _x isEqualTo east} count allUnits isEqualTo 0)};

В данном случае: условие ожидает что на дистанции менее 20 метров, от указанной координаты и это бойцы фракции EAST остаток равен нулю — то оно выполнено.

Можно так же изменить по разному, на варианты => или <= или ещё как.
Список разных вариантов операторов можно посмотреть тут https://community.bistudio.com/wiki/Operators#Comparison_Operators


if / else


Тут всё немного по-другому, но поинтереснее.

Если в случае с waitUntill мы ожидаем чего-то определённого, из категории «Вкл / Выкл» , то здесь мы можем ожидать разные результаты.

И самое главное, что мы можем ставить это ожидание в цикл (о циклах мы поговорим в другой статье)!

Для начала, пример с ожиданием в цикле, когда сверка идёт по двум условиям:

  1. Имя игрока в списке.
  2. Игрок ближе (можно дальше) чем 5 метров от точки координат.
0 spawn { 
for "_i" from 0 to 1 step 0 do { 
_name = name player; 
_name_list = ["первое имя", "второе имя"];  // Список имён
//Проверка, есть ли имя объекта в списке и дистанция его по отношению к указанной координате меньше 5 метров (радиус) или нет - если да - то код идёт дальше
if ((_name in _name_list) && ((player distance [3949.07,3552.22,0]) < 5)) then {titleText ["ПОКИНЬТЕ ЗОНУ", "BLACK FADED",3]; // Затемнение
sleep 2; // Пауза между чёрным экраном и обычной картинкой
titleText ["", "BLACK IN",3];}; // Просветление
uiSleep 3; // Пауза между запуском кода выше
}; 
};

При этом заметим, что тут нет команды else, так как она нам тут не нужна.

А вот если нам нужны варианты (в данном случае Да / Нет ), то можно писать так:

if (a < b) then {
    hint "B is greater than A";
} else {
    hint "A is greater than B";
};

Пример с: https://community.bistudio.com/wiki/else

Но можно так же ожидать разные варианты.
То есть, вариантов If может быть много, если нужно.

if (a) then {
    if (b) then {
        if (c) then {
            //делайте что-нибудь
         };
    };
};

Пример взят с: arma3.ru|Уроки по скриптописанию.

И в данном случае, мы можем проверять пошагово. Например:

  • Заложников не меньше чем X.
  • Вертолёт жив.
  • Ещё какое-то условие.

 

Описание команд на wiki от разработчика:
https://community.bistudio.com/wiki/if

https://community.bistudio.com/wiki/else

Надеюсь ничего не забыл, и не напутал. Если я где-то ошибся — напишите об этом мне в в нашем Discord.

Если же что-то непонятно, то можно спросить / уточнить в нашем Discord канале