Apprendre le pawn avec Gilux

From SA-MP Wiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 03:02, 28 November 2013
Connor Mead (Talk | contribs)

← Previous diff
Revision as of 03:23, 28 November 2013
Connor Mead (Talk | contribs)

Next diff →
Line 79: Line 79:
Quand j'ai un test dont je ne suis pas sûr, je le met en FS pour le tester, après je le met en GM si il marche. Quand j'ai un test dont je ne suis pas sûr, je le met en FS pour le tester, après je le met en GM si il marche.
<br/><br/> <br/><br/>
-Une include est un fichier avec l'extension .inc qui permet d'ajouter des fonctions au serveur.+Une include est un fichier avec l'extension <span style="font-weight:bold;">.inc</span> qui permet d'ajouter des fonctions au serveur.
<br/><br/> <br/><br/>
Rappel : Les FS s'ajoutent au server.cfg sur la ligne filterscripts ! Vous pouvez aussi les charger / décharger IG avec la commande /rcon loadfs [Nom] et /rcon unloadfs [Nom] Rappel : Les FS s'ajoutent au server.cfg sur la ligne filterscripts ! Vous pouvez aussi les charger / décharger IG avec la commande /rcon loadfs [Nom] et /rcon unloadfs [Nom]
Line 113: Line 113:
Que diriez-vous de créer une commande /handsup, qui permettra au joueur de se retrouver les mains en l'air ? Que diriez-vous de créer une commande /handsup, qui permettra au joueur de se retrouver les mains en l'air ?
<br/><br/> <br/><br/>
-Pour cela, vous devez trouver la callback "OnPlayerCommandText" => Callback appelée quand un joueur tape une commande (/commande)+Pour cela, vous devez trouver la callback "OnPlayerCommandText" <span style="color:orange;">=> Callback appelée quand un joueur tape une commande (/commande)</span >
<br/><br/> <br/><br/>
NOTE : Je m'habituerai à mettre des flèches orange autour des Callbacks et des instructions pour vous en donner le sens. NOTE : Je m'habituerai à mettre des flèches orange autour des Callbacks et des instructions pour vous en donner le sens.
Line 144: Line 144:
return 0; // On retourne 0 si la commande tapée ne correspond à aucune commande listée. return 0; // On retourne 0 si la commande tapée ne correspond à aucune commande listée.
} // On referme la callback</pawn> } // On referme la callback</pawn>
-Dans ce code, on va comparer la commande à plusieurs "propositions" : La 1ère étant "Si le joueur a tapé /handsup". C'est une condition (Je vous en reparlerai plus précisément dans une prochaine partie du tutoriel). Si la condition est fausse, on passe à la suivante, etc. jusqu'à ce qu'on arrive au return 0; , ce qui signifiera que la commande ne correspond à rien (Le joueur aura un SERVER:UNKNOWN COMMAND qui s'affichera)+Dans ce code, on va comparer la commande à plusieurs "propositions" : La 1ère étant "Si le joueur a tapé /handsup". <span style="font-weight:bold;">C'est une condition</span> (Je vous en reparlerai plus précisément dans une prochaine partie du tutoriel). Si la condition est fausse, on passe à la suivante, etc. jusqu'à ce qu'on arrive au return 0; , ce qui signifiera que la commande ne correspond à rien (Le joueur aura un SERVER:UNKNOWN COMMAND qui s'affichera)
<br/><br/> <br/><br/>
Dans les commentaires, j'ai parlé de "boucle". Ce terme n'est pas très approprié car il existe les "vraies" boucles qui n'ont pas du tout ce sens (quoique...) Bref, nous verrons les boucles plus tard ^^<br/> Dans les commentaires, j'ai parlé de "boucle". Ce terme n'est pas très approprié car il existe les "vraies" boucles qui n'ont pas du tout ce sens (quoique...) Bref, nous verrons les boucles plus tard ^^<br/>
Line 152: Line 152:
Je vais maintenant revenir sur les instructions : Qu'est-ce qui caractérise une instruction ?<br/> Je vais maintenant revenir sur les instructions : Qu'est-ce qui caractérise une instruction ?<br/>
Une instruction (Ou fonction) effectue une action, les instructions se chiffrent à un peu plus de 200 avec l'include a_samp.<br/> Une instruction (Ou fonction) effectue une action, les instructions se chiffrent à un peu plus de 200 avec l'include a_samp.<br/>
-UNE INSTRUCTION SE TERMINE TOUJOURS PAR ; (A ne pas oublier !)<br/>+<spanstyle="font-weight:bold;">UNE INSTRUCTION SE TERMINE TOUJOURS PAR ";"</span> (A ne pas oublier !)<br/>
Une instruction reçoit des paramètres, donc on peut constater ici qu'elle en a reçu 2 : playerid et SPECIAL_ACTION_HANDSUP<br/> Une instruction reçoit des paramètres, donc on peut constater ici qu'elle en a reçu 2 : playerid et SPECIAL_ACTION_HANDSUP<br/>
Et maintenant, je vous donne un petit lien vers la page du wiki samp consacrée à cette instruction : http://wiki.sa-mp.com/wiki/SetPlayerSpecialAction (Comme j'avais dit, connaître l'anglais c'est mieux ^^)<br/> Et maintenant, je vous donne un petit lien vers la page du wiki samp consacrée à cette instruction : http://wiki.sa-mp.com/wiki/SetPlayerSpecialAction (Comme j'avais dit, connaître l'anglais c'est mieux ^^)<br/>
Line 173: Line 173:
<br/><br/> <br/><br/>
Ce qui veut dire en gros, que Au et Revoir ne sont ni des instructions, ni des variables...<br/> Ce qui veut dire en gros, que Au et Revoir ne sont ni des instructions, ni des variables...<br/>
-Pour résoudre ce problème, il faut savoir que Au revoir est une chaine de caractères (phrase pour les incultes, string pour les anglophones)<br/>+Pour résoudre ce problème, il faut savoir que Au revoir est une <spanstyle="font-weight:bold;">chaine de caractères</span> (phrase pour les incultes, string pour les anglophones)<br/>
-Et toute chaine de caractères doit être entourée de guillemets doubles !+<div style="font-weight:bold;">Et toute chaine de caractères doit être entourée de guillemets doubles !</div>
Reprenons le code : Reprenons le code :
Line 191: Line 191:
++ et bon script à tous ! ++ et bon script à tous !
 +==Partie 2 :Structures utiles==
 +Salut, et bienvenue dans la 2e partie de mon tutoriel PAWN.<br/>
 +Dans le 1er tuto, vous avez pu voir comment bien débuter en scripting, et créer vos premières commandes.
 +<br/><br/>
 +Maintenant, nous allons voir comment gérer les structures avancées
 +
 +===Les variables===
 +Une variable est une information (32 bits) qui va aller se loger dans la mémoire vive de votre machine. Elle permet de contenir une information comme le nom du joueur, la couleur de son pseudo et bien d'autres choses.<br/>
 +Il existe 2 catégories de variables : Les variables globales et les variables locales<br/>
 +Contrairement à une variable locale qui fonctionne uniquement entre les accolades où elle est placée, une variable globale sera utilisé dans tout le script, elle pourra être modifiée dans tous les callbacks.<br/>
 +Une variable se déclare avec le terme new, qui peut être complété par un des tags suivants, en fonction du type de variable qu'il doit retenir :
 +* bool : Booléen
 +* Float: Nombre à virgule
 +* File : Fichier
 +* text : Textdraw
 +* Menu : Menu
 +(Il n'est pas obligé d'en mettre)
 +<pawn>new Float:PositionX;
 +new Menu:tuning;
 +new File:Listeban;</pawn>
 +J'ai donc ici créé 3 variables, la 1ère stockera un nombre à virgule, le second un menu, et le dernier un fichier.<br/>
 +Note : Ne pas oublier le ; !
 +
 +On peut aussi déclarer une variable comme ça :
 +<pawn>new vie = 40;</pawn>
 +(Donner une valeur à la variable dès sa déclaration)
 +<pawn>new vie, armure, argent;</pawn>
 +(Déclarer plusieurs variables d'un seul coup (Mais on ne peut pas leur attribuer de valeur)
 +===Modifier une variable===
 +Si dans votre script, vous avez le besoin de modifier une variable, voici la syntaxe :
 +<pawn>MaVariable = 10;</pawn>
 +====Des variables spéciales : Les arrays====
 +=====Les tableaux simples=====
 +Les arrays sont des tableaux de variables. Ils vous permettent de stocker des variables sans être obligé d'en créer un nombre énorme.<br/>
 +Dans un tableau, une valeur est associée à un index. Cet index commence toujours à 0. C'est à dire qu'un tableau avec 25 index se terminera par l'index 24.
 +
 +Si cela vous est flou, voici une représentation de ces tableaux :<br/>
 +[http://i27.servimg.com/u/f27/14/77/47/47/arrays10.png http://i27.servimg.com/u/f27/14/77/47/47/arrays10.png]<br/>
 +Pour créer un array, on procède de la même manière qu'une variable, c'est à dire avec new. Voici comment créer le tableau ci-dessus :
 +<pawn>new monTableau[8];</pawn>
 +Ce code va faire (à peu près) la même chose en une ligne que ceci :
 +<pawn>new var0;
 +new var1;
 +new var2;
 +new var3;
 +new var4;
 +new var5;
 +new var6;
 +new var7;</pawn>
 +Pour assigner une variable à un index particulier du tableau, on procède comme ceci :
 +<pawn>nomDuTableau[index] = valeur;</pawn>
 +Ainsi, pour modifier la case avec l'index 4, qui est donc la <span style="font-weight:bold;">5e case</span>, on fera :
 +<pawn>nomDuTableau[4] = valeur;</pawn>
 +Les chaînes de caractères sont aussi des arrays ! Chaque caractère occupe une case. Si l'on veut stocker le mot "Salut !" dans un tableau, il faudra 7 cases (5 lettres, 1 symbole et 1 espace) + 1 pour le nullbyte (\0) qui termine la chaîne de caractères.<br/>
 +Il faut donc déclarer un tableau de 8 cases.
 +<pawn>new string[8] = "Salut !"; //
 +printf("Valeur de la 5e case (Et donc l'index 4) de mon tableau : %c",monTableau[4]); // La fonction printf envoie un texte formaté dans la console : Il peut changer en fonction de la valeur d'une variable. Ici, %c représente un caractère.</pawn>
 +Ici, la console affichera : <span style="text-decoration:underline;">Valeur de la 5e case (Et donc l'index 4) de mon tableau : t</span><br/>
 +Il existe d'autres symboles pour printf : %i pour un entier, %s pour une chaîne entière, et %f pour un flottant.
 +
 +Nous allons maintenant apprendre à utiliser ces variables, avec l'ajout de conditions.
 +
 +===Les conditions===
 +Les conditions vont permettre d'adapter le script en fonction de certains paramètres donnés.
 +<br/><br/><br/>
 +<span style="color:blue;font-family: Comic San Ms;font-size:30px;">if</span><br/>
 +La condition basique est introduite avec le mot-clé "if" qui signifie "si", et "else" qui signifie "sinon".<br/>
 +Voici un bout de code :
 +<pawn>if(GetPlayerMoney(playerid) >= 25000)
 +{
 +SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !");
 +}
 +else
 +{
 +SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p");
 +}</pawn>
 +(Ce code dira "Tu as beaucoup d'argent !" si le joueur à plus de 25000 $)
 +
 +Donc on peut remarquer que :
 +*Toute ce qui suit une condition doit être entre accolades
 +*Une condition ne prend jamais de point-virgule
 +*Si la 1ère condition n'est pas remplie, on fait ce qui correspond à "else"
 +*On utilise des signes comme >=
 +
 +{| class="wikitable centre" width="80%"
 +|+ Ces signes sont des opérateurs, en voici une liste
 +|-
 +! scope=col | Signe
 +! scope=col | Signification
 +|-
 +| width="16%" |
 +==
 +| width="16%" |
 +Egal à
 +|-
 +| width="16%" |
 +<div></div>!=
 +| width="16%" |
 +Différent de
 +|-
 +| width="16%" |
 +>
 +| width="16%" |
 +Strictement plus grand que
 +|-
 +| width="16%" |
 +<
 +| width="16%" |
 +Strictement plus petit que
 +|-
 +| width="16%" |
 +>=
 +| width="16%" |
 +Plus grand ou égal à
 +|-
 +| width="16%" |
 +<=
 +| width="16%" |
 +Plus petit ou égal à
 +|-
 +|-
 +|}
 +
 +Cette structure à un défaut : elle ne permet que de tester qu'une condition, mais cela va être corrigé maintenant :
 +
 +
 +<span style="color:blue;font-family: Comic San Ms;font-size:30px;">else if</span>br/>
 +"else if" signifie "sinon, si". Si une première condition n'est pas validée, on va continuer et chercher si la 2e est vraie, etc.... jusqu'au "else" final si aucune condition n'est validée.
 +
 +Voici un exemple commenté :
 +
 +<pawn><?php
 +
 +if(GetPlayerMoney(playerid) >= 25000) // Si le joueur possède plus de 25 000 $
 +{
 +SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !"); // On envoie le message et le script ignorera les conditions suivantes.
 +}
 +else if (GetPlayerMoney(playerid) >= 10000) // Si il ne possède pas plus de 25 000$, mais si il en possède plus de 10 000
 +{
 +SendClientMessage(playerid,0xFFFFFF,"C'est pas encore ça, mais tu as de quoi vivre ;)"); // Même chose, on envoie le message et on continue
 +}
 +else // Si il possède moins de 10000
 +{
 +SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p"); // Si les 2 premières conditions sont fausses (Il n'a pas plus de 25000, ni plus de 10000), on envoie ce message.
 +}</pawn>

Revision as of 03:23, 28 November 2013

Contents

Apprenons le Pawn avec Gilux !

Je vais commencer en douceur, avec les bases du langage...

Partie 1: Les bases

Introduction

Si vous lisez ce tutoriel, c'est que vous avez envie d'apprendre à coder en Pawn, et c'est un bon choix si vous débutez ! En effet, le pawn est un langage de programmation simple, mais puissant (quand il est maîtrisé toutefois)

Sont requis :

  • La patience, l'apprentissage complet du PAWN prend quelques mois si c'est votre premier langage de programmation, et les erreurs vont venir mettre un peu plus vos nerfs à bout  :D De plus, beaucoup de personnes veulent commencer un RP dès qu'ils apprennent, c'est la voie du suicide assurée ! (Bon allez encore passable si vous connaissez le C)
  • Une maîtrise de l'anglais correcte, en effet le langage est 100% en anglais (Pas besoin de doctorat en anglais quand même hein ^^)
  • De l'envie et de la persévérance, les bugs ne doivent pas vous rebuter...
  • GTA San Andreas version 1.0 (Au cas où...)

Sans plus attendre, débutons le tutoriel. (Je partirai du principe que vous savez ouvrir vos ports si besoin, et les risques que cela entraîne (hack) et que vous savez configurer un serveur)

Découvrir Pawno

Je vais passer tout ce qui est configuration du serveur, vous trouverez sûrement comment configurer le serveur quelque part, ici je ne parlerai que de script.
Il va vous falloir ouvrir Pawno, livré avec l'archive de votre serveur
Vous découvrez l'interface de Pawno :
pawno10.jpg

En plus des boutons classiques "Nouveau" "Ouvrir" etc, il y a 2 boutons : captur10.png

Ils servent à compiler le script, car votre serveur ne fonctionnera pas avec les fichiers .pwn mais avec les fichiers .amx (Compilés)
C'est lors de cette compilation que le logiciel vous retournera des erreurs / avertissements si il doit en retourner.

Info : Pawno est ce qu'on appelle un IDE : Integrated Development Environment. En Français, cela se traduit par Environnement de développement.
Il contient l'éditeur de code, le compilateur, et le débuggeur qui vous retournera les erreurs. Il vous évite donc d'éditer le texte et d'avoir à utiliser un autre logiciel pour compiler.

Cliquez sur "New", un code s'affichera (Comme sur le screen)
C'est la structure de base d'un code, Nous allons l'aborder plus précisément dans le prochain chapitre.

La structure d'un code

Un code a plusieurs parties, nous allons les voir ici.

Les directives de précompilation
Voici quelques exemples :

#include <a_samp>
#include <include_basique>
#define COULEUR_ROUGE 0xFF0000FF
#define GivePlayerWeapon(%0,%1,%2); GiveWeaponToPlayer(%0,%1,%2);

Ces lignes sont en haut de votre script, et sont introduites par un dièse.
Elles permettent d'inclure des includes (fichiers contenant des fonctions supplémentaires), de substituer une fonction par une autre, etc etc.

La fonction main
main()
{
    print("\n----------------------------------");
    print(" Gilux's GM");
    print("----------------------------------\n");
}

Cette fonction main est la fonction principale du script.
Elle permet juste de démarrer le serveur, il est inutile d'y toucher.

Les Callbacks

Les Callbacks sont des sortes d'évènements (OnPlayerConnect = Que faire à la connexion d'un joueur ?)
Elles se concluent toutes par un return 1; ou return 0; , Nous verrons cela plus en détail par la suite.

Les commentaires

C'est pas tellement une partie de code, mais c'est tellement utile que je vais en parler ici.
Un commentaire est une note que vous pouvez laisser, mais qui ne sera pas prise en compte dans la compilation.
C'est donc utile pour noter des crédits, des choses à faire, etc.
Un commentaire sur une ligne se commence comme cela : // et votre texte sur la ligne deviendra tout vert !
Si vous voulez mettre un commentaire sur plusieurs lignes, il faut le commencer comme cela :

/*

Et tout
Votre
Texte mis en commentaire deviendra vert !

*/

Vous l'avez remarqué, un commentaire multiligne se termine comme ça : */

Votre première instruction

Avant de commencer à scripter, il faut que je vous explique la différence entre un GameMode (GM) et FilterScript (FS) (Et include en même temps tiens !)

Un GM, c'est le script principal de votre serveur, alors qu'un FS est un script additionnel qui peut être chargé / déchargé à tout instant.
Quand j'ai un test dont je ne suis pas sûr, je le met en FS pour le tester, après je le met en GM si il marche.

Une include est un fichier avec l'extension .inc qui permet d'ajouter des fonctions au serveur.

Rappel : Les FS s'ajoutent au server.cfg sur la ligne filterscripts ! Vous pouvez aussi les charger / décharger IG avec la commande /rcon loadfs [Nom] et /rcon unloadfs [Nom]

Si vous voulez faire un GM, laissez tel quel ou utilisez ce début de code (Supprimez les #define, #if defined, OnFilterScriptInit et Exit qui correspondent aux initialisations et déchargement de FS, ce qui ne nous servira pas) :

#include <a_samp>
 
 
main()
{
    print("\n----------------------------------");
    print(" Gilux's GM");
    print("----------------------------------\n");
}
 
 
public OnGameModeInit()
{
    // Don't use these lines if it's a filterscript
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}
 
public OnGameModeExit()
{
    return 1;
}

(On se débarasse des conditions inutiles)

Nous allons commencer par un GM, histoire de pas trop nous embrouiller ^^

Que diriez-vous de créer une commande /handsup, qui permettra au joueur de se retrouver les mains en l'air ?

Pour cela, vous devez trouver la callback "OnPlayerCommandText" => Callback appelée quand un joueur tape une commande (/commande)

NOTE : Je m'habituerai à mettre des flèches orange autour des Callbacks et des instructions pour vous en donner le sens.

Voici le code à copier dans la callback (Entre les accolades d'ouverture et de fermeture)

if(strcmp(cmd, "/handsup", true) == 0)
{
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_HANDSUP);
    return 1;
}

En voici une autre, qui donnera une bouteille de bière au joueur :

if(strcmp(cmd, "/beer", true) == 0)
{
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER);
    return 1;
}

Ce qui donne au final :

public OnPlayerCommandText(playerid, cmdtext[]) // La callback
{ // On ouvre la callback 
if(strcmp(cmd, "/handsup", true) == 0) // On compare la commande et la chaîne de caractères /handsup
    { // Si la commande est /handsup, on ouvre une condition
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_HANDSUP); // On utilise une instruction
    return 1; // On retourne 1 au compilateur, ce qui veut dire que l'action a été effectuée sans problèmes.
    } // On ferme la condition car elle est finie
if(strcmp(cmd, "/beer", true) == 0) // Si le joueur n'a pas tapé /handsup, on va vérifier si la commande est "/beer", sinon on ne procèdera pas à la vérification et on sortira de la "boucle" 
    { // On ouvre les accolades si la commande est correcte, sinon on retourne 0 (commande invalide)
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER); // On donne une bouteille au joueur (instruction)
    return 1; // On retourne 1, le boulot est fait, et on sort de la "boucle"
    } // on ferme la condition
return 0; // On retourne 0 si la commande tapée ne correspond à aucune commande listée.
} // On referme la callback

Dans ce code, on va comparer la commande à plusieurs "propositions" : La 1ère étant "Si le joueur a tapé /handsup". C'est une condition (Je vous en reparlerai plus précisément dans une prochaine partie du tutoriel). Si la condition est fausse, on passe à la suivante, etc. jusqu'à ce qu'on arrive au return 0; , ce qui signifiera que la commande ne correspond à rien (Le joueur aura un SERVER:UNKNOWN COMMAND qui s'affichera)

Dans les commentaires, j'ai parlé de "boucle". Ce terme n'est pas très approprié car il existe les "vraies" boucles qui n'ont pas du tout ce sens (quoique...) Bref, nous verrons les boucles plus tard ^^
Compilez le code, et lancez le serveur : Connectez-vous et tapez /beer et /handsup, cela devrait marcher sans problème si le compilateur n'a pas renvoyé d'erreur.
N'oubliez pas de sauvegarder le script dans "Gamemodes" et non dans "filterscripts" bien entendu ::)

Je vais maintenant revenir sur les instructions : Qu'est-ce qui caractérise une instruction ?
Une instruction (Ou fonction) effectue une action, les instructions se chiffrent à un peu plus de 200 avec l'include a_samp.
<spanstyle="font-weight:bold;">UNE INSTRUCTION SE TERMINE TOUJOURS PAR ";"</span> (A ne pas oublier !)
Une instruction reçoit des paramètres, donc on peut constater ici qu'elle en a reçu 2 : playerid et SPECIAL_ACTION_HANDSUP
Et maintenant, je vous donne un petit lien vers la page du wiki samp consacrée à cette instruction : http://wiki.sa-mp.com/wiki/SetPlayerSpecialAction (Comme j'avais dit, connaître l'anglais c'est mieux ^^)
On voit 2 paramètres : playerid (Ce paramètre on a pas besoin d'y toucher, il définit tout simplement l'ID du joueur qui a tapé la commande, et par conséquent, à qui va être affectée l'action, et actionid (en cliquant sur le lien vous trouverez différentes actions, comme sortir un portable, etc etc)
Vous pouvez donc commencer à créer des commandes avec les différentes instructions (Elles sont toutes disponibles ici :
http://wiki.sa-mp.com/wiki/Category:Scripting_Functions )
Mais avant, nous allons voir comment envoyer du texte au joueur ("client")
C'est THE instruction à retenir, elle s'appelle : SendClientMessage(playerid,color,text);

Les paramètres montrent : playerid (comme j'ai dit plus haut on touche pas), color ( la couleur en héxadécimal, utilisez SA:MP Color Picker) et le texte à afficher au joueur.

Essayons une commande :

if(strcmp(cmd, "/bonjour", true) == 0)
    { 
    SendClientMessage(playerid,0x00FFFFFF,Au revoir !);
    return 1;
    }

Votre compilateur devrait vous renvoyer :
Undefined symbol "Au"
Undefined symbol "Revoir"

Ce qui veut dire en gros, que Au et Revoir ne sont ni des instructions, ni des variables...
Pour résoudre ce problème, il faut savoir que Au revoir est une <spanstyle="font-weight:bold;">chaine de caractères</span> (phrase pour les incultes, string pour les anglophones)

Et toute chaine de caractères doit être entourée de guillemets doubles !

Reprenons le code :

if(strcmp(cmd, "/bonjour", true) == 0)
    { 
    SendClientMessage(playerid,0x00FFFFFF,"Au revoir !");
    return 1;
    }

Cela marchera sans problème !

Conclusion

Ainsi se termine ce 1er tutoriel qui, je pense, aidera beaucoup de monde pour débuter.
J'ai volontairement omis la configuration (server.cfg) pour la raison que des tutos existent déjà à ce propos (Tapez créer son serveur SA:MP sur Google)
Vous pouvez aussi, par exemple, à la mort d'un joueur (OnPlayerDeath) lui retirer de l'argent (GivePlayerMoney) et lui afficher un message !
Ou vous pouvez créer des commandes pour vous remettre la vie au maximum (SetPlayerHealth) et de l'armure tant qu'on y est ! (SetPlayerArmour)

++ et bon script à tous !

Partie 2 :Structures utiles

Salut, et bienvenue dans la 2e partie de mon tutoriel PAWN.
Dans le 1er tuto, vous avez pu voir comment bien débuter en scripting, et créer vos premières commandes.

Maintenant, nous allons voir comment gérer les structures avancées

Les variables

Une variable est une information (32 bits) qui va aller se loger dans la mémoire vive de votre machine. Elle permet de contenir une information comme le nom du joueur, la couleur de son pseudo et bien d'autres choses.
Il existe 2 catégories de variables : Les variables globales et les variables locales
Contrairement à une variable locale qui fonctionne uniquement entre les accolades où elle est placée, une variable globale sera utilisé dans tout le script, elle pourra être modifiée dans tous les callbacks.
Une variable se déclare avec le terme new, qui peut être complété par un des tags suivants, en fonction du type de variable qu'il doit retenir :

  • bool : Booléen
  • Float: Nombre à virgule
  • File : Fichier
  • text : Textdraw
  • Menu : Menu

(Il n'est pas obligé d'en mettre)

new Float:PositionX;
new Menu:tuning;
new File:Listeban;

J'ai donc ici créé 3 variables, la 1ère stockera un nombre à virgule, le second un menu, et le dernier un fichier.
Note : Ne pas oublier le ; !

On peut aussi déclarer une variable comme ça :

new vie = 40;

(Donner une valeur à la variable dès sa déclaration)

new vie, armure, argent;

(Déclarer plusieurs variables d'un seul coup (Mais on ne peut pas leur attribuer de valeur)

Modifier une variable

Si dans votre script, vous avez le besoin de modifier une variable, voici la syntaxe :

MaVariable = 10;

Des variables spéciales : Les arrays

Les tableaux simples

Les arrays sont des tableaux de variables. Ils vous permettent de stocker des variables sans être obligé d'en créer un nombre énorme.
Dans un tableau, une valeur est associée à un index. Cet index commence toujours à 0. C'est à dire qu'un tableau avec 25 index se terminera par l'index 24.

Si cela vous est flou, voici une représentation de ces tableaux :
arrays10.png
Pour créer un array, on procède de la même manière qu'une variable, c'est à dire avec new. Voici comment créer le tableau ci-dessus :

new monTableau[8];

Ce code va faire (à peu près) la même chose en une ligne que ceci :

new var0;
new var1;
new var2;
new var3;
new var4;
new var5;
new var6;
new var7;

Pour assigner une variable à un index particulier du tableau, on procède comme ceci :

nomDuTableau[index] = valeur;

Ainsi, pour modifier la case avec l'index 4, qui est donc la 5e case, on fera :

nomDuTableau[4] = valeur;

Les chaînes de caractères sont aussi des arrays ! Chaque caractère occupe une case. Si l'on veut stocker le mot "Salut !" dans un tableau, il faudra 7 cases (5 lettres, 1 symbole et 1 espace) + 1 pour le nullbyte (\0) qui termine la chaîne de caractères.
Il faut donc déclarer un tableau de 8 cases.

new string[8] = "Salut !"; // 
printf("Valeur de la 5e case (Et donc l'index 4) de mon tableau : %c",monTableau[4]); // La fonction printf envoie un texte formaté dans la console : Il peut changer en fonction de la valeur d'une variable. Ici, %c représente un caractère.

Ici, la console affichera : Valeur de la 5e case (Et donc l'index 4) de mon tableau : t
Il existe d'autres symboles pour printf : %i pour un entier, %s pour une chaîne entière, et %f pour un flottant.

Nous allons maintenant apprendre à utiliser ces variables, avec l'ajout de conditions.

Les conditions

Les conditions vont permettre d'adapter le script en fonction de certains paramètres donnés.


if
La condition basique est introduite avec le mot-clé "if" qui signifie "si", et "else" qui signifie "sinon".
Voici un bout de code :

if(GetPlayerMoney(playerid) >= 25000)
{
SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !");
}
else
{
SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p");
}

(Ce code dira "Tu as beaucoup d'argent !" si le joueur à plus de 25000 $)

Donc on peut remarquer que :

  • Toute ce qui suit une condition doit être entre accolades
  • Une condition ne prend jamais de point-virgule
  • Si la 1ère condition n'est pas remplie, on fait ce qui correspond à "else"
  • On utilise des signes comme >=
Ces signes sont des opérateurs, en voici une liste
Signe Signification

==

Egal à

!=

Différent de

>

Strictement plus grand que

<

Strictement plus petit que

>=

Plus grand ou égal à

<=

Plus petit ou égal à

Cette structure à un défaut : elle ne permet que de tester qu'une condition, mais cela va être corrigé maintenant :


else ifbr/> "else if" signifie "sinon, si". Si une première condition n'est pas validée, on va continuer et chercher si la 2e est vraie, etc.... jusqu'au "else" final si aucune condition n'est validée.

Voici un exemple commenté :

<?php
 
if(GetPlayerMoney(playerid) >= 25000) // Si le joueur possède plus de 25 000 $
{
SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !"); // On envoie le message et le script ignorera les conditions suivantes.
}
else if (GetPlayerMoney(playerid) >= 10000) // Si il ne possède pas plus de 25 000$, mais si il en possède plus de 10 000
{
SendClientMessage(playerid,0xFFFFFF,"C'est pas encore ça, mais tu as de quoi vivre ;)"); // Même chose, on envoie le message et on continue
}
else // Si il possède moins de 10000
{
SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p"); // Si les 2 premières conditions sont fausses (Il n'a pas plus de 25000, ni plus de 10000), on envoie ce message.
}