Portal SAMP
[Ajuda] OnPlayerKeyStateChange - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] OnPlayerKeyStateChange (/showthread.php?tid=4262)



OnPlayerKeyStateChange - L10motos - 02/12/2023

Estou com uma duvida, alguém sabe me informar sobre essa função:


Citar:public OnPlayerKeyStateChange(playerid, KEY:newkeys, KEY:oldkeys)


O que é oldkeys? o que é newkeys?
Traduzindo sei o que é, chave antiga e chave nova, mais queria mais informações sobre o mesmo.


RE: OnPlayerKeyStateChange - Aranha - 02/12/2023

vc pode usar teclas no lugar de comandos

https://portalsamp.com/showthread.php?tid=3803

https://www.open.mp/docs/scripting/callbacks/OnPlayerKeyStateChange


RE: OnPlayerKeyStateChange - L10motos - 02/12/2023

Eu estou tendo problema é que quando aperto enter para entrar em interiores tem vez que não entra, queria saber se tem alguma coisa a ver com isso.


RE: OnPlayerKeyStateChange - White_Blue - 02/12/2023

oldkeys = Tecla que foi pressionada anteriormente à tecla que o jogador acaba de pressionar.
newkeys = Tecla que o jogador acaba de pressionar.

(02/12/2023 23:35)L10motos Escreveu: Eu estou tendo problema é que quando aperto enter para entrar em interiores tem vez que não entra, queria saber se tem alguma coisa a ver com isso.

Se você usa o operador de igualdade (==) para verificar teclas, isso pode causar problemas e conflitos, sempre use o operador bitwise AND (&).

Código PHP:
if(newkeys == KEY_FIRE) return SendClientMessage(playerid, -1"Você acaba de pressionar KEY_FIRE!"); // Incorreto
if(newkeys KEY_FIRE) return SendClientMessage(playerid, -1"Você acaba de pressionar KEY_FIRE!"); // Correto 

Isso acontece pois teclas são representadas por bitmasks no SA-MP.


RE: OnPlayerKeyStateChange - L10motos - 03/12/2023

Cara, você é muito bom mesmo, devia ganhar um premio, mais consigo apenas te reputar, obrigado!


RE: OnPlayerKeyStateChange - Carlos Victor - 03/12/2023

Você pode pegar alguns macros que a própria equipe do SA-MP fez para deixar seu código mais limpo.
Código PHP:
#define PRESSED(%0) \
    
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
/*
    - Detecta a tecla é pressionada

    if (PRESSED( KEY_FIRE ))
    {
    
    }
*/


#define HOLDING(%0) \
    
((newkeys & (%0)) == (%0))
/*
    - Detecta se tecla é mantida pressionada (segurando)

    if (HOLDING( KEY_FIRE ))
    {
    
    }
*/

#define PRESSING(%0,%1) \
    
(%& (%1))
/*
    - Detecta se o jogador está pressionando uma tecla atualmente

    if (PRESSING( newkeys, KEY_FIRE | KEY_CROUCH ))
    {
        
    }
*/

#define RELEASED(%0) \
    
(((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
/*
    - Detecta se uma tecla parou se pressionada

    if (RELEASED( KEY_FIRE ))
    {
    
    }
*/

/*
    Você pode fazer múltiplas verificações usandos os macros acima, exemplos:

    if (HOLDING( KEY_FIRE | KEY_CROUCH ))
    if (PRESSED( KEY_FIRE | KEY_CROUCH ))
    if (PRESSING( newkeys, KEY_FIRE | KEY_CROUCH ))
    if (RELEASED( KEY_FIRE | KEY_CROUCH ))

*/

public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
        if(
PRESSED(KEY_SECONDARY_FIRE))
        {
                
// Tecla F pressionada
        
}
        return 
1;


Basicamente tudo isso você pode ler nas documentações que o nosso amigo White_Blue deixou acima também.