Для начала разберемся зачем это нужно и есть ли смысл. Подписывая наш класс на прослушку событий мы можем получить независимость от FG. После подписки и реализации некоторого метода(дальше больше) класс можем обрабатывать абсолютно любые экшены. Экшен в данном случаи представляет собой связь кнопки с именем: f – pickup.
Принцип работы следующий: наследую интерфейс IActionListener появляется необходимость в реализации функции void OnAction(const ActionId& action, int activationMode, float value); Данная функция и отвечает за прослушку событий нажатия кнопок. После регистрации класса для прослушивания нажатий, наш класс попадает в список слушателей. Когда в базом классе(который реализует распознавание нажатий) происходит событие нажатия, он сообщает всем подписчикам эту информацию и в нашем классе, который мы подписали, вызывается функция, описанная выше.
Теперь подробно.
Переходим в.h файл, и в его объявление организовываем public-наследование интерфейса IActionListener.

Затем переходим в оглавление интерфейса IActionListener путем нажатия кнопки ф12. Из него нам нужно перенести 1 метод, который заканчивается на =0;. Это предпосылка на то, что метод чистый-виртуальный и обязателен для переопределения в наследуемом классе. А значит копируем:

Переносим в свой класс, удаляем приставку virtual. Вместо =0; ставим просто;
Далее переходим в срр файл и в конструкторе производим подписку класса на прослушивание событий:

Сразу же в деструкторе классе пропишем отписку от прослушивания:

Окей, теперь перейдем к реализации скопированного метода. По сути дела при нажатии кнопки в функцию приходит что за кнопка(экшен) была нажата, и статус нажатия: клик/удержание/отпускание, а 3 параметр хз зачем) думаю для геймпадов, там указывается степень силы нажатия(?).
Думаю понятно, что если мы слушаем определенный экшен то его мы должны и отобрать в списке всех вызовов. Для этого используем обычный if

В данном примере action – аргумент функции – нажатая кнопка. Мы сравниваем экшен с тем, который нам необходим. Список всех экшенов храниться в g_pGameActions. Второе условие проверки на m_pCombatTarget здесь лишнее(просто было лень искать другой скрин). Окей, если экшен == экшену lookAt, то есть нажата та кнопка которая нужна, то выполняется проверка на статус нажатия. По сути следующая проверка необязательна, если в хмл-файле указано, что будет обрабатываться только событие клика.
Для примера с экономикой будет следующее:
if(action == g_pGameActions->economics)
{
pUIElementEcomics->SetVisible(true);
}
и все) А что бы скрыть уже подумай сам как сделать;)
Последний штрих!
Открываем папку Game Files, находим там файлик GameActions.actions и в самом низу прописываем DECL_ACTION(economics). Обратим внимание, что имя которые мы указали в скобках нам ещё пригодиться.
Далее, переходим в папку с движком->GameSDK->Libs->Config->defaultProfile.xml
В нем находим объявление actionmap с именем player(это примерно 200 стрчока). Далее перед экшеном
<action name="craft" onRelease="1" keyboard="c"/>
вписываем свой:
<action name="economics" onRelease="1" keyboard="y"/>
Вместо y можно указать другую кнопку. Но пока сойдет эта;)
Все. Сохраняемся, компилим код и радуемся.






