Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
Connexion avec identifiant, mot de passe et durée de la session

 
avancée

254644 Messages dans 14035 Fils de discussion- par 6616 Membres - Dernier membre: louloufcb

21 Mai 2012 à 20:18:56
GTAOnline.frSan Andreas MultiplayerScripting SA-MP [Pawn center]Tutoriels et références SA:MP (Modérateurs: S!m, Xartrick)[TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]
Pages: [1] 2 3 ... 5   Bas de page
Imprimer
Auteur Fil de discussion: [TUTO] Apprenons le Pawn avec Gilux ! [Partie 1 : Les bases]  (Lu 9650 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Gilux
Hors ligne Hors ligne

GTAOnline Addict
*

Messages: 1296


WWW
« 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  Très souriant 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)
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)
#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)
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)
if(strcmp(cmd, "/beer", true) == 0)
{
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER);
    return 1;
}

Ce qui donne au final :
Code: (PAWN)
<?php // Ne prêtez pas attention à ceci, c'est pour que le code soit en couleur ^^

public OnPlayerCommandText(playeridcmdtext[]) // 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 Roulement d'yeux

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 (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:
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.
« Dernière édition: 05 Janvier 2012 à 12:13:55 par Gilux » Journalisée


Hip-hop
Hors ligne Hors ligne

Tueur en série
*

Messages: 163


WWW



« Répondre #1 le: 21 Septembre 2010 à 21:52:12 »

Joli tuto vraiment bien expliqué !  king
Journalisée



Kerozen
Administrateur IG
Hors ligne Hors ligne


Admin Lalu's Stunt
GTAOnline Addict
*

Yé soui el capiténe

Messages: 1414






« Répondre #2 le: 22 Septembre 2010 à 02:24:45 »

J'avais envi de me mettre au Pawn... ça va sûrement m'aider ! Merci Sourire
Journalisée


aka Watash

Stunting since '07... "Vice City, do you remember?"
Lacuisse
Hors ligne Hors ligne


Administrateur
GTAOnline Fan Boy
*

Messages: 1587


« Répondre #3 le: 22 Septembre 2010 à 12:24:08 »

Joli tuto épinglé  Sourire

++

Journalisée





L'avenir du monde est d'additionner nos différences et non pas de les soustraires (Antoine de Saint Exupery).
Nesik[Z&B]
"Les meufs bien se font rare comme les capotes en Afrique" - Falcko
Hors ligne Hors ligne


GTAOnline Big Member
*

Le plus important est de rester soit même !

Messages: 646


WWWNesik44

« Répondre #4 le: 22 Septembre 2010 à 12:59:56 »

GG Gilux ça va en aider plus d'un  Clin d'oeil
Journalisée

Miami RP V5 ...
Gilux
Hors ligne Hors ligne

GTAOnline Addict
*

Messages: 1296


WWW
« Répondre #5 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 Clin d'oeil
++
Journalisée


Wati
Hors ligne Hors ligne

Petit nouveau
*

Messages: 1


Oui

« Répondre #6 le: 17 Octobre 2010 à 00:09:26 »

Merci !!!!!
Journalisée
jujuSAMP
Hors ligne Hors ligne

Petit nouveau
*

Messages: 6


« Répondre #7 le: 19 Octobre 2010 à 01:48:46 »

Merci pour ce merveilleux TUTO!

Sa ma beaucoup aidé.

Encore Merci !


Journalisée
mougoumougou
Hors ligne Hors ligne

Petit nouveau
*

Messages: 12


« Répondre #8 le: 04 Novembre 2010 à 21:21:05 »

Code:
#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.
Journalisée
Nesik[Z&B]
"Les meufs bien se font rare comme les capotes en Afrique" - Falcko
Hors ligne Hors ligne


GTAOnline Big Member
*

Le plus important est de rester soit même !

Messages: 646


WWWNesik44

« Répondre #9 le: 04 Novembre 2010 à 21:34:56 »

Tu as compilé ton script et configuer ton server.cgf ?
Journalisée

Miami RP V5 ...
mougoumougou
Hors ligne Hors ligne

Petit nouveau
*

Messages: 12


« Répondre #10 le: 04 Novembre 2010 à 22:10:42 »

Compilé oui, et voilà mon server.cfg :
Code:
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
Journalisée
Zombotech_Boss
Fun Serveur ++
Hors ligne Hors ligne

Criminel entrainé
*

[Banni] - Non j'dec

Messages: 51


« Répondre #11 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'  Clin d'oeil
Journalisée

Nesik[Z&B]
"Les meufs bien se font rare comme les capotes en Afrique" - Falcko
Hors ligne Hors ligne


GTAOnline Big Member
*

Le plus important est de rester soit même !

Messages: 646


WWWNesik44

« Répondre #12 le: 05 Novembre 2010 à 08:38:26 »

Citation
Juste une question :
Pourquoi tu mets des balises BBcode,samp reconnait l'url juste en mettent sa-mp.com  Clin d'oeil
Journalisée

Miami RP V5 ...
mougoumougou
Hors ligne Hors ligne

Petit nouveau
*

Messages: 12


« Répondre #13 le: 05 Novembre 2010 à 13:01:30 »

Ouais j'me suis trompé, mais jpense pas que sa vienne de là...
Journalisée
Nesik[Z&B]
"Les meufs bien se font rare comme les capotes en Afrique" - Falcko
Hors ligne Hors ligne


GTAOnline Big Member
*

Le plus important est de rester soit même !

Messages: 646


WWWNesik44

« Répondre #14 le: 05 Novembre 2010 à 13:29:25 »

Ouvre ton serveur et ajoute 127.0.0.1 des tes favoris
Journalisée

Miami RP V5 ...
Pages: [1] 2 3 ... 5   Haut de page
Imprimer
Aller à:  

Theme créé par padexx et modifié par GTAOnline.fr
Page générée en 0.574 secondes avec 23 requêtes.
Forum GTAOnline.fr 2.0 | Design par : Lalu et GtaManiac
Merci a toute la communaute pour son support !
Copyright © 2004-2012 - GTAOnline.fr | GTAPro.com | Contact