[Tutorial] Intйragir avec le clavier du client
#1

Hello.

Pour ceux qui ne connaоtraient pas (d'ailleurs, moi mкme je suis pas trop familiarisй avec cette callback), OnPlayerKeyStateChange(playerid, newkeys, oldkeys) est la callback permettant d'interagir avec certaines touches du clavier du client, enfin d'un ID de joueur (playerid comme giveplayerid (obtenu avec ReturnUser par exemple)

Ce tutoriel va s'appuyer du wiki sa-mp, car comme la page franзaise a pas йtй traduite en entier, faut bien que les gens avec des difficultйs en Anglais puissent l'utiliser.

Pour commencer, les paramиtres de la callback

playerid, c'est l'ID du joueur duquel on check le changement de touche
newkeys, c'est la touche sur laquelle on a appuyй
oldkeys, c'est la touche qui йtait appuyйe avant

Vous me direz oldkeys ne sert а rien, eh bien si ! Ca permet de savoir si un joueur maintient la touche !
(Si la touche appuyйe avant et aprиs sont les mкmes, alors la touche est considйrйe comme "maintenue" par pawno)


Prenons comme exemple un truc basique, soit "Si le joueur appuie sur la touche de tir, alors il dйmarre sa voiture"

On devra check si le joueur est dans une voiture, donc IsPlayerInAnyVehicle

Ce qui nous donnera

PHP Code:
public OnPlayerKeyStateChange(playeridnewkeysoldkeys// La callback
{
     if(
newkeys KEY_FIRE// On check si la touche nouvellement appuyйe est la touche de tir, mettez bien & et pas ==
     
{
         if(
IsPlayerInAnyVehicle(playerid)) // On check maintenant si le joueur est dans un vйhicule
         
{
             new 
vehid GetPlayerVehicleID(playerid);
             new 
enginelightsalarmdoorsbonnetbootobjective;
             
GetVehicleParamsEx(vehidenginelightsalarmdoorsbonnetbootobjective);
             
SetVehicleParamsEx(vehid1lightsalarmdoorsbonnetbootobjective);
             
SendClientMessage(playerid, -1"{9ACD32}[Information]{FFFFFF} Vous avez dйmarrй votre voiture en appuyant sur la touche de tir !");
          }
       }
       return 
1;

Ensuite, on peut faire des tas de choses avec зa.

Voici la liste des touches (ou plutфt de leurs noms, par exemple KEY_FIRE)
https://sampwiki.blast.hk/wiki/Keys_FR

Je vous fait un autre truc qui fait que tant que le joueur sprinte, il tue tous les autres joueurs du serveur

PHP Code:

public OnPlayerKeyStateChange(playeridnewkeysoldkeys// La callback
{
    if( (
newkeys KEY_SPRINT) && (oldkeys KEY_SPRINT) ) // On check si les deux touches sont identiques
    
{
        for(new 
0MAX_PLAYERSi++) // On utilise for pour faire en sorte que i englobe tous les joueurs
        
{
             if(
IsPlayerConnected(i))
             {
                   if(
== playerid) continue; // Si i vaut le joueur qui cours, on continue la commande sans rien faire au joueur qui court
                   
SetPlayerHealth(i0.0); // On tue tout le monde sauf le joueur qui court
             
}
        }
    }
    return 
1;

J'ai repris la syntaxe de blocs entre parenthиses pour les deux touches identiques du wiki car j'ai toujours procйdй comme зa et j'ai jamais eu de problиmes.
Bref, voilа, si vous avez besoin de prйcisions, demandez
Reply
#2

Tutoriel basique, mais en franзais et utile pour les nouveaux, fйlicitations !
Reply
#3

Je te remercie, зa me sera utile.
Tu saurais comment "remplacer" une commande du style /macommande par une touche ?
J'utilise zCMD, j'ai pensй а faire ma commande normalement, et lorsque le joueur appuie sur la touche souhaitй, renvoyer la commande /macommande qui est en zCMD.

Mais je me demandais si c'йtait possible sans passer par une commande.

Voilа tout, merci.

Bon tutoriel.
Reply
#4

Il serait mieux de donner la page Keys traduire !
https://sampwiki.blast.hk/wiki/Keys_FR

+ erreur dans le code:
Code:
new vehid = GetPlayerVehicleID(playerid); 
SetVehicleParamsEx(vehid, 1, lights, alarm, doors, bonnet, boot, objective);
Il faut utiliser GetVehicleParamsEx avant, et crйer les variables lights, arlam, doors, bonnet, boot et objective !

Il serait peut-кtre aussi un peu plus correct de vйrifier si le joueur est valide avant le tuer, il peut ne pas кtre connectй !
Reply
#5

Pas faux.
Merci Kilou, corrigй.

Zetano, tu remplaces CMD:tacommande(playerid, params[])
par

PHP Code:
public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(
newkeys TaTouche)
    {
        
// Le script de ta commande 
     
}
     return 
1;

Tu te sers de OnPlayerKeyStateChange comme d'un OnPlayerCommandText

PS : La page en franзais йtait pas lа quand j'ai fais le tuto :3
(This page was last modified 21:27, 1 February 2014.)
Lien editй !
Reply
#6

Bon j'avoue, j'ai traduit la page juste juste pour pouvoir te dire зa XD
Quote:

Tu saurais comment "remplacer" une commande du style /macommande par une touche ?
J'utilise zCMD, j'ai pensй а faire ma commande normalement, et lorsque le joueur appuie sur la touche souhaitй, renvoyer la commande /macommande qui est en zCMD.

pawn Code:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(newkeys==KEY_ACTION&&oldkeys!=KEY_ACTION)
    {
        OnPlayerCommandText(playerid, "/tacommande");
    }
     return 1;
}
Et puis la t'auras juste а crйer la commande dans OnPlayerCommandText AVEC STRCMP et pas zCMD (il n'y a pas de paramиtre, donc pas besoin de zCMD, зa ne fait qu'alourdir le script !), si malgrй l'alourdissement du script tu souhaites utiliser zCMD et bien зa ne change pas, il y a juste а faire passer зa dans OnPlayerCommandText, zCMD va le capter dans tous les cas ^^

Ou sinon tu fais comme le suggиre S4t3K, mais si tu comptes avoir la commande dans OnPlayerCommandText il vaut mieux passer par OnPlayerCommandText que de mettre le code une fois de plus, зa aussi зa ne fera qu'alourdir le script
Reply
#7

Trиs bien, je vous remercie, c'est surtout pour ouvrir des portes pour un mapping
La touche ouvrira la porte la plus proche du joueur.


J'essayerais une fois que j'aurais avancй dans mon GM.
Reply
#8

https://sampwiki.blast.hk/wiki/CallRemoteFunction

EDIT:

pawn Code:
CallRemoteFunction("OnPlayerCommandText","is", playerid, "ta commande");
Reply
#9

OnPlayerCommandText contient aussi le paramиtre playerid
pawn Code:
CallRemoteFunction("OnPlayerCommandText","is", playerid, "ta commande");
(J'ai jamais utilisй la commande donc зa peut кtre incorrect)
Reply
#10

Quote:
Originally Posted by Kilou
View Post
OnPlayerCommandText contient aussi le paramиtre playerid
pawn Code:
CallRemoteFunction("OnPlayerCommandText","is", playerid, "ta commande");
(J'ai jamais utilisй la commande donc зa peut кtre incorrect)
Oui tu as raison, j'ai oubliй playerid.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)