• 01 Juillet 2025, 12:39:28


Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Pirhotau

Pages: [1]
1
Salut!
Lorsque tu dis que ça ne fonctionne pas, qu'est ce qui ne marche pas? Tu as ton problème de d'habitude? Ou alors ça plante lors de la compilations (quelles sont les erreurs alors) ou dans le jeu?

J'avais une autre idée, mais elle n'est finalement pas réalisable...

2
Ligne 16, dans ton enum, tu as:
Code: (pawn) [Sélectionner]
enum
{
     pPass,
     ...
}
En fait, tel qu'est défini la variable "pPass", c'est un nombre entier, or un mot de passe est une chaine de caractères. Il faudrait donc définir pPass[30] (30 étant la longueur max du mot de passe). Cependant, j'ai jamais testé la création d'ume chaine de caractères au sein d'un array, et je doute que ça marche. Si ça ne marche pas tu peux essayer de creer un nouvel array ne contenant que les mots de passe:
Code: (pawn) [Sélectionner]
MotsDePasse[MAX_PLAYERS][30]; À tester aussi...
Utilisation:
Code: (pawn) [Sélectionner]
INI_int("Password",MotsDePasse[playerid]);

3
Je m'incline!  :grin:

4
Salut!
Pour le cryptage, je pense qu'il faut regarder du côté de la fonction WP_Hash. Tu la supprime:

Code: (pawn) [Sélectionner]

// ligne 146
new HashPass[129];
WP_Hash(HashPass, sizeof(HashPass), inputtext);
INI_WriteString(File, "Password", HashPass);

// à remplacer par:
 INI_WriteString(File, "Password", inputtext);

et tu fais de même pour les autres endroits où ça apparait.

5
Ah! Moi, je pense qu'il y a un problème. (Vous avez le droit de me contre-dire).
Mais le texte va être afficher un gros paquet de fois avec à chaque fois une lettre en plus:

Code: (pawn) [Sélectionner]
       while(index < len)
        {
                /* Si le message à partir de notre index est supérieur à 128 caractères */
                if(strlen(message[index]) >= 128)
                {
                        /* On copie dans la variable tmp, les 128 caractères */
                        format(tmp, sizeof(tmp), message[index]);
                        /* on augmente notre index de 128 */
                        index += 128;
                        /* on affiche le contenue de tmp */
                        SendClientMessage(playerid, color, tmp);               // Il faudrait sortir cette fonction de la boucle...
                }
    [...]
        }

6
Salut!
Je sais que l'habitude n'est pas sur ce forum de poster des bouts de code tout fait, mais j'avais créé un système qui permettait de redimensionner des longues chaines de caractères pour les afficher à l'écran...
Je vous donne les deux versions que j'ai créées:
- Affichage du texte dans le chat avec "SendClientMessage"
[spoiler]
Code: (pawn) [Sélectionner]
new str[1024]; // Stockage brut du texte (cad le texte que l'on veut redimensionner)

// Système de redimensionnement:
new tmp[256]; // Stockage du texte temporaire (cad le texte que l'on va afficher)
new StrLenMax = 100; // Longueur max du texte à afficher (en nombre de caractères)
new idx; // pour le fonctionnement du strtok
if(strlen(str) > StrLenMax) // Si texte trop long
{
    new len = 0; // Longueur du texte déjà redimensionné
    while(len < strlen(str)) // Tant que la taille nouveau texte est inférieur à celle du texte d'origine (donc qu'il n'a pas été recréé en entier)
    {
// Ici, on décompose: on prend chaque mot un par un
          new str2[128]; // Stocke un mot
          str2 = strtok(str,idx); // Trouve le mot
          format(tmp,256,"%s",str2); // L'integre au début de la nouvelle ligne
         
          while(strlen(tmp) < StrLenMax) // Crée la suite de la ligne en ajoutant autant de mots que nécessaire
          {
              str2 = strtok(str,idx);
              format(tmp,256,"%s %s",tmp,str2);
          }
         
          len = len + strlen(tmp) + 1; // Enregistre la longueur de texte redimensionné
          SendClientMessageToAll(COLOR_BL,tmp); // Affiche le texte
    }
}
else // Si le texte est suffisement court, l'afficher directement
{
     SendClientMessageToAll(COLOR_BL,str);
}
Je résume: entrée: str, sortie: SendClientMessage
[/spoiler]


- La deuxième version qui permet d'afficher le texte dans un dialog par exemple. (En sortie, on obtient une chaine de caractère qui comporte des retours à la ligne)
[spoiler]
Code: (pawn) [Sélectionner]
new str[256]; // Texte de départ
                       
 // Redimensionnement du texte:
new tmp[256]; // Stockage du texte temporaire
new StrLenMax = 60; // Longueur max du texte à afficher
new msg[512]; // Stockage du message final

 if(strlen(str) > StrLenMax) // Si texte trop long
{
      new len = 0; // Longueur du texte déjà redimensionné
      new bool:PremiereLigne = true;
      while(len < strlen(str)) // Tant que le nouveau texte est inférieur au texte d'origine (donc qu'il n'a as été recréé en entier)
       {
             new str2[128]; // Stocke un mot
             str2 = strtok(str,idx); // Trouve le mot
             format(tmp,256,"%s",str2); // L'integre au début de la nouvelle ligne

             while(strlen(tmp) < StrLenMax) // Crée la suite de la ligne en ajoutant autant de mots que nécessaire
             {
                    str2 = strtok(str,idx);
                    format(tmp,256,"%s %s",tmp,str2);
             }

             len += strlen(tmp) + 1; // Enregistre la longueur de texte redimensionné

              // Colle les bouts ensemble:
              if(PremiereLigne == false)
              {
                    format(msg,512,"%s\n%s",msg,tmp);
              }
              if(PremiereLigne == true)
              {
                    format(msg,512,"%s",tmp);
                    PremiereLigne = false;
              }
        }
}
else // Si le texte est suffisement court, l'afficher directement
{
         format(msg,512,"%s",str);
}
Je résume: entrée: str, sortie: msg
[/spoiler]


Je ne vous encourage pas à le recopier bêtement pour la simple et bonne raison qu'il est très loin d'être optimisé (notamment en ce qui concerne la longueur de chaînes de caractères), mais aussi parce que vous pouvez aisément créer le votre! :)
L'avantage de ce système, c'est que les mots ne sont pas coupés n'importe comment.

Voilà!
Enjoy!

7
Salut à tous!

J'essaie de comprendre un peu le fonctionnement des fonction de lecture et d'écriture dans un fichier (fread, fwrite, etc...). J'ai déjà eu l'occasion de me servir de la fonction d'écriture uniquement pour créer une sorte de fichier log où sont enregistré les commandes utilisées ou encore l'enregistrement de coordonnés avec une commande (/sav).

Mais aujourd'hui, j'aimerai aller plus loin et créer un système qui permettrait d'enregistrer certaines données de joueurs (argent, points...) mais aussi de pouvoir les lire lors d'une nouvelle connexion. Je sais qu'il y a déjà de nombreux tuto concernant des systèmes de login, mais j'avoue avoir du mal à comprendre... (A savoir, je n'ai pas du tout besoin de système de mot de passe où autre, c'est pour jouer avec des amis en lan).

Donc, je pensais organiser mon fichier de la manière suivante:
Code: (pawn) [Sélectionner]
NomDuJoueur1 paramètre1 paramètre2 paramètre3 paramètre4 ...
NomDuJoueur2 paramètre1 paramètre2 paramètre3 paramètre4 ...
...
Avec à la rigueur des séparateurs comme | ou ; entre les paramètres.

Là où se situe réellement mon problème, c'est la lecture des différentes données.
- Comment faire pour obtenir le contenu d'une ligne (uniquement) dans un string? (En donnant par exemple le n° de ligne)
- Comment faire pour chercher la ligne qui correspond à un joueur? (Dans ce cas, je suppose l'utilisation d'une boucle qui lit chaque début de ligne et qui compare le nom du joueur (strcmp))
- Il faudrait ensuite pouvoir supprimer une ligne pour pouvoir en réécrire une nouvelle par dessus. (J'ai vu la fonction Fdelete:
[spoiler]
Code: (pawn) [Sélectionner]
lien: [url]http://wiki.sa-mp.com/wiki/Fdelete_code[/url]
fdeleteline(filename[], line[]){
   if(fexist(filename)){
      new temp[256];
      new File:fhandle = fopen(filename,io_read);
      fread(fhandle,temp,sizeof(temp),false);
      if(strfind(temp,line,true)==-1){return 0;}
      else{
         fclose(fhandle);
         fremove(filename);
         for(new i=0;i<strlen(temp);i++){
            new templine[256];
            strmid(templine,temp,i,i+strlen(line));
            if(equal(templine,line,true)){
               strdel(temp,i,i+strlen(line));
               fcreate(filename);
               fhandle = fopen(filename,io_write);
               fwrite(fhandle,temp);
               fclose(fhandle);
               return 1;
            }
         }
      }
   }
   return 0;
}
[/spoiler]

Faudrait-il encore que j'en comprenne l'utilisation...)

- Comment extraire chaque paramètre d'une ligne? (fonction strtok?)

Je crois avoir tout dit... Si j'ai d'autres questions, je vous ferai signe! :)

Merci d'avance! (Et déjà merci si vous avez eu le courage de me lire!)

8
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!

9
Ah... Pourtant ça y ressemble étrangement! :)

Bref... J'ai réussi à trouver peut être bien une solution au problème:
- J'ai supprimé les lignes:
Code: (c) [Sélectionner]
#if defined _MonInclude_included
    #endinput
#endif
#define _MonInclude_included
- et j'ai commenté les "native". De cette manière, ils apparaissent bien dans la liste de droite et ça ne plante plus. D'ailleurs, après divers tests, je pense que c'est ça qui bloquait... (Mais c'est étrange, tous les includes que j'ai pu voir ont ces "native" et tout va bien... Si quelqu'un a une explication, je suis preneur! :))

Merci beaucoup!

10
Toutes mes autres commandes fonctionnent parfaitement.
Le seul problème vient de l'include que je crée ou des fonctions que je met dedans. A savoir que ces fonctions fonctionnent très bien en les plaçant en fin de script (au lieu d'utiliser l'include).

11
Bonjour!

Je rencontre quelques problèmes avec les "includes", je m'explique:
J'ai plusieurs fonctions que j'utilise régulièrement dans mes scripts et au lieu de devoir à chaque fois les copier/coller à la fin de FS ou du GM, j'ai pensé à créer un "include". Malheureusement, j'ai pas trouvé grand chose (seulement ce site:http://forum.sa-mp.com/showthread.php?t=164903 où je n'ai pas tout compris). Voici le résultat: http://pastebin.com/ibqfekym

Lorsque j'utilise la fonction dans un script, pas de problème pour la compilation, mais lorsqu'il s'agit de l'utiliser en cours de jeu (avec une commande par exemple), il ne se passe rien. (Pour le cas de la commande, j'ai un message d'erreur qui m'indique que la commande n'existe pas. Après divers tests, j'ai conclu que seule la ligne qui contient la fonction de l'include fait planter la commande.)

Et j'ai déjà essayer de créer d'autres commande, mais rien à faire, le résultat est le même.

Pour info, le fichier est bien en .inc et dans le dossier "includes" du dossier "pawno". J'ai aussi essayé d’intégrer juste ma fonction (la variable avec tous les noms et le fonction en elle même) dans un include existant et le résultat est le même. Aussi, le FS dans lequel j'utilise ce fichier commence bien par
Code: (c) [Sélectionner]
#include <MonInclude>
Merci d'avance!  :sign_merci:

Pages: [1]