GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Garwan50 le 10 Août 2013, 15:16:55

Titre: Problème d'écriture .ini
Posté par: Garwan50 le 10 Août 2013, 15:16:55
Hello,
Bonjour, j'ai un soucis avec Y_INI, j'avais suivis un système de compte sur le tuto forum.samp qui marchait très bien, mais je me suis rendu compte qu'il buguait en créant une commande /retireradmin, qui des qu'un que quelqu'un est admin (1), il ne le soit plus (0), avec quelques printf, j'avais vu que: quand le joueur se connecte, il est admin, apres avoir entré la commande il n'est plus admin, et quand il se deconnecte il n'est plus admin, donc c'est bien l'enregistrement des données dans le .ini qui déconne.

Sauf que la c'est carrément tout le systéme qui déconne, une fois in game, j'ai mes boites de dialogues qui s'ouvrent, je m'inscris sur mon serveur et je spawn, et quand je me déco, dans mon dossier scriptfile>Users, j'ai bien un fichier <pseudo>.ini, mais rien dedans !

Mes differents scripts:

Code: (pawn) [Sélectionner]
enum pInfo
{
        pMdp,
        pArgent,
        pAdmin,
        pKills,
        pDeaths,
       
}
new PlayerInfo[MAX_PLAYERS][pInfo];

Code: (pawn) [Sélectionner]
        if(fexist(UserPath(playerid)))
        {
            INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,COL_WHITE"Login",COL_WHITE"Entrez votre mot de passe pour vous connecter.","Login","Quitter");
        }
        else
        {
            ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,COL_WHITE"Enregistrement",COL_WHITE"Entrez un mot de passe pour votre compte.","Valider","Quitter");
        }

Code: (pawn) [Sélectionner]
public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
    INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
    INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
 
    gJob[playerid] = 0;
    PlayerInfo[playerid][pAdmin] = 0;
    checkpoint = 0;
    return 1;
}

Code: (pawn) [Sélectionner]
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        switch(dialogid)
        {
            case DIALOG_REGISTER:
            {
                if(!response) return Kick(playerid);
                if(response)
                {
                    if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Enregistrement",""COL_RED"Il faut inserer un mot de passe !\n"COL_WHITE"Entrez votre password ci dessous pour enregistrer votre compte","Valider","Quitter");
                    new INI:File = INI_Open(UserPath(playerid));
                    INI_SetTag(File,"data");
                    INI_WriteInt(File,"Password",udb_hash(inputtext));
                    INI_WriteInt(File,"Cash",0);
                    INI_WriteInt(File,"Admin",0);
                    INI_WriteInt(File,"Kills",0);
                    INI_WriteInt(File,"Deaths",0);
                INI_Close(File);
                    SaveAccount(playerid);
               
                ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Validé !",""COL_GREEN"Bienvenue ! Reconnectez vous pour sauvegarder vos stats","Ok","");
                }
            }
            case DIALOG_LOGIN:
            {
                if(!response) return Kick(playerid);
                if(response)
            {
                    if(udb_hash(inputtext) == PlayerInfo[playerid][pMdp] )
                    {
                        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
                        GivePlayerMoney(playerid, PlayerInfo[playerid][pArgent]);
                        ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Validé!",""COL_GREEN"Connexion réussie ! Bon jeu !","Ok","");
                        if(PlayerInfo[playerid][pAdmin] == 1)
                        {
                            new playername[MAX_PLAYER_NAME];
                            new str[124];
                            GetPlayerName(playerid, playername, sizeof(playername));
                            format(str, sizeof(str), "L'administrateur %s vient de se connecter !", playername);
                            SendClientMessageToAll(COLOR_ADMIN, str);
                        }
                    }
                    else
                    {
                            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_RED"Vous avez entré un mot de passe incorrect.\n"COL_WHITE"Entre votre mot de passe ci dessous pour vous connecter.","Login","Quitter");
                    }
                    return 1;
            }
 
            }
 
        }
        return 1;
}


Code: (pawn) [Sélectionner]
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
    INI_Int("Password",PlayerInfo[playerid][pMdp]);
    INI_Int("Cash",PlayerInfo[playerid][pArgent]);
    INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
    INI_Int("Kills",PlayerInfo[playerid][pKills]);
    INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
    return 1;
}

 
stock UserPath(playerid)
{
    new string[128],playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,playername,sizeof(playername));
    format(string,sizeof(string),PATH,playername);
    return string;
}
 
 
stock udb_hash(buf[]) {
    new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n<length; n++)
    {
       s1 = (s1 + buf[n]) % 65521;
       s2 = (s2 + s1)     % 65521;
    }
    return (s2 << 16) + s1;
}

game mode complet: http://pastebin.com/D1zS6YaD (http://pastebin.com/D1zS6YaD)

Merci d'avance je desespere assez ^^
Titre: Re : Problème d'écriture .ini
Posté par: Garwan50 le 11 Août 2013, 07:19:35
up svp :/
Titre: Re : Problème d'écriture .ini
Posté par: Infu le 11 Août 2013, 16:24:20
Code: (pawn) [Sélectionner]
public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
    INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
    INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
 
    gJob[playerid] = 0;
    PlayerInfo[playerid][pAdmin] = 0;
    checkpoint = 0;
    return 1;
}


Si tu mets le niveau Admin à 0 après avoir écrit dans le fichier, narmol que ça fonctionne pas déjà. Pour le reste j'ai pas compris
Titre: Re : Problème d'écriture .ini
Posté par: Xartrick le 11 Août 2013, 19:02:20
Dans le code que tu nous montre, tu as deux systèmes de sauvegarde.

Code: (pawn) [Sélectionner]
public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));
    INI_SetTag(File,"data");
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
    INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
    INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
    INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
    INI_Close(File);
 
    gJob[playerid] = 0;
    PlayerInfo[playerid][pAdmin] = 0;
    checkpoint = 0;
    SaveAccount(playerid);
    return 1;
}

Code: (pawn) [Sélectionner]
public SaveAccount(playerid)
{
    if(IsPlayerConnected(playerid))
    {
            new string3[32];
            //new valeur[32];
            new playername3[MAX_PLAYER_NAME];
            GetPlayerName(playerid, playername3, sizeof(playername3));
            format(string3, sizeof(string3), "Users/%s.ini", playername3);
            new File: hFile = fopen(string3, io_write);
            if (hFile)
            {
                new var[32];
                format(var, 32, "Mdp=%s\n", PlayerInfo[playerid][pMdp]);fwrite(hFile, var);
                format(var, 32, "Argent=%d\n",PlayerInfo[playerid][pArgent]);fwrite(hFile, var);
                format(var, 30, "Admin=%d\n",PlayerInfo[playerid][pAdmin]);fwrite(hFile, var);
                format(var, 30, "Meurtres=%d\n",PlayerInfo[playerid][pKills]);fwrite(hFile, var);
                format(var, 30, "Morts=%d\n",PlayerInfo[playerid][pDeaths]);fwrite(hFile, var);
                fclose(hFile);
                //SpawnPlayer(playerid);
            }
    }
    return 1;
}

Donc, évidement, comme tu sauvegarde deux fois de deux façons différentes et entre ces deux sauvegarde, tu retire le rang administrateur du joueur, au final, le joueur est systématiquement un membre.

Donc, déjà, sauvegardé deux fois, c'est inutile, et de deux manières différentes, encore plus !
Titre: Re : Re : Problème d'écriture .ini
Posté par: Garwan50 le 11 Août 2013, 19:44:12
Si tu mets le niveau Admin à 0 après avoir écrit dans le fichier, narmol que ça fonctionne pas déjà. Pour le reste j'ai pas compris

Je sauvegarde et apres je le met à zero, sinon si quelqu'un se connecte et a le même ID, il sera admin.

Dans le code que tu nous montre, tu as deux systèmes de sauvegarde.

Donc, évidement, comme tu sauvegarde deux fois de deux façons différentes et entre ces deux sauvegarde, tu retire le rang administrateur du joueur, au final, le joueur est systématiquement un membre.

Donc, déjà, sauvegardé deux fois, c'est inutile, et de deux manières différentes, encore plus !


Oui j'ai retiré le SaveAccount, mais il a déjà tendance à mieux fonctionner que lui, dans la mesure ou le SaveAccount écrit au moins les "variables" dans le .ini, mais rien d'autre, alors que le systeme Y_INI crée juste le pseudo.ini et s'arrête là.
Titre: Re : Re : Re : Problème d'écriture .ini
Posté par: Infu le 11 Août 2013, 21:45:39
Si tu mets le niveau Admin à 0 après avoir écrit dans le fichier, narmol que ça fonctionne pas déjà. Pour le reste j'ai pas compris

Je sauvegarde et apres je le met à zero, sinon si quelqu'un se connecte et a le même ID, il sera admin.

LAL. Non, tant que l'admin a son compte protégé par un MDP personne d'autre sera admin ...  :happy:
Titre: Re : Problème d'écriture .ini
Posté par: Xartrick le 11 Août 2013, 23:36:40
Donc maintenant, cela devrait fonctionner.
Titre: Re : Problème d'écriture .ini
Posté par: Garwan50 le 12 Août 2013, 04:16:18
Ok je savais pas Infu.

Cependant en retirant SaveAccount, ca ne fonctionne toujours pas ^^
Titre: Re : Problème d'écriture .ini
Posté par: Garwan50 le 12 Août 2013, 23:24:08
personne ? ^^
Titre: Re : Problème d'écriture .ini
Posté par: Garwan50 le 13 Août 2013, 20:26:15
uppp
Titre: Re : Problème d'écriture .ini
Posté par: Garwan50 le 14 Août 2013, 03:33:17
Il fallait lancer le serveur en tant qu'admin.

Probleme reglé