GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Infu le 22 Février 2014, 15:39:10

Titre: [Include] Comment en créer une ?
Posté par: Infu le 22 Février 2014, 15:39:10
Salut  :smile:

Comme cette personne (http://www.gtaonline.net/forums/index.php/topic,17346.0.html) j'essaye de créer une include qui aura pour but de calculer le prix de quelque chose, ce qui m'évitera de faire le calcul à chaque fois dans le script.
J'ai donc tenté de cette manière:


Code: (pawn) [Sélectionner]
GetWeaponPrice(PrixInitial, PrixMunition, NbrMunition)
{
new price = 0;
NbrMunition = PrixMunition * NbrMunition;
price = PrixInitial + NbrMunition;
return 1;
}

// native GetPrice(PrixInitial, PrixMunition, NbrMunition);

Et donc, en jeu je ferai:
Code: (pawn) [Sélectionner]
CMD:getprice(playerid, params[])
{
#pragma unused params
new price = GetWeaponPrice(120, 40, 2);
print(price);
return 1;
}


J'ai pas du tout compris, si quelqu'un peut prendre le temps de m'expliquer ce serait sympa  :smile:
Titre: Re : [Include] Comment en créer une ?
Posté par: Kiloutre le 22 Février 2014, 16:23:03
J'ai pas trop compris, en gros le truc c'est que la fonction retourne rien de correct ?
Dans GetWeaponPrice, j'ai vu que tu retournais 1 à la fin
Du coup
Code: (pawn) [Sélectionner]
new price = GetWeaponPrice(120, 40, 2);price vaudra maintenant 1, vu que ça retourne 1 dans tout les cas
Tu dois retourner le prix (return price;) et non 1 ^^

PS:
Code: (pawn) [Sélectionner]
NbrMunition = PrixMunition * NbrMunition;est inutile, tu peux directement faire:
Code: (pawn) [Sélectionner]
price = PrixInitial + PrixMunition * NbrMunition;(La multiplication est prioritaire dans ce calcul, elle sera donc effectuée en premier.
ça revient un peu à écrire "PrixInitial + (PrixMunition * NbrMunition)")
Titre: Re : [Include] Comment en créer une ?
Posté par: Gzsume le 22 Février 2014, 16:32:11
Tu peux simplifier la fonction à l'extrême de cette manière :

Code: (pawn) [Sélectionner]
GetWeaponPrice(PrixInitial, PrixMunition, NbrMunition)
{
        return PrixInitial + (PrixMunition * NbrMunition);
}

Le calcul est effectué et le résultat est directement retourné. ;-)
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 23 Février 2014, 11:24:45
Ah d'accord, je vois. Merci  :smile:

Et pour créer des callbacks ?? Je veux dire par exemple "OnPlayerTeleport", comment on s'y prend ?
Titre: Re : [Include] Comment en créer une ?
Posté par: Kiloutre le 23 Février 2014, 11:50:31
Simple ! C'est comme un timer:
Code: (pawn) [Sélectionner]
forward OnPlayerTeleport(playerid, Float:x, Float:y, Float:z);
//Dans ton include
Et pour l'utiliser:
Code: (pawn) [Sélectionner]
public OnPlayerTeleport(playerid, Float:x, Float:y, Float:z)
{
    //Tu fais ce que tu veux
    return 1; //Il me semble que t'es pas obligé de retourner quelque chose
}

Mais évidemment c'est à toi d'appeler ta callback, le jeu ne le fera pas lui-même ^^
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 23 Février 2014, 12:15:36
Ah oui. C'est parce que j'ai jamais fait d'include donc je pensais que c'était totalement différent x)
Titre: Re : [Include] Comment en créer une ?
Posté par: Gzsume le 23 Février 2014, 21:51:41
Une bibliothèque (c'est le nom exact, include c'est uniquement la directive de préprocesseur appelée pour l'inclure dans un fichier source) ce n'est ni plus ni moins qu'une série de fonctions prêtes à l'emploi. Pour faire simple, c'est du code source, mais placé dans un fichier différent qui sera ensuite inclus dans le fichier source principal.

Lors de la compilation, la directive de préprocesseur include a une tâche toute simple : elle copie ce que contient un fichier (dans ton cas, une bibliothèque) et elle le colle à la place de la directive. Tu peux essayer de créer une bibliothèque qui contient une variable et afficher son contenu dans le fichier source, tu verras, ça fonctionnera.


Code: (pawn) [Sélectionner]
// essai_include.inc
new ma_variable = 5;

Code: (pawn) [Sélectionner]
// fichier_source.pwn
#include <essai_include.inc>
printf("%s", ma_variable);

Au passage, que la bibliothèque ait l'extension de fichier .inc, .pwn ou même .txt, ça importe peu. Ça contient du texte, du code source, rien de plus. ;-)
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 23 Février 2014, 22:29:19
Oui ça j'avais compris, merci  :smile:
Ce que je me disais par exemple c'est: comment détecter que quelqu'un se TP directement à partir de la bibliothèque.
Titre: Re : [Include] Comment en créer une ?
Posté par: Gzsume le 23 Février 2014, 23:43:28
Une simple fonction appelée par un timer qui compare la position actuelle et la dernière position sauvegardée (avec un temps court entre deux appels). Si c'est supérieur à une certaine distance (une constante que tu auras choisie), c'est qu'il s'est téléporté.

Ou alors, tu peux appeler directement la fonction lorsque tu téléportes un joueur dans ton gamemode ou un filterscript, en créant ta propre fonction de téléportation. C'est sans-doute le plus simple et ce avec quoi tu auras le moins de chances de te planter.
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 23 Février 2014, 23:48:15
Ouais je vois, je penche pour la deuxième solution ;)

Je dois faire ça sous forme d'une fonction que je créé pour téléporter les joueurs. Et ensuite je fais un timer qui regarde si le joueur s'est téléporté en utilisant ma fonction, sinon il cheat. Je pense que ça doit être bon?
Titre: Re : [Include] Comment en créer une ?
Posté par: Gzsume le 24 Février 2014, 01:25:10
Beh, non. Tu fais une fonction de la forme TeleportPlayer(playerid, float:X, float:Y, float:Z, interieur); et dedans tu appelles la callback après avoir téléporté le joueur avec SetPlayerPos(). Pas besoin de vérifier puisque tu le téléportes toi-même.

Après si tu veux détecter ça pour faire un anti-cheat, alors oui, il faut vérifier. Mais plutôt que de vérifier qu'il s'est téléporté, vérifies plutôt que tu ne l'as pas téléporté dans les dernières secondes. ;-)
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 24 Février 2014, 06:54:21
D'accord  :smile:
Titre: Re : [Include] Comment en créer une ?
Posté par: Pirhotau le 12 Mars 2014, 22:42:55
Salut!
Pour répondre à ta question concernant les includes, j'ai réussi à faire comme ça:
(je te poste l'include que j'ai créé pour prendre exemple, je doute que les fonctions t'intéressent)
http://pastebin.com/yZFkxxaW (http://pastebin.com/yZFkxxaW)

Notes:
 - Oui, le code n'est pas forcement extrêmement beau, mais bon...
 - Commence toujours ton fichier avec la ligne:
Code: (c) [Sélectionner]
#include<a_samp> - Perso, mon fichier est en ".inc", je ne sais pas si ça change quelque chose...
 - Le nom de ton fichier correspond au nom de ton include
    exemple: Si ton fichier s'appelle "MonFichier.inc", tu écrira dans tes scripts "#include<MonFichier>"
 - Intéressant: dans les "native", lorsque tu termine ta ligne avec un commentaire (comme dans mon exemple), celui ci est affiché dans la syntaxe de ta fonction dans la barre des taches en bas à gauche dans pawno, ce qui peut éviter quelques trous de mémoire! :) (Bien évidement, il faut avoir précédemment sélectionné ta fonction dans la liste à droite)

Sinon, j'ai rien d'autre à ajouter. Je ne suis pas un expert, donc j'ai surement zappé des trucs ou commis quelque imprécision. Je prendrais volontiers vos remarques!

ps: J'ai toujours pas compris pourquoi ça ne marchait pas si je ne mettais pas les "native" dans un commentaire... Si un programmeur expérimenté pouvait répondre à mon interrogation, ce serait avec plaisir!
Titre: Re : [Include] Comment en créer une ?
Posté par: Gzsume le 13 Mars 2014, 00:34:27
Salut,

Pour commencer, merci de faire attention à la date du dernier message avant de poster. Dans ton cas ce n'est pas très grave, puisque tu apportes quelques informations intéressantes, mais tu pourrais tomber sur un méchant modo la prochaine fois. :smile:

En ce qui concerne le format de fichier à utiliser pour la bibliothèque, ça importe peu. Ça pourrait très bien être un .txt et tu pourrais même inventer ton propre format (.gzsume par exemple). Le principe de la directive #include est très simple : ça copie le contenu du fichier passé en argument, et ça le colle à la place de la directive. Le format importe donc peu, pour peu que ce soit du code source non-compilé.

Quant aux native(s), ce n'est pas obligatoire. Comme je l'ai dit, la directive se contente de faire un copier-coller. Comme tu crées des fonctions de type stock, elles seront intégrées à ton gamemode (ou à tout autre fichier source, d'ailleurs) et seront disponibles. Par contre, les native(s) deviennent utiles si tu souhaites afficher les fonctions dans la partie droite de Pawno. Comme j'ai désactivé ce panneau, ça m'importe peu, personnellement.

Une chose à faire lorsqu'on crée ses propres bibliothèques, c'est de prendre en compte le risque d'inclusions infinies. Pour faire simple, ça consiste à empêcher qu'un fichier source soit inclus dans un autre de manière infinie (imaginons que tu inclus une bibliothèque dans une autre, elle-même inclue dans ton fichier source principal : la première bibliothèque sera inclue deux fois). C'est très simple si tu suis ce principe pour tous tes fichiers de bibliothèques :

Code: (pawn) [Sélectionner]
#ifndef DEF_NOM_DE_L_INCLUDE
#define DEF_NOM_DE_L_INCLUDE

/* Contenu de l'include */

#endif

Plus d'informations ici (http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/les-conditions-2)

Bonne soirée !

Edit : Il semblerait que #ifndef ne fonctionne pas en Pawn. J'utilise ça par habitude avec le langage C. Il faudrait aller faire un tour sur la doc officielle du langage pour plus d'informations... si ça t'intéresse.
Titre: Re : [Include] Comment en créer une ?
Posté par: Kiloutre le 13 Mars 2014, 06:16:24
Code: (pawn) [Sélectionner]
#if !defined TEST
Titre: Re : [Include] Comment en créer une ?
Posté par: Infu le 13 Mars 2014, 19:17:27
D'accord, merci pour ces informations  :smile: