[TUTORIEL] zcmd && sscanf

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

maxya

Membre
May 13, 2011
12
0
421
I - Le commencement :

Salut la communauté !

Vous connaissez déjà SA:MP (Le multi-joueurs de GTA : san andreas) et le Pawn ? Vous vous débrouillez pas mal avec de petits script par ci par là, vous créez des commandes basiques, mais votre problèmes c'est que vous ne savez pas crée des commandes dynamiques qui vont affectés les autres joueurs ? Alors ce tutoriel est pour vous ! Ont va apprendre ensemble à crée des commandes dynamiques qui vont affecter les autres joueurs et pas que vous, vous pouvez maintenant enfin (ou presque) vous passez du ennuyeux playerid, pour cela ont va utilisé un couple de plugin, un duo, qui sont: zcmd et sscanf version 2 .

Vous êtes prêt ? Alors, allons y !

Voilà, on va enfin commencer a créé nos commandes, mais attendez ! Il nous faudra d'abord télécharger nos includes et les ajouter a notre dossier pawno pour cela, rendez vous ici:

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris! qui contiens notre include sscanf .

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris! qui contient notre include zcmd .

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Une fois ces deux includes télécharger, vous aurez une archive .rar pour sscanf, et un fichier .inc pour zcmd .

1406087323-scanfzcmd.png

On va commencé par l'étape la plus délicate celle du sscanf, vous allez ouvrir votre dossier pawno et en même temps votre archive sscanf, ensuite vous aller extraire sscanf2.inc qui se trouve pawno/include de votre archive dans le répertoire pawno/include de votre dossier pawno, vous allez faire de même pour plugin par contre le dossier sscanf vous aller directement le placez à la racine de votre dossier pawno avec le samp-server.exe .

Si vous ne trouvez pas le dossier plugin créez le puis mettez y le contenu de plugin qui se trouve dans l'archive .

Au final vous aurez quelque chose qui ressemble à ça .

1406087820-dossie.png

Puis pour le zcmd c'est extrêmement facile puisqu'il suffit de prendre le fichier zcmd.inc et le mettre dans pawno/include de votre dossier pawno .

Enfin vous devez alleer dans votre fichier server.cfg qui se trouve dans la racine de votre dossier pawno et y rajouté cette ligne .

Code:
plugins sscanf

Si plugins y est déjà ajoutez simplement sscanf dans la même ligne précédé d'un espace .

1406091903-plug.png

II - Sscanf kézako ? :

Eh bien mes chèrs petits, sscanf est un plugin crée par Alex alias Y_Less, et ce plugin est très utile car il permet de décomposer une variable de type string en plusieurs variables, c'est un peu comme la méthode split qui est utilisé en C++ ou encore en python et donc nous allons dès a présent voir comment utilisé cette include.

Tous d'abord on doit include le plugin, pour cela allez en haut de votre GM et tapez ceci:

Code:
#include <sscanf2>

Voilà maintenant notre plugin est inclu à notre GM ! Maintenant on va enfin pouvoir rencontrer la fonction sscanf, mesdames et messieurs veuillez accueillir la célèbre l'unique la merveilleuse fonction sscanf !

Code:
sscanf(string, spef, resul1, resul2);

Le premier argument de cette fonction que j'ai appeler string doit être une chaîne de caractère, et c'est de cette chaîne de caractère qu'on va découper, c'est donc cette argument qui dans notre exemple va contenir "Hello world !" .

Le premier argument de cette fonction que j'ai appelé string doit être une chaîne de caractère et c'est de cette chaîne de caractère qu'on va découper, c'est donc cet argument qui dans notre exemple va contenir "Hello world !" .

Le deuxième argument que j'ai appelé spécificateur sert à aider la fonction sscanf et lui indiquer comment elle doit extraire la chaîne de caractère principale dans plusieurs variables (3ème paramètre), est ce qu'elle doit l’extraire sous forme de 3 strings ou sous forme de seulement 2 string ou pourquoi pas sous forme d'un string suivi d'un int ou d'un float ou pourquoi seulement en un float, dans notre cas ce sera 3 strings puisqu'on a " Hello " puis " world " puis " ! ".

je tiens aussi a préciser que sscanf découpe (par défaut) a chaque fois qu'elle rencontre le premier espace, sscanf considère qu'on passe à une nouvelle valeur lorsqu'elle rencontre un espace, et ensuite suivant la spécification il va extraire ou non la valeur dans une variable

Pour dire à sscanf d'extraire à chaque fois qu'elle rencontre un signe que nous choisissons, il suffit d'ajouté un spécificateur p suivis de deux crochets, et entre les deux crochets ont mets le signe "séparateur". exemple:

Code:
sscanf(variable, "p<|>fi", var1, var2);

Maintenant sscanf va extraire à chaque fois qu'elle va rencontrée un "|" .

Enfin les derniers arguments, c'est dans quelles variables mettre ce qu'on vient d'extraire suivant les spécifications, par exemple si dans spef on précise string puis integer, alors resul1 doit être de type string et resul2 doit être de type int, dans notre exemple on doit avoir 3 variables de type string la première qu'on appellera contiendra resul1 contiendra "Hello" puis la deuxième resul2 contiendra "world" et la troisième resul3 contiendra "!" .

Mais concrètement, qu'est-ce que cela donne ? Nous allons tous d'abord déclaré une variable de type string qui contiendra "Hello world !" et 3 variables de type string vide .

Code:
new test[15] = "Hello world !";
new a[10] = "";
new b[10] = "";
new c[3] = "";

Ensuite je vais allé au main et je tape ça .

Code:
main()
{
    sscanf(test, "s[6]s[6]s[3]", a, b, c);

    printf("La variable a contient: %s", a);
    printf("La variable b contient: %s", b);
    printf("La variable c contient: %s", c);
}

Et donc quand je lance le samp-server j'ai belle et bien .

1406091389-cmd.png

Explications du code, tous d'abord on déclare 4 variables de type string dont l'une contiens notre hello world, ensuite avec la fonction sscanf on extrait la variable string en 3 morceaux qu'on stock dans les variables a, b et c puis on affiche . Comme vous avez pus le remarquer les spécificateurs doivent être entre double guillemets (donc une chaîne de caractère) et aux seins de ces derniers, vous mettez ces derniers comme expliquer ci-dessus, pour une liste complète des spécificateurs je vous invite à aller lire la Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris! très simple .

III - Zcmd c'est bon pour la santé ! :

Pour commencé ont dois d'abord inclure zcmd ce qui est relativement facile .

Code:
#include <zcmd>

Après avoir fait cela, nous allons voir comment crée une commande zcmd, pour cela il y'a 4 façons différentes pour le faire .

Ce que je vous conseil de faire c'est soit :

Code:
COMMAND:macommande(playerid, params[])
{
    return 1; 
}

Soit:

Code:
CMD:macommande(playerid, params[]) 
{
  return 1; 
}

Mais vous pouvez aussi utilisé:

Code:
command(macommande, playerid, params[]) 
{
  return 1; 
}

ou encore:

Code:
cmd(macommande, playerid, params[])
{
  return 1;
}

Mais ces deux dernières commencent a devenir obsolète et je vous conseille pas de les utilisé .

Tous au long de ce tutoriel je vais travaillé avec CMD:macommande(playerid, params[]) mais rien ne vous empêche d'utilisé un autre style .

Analysons le code:

Au début nous tapons CMD:macommande jusqu'ici rien de sorcier, mais analysons les paramètres, au début nous avons le classique playerid qui définit l'id du joueur qui a tapé la commande, puis nous avons params[] qui est une chaîne de caractère qui contient tous qu'on écrit après macommande et là si vous êtes un peu malin vous devez voir le lien qui existe entre zcmd et sscanf, non vous ne l'avez pas trouver ? Ce n'est pas grave, essayons de faire une commande /v id_du_véhicule_a_crée qui crée un véhicule que le joueur choisit en tapant l'id du véhicule après la commande /v, et qui met le joueur dedans .

Même si la commande c'est /v dans CMD:macommande(playerid, params[]) on ne fais que v sans le / ce qui va donner dans notre cas CMD:v(playerid, params[])

Nous allons allé à la toute fin de notre GM puis nous allons tapé .

Code:
CMD:v(playerid, params[])
{
    new vehicle = 0;

    if(!sscanf(params, "i", vehicle))
    {
        new float:fPosX = 0.0, float:fPosY = 0.0, float:fPosZ = 0.0, float:fPosAngle = 0.0;
        new iVehicleID = 0;

        GetPlayerPos(playerid, fPosX, fPosY, fPosZ);
        GetPlayerFacingAngle(playerid, fPosAngle);
        iVehicleID = CreateVehicle(vehicle, fPosX, fPosY, fPosZ, fPosAngle, 0, 1,60);
        PutPlayerInVehicle(playerid, iVehicleID, 0);

    }
    else SendClientMessage(playerid, 0xFFFFFFFF, "Astuce: /v <id_vehicule>");

    return 1;
}

Explication du code:

au début on regarde si le joueur qui tape la commande est belle et bien connecter, s'il est connecté on crée la variable de type integer qui va contenir l'id du véhicule, ensuite on va utiliser sscanf pour extraire le contenu de params (la chaîne qui contient nos paramètres), et ce dans notre variable vehicle, vous pouvez, remarquer que le spécificateur est un integer (i), si ce n'est pas un integer, on envoie au joueur un message "Astuce: /v <id_vehicule>", mais si c'est bien un integer, on crée des variables pour récupérer les coordonnées du joueur ainsi que l'angle ou il regarde et une variable iVehicleID qui va contenir le véhicule qu'on va créer .

Ensuite, on récupère la position du joueur ainsi que l'angle ou il regarde, puis on crée un véhicule qui aura les mêmes coordonnées que le joueur ainsi que le même angle de vue, remarquez le premier paramètre de CreateVehicle qui est notre "vehicle" qui définit l'id du véhicule a créé, enfin on met le joueur dans le véhicule à la place conducteur et si tous ça marche bien on fait un return 1 pour dire que la commande c'est bien exécuté .

Une fois que vous utilisé zcmd oubliez la callback OnPlayerCommandText, elle ne peut plus être utilisé !

IV - Remerciement :

Je tiens à remercier toutes les personnes qui m'ont aidé à apprendre le Pawn et qui m'ont aider sur ce forum: Kiloute (qui m'a beaucoup aidé pour ce tutoriel) ,Gilux, Ssk, Xolokos, Infu, Xartrick, Gzsume ainsi que tous les autres que j'ai malheureusement oublié .

PS: ce tuto est à moi sous-license CC-BY ce qui veux dire que vous pouvez en faire ce que vous voulez à condition de précisez que j'en suis l'auteur (maxia ou maxya) .

PPS: Un petit merci ça fais toujours plaisir :) !

Voila si vous ne comprenez pas bien un truc dîtes le moi ! .