[TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]

Aller en bas

[TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]

Message par Mez le Mer 24 Juil 2013 - 0:20

Apprenons le Pawn avec Gilux !
Partie 1 : Les bases
Salut à tous, et bienvenue dans ce qui sera ma série de tutoriels sur le langage Pawn.
Je vais commencer en douceur, avec les bases du langage...


Sommaire
0) Introduction
1) Découvrir Pawno
2) La Structure d'un code.
3) Votre première instruction
4) Conclusion

0) 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  Very Happy 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)


1) 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 :


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


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.

2) La structure d'un code

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

Les directives de précompilation
Voici quelques exemples :

#include
#include
#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
Code:
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 : */

3) 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) :
Code:

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

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

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

Ce qui donne au final :
Code:

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

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.
UNE INSTRUCTION SE TERMINE TOUJOURS PAR ; (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 :

Code:
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 chaine de caractères ([tt]phrase[/tt] pour les incultes, [tt]string[/tt] pour les anglophones)
Et toute chaine de caractères doit être entourée de guillemets doubles !

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

Cela marchera sans problème !

4) 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)
En attendant la sortie de la partie 2, vous avez le temps de vous entrainer à l'aide du wiki : http://wiki.sa-mp.com/
Vous pouvez 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 !

Suite : Stuctures Utiles (Variables, Boucles, etc)






Reproduction autorisée, sous conditions Creative Commons.

Tuto réalisé pour The Pawn Zone et GTAOnline.


Source : gtaonline.net
avatar
Mez

Messages : 313
Date d'inscription : 05/05/2013
Localisation : 76

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum