problem with register system
#1

I 've scripted his simple register/login system to save money and score with Dini. I used OnPlayerUpdate to save the two things in .ini files cause OnPlayerDisconnect wouldn't work. So when I play, money and score do get updated and change. When I quit samp, file has the money and score I had at the time i left server. But as soon as I connect to the server, .ini file's score and money go to 0! Help please or i am going to throw my computer out of the window.
pawn Код:
#include <a_samp>
#include <Dini>
#include <zcmd>
#include <sscanf2>

new Logged[MAX_PLAYERS] = 0;

#define COLOUR_GREEN    0x00FF00AA
#define COLOUR_RED      0xFF0000FF

adler32_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;
}

public OnFilterScriptInit()
{
    print("   Loaded successful.");
    return 1;
}

public OnPlayerConnect(playerid)
{
    Logged[playerid]=0;
    return 1;
}

public OnPlayerUpdate(playerid)
{
    new name[MAX_PLAYER_NAME], file[200];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    dini_IntSet(file, "money", GetPlayerMoney(playerid));
    dini_IntSet(file, "score", GetPlayerScore(playerid));
    return 1;
}

CMD:register(playerid, params[])
{
    new name[MAX_PLAYER_NAME], file[200], text[60];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    if (!dini_Exists(file))
    {
        if (!sscanf(params, "s[60]", text))
        {
            new pass=adler32_hash(text);
            dini_Create(file);
            dini_IntSet(file, "password", pass);
            dini_IntSet(file, "money", GetPlayerMoney(playerid));
            dini_IntSet(file, "score", GetPlayerScore(playerid));
            Logged[playerid] = 1;
            SendClientMessage(playerid, COLOUR_GREEN, "You registered and automatically logged in.");
        }
        else
        {
            SendClientMessage(playerid, COLOUR_RED, "You must enter a password to register.");
        }
    }
    else
    {
        SendClientMessage(playerid, COLOUR_RED, "This name is already registered.");
    }
    return 1;
}


CMD:login(playerid, params[])
{
    new name[MAX_PLAYER_NAME], file[200], text[60];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    if (Logged[playerid]==0)
    {
        if (!sscanf(params, "s[60]", text))
        {
            if (dini_Exists(file))
            {
                if (adler32_hash(text)==dini_Int(file, "password"))
                {
                    new mon=GetPlayerMoney(playerid) + dini_Int(file, "money"), sc=GetPlayerScore(playerid) + dini_Int(file, "score");
                    GivePlayerMoney(playerid, mon);
                    SetPlayerScore(playerid, sc);
                    Logged[playerid] = 1;
                    SendClientMessage(playerid, COLOUR_GREEN, "You are now logged in, and your stats were automatically loaded.");
                }
                else
                {
                    SendClientMessage(playerid, COLOUR_RED, "Login failed - wrong password!");
                }
            }
            else
            {
                if(!dini_Exists(file))  SendClientMessage(playerid, COLOUR_RED, "This name isn't registered! Please register now.");
            }
        }
        else
        {
            SendClientMessage(playerid, COLOUR_RED, "You must enter a password to register.");
        }
    }
    else
    {
        SendClientMessage(playerid, COLOUR_RED, "You are already logged in.");
    }
    return 1;
}
Solution found
Reply
#2

pawn Код:
#include <a_samp>
#include <Dini>
#include <zcmd>
#include <sscanf2>

new Logged[MAX_PLAYERS] = 0;

#define COLOUR_GREEN    0x00FF00AA
#define COLOUR_RED      0xFF0000FF

adler32_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;
}

public OnFilterScriptInit()
{
    print("   Loaded successful.");
    return 1;
}

public OnPlayerConnect(playerid)
{
    Logged[playerid]=0;
    return 1;
}

public OnPlayerUpdate(playerid)
{
    new name[MAX_PLAYER_NAME], file[200];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    dini_IntSet(file, "money", GetPlayerMoney(playerid));
    dini_IntSet(file, "score", GetPlayerScore(playerid));
    return 1;
}

CMD:register(playerid, params[])
{
    new name[MAX_PLAYER_NAME], file[200], text[60];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    if (!dini_Exists(file))
    {
        if (!sscanf(params, "s[60]", text))
        {
            new pass=adler32_hash(text);
            dini_Create(file);
            dini_IntSet(file, "password", pass);
            dini_IntSet(file, "money", GetPlayerMoney(playerid));
            dini_IntSet(file, "score", GetPlayerScore(playerid));
            Logged[playerid] = 1;
            SendClientMessage(playerid, COLOUR_GREEN, "You registered and automatically logged in.");
        }
        else
        {
            SendClientMessage(playerid, COLOUR_RED, "You must enter a password to register.");
        }
    }
    else
    {
        SendClientMessage(playerid, COLOUR_RED, "This name is already registered.");
    }
    return 1;
}


CMD:login(playerid, params[])
{
    new name[MAX_PLAYER_NAME], file[200], text[60];
    GetPlayerName(playerid, name, sizeof(name));
    format(file, sizeof(file), "\\users\\%s.ini", name);
    if (Logged[playerid]==0)
    {
        if (!sscanf(params, "s[60]", text))
        {
            if (dini_Exists(file))
            {
                if (adler32_hash(text)==dini_Int(file, "password"))
                {
                    new mon=dini_Int(file, "money"), sc=dini_Int(file, "score");
                    GivePlayerMoney(playerid, mon);
                    SetPlayerScore(playerid, sc);
                    Logged[playerid] = 1;
                    SendClientMessage(playerid, COLOUR_GREEN, "You are now logged in, and your stats were automatically loaded.");
                }
                else
                {
                    SendClientMessage(playerid, COLOUR_RED, "Login failed - wrong password!");
                }
            }
            else
            {
                if(!dini_Exists(file))  SendClientMessage(playerid, COLOUR_RED, "This name isn't registered! Please register now.");
            }
        }
        else
        {
            SendClientMessage(playerid, COLOUR_RED, "You must enter a password to register.");
        }
    }
    else
    {
        SendClientMessage(playerid, COLOUR_RED, "You are already logged in.");
    }
    return 1;
}
I ain't sure, try to test it.
Reply
#3

Damn, I found the solution...
pawn Код:
public OnPlayerUpdate(playerid)
{
    if (Logged[playerid]==1)
    {
        new name[MAX_PLAYER_NAME], file[200];
        GetPlayerName(playerid, name, sizeof(name));
        format(file, sizeof(file), "\\users\\%s.ini", name);
        dini_IntSet(file, "money", GetPlayerMoney(playerid));
        dini_IntSet(file, "score", GetPlayerScore(playerid));
    }
    return 1;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)