Salut,
J'ai eu envie de créer un topic pour recenser les trucs et astuces à connaître lorsqu'on développe avec le langage Pawn. Certaines sont évidentes, d'autres un peu plus mystérieuses... L'objectif de ce topic est donc d'apprendre de nouvelles choses, que vous soyez un vétéran ou un débutant. N'hésitez pas à contribuer, ce serait cool de prolonger la liste avec vos connaissances.
Fonctions de type public
On peut déclarer une fonction de type public de la manière suivante :
forward public Fonction();
L'intérêt n'est pas énorme, mais ça permet de mieux s'y retrouver si vous développez des scripts un peu longs.
Concaténation et arguments
Il est possible de concaténer des chaînes de caractères passées en arguments d'une fonction. Exemple avec un message envoyé aux joueurs :
#define CLR_BLEU "{0000FF}"
SendClientMessageToAll(-1, "Cette phrase écrite en blanc" CLR_BLEU "devient bleue");
Index de boîtes de dialogue
Plutôt que d'utiliser le code suivant pour définir les index de vos boîtes de dialogue :
#define DIALOG_INSCRIPTION (1)
#define DIALOG_CONNEXION (2)
#define DIALOG_CHOIXTEAM (3)
...
Vous pouvez utiliser un simple énumérateur, de cette façon :
enum
{
DIALOG_INSCRIPTION,
DIALOG_CONNEXION,
DIALOG_CHOIXTEAM
};
// Au moment de créer votre boîte de dialogue
ShowPlayerDialog(playerid, DIALOG_INSCRIPTION, ...);
Par défaut, le premier élément d'un énumérateur portera l'index 0 et s'incrémentera de 1 pour chaque élément suivant. Les deux codes sont donc identiques, même si le premier ne consommera aucune place en mémoire (les directives de préprocesseurs n'étant pas présentes dans la version compilée). L'avantage, c'est que si vous supprimez une boîte de dialogue en cours de route, les index continueront de se suivre, puisque énumérateur les attribue dynamiquement (j'entends par là, à chaque compilation et ce de manière automatique).
OnGameModeExit()
Ce n'est pas une astuce mais un petit truc à savoir, la callback OnGameModeExit() n'est pas appelée lorsque vous fermez le processus du serveur (aka. la console) via la croix rouge. Par contre, il est correctement appelé lorsque vous tapez exit dans la console, comme c'est normalement attendu.
Erreurs de compilation personnalisées
Il est possible de créer ses propres erreurs de compilation avec le mot-clé de préprocesseur #error. Un petit exemple :
main()
{
#if !defined TEST
#error Ceci est une erreur
#endif
}
Affichage lors de la compilation :
C:\Users\...\tests.pwn(6) : fatal error 111: user error: Ceci est une erreur
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
1 Error.
Fonctions de type public et gmx
Les fonctions de type public présentes dans des filterscripts sont toujours actives lorsque vous envoyez un gmx via le jeu ou la console. Ainsi, en utilisant OnPlayerText() par exemple, vous pouvez continuer d'utiliser la chatbox pendant que le gamemode redémarre.
Vérifier si une valeur est comprise entre deux autres
Jusqu'ici, il se peut que lorsque vous souhaitiez vérifier que la valeur numérique d'une variable (nommons-la var) était comprise entre deux autres valeurs, vous tapiez cette condition :
if (var > 3 && var < 6)
Ça fonctionne, mais il y a une méthode bien plus simple permise avec le langage Pawn :
if (3 < var < 6)
Les deux codes ont le même effet, le second est cependant plus agréable à lire et à écrire.
Incrémentation dans une boucle de type while
Vous pouvez incrémenter une variable numérique dans une boucle while (presque) de la même manière que vous le faîtes avec une boucle for. Un exemple avec ce code :
new Line = 0;
while (Line++ < 10)
{
printf("Line %d", Line);
}
Ce qui affiche en console :
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
L'explication est toute simple : à la lecture de la condition de la boucle, la variable Line est incrémentée de 1, puis la condition est vérifiée.
Récupérer la taille d'un tableau multi-dimensionnel
Vous pouvez récupérer la taille (aka. le nombre de cases/lignes) d'un tableau multi-dimensionnel de la manière suivante :
tab[5][10][20];
printf("%d %d %d", sizeof tab, sizeof tab[], sizeof tab[][]);
Ce qui affiche en console :
5 10 20
Retenir une ligne avec Pawno
C'est une petite astuce qui peut être utilisée sous l'IDE Pawno (celui par défaut). CTRL + SHIFT (MAJ) + <0...9> vous permet de retenir une ligne. Pour vous y rendre, utilisez CTRL + <0...9>. L'IDE va alors directement vous amener à la ligne marquée. Utiliser CTRL + SHIFT (MAJ) + <0...1> une seconde fois permet de retirer le marquage d'une ligne. C'est vraiment pratique lorsqu'on développe un long script.
(http://i.imgur.com/6rTXj1N.png)
Exemple avec une ligne marquée
Récupérer le nombre d'arguments passés à une fonction
Vous pouvez utiliser la fonction numargs() pour récupérer le nombre d'arguments passés à une fonction. De plus, la fonction getarg() permet de récupérer un argument, en précisant lequel (par ordre chronologique). Par exemple, dans le cas d'une fonction de type Fonction(5, 12, 37), getarg(1) retournera 12. Notez que l'index des arguments débute à 0 mais que le nombre d'arguments est bien valide. Exemple :
main()
{
Fonction(1, 12, 37);
}
stock Fonction(...)
{
printf("Arguments : %d", numargs());
printf("Argument 0 : %d", getarg(0));
printf("Argument 1 : %d", getarg(1));
printf("Argument 2 : %d", getarg(2));
return 1;
}
Affichage en console :
Arguments : 3
Argument 0 : 1
Argument 1 : 12
Argument 2 : 37
Scroller plus vite sous Pawno
Une autre petite astuce avec l'IDE Pawno, vous pouvez scroller beaucoup plus vite en maintenant la touche CTRL pendant que vous scrollez. Pratique dans le cas de longs scripts.
Initialiser de gros tableaux
Plutôt que d'utiliser une boucle qui va initialiser vos tableaux, vous pouvez suivre cette méthode :
main()
{
new GrosTableau[1024] = {12, ...};
printf("Case 0 : %d", GrosTableau[0]);
printf("Case 1 : %d", GrosTableau[1]);
printf("Case 5 : %d", GrosTableau[5]);
printf("Case 500 : %d", GrosTableau[500]);
printf("Case 1023 : %d", GrosTableau[1023]);
}
Les 1024 cases du tableaux seront initialisées avec la valeur 12. Affichage en console :
Case 0 : 12
Case 1 : 12
Case 5 : 12
Case 500 : 12
Case 1023 : 12
OnGameModeInit appelé deux fois
Ce n'est pas une astuce, mais un petit bug que j'ai découvert en développant il y a quelques jours. Si le point d'entrée d'un gamemode se présente sous cette forme (1) plutôt que sur la forme originale (2), la callback OnGameModeInit est appelée deux fois.
main(); // (1) Forme qui cause le bug
main() {} // (2) Forme originale
Un exemple avec ce code et son affichage en console :
#include <a_samp>
main();
public OnGameModeInit()
{
print("OnGameModeInit has been called");
return 1;
}}
OnGameModeInit has been called
OnGameModeInit has been called
Récupérer le texte d'un item dans une boîte de dialogue de type list
Bon, le titre est assez long, mais c'est tout bête. Lorsque, dans la callback OnDialogResponse(), vous recevez la réponse d'une boîte de dialogue de type list (DIALOG_STYLE_LIST), l'argument inputtext contient la chaîne de caractère de l'item sélectionné. Par exemple, avec une liste de cette forme :
- Blabla 1
- Tchutchu 2
- Tagada 3
Si le joueur sélectionne le second item, l'argument inputtext contiendra "Tchutchu 2" (sans les guillemets).
C'est tout pour le moment, mais comme je l'ai précisé en entête de ce message, n'hésitez pas à poster vos petits trucs pour faire s'allonger la liste. Je suis sûr que certaines de ces astuces pourront servir aux gens qui débarquent dans le Pawn. :smile: