• 29 Mars 2024, 09:21:27


Auteur Sujet: [Include] Comment en créer une ?  (Lu 2981 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
[Include] Comment en créer une ?
« le: 22 Février 2014, 15:39:10 »
Salut  :smile:

Comme cette personne 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:


Adju ♥
(-_-)



Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #1 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)")
« Modifié: 22 Février 2014, 16:35:40 par Kiloutre »

[/url]

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #2 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é. ;-)

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #3 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 ?


Adju ♥
(-_-)



Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #4 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 ^^

[/url]

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #5 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)


Adju ♥
(-_-)



Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #6 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. ;-)

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #7 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.


Adju ♥
(-_-)



Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #8 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.

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #9 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?


Adju ♥
(-_-)



Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #10 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. ;-)

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3550
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #11 le: 24 Février 2014, 06:54:21 »
D'accord  :smile:


Adju ♥
(-_-)



Hors ligne Pirhotau

  • *
  • Nouveau
  • Messages: 11
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #12 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

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!
Projets:
- FS qui contient de nombreux jeux (Chasse au trésor, course de voitures, braquage d'un fourgon, minis jeux divers (ambulancier, vendeur de glaces...)...) (projet principal)
- FS qui contient un compteur de vitesse, une jauge de carburant, péages et radars (inspirés de scripts de PPC, mais réécris et adaptés à mes besoins), affichage des noms de voitures (réécrit et adapté d'un script de Biltong), concessionnaire automobile.
- FS qui regroupe un grand nombre de commandes utiles (enregistrement dans un fichier de coordonnés pour la création d'objets) ou inutiles (changement de l'heure).
- Des ajouts au GM "LVDM" (gestion de la santé par exemple...)


Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #13 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

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.

Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : [Include] Comment en créer une ?
« Réponse #14 le: 13 Mars 2014, 06:16:24 »
Code: (pawn) [Sélectionner]
#if !defined TEST

[/url]