• 28 Mars 2024, 12:30:55


Auteur Sujet: [Tutoriel] Passer du Pawn au Lua !  (Lu 9354 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Tux

  • *
  • Tueur en série
  • GeChaud =3
  • Messages: 112
    • Voir le profil
    • Trace - Serveur Multi Modes
[Tutoriel] Passer du Pawn au Lua !
« le: 04 Juillet 2011, 11:50:21 »
Tout d'abord, pourquoi passer à MTA San Andreas plutôt que de rester SAMP ? Si vous êtes venu sur ce tutoriel alors que vous connaissez le Pawn, c'est sûrement pour une raison. Soit, vous êtes comme moi et vous voulez ne laisser aucune limites à vos envies de créations, ou bien vous souhaitez tout simplement étendre votre champ de script (ou encore vous souhaitez créer un Role Play sur MTA, mais ça c'est une autre histoire !). Quoiqu'il en soit, vous êtes venu sur ce tutoriel pour passer du Pawn au Lua !

En effet, même si SA:MP propose pas mal de fonctions et de callback, MTA en propose beaucoup plus ce qui facilite le scripting ! Je ne dis pas que SA:MP, ce n'est pas super top, mais ça a ses limites niveau confort de programmation, et il faudra l'admettre: il manque quelques fonctions :-. En attendant que SA:MP passe à la version 0.4 ou 0.5, passer sur MTA:SA ne vous ferra pas de mal, qui plus est MTA est soutenu par une communauté aussi forte que SA:MP, seul le manque de joueurs peuvent vous causer problème.

Et oui: SA:MP est plus célèbre que MTA, je ne sais pas pourquoi et je ne veux pas le savoir ::).

Enfin bref, le plus important tout de même c'est d'apprendre à coder en Lua ! Ce tutoriel peut avoir quelques petits défauts: je connais le Lua que depuis 1 ou 2 mois.

Etape 1: La syntaxe
Le Lua s'apparente à un mélange de VB.Net et de JavaScript à mes yeux (ou pour un Squirrel si on veux). En fait, à la place des callbacks, des stocks, des publics, des forward etc de Pawn, on a des évènements qui seront gérer par des fonctions. En d'autre termes, c'est vous qui créer les Callbacks et c'est vous qui décider quand les déclencher !
Trêve de bavardage, commençons par créer un script.

Pour scripter en Lua vous devez avoir au minimum Notepad  . Allez dans le dossier MTA San Andreas/server/mods/deathmatch/resources et créez un dossier. Nommez-le comme vous le souhaitez.
/! Sur MTA, on ne parle pas exactement de Gamemode ou de Filterscript. En fait, un serveur est constitué de ressources (des compilations de scripts en masse) dont plusieurs genres existes:
- Le gamemode, que vous connaissez certainement si vous avez fait du Pawn
- Des scripts, qui sont en quelques sortes des filterscripts
- Des maps

Je sais, j'aurais dû commencer par vous apprendre à démarrer un serveur MTA car en effet ce n'est pas très facile, mais j'y reviendrai plus tard ! Donc, créez un dossier qui sera celui de votre premier Gamemode. Ne mettez aucun espace et utilisé des caractères algébriques du type A-Z, 0-9 ou a-z. Une fois ce dossier créé, allez dedans et créez un fichier meta.xml. Un fichier meta dans un script MTA, c'est un peu comme sa carte d'identité. Le fichier meta référencera les textures et les modèles à remplacer pour certains véhicules par exemple, ou encore des musiques et des images pour vos fenêtres MTA (si vous ne connaissez pas les possibilités de MTA, il est temps d'aller sur un petit serveur !). Pour en savoir plus sur les balises XML des fichiers meta.xml, rendez-vous ici.

Si vous commencez déjà à avoir des sueurs froides en lisant ce tutoriel et en ne comprenant rien, il est temps de faire le point ! En gros, ce qu'il n'y a pas sur SA:MP c'est bien les fichiers meta.xml, et aussi les fichiers.map et encore la notion de ressources, etc... Tant de choses qui peuvent vous désorienter. Pourtant, avec le temps, c'est assez simple à comprendre:
- Chaque ressources est en fait un dossier qui contient un fichier XML qui montre le chemin vers les fichiers .lua et les ressources brutes que le mode de jeu ou le script a besoin

Bon, on peut reprendre ?
Allez dans le fichier meta.xml. En plus des genres de scripts, il y a leur endroit d'exécution ! En effet, un code doit s'exécuter soit côté client soit côté serveur. Un script côté server gère en quelque sortes tous les joueurs, et un script client un joueur. En plus de cela, vous pouvez créer plusieurs scripts .lua pour votre mode de jeu. Plutôt déboussolant ? Pas vraiment: vous pouvez en effet comme cela ranger vos bouts de codes plus facilement ! Je ne vous incite pas à faire un script par évènement ! Revenons-en au fichier meta.xml. Commencez par ajouter la balise <meta> à votre fichier (si vous avez des notions de xHTML, il est temps des les appliquer !) comme ceci:

Code: (html4strict) [Sélectionner]
<meta>

</meta>


Ajoutez une balise entre ces deux là nommé <info />. A l'intérieur de cette balise, vous devez mettre différents attributs pour définir votre script (nom d'auteur, etc) comme cet exemple:

Code: (html4strict) [Sélectionner]
<meta>
    <info author="ZizouDu94" name="Mon GAMEMODE!!!" description="Mon premier Game Mode !!!" type="gamemode" />
</meta>

Vous pouvez aussi ajouter un attribut "version" si ça vous chante. Ensuite, créez dans le dossier un fichier nommé global_server.lua puis revenez-en à notre meta.xml et ajoutez ceci:
Code: (html4strict) [Sélectionner]
<meta>
    <info author="ZizouDu94" name="Mon GAMEMODE!!!" description="Mon premier Game Mode !!!" type="gamemode" />
    <script src="global_server.lua" type="server" />
</meta>
La balise script, comme vous le voyez, permet d'ajouter des scripts .lua à votre gamemode, par défaut ceux qui sont dans le dossier, mais vous pouvez par exemple mettre les scripts serveurs dans un dossier "server" et faire:
Code: (html4strict) [Sélectionner]
<meta>
    <info author="ZizouDu94" name="Mon GAMEMODE!!!" description="Mon premier Game Mode !!!" type="gamemode" />
    <script src="server/global_server.lua" type="server" />
</meta>
Notez aussi la balise type qui est optionnel pour les scripts côté serveur.
Ensuite, revenons-en à notre script en .lua. Il est temps de commencer votre premier script .lua en vous inspirant du Pawn !

Etape 2: Les petites différences entre le Pawn et le Lua

Les commentaires sur le Lua: on passe du "//" et du "/* */" au "--" et au "--[[ ]]". Rien de compliqué non ? Voici un exemple:
Code: (lua) [Sélectionner]
--[[ Ceci est un commentaire multilignes.
Je peux le taper sur plusieurs lignes.
Tapez sur entrer pour sauter une ligne !]]
function sayHello ( player )
    outputChatBox ("Hello " .. getPlayerName ( player ), 110, 0, 0, false )
end
-- Ceci est un commentaire monoligne

Côté variables, on passe du "static" et du "new" au "" et au "local". En d'autres termes, pour créer des variables globales, vous n'écrivez rien ! Aussi, les variables se convertissent automatiquement, sauf exception. Vous pouvez créer un tableau en faisant: tableau = { } par exemple. Pour l'initialiser: tableau = {4, 3, 1}. Les index de tableau commence à partir de 1 contrairement au Pawn. Et en passant, la fonction random sous Lua est différente: math.random(mini, max). Pour les strings, c'est comme si vous créer des variables normales. Il n'est pas vraiment utile de faire un formatage ensuite pour régler ce string avec des variables. Exemple: "local string = variable1 .. " est égale à " .. variable 2". Notez aussi qu'il n'y a pas besoin ni de parenthèses pour les if, les else if et les else, ni de ";" et ni de "{ }". Nous verrons cela plus tard. Voici un exemple de variables:
Code: (Lua) [Sélectionner]
possibilites = { 5, 7, 35, 54, 23, 2 )
function randAddition( num1 )
   local result = num1 possibilites[math.random ( 1, #possibilites )]
   outputChatBox("Le résultat au hasard est: "..result )
end

Il y a pleins d'autres différences, le meilleur est de se rendre sur le wiki de Lua: ici.

Etape 3: Un premier "callback" !
Donc, il n'y a pas de Callbacks. A la place, il y a des évènements qui seront "accrocher" à des fonctions. Voici un exemple:
Code: (Lua) [Sélectionner]
function unJoueurRejointLeServeur ( )
   outputChatBox ( "Bienvenue sur mon serveur, " .. getPlayerName ( source ), source) -- Vous remarquez que par défaut, la variable source est créer par les évènements pour une fonction
end
addEventHandler ( "onPlayerJoin", getRootElement ( ), unJoueurRejointLeServeur ) -- getRootElement cherche en fait l’élément clef qui a produit cette évènement.

Il y a tant d'autres choses à dire sur le Lua. Je ne pourrais pas tout décrire ici et de plus je manque de temps, mais l'envie m'a pris de faire ce petit tutoriel pour attirer quelques curieux. Pour retrouver tous les évènements, fonctions et autres de MTA, rendez-vous sur le Wiki de MTA (en anglais): http://wiki.multitheftauto.com. Si vous n'avez pas appris l'anglais et que vous avez appris le Pawn, vous êtes sans doutes limités dans les possibilités sur SA:MP, et donc je doute que ce tutoriel ait une quelconque utilité pour vous (;.

Sur ce, bon scripting !
« Modifié: 05 Juillet 2011, 17:16:36 par Citizen »

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : [Tutoriel] Passer du Pawno au Lua !
« Réponse #1 le: 04 Juillet 2011, 12:29:42 »
Sympa comme initiative, malgré quelques fautes d'orthographe.
Ne confond pas pawno qui est un logiciel et le pawn qui est le langage, puis j'éviterai d'utiliser callback pour utiliser le mot event, mais c'est pareil ^^

GG



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne ApocKalipsS

  • *
  • Gangster
  • **** | Une experience GTA IV hors du commun !
  • Messages: 1141
    • Voir le profil
Re : [Tutoriel] Passer du Pawno au Lua !
« Réponse #2 le: 04 Juillet 2011, 17:17:48 »
Pas mal, finalement c'est proche du Squirrel.

Hors ligne Tux

  • *
  • Tueur en série
  • GeChaud =3
  • Messages: 112
    • Voir le profil
    • Trace - Serveur Multi Modes
Re : Re : [Tutoriel] Passer du Pawno au Lua !
« Réponse #3 le: 05 Juillet 2011, 10:02:41 »
Pas mal, finalement c'est proche du Squirrel.

Oui mais pas que ;).
Comme je le disais, on peut aussi le rapprocher au JavaScript, qui plus est le point virgule n'est pas obligatoire (mais fortement conseillé) et on retrouve ce même système d'évènement, ce qui a ses côté pratiques.

Hors ligne Citizen

  • Scripteur LUA confirmé
  • *
  • Messages: 235
    • Voir le profil
    • Byston Evolution
Re : [Tutoriel] Passer du Pawn au Lua !
« Réponse #4 le: 05 Juillet 2011, 17:56:29 »
Merci Tux et salut  :happy
Alors je me suis permis de corriger les fautes d’orthographes ainsi que ton exemple randAddition qui ne pouvais pas du tout fonctionner.
Et par contre je ne l'ai pas modifier car c'est TON tutoriel et tes mots mais:
Citer
getRootElement() cherche en fait l’élément clef qui a produit cette évènement.
est pour moi complétement faut je dirais plutôt:
Citer
le 2ème argument sert à définir les éléments qui sont "autorisés" à être la "source" de cet événement. getRootElement() signifie tous les éléments du serveur.



Sinon pour ceux que ça intéresse, je traduis ( quand j'ai le temps ) le wiki de MTA, et toute aide ne serai pas de refus  :cheers .
http://wiki.multitheftauto.com/wiki/FR/Page_Principale
( je vais faire un nouveau sujet pour ça )

Cordialement,
          Citizen
The rEvolution is coming ...

Hors ligne Tux

  • *
  • Tueur en série
  • GeChaud =3
  • Messages: 112
    • Voir le profil
    • Trace - Serveur Multi Modes
Re : Re : [Tutoriel] Passer du Pawn au Lua !
« Réponse #5 le: 08 Septembre 2011, 13:22:22 »
Merci Tux et salut  :happy
Alors je me suis permis de corriger les fautes d’orthographes ainsi que ton exemple randAddition qui ne pouvais pas du tout fonctionner.
Et par contre je ne l'ai pas modifier car c'est TON tutoriel et tes mots mais:
Citer
getRootElement() cherche en fait l’élément clef qui a produit cette évènement.
est pour moi complétement faut je dirais plutôt:
Citer
le 2ème argument sert à définir les éléments qui sont "autorisés" à être la "source" de cet événement. getRootElement() signifie tous les éléments du serveur.



Sinon pour ceux que ça intéresse, je traduis ( quand j'ai le temps ) le wiki de MTA, et toute aide ne serai pas de refus  :cheers .
http://wiki.multitheftauto.com/wiki/FR/Page_Principale
( je vais faire un nouveau sujet pour ça )

Cordialement,
          Citizen

M'okay merci, ça m'aidera sûrement pour la suite.

Amicalement.