GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Tutoriels et références SA:MP => Discussion démarrée par: FuSion le 21 Février 2010, 00:11:19

Titre: [TUTO] Commandes rapides
Posté par: FuSion le 21 Février 2010, 00:11:19
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:
Code: (pawn) [Sélectionner]
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:
Code: (pawn) [Sélectionner]
#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.


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 (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:

Code: (pawn) [Sélectionner]
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

Code: (pawn) [Sélectionner]
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 ?&nbsp; :D

Étude du code:
- Étudions de plus prêt cet ligne la, qui as surement du attirez votre attention ( Ou pas )
Code: (pawn) [Sélectionner]
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
dDé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:
Code: (pawn) [Sélectionner]
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
Titre: Re : [TUTO] Commandes rapides
Posté par: Barto le 21 Février 2010, 00:15:35
GG beau tuto, j'ai pas tout lu, mais je le fais demain.
Titre: Re : [TUTO] Commandes rapides
Posté par: Dark_revan le 21 Février 2010, 01:04:31
Merci pour ce tuto j'avoue que la fonction SSCANF est vraiment bien :D
Titre: Re : Re : [TUTO] Commandes rapides
Posté par: FuSion le 21 Février 2010, 01:53:29
Merci pour ce tuto j'avoue que la fonction SSCANF est vraiment bien :D

C'est une fonction plutôt simple et rapide a utiliser d'où son adoption au sein de plusieurs système utilisant ce type de commande.  ;)
Titre: Re : [TUTO] Commandes rapides
Posté par: Dark_revan le 21 Février 2010, 07:59:03
Une petite question fusion que j'ai poster sur un topic. tu as dit :

Citer
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)

Serait tu comment arrondir par exemple une Float ( %f) de façon a retirer les chiffre aprés la virgule ou les arrondir a l'unité ?
Titre: Re : Re : [TUTO] Commandes rapides
Posté par: Ssk le 21 Février 2010, 09:08:11
Une petite question fusion que j'ai poster sur un topic. tu as dit :

Citer
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)

Serait tu comment arrondir par exemple une Float ( %f) de façon a retirer les chiffre aprés la virgule ou les arrondir a l'unité ?


floatround();
Titre: Re : [TUTO] Commandes rapides
Posté par: Dark_revan le 21 Février 2010, 11:19:26
Merci mais la fonction floatround ne met pas automatiquement a l'unité comment faudrait t'il faire par exemple :

new Float:X;// un float pour exemple
X = 55.333333;// la float avec virgule
format(string, sizeof(string), " Vous êtes à: %f X",X);//pour voir la float avec virgule
SendClientMessage(playerid,0x00FF00FF,string);

Comment mettre ceci sans virgule avec la fonction floatround svp
Titre: Re : [TUTO] Commandes rapides
Posté par: Barto le 21 Février 2010, 11:22:17
Je viens e remarquer que tu ne l'avais pas mis dans la partie Tuto.
Titre: Re : [TUTO] Commandes rapides
Posté par: Anonyme le 21 Février 2010, 11:24:32
Normal c'est a un modérateur de le déplacer on peux pas poster dans la section tuto je pense :p

Sinon, Beau tuto FuSion y vas surement bien m'aider
Titre: Re : Re : [TUTO] Commandes rapides
Posté par: Ssk le 21 Février 2010, 13:19:25
Merci mais la fonction floatround ne met pas automatiquement a l'unité comment faudrait t'il faire par exemple :

new Float:X;// un float pour exemple
X = 55.333333;// la float avec virgule
format(string, sizeof(string), " Vous êtes à: %f X",X);//pour voir la float avec virgule
SendClientMessage(playerid,0x00FF00FF,string);

Comment mettre ceci sans virgule avec la fonction floatround svp


euh ta meme pas utiliser la fonction !
 à cette étape tu fait

X = 55.333333;

X = floatround(55.333333);
Titre: Re : [TUTO] Commandes rapides
Posté par: Dark_revan le 21 Février 2010, 14:05:57
Désoler j'ai trouver je chercher compliquer avec la fonction alors quel marchais juste la la place de %f mettre %i.

 :dejadehors
Titre: Re : [TUTO] Commandes rapides
Posté par: Barto le 09 Juin 2010, 19:48:09
Désolé de up le sujet mais je me suis rendu compte tout à l'heure (en expliquant un truc à un nouveau) que ce tuto n'était pas dans la section tutoriaux sa:mp.
Vu que c'est un bon tuto, ca serait cool de le déplacer.
Encore désolé d'avoir up ce sujet.

Bonne soirée, Barto.
Titre: Re : [TUTO] Commandes rapides
Posté par: cristab le 09 Juin 2010, 20:19:53
bien vue ^^ je pense que Sim ne l'avait pas vu envoie le lien en MP avec le lien du post il le feras des qu'il seras de retours :)
Titre: Re : [TUTO] Commandes rapides
Posté par: Barto le 09 Juin 2010, 20:21:45
Ok, je vais faire ça.
Titre: Re : [TUTO] Commandes rapides
Posté par: S!m le 18 Juin 2010, 22:02:07
Salut,

voilà c'est fait, désolé de ne pas avoir été plus rapide.
Je ne connaissais pas ce tuto (très beau d'ailleurs)

++Sim++
Titre: Re : [TUTO] Commandes rapides
Posté par: Boomerkuigi le 29 Novembre 2010, 16:56:10
Je voulais savoir si il y a une limite de parametres avec le dcmd ?
Titre: Re : [TUTO] Commandes rapides
Posté par: S!m le 29 Novembre 2010, 19:08:05
Salut,

si tu parle de params, il n'ajoute pas de limite. C'est la même qu'avec un strcmp, la longueur de cmdtext ne peut dépasser 128. Pour params c'est donc len = (128 - la longueur de la commande - 2) (le /et l'espace)

++Sim++
Titre: Re : Re : [TUTO] Commandes rapides
Posté par: Wing le 03 Décembre 2010, 20:42:28
GG beau tuto, j'ai pas tout lu, mais je le fais demain.
Titre: Re : [TUTO] Commandes rapides
Posté par: Tetsuka le 27 Janvier 2011, 00:14:38
Salut, je voudrais connaitre les limites de ces deux includes! Peut on faire n'importe quelle commande avec ce système? Quelqu'un a-t-il un exemple de fonction plus complexe? Merci.
Titre: Re : [TUTO] Commandes rapides
Posté par: Myk3L le 29 Janvier 2011, 13:20:41
Belle initiative mais le must c'est quand même le zcmd et sscanf !
Titre: Re : [TUTO] Commandes rapides
Posté par: Ashley11 le 31 Juillet 2011, 23:46:04
Désolé d'up le topic mais quelqu'un pourrait m'expliquer la fonction strtok ?


celle-ci n'existe malheureusement pas en C++  :lmao :(



Merci d'avance...
Titre: Re : [TUTO] Commandes rapides
Posté par: Xartrick le 31 Juillet 2011, 23:51:23
Cette fonction existe en C++ ...

http://www.cplusplus.com/reference/clibrary/cstring/strtok/ (http://www.cplusplus.com/reference/clibrary/cstring/strtok/)
Titre: Re : [TUTO] Commandes rapides
Posté par: Ashley11 le 01 Août 2011, 00:02:11
lol !


Je me sent bête...



Merci Xartrick !  :jesors
Titre: Re : [TUTO] Commandes rapides
Posté par: Kevin_Carter le 02 Mars 2012, 21:40:40
Désolé de UP le post mais j'ai un problème...
J'ai C/C le dcmd de /heal mais ça marque ça :
C:\Documents and Settings\HP_Administrateur\Bureau\Serveur Universal Life Role Play\gamemodes\TEAM_SDU.pwn(93) : error 017: undefined symbol "dcmd_heal"
C:\Documents and Settings\HP_Administrateur\Bureau\Serveur Universal Life Role Play\gamemodes\TEAM_SDU.pwn(96) : error 017: undefined symbol "params"
C:\Documents and Settings\HP_Administrateur\Bureau\Serveur Universal Life Role Play\gamemodes\TEAM_SDU.pwn(104) : warning 225: unreachable code
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


2 Errors.
Vous pourriez m'aider ?
Titre: Re : [TUTO] Commandes rapides
Posté par: Xartrick le 03 Mars 2012, 14:18:56
Serait-il possible d'avoir le code ?
Nous ne sommes pas magiciens, mais avec ça, on voit clairement les erreurs.

undefined symbol: Les symboles (variables/fonctions) dcmd_heal et params n'existent pas.
unreachable code: Ce code ne sera jamais exécuter car dans aucun cas on peut l'atteindre.