Полезная справка

Здесь собраны мелкие полезные справки по скриптам, на которых новички совершают ошибки все как один.
Не поленитесь ознакомится.

 

Если прописать код:
hint "ТЕКСТ";

То он отобразится только у сервера/хоста.
Если надо что бы он отображался у клиента (игрока), то вот так можно написать:

["всё, пи**ц.."] remoteExec ["hint"];

Где команда remoteExec и перекидывает выполнение команды hint на сторону клиента.


Если нужно отобразить hint на клиенте (игроке) с подсчётом некоторых параметров:
Пример:

format ["Уровень параметра Courage = %1", leader _group skillFinal "courage"] remoteExec ["hint"];

format в данном случае позволяет посчитать те самые параметры идущие после запятой.
А в %1 заносится результат полученный в коде после запятой.

В этом примере проверяется параметр Courage (смелость группы ботов).
Подробнее http://armasupp.ru/?p=264

Добавлю по remoteExec. Функция имеет дополнительный параметр. На примере хинта эта функция будет выглядеть так:

“Текст” remoteExec [“hint”,-2];

Цифра в конце определяет где будет выполняться функция.

0 — на сервере и клиенте 2 — только на сервере 3 и тд.

На конкретном клиенте, который имеет ID соответствующий этой цифре. Минусовое значение переворачивает значение. Например -2 — выполняется на каждом клиенте, но не на сервере. -3 и т.д. Выполняется на всех клиентах кроме того, который имеет ID 3


 

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

0 spawn {
КОД
};

Команда waitUntill останавливает выполнение кода стоящего после неё, пока не будет выполнено условие в ней написанное.

waitUntill
{
Условие
};

Если код в котором она идёт написать в

0 spawn
{
Код
};

То код после этого блока будет работать без остановки до выполнения условия. То есть параллельно с ним.


 

Переход с SQS на SQF. (или обратно)
Хотел бы рассмотреть пару особенностей перехода с языка sqs на sqf:

Комментарии:
sqs:
; this is my comment

sqf:
//this is my comment

/*
комментарий
второй комментарий
кусок кода выключенный этим символом для теста
Код
Код
конец кода
конец комментариев и куска выключенного кода
*/

Операция ожидания:
sqs:
@ CONDITION

sqf:
waitUntil {CONDITION} Ссылка на вики: https://community.bistudio.com/wiki/waitUntil

Условие выполнения
Синтаксис постановки условия и результата условия в sqs и sqf так же отличается.
Постановка условия в sqs осуществляется так:
? alive player: hint "Игрок жив"
; Условие сверху выполняется, если игрок жив. Результат: хинт с сообщением "Игрок жив"
?!(alive player): hint "Игрок мертв :c"
; Условие свержу выполняется, если игрок мертв. Результат: хинт с сообщением "Игрок мертв"

 

Пример на sqf:
if (alive player) then {hint "Игрок жив"} else {hint "Игрок мертв"}; //Код выполняет все те же действия, что и код на sqs, однако получился гораздо компактнее.
/***
alive возвращает логическое значение (0 или 1). При первой проверке мы указали условие равное условию: ((alive player) == 1).
else {} же означает все остальные варианты. А так как логическое значение равно либо 0, либо 1, то на else приходится условие: ((alive player) == 0) или же (!alive player).
***/

Ожидание в скриптах
Методы осуществления задержки при выполнении задачи в sqs и sqf так же различны.
В sqs используется команда ~, а в sqf: sleep (https://community.bistudio.com/wiki/sleep) или же uiSleep (https://community.bistudio.com/wiki/uiSleep).
Пример на sqs:

~ 10
; Задержка в 10 секунд
systemChat "Как поспал братишка?"
; Сообщение в чат

Пример на sqf:

sleep 10; //Ожидание 10 сек
systemChat "Как поспал братишка?"; //Сообщение в чат

Конструкция меток.
В языке sqs и sqf есть возможность создавать специальные метки в коде, к которым можно будет вернуться из любой его части при помощи goto/breakTo/breakOut. (Использование меток с goto — очень плохой тон в программировании. Зачастую, можно спокойно обойтись без них)
Коротко об использовании меток в sqs на примере:

#Metka1
; объявление метки
systemChat "Here I am"
; в чат выводится сообщение: Here I am
goto "Metka1"
; возвращаемся к метке Metka1 и начинаем читать код снова. Результат: Мы создали бесконечный цикл, который будет выводить в чат сообщение "Here I am"

В sqf метод использования меток кардинально отличается.
Данный метод меток позволяет только отмечать области видимости кода (scope) и в дальнейшем работать с ними
Пример на sqf:

scopeName "main"; //Создание метки в глобальной области данного скрипта
while {true} do {
//Переход на локальную область while{}do{}
scopeName "loop1"; //Объявление метки локальной области while{}do{}
while {true} do {
//Переход на вторую локальную область while{}do{} (x2), лежащую в предыдущей области while{}do{}
scopeName "loop2"; //Объявление метки этой локальной области while{}do{}
if (condition1) then {breakTo "main"}; //Удаляет все области и возвращается к области с меткой "main"
if (condition2) then {breakOut "loop2"}; //Удаляет область "loop2" и возвращается к области с меткой "loop1"
sleep 1;
};
sleep 1;
};

 

Открыть арсенал на ящике, при этом не с 15 (по умолчанию) метров, а со скольких укажите. < 3 = в упор, почти в упор.

Через addAction

this addAction ["Арсенал", {call BIS_fnc_arsenal;},[false],1,false,true,"","(_target distance _this) < 3"];

Думаю многие встречают в скриптах такую непонятную штуку, как select 0 или select 3 например. Я сам не втыкал что оно такое и что оно делает, а оказывается все просто. select выбирает элемент массива, при этом исчисление начинается не с 1, а с 0. Первый элемент массива имеет индекс 0, дальше 1 и по порядку. Теперь на примере. У нас есть массив:

_array = [“player”,”unit”,55];

Далее мы хотим создать переменную и присвоить ей значение первого элемента массива и вторую переменную со значением третьего элемента:

_a = _array select 0;
_b = _array select 2;

В итоге _a = “player”, a _b = 55.

Теперь о том, зачем нам это нужно? На примере того же скрипта на отбор у игрока прицела тепловизора, мы знаем, что нужно отбирать прицел с названием класса “optic_Nightstalker”, но как узнать какой прицел одет на пушку? Команда primaryWeaponItems возвращает нам массив из 4 элементов, каждый из которых содержит в себе информацию о том, какие прибамбасы одеты на оружие:
[“глушитель”,”лазер/фонарик”,”прицел”,”сошки”]

Мы знаем что прицел идет третьим, а значит имеет индекс 2. Так вот, чтобы узнать какой стоит прицел мы должны с помощью команды select выбрать его. Получается:

(primaryWeaponItems player) select 2;

С недавних пор вместо слова select можно использовать символ # :

(primaryWeaponItems player) # 2;

Думаю все понятно )))

Авторы справки:
MAXIMILI, PIONEER, BlackTok[BT], SIVAT, BETEP3526, Dusin.

Обсудить эти команды, и спросить другие — можно в нашем Discord канале