Здесь собраны мелкие полезные справки по скриптам, на которых новички совершают ошибки все как один.
Не поленитесь ознакомится.
Если прописать код:
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 канале