• 28 Mars 2024, 13:21:49


Auteur Sujet: [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]  (Lu 57405 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
[TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« le: 21 Septembre 2010, 21:15:32 »
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  :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)


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 <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
Code: (PAWN) [Sélectionner]
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: (PAWN) [Sélectionner]
#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: (PAWN) [Sélectionner]
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: (PAWN) [Sélectionner]
if(strcmp(cmd, "/beer", true) == 0)
{
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER);
    return 1;
}

Ce qui donne au final :
Code: (PAWN) [Sélectionner]
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.
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: (pawn) [Sélectionner]
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 (phrase pour les incultes, string pour les anglophones)
Et toute chaine de caractères doit être entourée de guillemets doubles !

Reprenons le code :
Code: (pawn) [Sélectionner]
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.
« Modifié: 07 Octobre 2012, 19:51:46 par GtaManiac »

Hors ligne Hip-hop

  • *
  • Tueur en série
  • Messages: 159
    • Voir le profil
    • Grand Theft RolePlay
Re : [TUTO] On apprend le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #1 le: 21 Septembre 2010, 21:52:12 »
Joli tuto vraiment bien expliqué !  :king



Hors ligne Lacuisse

  • *
  • Messages: 4082
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #2 le: 22 Septembre 2010, 12:24:08 »
Joli tuto épinglé  :)

++

L'avenir du monde est d'additionner nos différences et non pas de les soustraires (Antoine de Saint Exupéry).

De toutes les passions, la seule vraiment respectable me parait être la gourmandise. (Guy De Maupassant)

Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #3 le: 22 Septembre 2010, 12:59:56 »
GG Gilux ça va en aider plus d'un  ;)

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #4 le: 22 Septembre 2010, 15:01:49 »
Salut, merci pour les commentaires, j'en profite pour dire que la 2e partie vient d'être postée ;)
++

Hors ligne Wati

  • *
  • Nouveau
  • Messages: 1
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #5 le: 17 Octobre 2010, 00:09:26 »
Merci !!!!!

Hors ligne jujuSAMP

  • *
  • Nouveau
  • Messages: 5
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #6 le: 19 Octobre 2010, 01:48:46 »
Merci pour ce merveilleux TUTO!

Sa ma beaucoup aidé.

Encore Merci !



Hors ligne mougoumougou

  • *
  • Nouveau
  • Messages: 12
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #7 le: 04 Novembre 2010, 21:21:05 »
#include <a_samp>


main()
{
print("\n----------------------------------");
print(" My First 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;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerConnect(playerid)
{
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
return 1;
}

public OnPlayerSpawn(playerid)
{
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}

public OnVehicleSpawn(vehicleid)
{
return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
return 1;
}

public OnPlayerText(playerid, text[])
{
return 1;
}


public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/handsup", cmdtext, true) == 0)
{
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_HANDSUP);
    return 1;
}
if (strcmp("/biere", cmdtext, true) == 0)
{
SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER);
    return 1;
    }
return 0;
}

Je ne sais pas ce qui cloche, mais quelque chose fais que mon serveur Didn't respond, ors avec LARP, mon serveur marche en local.

Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #8 le: 04 Novembre 2010, 21:34:56 »
Tu as compilé ton script et configuer ton server.cgf ?

Hors ligne mougoumougou

  • *
  • Nouveau
  • Messages: 12
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #9 le: 04 Novembre 2010, 22:10:42 »
Compilé oui, et voilà mon server.cfg :
echo Executing Server Config...
lanmode 0
rcon_password bossstif
maxplayers 50
port 7777
hostname Stifox Dm
gamemode0 Stifox 1
filterscripts
announce 0
query 1
weburl [url=http://www.sa-mp.com]www.sa-mp.com[/url]
maxnpc 0
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000

Hors ligne Zombotech_Boss

  • Fun Serveur ++
  • *
  • Tueur
  • [Banni] - Non j'dec
  • Messages: 53
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #10 le: 04 Novembre 2010, 22:34:56 »
Merci, sa ma appris des trucs que je ne connaissait pas malgré le petit bout de temps, et qui vont m'aider du coup  :laugh
Beau tuto'  ;)

Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #11 le: 05 Novembre 2010, 08:38:26 »
Citer
www.sa-mp.com
Juste une question :
Pourquoi tu mets des balises BBcode,samp reconnait l'url juste en mettent sa-mp.com  ;)

Hors ligne mougoumougou

  • *
  • Nouveau
  • Messages: 12
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #12 le: 05 Novembre 2010, 13:01:30 »
Ouais j'me suis trompé, mais jpense pas que sa vienne de là...

Hors ligne Nesik

  • *
  • Grand Banditisme
  • Messages: 674
    • Voir le profil
    • Uknow
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #13 le: 05 Novembre 2010, 13:29:25 »
Ouvre ton serveur et ajoute 127.0.0.1 des tes favoris

Hors ligne Jcvag44800

  • *
  • Grand Banditisme
  • Messages: 616
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
« Réponse #14 le: 05 Novembre 2010, 17:37:15 »
Merci !

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

Sa me met error 017: undefined symbol "cmd"