31.03.2013, 18:47
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.
Solution found
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;
}