GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Tetsuka le 11 Juin 2011, 23:44:09
-
Salut salut,
J'ai pas vraiment l'habitude de demander de l'aide, mais là je suis sur une tuile et je sèche.
J'ai du mal avec la reconnaissance du mot de passe, ici, peu importe le mot de passe qui est tapé dans la boite de dialogue, c'est considéré comme bon et le joueur peut se connecter...
public OnPlayerLoginAttempt( playerid, password[])
{
new string[ 128 ], Nom[MAX_PLAYER_NAME];
GetPlayerName( playerid, Nom, sizeof(Nom) );
format( string, sizeof( string ), "Comptes/%s.ini", Nom);
if(fexist( string) )
{
if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)
{
etc...
Le dialogue en question:
case 3894:
{
if(strlen(inputtext) > 128 || strlen(inputtext) < 1)
{
ShowPlayerDialog( playerid, 3894, DIALOG_STYLE_INPUT, "Authentification", "Bienvenue sur le serveur\n\nEntre ton mot de passe pour te connecter", "Connexion", "Aide" );
}
else
{
if( Player[playerid][Authentif] == 0 )
{
OnPlayerLoginAttempt( playerid, inputtext);
}
else
{
SendClientMessage( playerid, GRIS, "Tu es déjà authentifié." );
}
}
}
J'ai esssayé pas mal de trucs en zieutant sur d'autres scripts, mais rien n'y fait.
Merci d'avance,
Tetsu
-
La fonction strcmp à un bug : Si une des chaînes est vide, elle se comporte comme si les deux chaînes étaient égales.
Donc dans un premier temps, il faut vérifier que tes chaînes de caractères ne sont pas vides.
Pour cela, il suffit de rajouter un printf juste avant la comparaison :
public OnPlayerLoginAttempt( playerid, password[])
{
new string[ 128 ], Nom[MAX_PLAYER_NAME];
GetPlayerName( playerid, Nom, sizeof(Nom) );
format( string, sizeof( string ), "Comptes/%s.ini", Nom);
if(fexist( string) )
{
printf ("---> strcmp (<%s>, <%s>)", dini_Get( string, "Password" ), password); // LIGNE A AJOUTER
if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)
{
etc...
Puis, on regarde dans la console du serveur si on n'a pas un affichage du genre
---> strcmp (<Toto>, <>)
ou
---> strcmp (<>, <Titi>)
NB : <> indique une chaîne vide
Ensuite, si c'est la cas, il te suffira de déterminer pourquoi la chaîne est vide.
NB : Il faut quand même gérer le cas où le joueur ne saisit pas de mot de passe.
++
Syg
-
Salut Syg,
Merci pour ton coup de pouce, je vais voir ça.
Sinon, le cas où le joueur ne saisit pas de mot de passe est géré dans le dialog: if(strlen(inputtext) > 128 || strlen(inputtext) < 1)
(Si c'est bien de ça que tu parlais)
Double post
Voilà le résultat du test:
[00:33:15] ---> strcmp (<>, <test>)
J'ai donc un soucis avec la variable joueur...
Je me rend compte que, dans mon fichier joueur, à chaque fois que je me connecte, ce qui était "Password = ..." devient "ÿPassword = ..." Je pense que le soucis viens de là, mais aucune idée d'où ça peut venir...
-
dans un sens c'est normale
if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)
ceci est bien trop long une fonction dans une fonction
new passfichier[256];
passfichier = dini_Get( string, "Password" );
if(strcmp( passfichier, password, false ) == 0)
voila qui devrais etre capable de lire le fichier
pour le soucis de Password a ÿPassword tu as du faire une erreure de frappe quelque part.
-
Salut Cristab, merci pour ton aide.
Le mot de passe n'est toujours pas récupéré, je suis persuadé que le soucis vient du ÿPassword.
Lorsque je me connecte, la ligne Password devient ÿPassword et à la déconnexion un nouvelle ligne Password apparait à la fin...
J'ai bien vérifié, je n'ai fait aucune erreur de frappe.
-
tu peu me montrer tout sa au moment de la connection ect ect
-
Le caractère ÿ correspond au code ASCII 255. Ce n'est certainement pas une coïncidence.
Je pense comme cristab, le fichier doit être mal écrit mais ça ne vient pas forcément de la ligne Password=, ça peut aussi venir de celle qui est juste au dessus.
++
Syg
-
Voici un pastebin avec les 3 fonctions qui concernent le mot de passe.
http://pastebin.gtaonline.fr/pastebin.php?show=1105 (http://pastebin.gtaonline.fr/pastebin.php?show=1105)
Le Password est en première ligne sur tous les fichiers (sauf dans le cas où la nouvelle ligne se crée)
-
tu n'est pas obliger de sauver a chaque coup le password dans SavePlayerData tu l'enregistre dans le /register et dans le /changepass mais c'est tout je rapelle que Dini est un peu long mais la tu fais des save un peu partout ce qui le rendras forcement instable
-
Salut,
il a l'air de ne sauvegarder qu'à la déconnexion...ce n'est pas si pire...
Normalement il faut que ça puisse sauvegarder correctement...
Si tu fais un print du string avant de l'enregistrer, es-ce que ça t'affiche le mot de passe correctement?
++Sim++
-
Salut,
Donc, si je suis vos conseils:
-Je supprime l'enregistrement du mot de passe dans le SavePlayerData pour ne le garder qu'à l'enregistrement/changement
-Je fais en sorte que les stats soient sauvegardées de manière récurrente? En sachant que j'ai quand même fait en sorte d'appeler souvent cette fonction.
C'est bien ça?
Sim, voici le résultat du printf: [15:07:24] ---> strcmp (<test>, <test>) Ca a donc l'air de bien fonctionner..
Double post
Bon, je me suis rendu compte que le problème n'est pas général.
Avec tous les autres comptes que j'ai crée/testé tout fonctionne nickel, sauf avec un seul et le soucis du ÿPassword... Une idée?
-
Corrige le fichier du joueur qui pose problème à la main (supprime le ÿ) et regarde si le problème est toujours là.
Si il est toujours là ... il faudra investiguer plus en profondeur..
++
Syg
-
Déjà fait, le ÿ réapparait à chaque fois.
-
efface le fichier en question est demande au joueur de le recreer
-
C'est la seule solution je crois oui, mais c'est dommage de pas trouver l'origine de ce bug, car si ça se reproduit, ça peut devenir embêtant.
Merci pour votre aide, je vous tiens au courant.
-
C'est quoi le pseudo du joueur qui pose problème ?
++
Syg