Сообщение от
Vano_Glad
Тем не менее клавиша залипает
PHP код:
if(newkeys == KEY_SPRINT)
{
if(select_skin_magazine[playerid] == true)
{
if(show_dialog[playerid] == false)
{
show_dialog[playerid] = true;
static const fmt_str[] =
"\
{FFFFFF}Вы уверены что хотите купить эту одежду?\
\nЦена: %d\
";
new string[sizeof(fmt_str)+5];
format(string, sizeof(string), fmt_str
,
magazine_money[playerid]
);
SPD(playerid, 299, DSM, "Покупка новой одежды", string, "Да", "Нет");
}
}
}
Когда просят показать код реализации, следует показывать весь код, что относится к реализации. В данном случае это и объявление массива show_dialog (обязательно указать где именно он инициализируется), и сброс флажка.
Вот такой код (тот же самый, что и у тебя, просто обрезано лишнее):
PHP код:
new bool:show_dialog[MAX_PLAYERS char];
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
printf("\nnewkeys: %d | oldkeys: %d", newkeys, oldkeys);
if(newkeys == KEY_SPRINT)
{
printf("show_dialog: %b", show_dialog[playerid]);
if(show_dialog[playerid] == false)
{
show_dialog[playerid] = true;
ShowPlayerDialog(playerid, 299, DIALOG_STYLE_MSGBOX, "Покупка новой одежды", "{FFFFFF}Вы уверены что хотите купить эту одежду?\nЦена: 5000", "Да", "Нет");
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 299)
{
print("dialogid: 229");
show_dialog[playerid] = false;
}
return 1;
}
Работает на все 100%. Ты можешь сколько угодно держать клавишу во время открытия диалога, но если её отпустить при закрытии этого самого диалога, диалог по новой открыт не будет (соответственно, если продолжать держать - откроется по новой, что логично, ибо пока диалог открыт, игрок не может двигаться, а когда закрывается, игрок начинает двигаться по новой, соответственно, отправляя новую информацию о нажатии клавиш).
Если ты считаешь "залипанием" именно то, что я описал выше, то тут уже нужно смотреть на конкретную систему, в которой ты хочешь сделать заглушку. Например, если у тебя в системе покупки одежды шифт используется в качестве выбора скина, то достаточно просто обнулять переменную show_dialog именно когда игрок нажал этот шифт и вышел из окна покупки. Если же тебе нужно просто обрабатывать следующее нажатие с задержкой, то можно задействовать таймер. Ну а если нужно не отлавливать кнопку пока игрок её не отожмёт, то тут на помощь придут те самые макросы, один из которых уже кидали выше.