Авторы: BIS Wiki, я, и неравнодушные ребята из нашего прекрасного Discord сообщества.
AddAction — может показаться чем-то непонятным, и что это вообще такое.
А на самом деле всё просто. Это то самое меню, в котором вы выбираете действие (на колёсико).
Например: установить заряд, открыть дверь, взять что-то.
ВАЖНО:
Код, который выполняется по нажатию этой кнопки — выполняется локально для игрока её нажавшего.
Кроме того, его можно добавлять как всем, так и персонально какому либо игроку.
Причём сделать это «налету», прямо в процессе игры.
Только не пилите remoteExec самим себе 😉
Добавить себе экшн:
player addAction
, а не [player,[“action”,{}]] remoteExec [“addAction”,player];
Чтобы добавить конкретному пользователю экшн на ящике мы пишем:
[box,["Action",{}]] remoteExec ["addAction",его ID];
Чтобы для всех:
[box,["Action",{}]] remoteExec ["addAction",-2];
А ещё, его можно добавлять определённой стороне, например, только красным.
Полное описание remoteExec, на BIS Wiki.
На бики есть вот такая справка по этой команде:
Синтаксис:
object addAction [ title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, selection, memoryPoint ];
То есть на выходе, мы получим вот такой код:
this addAction [ "Поднять", { hint "хех" }, [], 1.5, true, true, "", "true", 2, false, "", "" ];
Тут написано вот что:
Title — заголовок. А именно, название самой кнопки, которую мы делаем тут (пункт меню на колёсико).
Кроме того, его можно и подкрасить, примерно таким образом:
"<t color='#ff0000'>Red text</t>"
Script — тот скрипт, который будет выполнятся при нажатии на этот пункт меню. Должен быть в формате SQS (морально устарел в 2007 году) или SQF
Туда могут быть переданы параметры.
- Параметры массива передаваемые в скрипт при активации в _this вариабле :
params ["_target", "_caller", "_actionId", "_arguments"];
- target (_this select 0): Object — объект, которому назначено действие
- caller (_this select 1): Object — юнит, который активировал действие
- ID (_this select 2): Number — ID активированного действия (аналогично идентификатору, возвращенному addAction )
- arguments (_this select 3): Anything — аргументы, переданные скрипту, если Вы используете расширенный синтаксис
Arguments — Anything (Необязательно) По умолчанию они ноль (ничего). Аргументы что бы перейти к выполнению скрипта (Будет select 3 в Script).
Если в качестве аргумента используется, например, Array , его ссылка на 1-й элемент будет _this select 3 select 0
Priority: Number — (Необязательно, по умолчанию 1.5) значение приоритета действия. Действия будут расположены в порядке убывания в соответствии с этим значением. Каждое игровое действие имеет заданное значение приоритета. Значение может быть отрицательной или десятичной дробью. Действия с одинаковыми значениями будут расположены в том порядке, в котором они были сделаны, самые новые внизу. Чем больше число, тем выше будет действие в меню. Типичный диапазон: от 0 (низкий приоритет. Например: «Выйти») до 6 (высокий приоритет. Например: «Авто-зависание включено»)
showWindow: Boolean — (Необязательно, по умолчанию true ), если установлено значение true , игроки видят «Title» в середине экрана, когда они приближаются к объекту. Будет показан только текст заголовка для действия с наивысшим приоритетом и то что с параметром «showWindow true«. Установка в false отключает функцию.
То есть придётся крутить колёсиком что бы пункт появился, а так он будет мазолить глаза когда подходите к объекту с этим addAction.
hideOnUse: Boolean — (Необязательно, по умолчанию true ), если установлено значение true , меню действий будет скрыто после выбора этого действия. Если установлено значение false , меню действий останется открытым и видимым после выбора этого действия, оставив выделенным то же действие, чтобы можно было быстро повторно выбрать это же действие или выбрать другое действие.
shortcut: String — (Необязательно, по умолчанию «») одно из key names, определенных в bin.pbo (например, «moveForward«). Добавление доступного ярлыка свяжет соответствующую клавишу с этим действием. Доступность ярлыков можно проверить с помощью команды inputAction.
Например, это как кнопка «включить автозависание» в вертолёте, где оно доступно и на колёсико в меню, и на кнопку X.
condition: String — (Необязательно, по умолчанию «true») код сценария, который должен возвращать true, чтобы отображалось действие. Специальные переменные, передаваемые в код скрипта:
- _target : Object — объект, к которому прикреплено действие, или, если объект является юнитом внутри транспортного средства, транспортное средство
- _this : Object — вызывающий , которому показано действие (или не показано, если условие возвращает false )
- _originalTarget: Object — исходный объект, к которому прикреплено действие, независимо от того, находится объект / юнит в транспортном средстве или нет
В «» надо написать условие, как пишем в if. Условие должно возвращать true либо false.
В условие по умолчанию включены два параметра:
_this — тот кто вызывает экшн
и
_target — объект на котором привязан экшн
Пример:
Экшн будет показываться, если вызывающий на стороне красных:
"side _this == EAST"
Пример 2:
Если объект на котором весит экшн не поврежден, то экшен не будет виден:
"damage _target > 0"
radius: Number — (Необязательно, по умолчанию 50) 3D- расстояние в метрах, на котором должен быть активирован объект, активирующий действие.
-1 отключает этот радиус.
То есть, если не указать, то этот пункт меню будет виден на расстоянии 50 метров от объекта на котором он есть.
-1 — максимальная дистанция проверки условия. Проверка условия обладает следующими свойствами:
- Условие проверяется в незапланированной среде каждый кадр
- Условие не проверяется, если открыт какой-либо диалог/дисплей.
- Максимальная дальность проверки условия зависит от типа объекта, например:
- Статические объекты (Например: дом): 50-60 метров
- Динамические объекты (Например: машина, ящик, человек): общая дальность прорисовки (Дальность прорисовки ландшафта)
Часто можно такое встретить на базах многих небольших проектов, когда бежишь по ней, а перед тобой постоянно АРСЕНАЛ , АРСЕНАЛ.
Прям утомляет.
Оптимально:
1 метр — в упор
2 метра — на расстоянии вытянутой руки
Так что не пропускайте, и указывайте сколько надо.
unconscious: Boolean — (Необязательно, по умолчанию false ), если true будет показано игроку который без сознания (см. SetUnconscious , lifeState )
selection: String — (Необязательно, по умолчанию «») именованное выделение в геометрии LOD, к которому прикреплено действие
memoryPoint: String — (Необязательно, по умолчанию «») memoryPoint на объекте, к которому прикреплено действие. Если выбран selection , memoryPoint не используется
Едем дальше.
Возвращает значение: Number — Возвращается идентификатор действия. Действие можно удалить с помощью removeAction (см. Также removeAllActions . Идентификаторы увеличиваются, первое заданное действие для каждого устройства имеет идентификатор 0, второе — идентификатор 1 и т.д.
Идентификаторы также передаются вызываемому скрипту (см. Параметр Script).
В общем мы получаем по итогу вот такой код:
Конечно же этот код можно и нужно менять под свои запросы.
Выше описано как это делается.
Есть ещё вариант, когда после нажатия на кнопку которую видно всем, будет появляться кнопка видная только тому кто нажал.
В данном случае, появится машина (класснейм надо указать), и у неё будут кнопки:
- Открыть
- Закрыть
Которые будут видны только тому, кто «купил» (нажал первую кнопку) эту технику.
Если другой игрок так же «купит» (нажмёт эту кнопку на стенде магазина) — то у него будут свои кнопки
- Открыть
- Закрыть
Которые не будут действовать на технику другого игрока.
this addAction ["Купить технику",{ _pos = getPos player; _veh = "I_Quadbike_01_F" createVehicle _pos; _veh addAction ["Закрыть",{ }, [], 1.5, false, false, "", "_this distance _target < 5" ]; _veh addAction ["Открыть",{ }, [], 1.5, false, false, "", "_this distance _target < 5" ]; }, [], 1.5, false, false, "", "_this distance _target < 5" ];
Остальные примеры по этой ссылке
Очень надеюсь что эта статья будет вам полезна.
Ну если что-то не поняли, то заходите в наш Discord, там вам всегда помогут.