L'inconvénient du FS c'est qu'il faut le rajouter dans le fichier de configuration du serveur et qu'il ne faut pas oublier de mettre le .AMX correspondant dans le répertoire filterscript. De plus il fait l'objet d'un compilation séparée et ne permet pas le partage de variables directement avec le GM.
La solution la plus simple pour réduire la taille du script d'un GM est de passer par des includes.
Exemple :
Voici un gamemode (très petit) :
#include <a_samp>
main ()
{
}
public OnGameModeInit ()
{
/* Ajout de tous les persos */
for (new i=0, j=0 ; i<350 ; i++)
{
AddPlayerClass (i, 1930.8340, -1394.4470, 13.7947, 151.9744, 0, 0, 0, 0, 0, 0);
}
/* Ajout des véhicules */
AddStaticVehicle(409,1669.6370,1579.5623,10.6049, 0.0,random (127), random (127));
AddStaticVehicle(409,1669.5219,1573.8367,10.5817,86.3478,random (127), random (127));
AddStaticVehicle(400,1668.8595,1567.9686,10.8705,96.2175,random (127), random (127));
AddStaticVehicle(400,1669.5197,1563.3639,10.8782,98.5761,random (127), random (127));
AddStaticVehicle(402,1669.8319,1558.1472,10.6282,94.3042,random (127), random (127));
}
Modification :
Je crée un fichier que je nomme VEH.INC dans le répertoire gamemode (donc au même endroit que le gamemode car c'est plus facile à gérer que de le mettre dans le répertoire include de PAWNO).
Ce fichier contient les lignes suivantes :
AddStaticVehicle(409,1669.6370,1579.5623,10.6049, 0.0,random (127), random (127));
AddStaticVehicle(409,1669.5219,1573.8367,10.5817,86.3478,random (127), random (127));
AddStaticVehicle(400,1668.8595,1567.9686,10.8705,96.2175,random (127), random (127));
AddStaticVehicle(400,1669.5197,1563.3639,10.8782,98.5761,random (127), random (127));
AddStaticVehicle(402,1669.8319,1558.1472,10.6282,94.3042,random (127), random (127));Soit tous les véhicules de mon GM.
Ensuite, je modifie mon GM comme ceci :
#include <a_samp>
main ()
{
}
public OnGameModeInit ()
{
/* Ajout de tous les persos valides */
for (new i=0, j=0 ; i<350 ; i++)
{
if (i != BadSkins[j])
{
AddPlayerClass (i, 1930.8340, -1394.4470, 13.7947, 151.9744, 0, 0, 0, 0, 0, 0);
}
else
{
j++;
}
}
/* Ajout des véhicules */
#include ".\\veh.inc"
}
Explication :
La directive de compilation #include permet de rajouter des parties de script n'importe où dans le script de départ (et donc pas seulement au début du GM). Les parties de script sont incluses telles quelles, sans aucun ajout (seul le contenu du fichier est inclus) pour produire le script final qui sera compilé.
De plus, cette directive permet d'aller chercher les fichiers à inclure à n'importe quel endroit sur la machine où est compilé le script. Mais pour cela, il faut utiliser des guillemets (" ") et donner le chemin d'accès (absolu ou relatif) au fichier.
NB : L'usage de < et > indique que le fichier à inclure se trouve dans le(s) répertoire(s) par défaut des includes (pawno\include)
Dans mon cas, je donne le chemin relatif au fichier. Ce chemin relatif est "." (répertoire courant dans lequel le compilateur travaille = répertoire gamemode) suivi du nom du fichier que je veux inclure (je double l'antislash car je suis dans un chaîne de caractères).
Dans cet exemple, le gain est minime mais cette solution fonctionne quelque soit le nombre de lignes que l'on déplace du GM vers le fichier à inclure.
Il est aussi possible d'inclure autant de fichier que l'on veut et ces fichiers peuvent contenir ce que l'on veut (des bouts de code, comme dans mon exemple, des fonctions, des callbacks, des déclaration de variables, ...).
Ce qu'il faut retenir c'est que le compilateur ne compile par un GM, il compile un script reconstitué à partir du GM et des différents "morceaux" que l'on inclut dedans.
Lorsqu'on a compris ça, on peut faire un GM seulement à partir d'include (solution extrème) :
#include <a_samp>
#include ".\\DeclVars.inc"
#include ".\\main.inc"
#include ".\\OnGameModeInit.inc"
#include ".\\OnPlayerSpawn.inc"
Dernière remarque :
Le directive #include est récursive. Il est donc possible de mettre de #include dans des fichiers include (c'est le cas dans "a_samp.inc" par exemple).
++
Syg