• 06 Mai 2024, 03:50:33


Auteur Sujet: [BIG TUTO] zcmd && sscanf2  (Lu 5084 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne maxya

  • *
  • Tueur en série
  • Messages: 158
    • Voir le profil
[BIG TUTO] zcmd && sscanf2
« le: 02 Août 2014, 04:12:32 »
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:

- sscanf: qui contiens notre include sscanf .

- zcmd: qui contient notre include zcmd .

- Et si ce n'est déjà fais le dossier pawno .

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


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 .


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 .

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


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:

#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 !

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:

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 .

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

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

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 .


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 documentation très simple .

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

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

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

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

Soit:

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

Mais vous pouvez aussi utilisé:

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

ou encore:

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é .

CMD:v(playerid, params[])
{
    if(IsPlayerConnected(playerid))
    {
        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>");
    }
        else SendClientMessage(playerid, 0xFFFFFFFF, "Error !");

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

PS2: Je l'ai aussi mit sur ZDS: http://zestedesavoir.com/tutoriels/off/401/pawn-utilise-zcmd-et-sscanf/

PS3: Svp, si un admin peut me faire la mise en forme, je ne suis pas très bon en design et tous ça  :smile: .

Voila si vous ne comprenez pas bien un truc dîtes le moi ! .
« Modifié: 02 Août 2014, 22:36:21 par maxya »

Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : [BIG TUTO] zcmd && sscanf2
« Réponse #1 le: 02 Août 2014, 11:43:33 »
Plutôt bon dans l'ensemble, par contre je doute que l'appellation "BIG TUTO" soit vraiment méritée
Et on peut remarquer pas mal d'erreurs qui auraient pu être facilement évitées

Citer
- Et si ce n'est déjà fais le dossier pawno .
Tu as écrit ce texte avec un lien de téléchargement vers les dossiers pour faire un serveur, il faut le préciser

Citer
Une fois ces deux includes télécharger
zcmd est bien une include, mais sscanf est un plug-in (qui nécessite un .inc pour fonctionner en effet)

Citer
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 .
Il y a plus simple: extraire sscanf.rar dans la racine des fichiers du serveur (là où se trouvent les dossiers "gamemodes", "filterscripts", etc)

Citer
Le deuxième argument que j'ai appelé marqueurs
Le nom correct serait plutôt "formatage"

Citer
comment elle doit découper la chaîne
Ce n'est pas du découpage, sscanf s'occupe juste d'extraire ce que contient la chaîne dans des variables en suivant la formatage

Citer
je tiens aussi a préciser que sscanf découpe a chaque fois qu'elle rencontre le premier espace !
Il faut être plus clair: sscanf considère qu'on passe à une nouvelle valeur lorsqu'il rencontre un espace (sauf pour les string), et ensuite suivant le formatage il va extraire ou non la valeur dans une variable

Citer
c'est dans quelles variables mettre ce qu'on vient de découper suivant les marqueurs
Être plus clair la encore: ce sont des variables qui vont recevoir les valeurs extraites, suivant le formatage

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

Citer
on découpe la variable string en 3 morceaux
Encore une fois ce n'est pas du découpage, c'est de l'extraction

Citer
les marqueurs doivent être entre double guillemets et aux seins de ces derniers, vous mettez vos marqueurs comme expliquer ci-dessus, pour une liste complète des marqueurs je vous invite à aller lire la documentation très simple .
Le formatage doit être une chaîne de caractère en effet, comme dans la fonction format()

Citer
Au début nous tapons CMD:macommande jusqu'ici rien de sorcier
Et pourtant il faut clarifier ça:
Tu crées une callback qui sera appelée lorsque la commande "/macommande" sera tapée

Citer
au début on regarde si le joueur qui tape la commande est belle et bien connecter
Ce qui est assez useless, un joueur ne risque pas de taper une commande sans être connecté

Citer
avec sscanf on prend ce qui a été écrit après /v (notre commande), puis on le met dans la variable vehicle,
Tu pourrais être plus clair:
On va utiliser sscanf pour extraire le contenu de params (la chaîne qui contient nos paramètres), et ce dans notre variable vehicle

Citer
Une fois que vous utilisé zcmd oubliez la callback OnPlayerCommandText, elle ne peut plus être utilisé !
Si, elle le peut (mais le code ZCMD sera toujours exécuté avant OnPlayerCommandText)

Citer
PS3: Svp, si un admin peut me faire la mise en forme, je ne suis pas très bon en design et tous ça
Tu as fait un tuto, c'est à toi de bien mettre en forme et non aux Administrateurs de faire le travail pour toi...

PS: C'est "PPS", "PPPS", et non pas "PS2", "PS3" ^^

[/url]

Hors ligne maxya

  • *
  • Tueur en série
  • Messages: 158
    • Voir le profil
Re : [BIG TUTO] zcmd && sscanf2
« Réponse #2 le: 02 Août 2014, 14:46:24 »
Merci kiloutre je vais modifié ça après (c'est mon premier tuto), mais je ne suis pas d'accord avec toi sur le fait qu'on puisse toujours utilisé OnPlayerCommandText, j'ai essayé de l'utilisée en même temps que zcmd et elle n'a pas fonctionnée .

Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : Re : [BIG TUTO] zcmd && sscanf2
« Réponse #3 le: 02 Août 2014, 16:45:01 »
Merci kiloutre je vais modifié ça après (c'est mon premier tuto), mais je ne suis pas d'accord avec toi sur le fait qu'on puisse toujours utilisé OnPlayerCommandText, j'ai essayé de l'utilisée en même temps que zcmd et elle n'a pas fonctionnée .
Le code de ZCMD va, si jamais il ne trouve pas la commande, appeler OnPlayerCommandText
Donc en effet, il est impossible d'avoir la même commande sur ZCMD et dans OnPlayerCommandText (ce qui serait inutile), mais il est néanmoins toujours possible de se servir de OnPlayerCommandText si ZCMD est inclus

[/url]

Hors ligne maxya

  • *
  • Tueur en série
  • Messages: 158
    • Voir le profil
Re : [BIG TUTO] zcmd && sscanf2
« Réponse #4 le: 02 Août 2014, 19:17:41 »
D'accord Kiloutre merci pour l'info je ne savait pas, sinon j'ai modifié le tutoriel et j'ai repris quelque une de tes phrase si ça ne te dérange pas . Si vous avez d'autres remarques, je suis ouvert à toutes critiques  :smile: .