Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Sign in to follow this  
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)}; но не работает...

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

 

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

Share this post


Link to post
Share on other sites

13 answers to this question

Recommended Posts

  • 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"];
 

Share this post


Link to post
Share on other sites



  • 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? или то случайно?

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0
 

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

Share this post


Link to post
Share on other sites
  • 0

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

 

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

Share this post


Link to post
Share on other sites
  • 0

 

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

 

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

 

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

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

Почему бред?

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

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

 

 

Share this post


Link to post
Share on other sites
  • 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; 
       }; 
    }; 
};

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.