Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
ka3ant1p

назначение действия на клавишу

Хочу на некоторые кнопки повесить различные действия но что то не совсем выходит =(
В общем проблема в том что при заходе в игру или перезаходе функция не вешается, точнее как я понял вешается но после полной прогрузки все дисплейивентхендлеры обнуляються, пробовал делать в скрипте задержку в 20 секунд, помогло только при перезаходе из лобби, при первом запуске нужно больше минуты задержка но это очень как то долго.

Скрипт вызываю из инита почти в самом конце.
Скрипт выглядит примерно так:
 

fastKeyexpression = {};
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call fastKeyexpression"];
fastKeyexpression = {
	_keyDown = _this select 1;
	if (_keyDown == 62) then {hint "Использован бинт";};
	if (_keyDown == 63) then {hint "Использовано болеутоляющее";};
	if (_keyDown == 64) then {hint "Использован пакет крови";};
	if (_keyDown == 65) then {hint "Использована морфий";};
};

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

_fnc_bandage_fast_key_off = 0;

while {alive player} do {
if ("ItemBandage" in magazines player) then {
if (_fnc_bandage_fast_key_off == 0) then {
bandagefastkey = (findDisplay 46) displayAddEventHandler ["KeyDown","if ((_this select 1) == 62) then {cutText [""Используем бинты"", ""PLAIN""];};"];
_fnc_bandage_fast_key_off = 1;
};
} else {
if (_fnc_bandage_fast_key_off == 1) then {
(findDisplay 46) displayRemoveEventHandler ["KeyDown", bandagefastkey];
_fnc_bandage_fast_key_off = 0;
};
};
if (!isnil "bandagefastkey") then {hint str bandagefastkey;};
};

Эта проверка показало что переменная bandagefastkey на момент хинта уже была определена но не работает, то есть действие которое повесилось обнуляется....

Если убрать проверку if (_fnc_bandage_fast_key_off == 0) все работает но в цикле навешивается постоянно и удалить не имеется возможным

 

Пробовал делать задержку waituntil {!isnull (finddisplay 46)}; но не работает...

Если зайти выкинуть и поднять бинты то все работает

 

В общем вопрос заключается в том как правильно его запустить или сделать правильно задержку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

А так

(вызов из init.sqf как execVM)

 

 

waituntil {!alive player ; !isnull (finddisplay 46)};
fastKeyexpression =
    {
        switch (_this select 1) do
            {
                case 62: { hint "Использован бинт"; };
                case 63: { hint "Использовано болеутоляющее"; };
                case 64: { hint "Использован пакет крови"; };
                case 65: { hint "Использована морфий"; };
            };
    };
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call fastKeyexpression"];
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

 

А так

(вызов из init.sqf как execVM)

 

 

waituntil {!alive player ; !isnull (finddisplay 46)};
fastKeyexpression =
    {
        switch (_this select 1) do
            {
                case 62: { hint "Использован бинт"; };
                case 63: { hint "Использовано болеутоляющее"; };
                case 64: { hint "Использован пакет крови"; };
                case 65: { hint "Использована морфий"; };
            };
    };
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call fastKeyexpression"];
 

щя попробую, а почему !alive player? или то случайно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Не случайно). Ты же клиенту вешаешь событие на кнопку. Зачем искать дисплей 46, если игрок еще грузится или дохлый. Некорректно может сработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

прямо скопировал как ты сказал что то нифига не работает =(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
 

Попробуй повесить вызов скрипта с хот кеями на колесико.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ну если это весь скрипт, то проверь для начала так:

 

waituntil {!alive player ; !isnull (finddisplay 46)};
fastKeyexpression =
    {hint str _this;};
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call fastKeyexpression"];
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

Ну если это весь скрипт, то проверь для начала так:

 

waituntil {!alive player ; !isnull (finddisplay 46)};
fastKeyexpression =
    {hint str _this;};
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call fastKeyexpression"];
 

проблема в другом, когда запихиваю в цикл, и в цикле проверяю наличие скажем бинтов, точнее вешаю действие в случае если есть бинт, то получается следующее: заходим в игру есть бинт, а действия нет, выкинули - подняли бинт - все работает.... ставим в скрипте задержку 20 секунд перезахоим из лобби все сразу работает... но что бы все работало изначально очень долгую задержку приходится ставить.

Вот я думаю может есть какая то проверка что игрок полностью прогруился.... ведь если взять антихак там менюшка ж нормально работает....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Чето как то бредово))))))))))
 - Про бинты - есть\нету... выкинуть поднять.... бред)

 

По поводу задержки - да, по сути, так и должно быть, или добавляй в fn_self_actions, и там каждый раз переобновляй (перевешивай) события.

антихак тоже не сразу работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Чето как то бредово))))))))))

 - Про бинты - есть\нету... выкинуть поднять.... бред)

 

По поводу задержки - да, по сути, так и должно быть, или добавляй в fn_self_actions, и там каждый раз переобновляй (перевешивай) события.

антихак тоже не сразу работает.

Почему бред?

Т.к. все происходит в цикле и в случае когда бинтов нет - действие которое вешается при их наличии удаляется и добавляется действие при отсутсвии бинтов и наоборот, когда бинт подними действие при отсутсвии бинтов удалится и вешается действие при наличии бинтов, потому выбросить поднять начинает срабатывать.....

То есть первый displayAddEventHandler который вешается в скрипте не работает, после его удаления и добавления вновь (выкинуть поднять бинт) все работает прекрасно

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

я просто как обычно от руки накидал потому не полностью записал....
Вот точнее будет так:
 

init.sqf: 
waituntil {!isnull (finddisplay 46)}; 
[]execVM "medhotkeys.sqf"; 

medhotkeys.sqf: 
_fnc_bandage_fast_key = 0; 
_fnc_bandage_fast_key_off = 0; 

while {alive player} do { 
    if ("ItemBandage" in magazines player) then { 
       if (_fnc_bandage_fast_key_off == 1) then { 
          (findDisplay 46) displayRemoveEventHandler ["KeyDown", bandagefastkeyoff]; 
          _fnc_bandage_fast_key_off = 0; 
       }; 
       if (_fnc_bandage_fast_key == 0) then { 
          bandagefastkey = (findDisplay 46) displayAddEventHandler ["KeyDown","if ((_this select 1) == 62) then {cutText [""Используем бинты"", ""PLAIN""];};"]; 
          _fnc_bandage_fast_key = 1; 
       }; 
    } else { 
       if (_fnc_bandage_fast_key == 1) then { 
          (findDisplay 46) displayRemoveEventHandler ["KeyDown", bandagefastkey]; 
          _fnc_bandage_fast_key = 0; 
       }; 
       if (_fnc_bandage_fast_key_off == 0) then { 
          bandagefastkeyoff = (findDisplay 46) displayAddEventHandler ["KeyDown","if ((_this select 1) == 62) then {cutText [""нет бинтов"", ""PLAIN""];};"]; 
          _fnc_bandage_fast_key_off = 1; 
       }; 
    }; 
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

все спасибо, разобрался =) Запихнул в фн_селфакшн и все работает =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

У тебя while без паузы - вечный цикл, со 100% загрузкой процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

У тебя while без паузы - вечный цикл, со 100% загрузкой процессора.

забыл поставить =) в скрипте вообще у меня он есть =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.