Gentes dames, bonsoir.
Sur ce nouveau tutoriel, nous allons apprendre a utiliser un système plus élaboré et rapide que la méthode strtok, qui es connu pour être compliqué (pour ma part) mais aussi lente, alors pourquoi ne pas utiliser un type de commande beaucoup plus rapide et simple d'utilisation comme le DCMD.Les commandes rapides
Dans une commande qui utilise la méthode strtok on as souvent un petit problème a rendre notre code plus visible et ainsi plus compréhensible, alors que pour le dcmd il nous faudra déclarer notre commande au OnPlayerText et mettre la commande comme une variable voici deux exemple de DCMD et de strtok:
Un exemple du strtok:public OnPlayerCommandText(playerid, cmdtext[])
{
new idx, cmd[20];
cmd = strtok(cmdtext, idx);
if (strcmp(cmd, "/kick", true) == 0)
{
new tmp[20],id;
tmp = strtok(cmdtext, idx);
if (strlen(tmp))
{
id = strval(tmp);
if (IsPlayerConnected(id))
{
Kick(id);
SendClientMessage(playerid, 0x00FF00AA, "Le joueur fut kické(e)");
}
}
return 1;
}
return 0;
}[/code=pawn]
[b]Un exemple du dcmd:[/b]
[code=pawn]public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(kick, 4, cmdtext);
return 0;
}
dcmd_kick(playerid, params[])
{
if (strlen(params))
{
id = strval(params);
if (IsPlayerConnected(id))
{
Kick(id);
SendClientMessage(playerid, 0x00FF00AA, "Le joueur fut kické(e)");
}
}
return 1;
}
Étude du code:- Notez que le strtok disparait logique, par contre on note l'affichage d'une commande plus simple utilisant simplement des commandes de base assez simple a comprendre, notez que cet affichage peux être encore plus simplifié grâce au sscanf (nous allons découvrir dans le chapitre suivant).
- Il sera normal que votre code ne se compile pas avec ce bout de code puisque vous n'aviez pas déclaré la fonction DCMD, pas de soucis tonton FuSion a la solution, il vous suffira d'ajouter cet ligne magique en haut de votre code et hop, ça marche:
#define dcmd(%1,%2,%3) if ((strcmp(%3, "/%1", true, %2+1) == 0)&&(((%3[%2+1]==0)&&(dcmd_%1(playerid,"")))||((%3[%2+1]==32)&&(dcmd_%1(playerid,%3[%2+2]))))) return 1;
- Dans la ligne suivante : dcmd(kick, 4, cmdtext); on déclare notre commande (kick), le nombre de ces caractères (4) et a la fin le type qui est une cmdtext.
- Simplifiez vos commandes grâce au SSCANF
Il existe un truc plus simple qui vous permet de vous simplifiez la vie, il s'agit du SSCANF, il s'agit d'une fonction crée par Y_Less.
Vous pourriez prendre la fonction du lien suivant:
http://wiki.sa-mp.com/wiki/Sscanf (Le code est trop long pour être mis sur GTAo)
Une fois le code mis en place, a vous la simplicité.
Reprenons notre exemple du dcmd pour faire une comparaison
Un exemple du dcmd:public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(kick, 4, cmdtext);
return 0;
}
dcmd_kick(playerid, params[])
{
if (strlen(params))
{
id = strval(params);
if (IsPlayerConnected(id))
{
Kick(id);
SendClientMessage(playerid, 0x00FF00AA, "Le joueur fut kické(e)");
}
}
return 1;
}
Un exemple en DCMD avec le SSCANF
dcmd_heal(playerid, params[])
{
new id;
if (sscanf(params, "d", id)) SendClientMessage(playerid, 0xFF0000AA, "Usage: /kick <ID>");
else
{
Kick(id);
SendClientMessage(playerid, 0x00FF00AA, "Le joueur fut kické(e)");
}
return 1;
}
C'est plus cout, compréhensible et surtout d'une simplicité étonnante, vous ne trouvez pas ? :D
Étude du code:- Étudions de plus prêt cet ligne la, qui as surement du attirez votre attention ( Ou pas )
if (sscanf(params, "d", id)) SendClientMessage(playerid, 0xFF0000AA, "Usage: /kick <ID>");
Il s'agit de notre commande sscanf, qui prend params comme variable pour extraire les données, "d" comme paramètre des données a renvoyer et id comme donné a renvoyer, simple non ?
- A présent, vous vous demandez surement a quoi sert le "d" qui sert comme paramètre de donnée a renvoyer, bah au faite c'est tout simple, c'est le format du caractère, voici un tableau qui contient tout les caractères de paramètre de donnée. (Source: Wiki SAMP)
Caractère | | Paramètre de donnée |
d | Décimal |
c | Une seule lettre(caractère) |
u | ID ou Pseudonyme |
s | String(Phrase) |
h | Hexadécimal |
f | Float(X,Y,Z) |
z | String optionnel(Phrase optionnel) |
Je vais vous donner un exemple pour comprendre plus vite, pour une commande du genre: /ban id raison, il vous faudra deux paramètre et donc utiliser u(id) et z(raison qui es optionnel) ça donnera ça:
if (sscanf(params, "uz", id, raison))
Voila, le tutoriel touche a sa fin, j'espère que vous savez maintenant utiliser les commandes rapides pour vos futurs système admin/serveur.
Vous pouvez toujours vous entrainez en créant quelque commandes (/kick, /ban, /freeze, /unfreeze, ...) et laisser court a votre imagination.
Merci d'avoir lu ce tutoriel