AddAction . Что это такое, и как его правильно настроить.


Авторы: 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

PriorityNumber — (Необязательно, по умолчанию 1.5) значение приоритета действия. Действия будут расположены в порядке убывания в соответствии с этим значением. Каждое игровое действие имеет заданное значение приоритета. Значение может быть отрицательной или десятичной дробью. Действия с одинаковыми значениями будут расположены в том порядке, в котором они были сделаны, самые новые внизу. Чем больше число, тем выше будет действие в меню. Типичный диапазон: от 0 (низкий приоритет. Например: «Выйти») до 6 (высокий приоритет. Например: «Авто-зависание включено»)

showWindow: Boolean — (Необязательно, по умолчанию true ), если установлено значение true , игроки видят «Title» в середине экрана, когда они приближаются к объекту. Будет показан только текст заголовка для действия с наивысшим приоритетом и то что с параметром «showWindow true«. Установка в false отключает функцию.
То есть придётся крутить колёсиком что бы пункт появился, а так он будет мазолить глаза когда подходите к объекту с этим addAction.

hideOnUseBoolean — (Необязательно, по умолчанию true ), если установлено значение true , меню действий будет скрыто после выбора этого действия. Если установлено значение false , меню действий останется открытым и видимым после выбора этого действия, оставив выделенным то же действие, чтобы можно было быстро повторно выбрать это же действие или выбрать другое действие.

shortcut: String — (Необязательно, по умолчанию «») одно из  key names, определенных в bin.pbo (например, «moveForward«). Добавление доступного ярлыка свяжет соответствующую клавишу с этим действием. Доступность ярлыков можно проверить с помощью команды inputAction.
Например, это как кнопка «включить автозависание» в вертолёте, где оно доступно и на колёсико в меню, и на кнопку X.

conditionString — (Необязательно, по умолчанию «true») код сценария, который должен возвращать true, чтобы отображалось действие. Специальные переменные, передаваемые в код скрипта:

  • _target : Object — объект, к которому прикреплено действие, или, если объект является юнитом внутри транспортного средства, транспортное средство
  • _this : Object — вызывающий , которому показано действие (или не показано, если условие возвращает false )
  • _originalTargetObject — исходный объект, к которому прикреплено действие, независимо от того, находится объект / юнит в транспортном средстве или нет

В «» надо написать условие, как пишем в if. Условие должно возвращать true либо false.
В условие по умолчанию включены два параметра:
_this — тот кто вызывает экшн
и
_target — объект на котором привязан экшн

Пример:
Экшн будет показываться, если вызывающий на стороне красных:

"side _this == EAST"

Пример 2:
Если объект на котором весит экшн не поврежден, то экшен не будет виден:

"damage _target > 0"

 

radiusNumber — (Необязательно, по умолчанию 50) 3D- расстояние в метрах, на котором должен быть активирован объект, активирующий действие.
-1 отключает этот радиус.

То есть, если не указать, то этот пункт меню будет виден на расстоянии 50 метров от объекта на котором он есть.

-1 — максимальная дистанция проверки условия. Проверка условия обладает следующими свойствами:

  • Условие проверяется в незапланированной среде каждый кадр
  • Условие не проверяется, если открыт какой-либо диалог/дисплей.
    Максимальная дальность проверки условия зависит от типа объекта, например:

  • Статические объекты (Например: дом): 50-60 метров
  • Динамические объекты (Например: машина, ящик, человек): общая дальность прорисовки (Дальность прорисовки ландшафта)

Часто можно такое встретить на базах многих небольших проектов, когда бежишь по ней, а перед тобой постоянно АРСЕНАЛ , АРСЕНАЛ.
Прям утомляет.

Оптимально:

1 метр — в упор
2 метра — на расстоянии вытянутой руки

Так что не пропускайте, и указывайте сколько надо.

unconsciousBoolean — (Необязательно, по умолчанию false ), если true будет показано игроку который без сознания (см. SetUnconscious , lifeState )

selectionString — (Необязательно, по умолчанию «») именованное выделение в геометрии LOD, к которому прикреплено действие

memoryPointString — (Необязательно, по умолчанию «») 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, там вам всегда помогут.