Если у тебя SA:MP / open.mp на Pawn, то здесь важный момент:
KEY_B не существует.
Через OnPlayerKeyStateChange ловятся только те клавиши, которые есть в списке поддерживаемых констант, например KEY_YES = Y, KEY_NO = N, KEY_WALK, KEY_JUMP и т. д. В официальных списках B нет.
То есть:
if(newkeys & KEY_YES)
это нормально, потому что KEY_YES действительно соответствует клавише Y. А вот аналога вида KEY_B в стандартном SA:MP/open.mp нет.
Пример рабочего кода для BattlePass на Y:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if ((newkeys & KEY_YES) && !(oldkeys & KEY_YES))
{
ShowBattlePass(playerid); // твоя функция открытия BattlePass
}
return 1;
}
Что можно сделать вместо B:
1. Повесить BattlePass на доступную клавишу, например Y, N или H (KEY_CTRL_BACK). Эти константы поддерживаются.
2. Открывать BattlePass через команду, например /bp.
3. Открывать через диалог, текстдрав или кнопку в интерфейсе.
4. Если тебе именно обязательно нужна клавиша B, то стандартным Pawn-кодом на сервере это не делается — для этого уже нужен клиентский мод/плагин, потому что SA:MP сервер сам по себе такую клавишу не отслеживает. Это следует из официального списка доступных key constants, где B отсутствует.
Готовый вариант через команду:
CMD:bp(playerid, params[])
{
ShowBattlePass(playerid);
return 1;
}
Итог:
для SA:MP B через OnPlayerKeyStateChange не поймать, потому что нет KEY_B.
Самый близкий нормальный вариант — поставить BattlePass на KEY_YES, KEY_NO или команду /bp.