GTA SA Basic Account System

Status
Not open for further replies.

Adam

Member
May 24, 2010
37
1
Hi firstly PAWN code is whats used to code SAMP (San Andreas Multiplayer) Gamemodes etc.
Now im going to show you how to make a simple account system to use in your gamemode. this will save all players data on disconnect.

First let's start with our Variables.
pawn code
Code:
#include <dini>
#include <dudb>
Put these at the top of your script below your current includes. (this system use's dini)

then add these.
Code:
new logged[MAX_PLAYERS];
enum pInfo
{
    AdminLevel,
    cash,
    score,
}
new PlayerInfo[MAX_PLAYERS][pInfo];

that enum you see above is what holds the stat variables, such as the admin level, cash, and score!

now, we get on to the next step.
Detecting if the player has an account when they connect.

add this to your OnPlayerConnect

Code:
new name[MAX_PLAYER_NAME];
    new file[128];
    GetPlayerName(playerid, name, sizeof(name));
    format(file,sizeof(file),"/Users/%s.ini",name);
    if(!fexist(file))
    {
    SendClientMessage(playerid, COLOR_GREEN, "OMGWTFBBQ You arent registered! type /register to save your stats!");
    logged[playerid] = 0;
    }
    if(fexist(file))
    {
    SendClientMessage(playerid, COLOR_GREEN, "hot damn sexy! You are registered! type /login [pass]!!");
    }

There we go! now it detects if the player has or doesnt have a registered account.

Now we add the saving lines to OnPlayerDisconnect
add the folowing.
Code:
new file[128];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    format(file,sizeof(file),"/Users/%s.ini",name);
    if(dini_Exists(file))
    {
  dini_IntSet(file, "score", PlayerInfo[playerid][score]);
  dini_IntSet(file, "money", PlayerInfo[playerid][cash]);
  dini_IntSet(file, "AdminLevel",PlayerInfo[playerid][AdminLevel]);
    }
    logged[playerid] = 0;
there we go! now it saves their stats when the disconenct/crash.

Now we add the /register command. This is in DCMD so make sure you have the proper defines for it.

first add
Code:
dcmd(register, 8, cmdtext);
    dcmd(login, 5, cmdtext);

add these to your OnPlayerCommandText

Now we add the commands.
Code:
dcmd_register(playerid, params[])
{
  new file[128], pname[MAX_PLAYER_NAME];
  GetPlayerName(playerid, pname, sizeof(pname));
  format(file, sizeof(file), "\\Users\\%s.ini", pname);
  if(!strlen(params)) return SendClientMessage(playerid, COLOR_RED, "[SYSTEM]: /register [password]");
  if(dini_Exists(file)) return SendClientMessage(playerid, COLOR_RED, "[SYSTEM]: You are already registered!");
  dini_Create(file);
  dini_IntSet(file, "hashPW", udb_hash(params));
  dini_Set(file, "password", params);
  dini_IntSet(file, "AdminLevel",PlayerInfo[playerid][AdminLevel] = 0);
  dini_IntSet(file, "score", PlayerInfo[playerid][score] = 0);
  dini_IntSet(file, "money", PlayerInfo[playerid][cash] = 500);
  new string[128];
  format(string, 128, "[SYSTEM]: You succesfully registered the nickname %s with password %s", pname, params);
  SendClientMessage(playerid, COLOR_YELLOW, string);
  logged[playerid] = 1;
  SendClientMessage(playerid, COLOR_YELLOW, "[SYSTEM]: You have been automatically logged in!");
  return 1;}

Theres the register command, it will create their file in the "users" folder in your scriptfiles.
and will also automaticly log them in when they register, (also shows their password along with the hashed password)

Next the /login command. Witch will pull their data from their file.
Code:
dcmd_login(playerid, params[])
{
  new file[128];
  new string[MAX_STRING], pname[MAX_PLAYER_NAME];
  GetPlayerName(playerid, pname, sizeof(pname));
  format(file, sizeof(file), "\\Users\\%s.ini", pname);
  if(!strlen(params)) return SendClientMessage(playerid, COLOR_RED, "[SYSTEM]: /login [password]");
  if(!dini_Exists(file)) return SendClientMessage(playerid, COLOR_RED, "[SYSTEM]: You are not registered!");
  if(logged[playerid]) return SendClientMessage(playerid, COLOR_RED, "[SYSTEM]: You are already logged in!");
  new tmp;
  tmp = dini_Int(file, "hashPW");
  if(udb_hash(params) != tmp)
  {
    format(string, 256, "You specified the wrong password for %s!", pname);
    SendClientMessage(playerid, COLOR_RED, string);
  }
  else
  {
    logged[playerid] = 1;
    PlayerInfo[playerid][AdminLevel] = dini_Int(file, "AdminLevel");
    SetPlayerScore(playerid, PlayerInfo[playerid][score]);
    new lebel = PlayerInfo[playerid][AdminLevel];
    GivePlayerMoney(playerid, dini_Int(file, "money")-GetPlayerMoney(playerid));
    format(string, 256, "[SYSTEM]: Successfully logged in! (level: %d)!", lebel);
        SendClientMessage(playerid,COLOR_RED, string);
    printf("%s (%i) logged in with password %s", pname, playerid, params);
  }
  return 1;}

We're done! this should now have /register, /login, and save stats on logout!


good luck with further projects, and if you find any bugs or errors, please post them.


EDIT: To add more items to save, simply add them to the enum we added at the top. then add dini_IntSet(file, "filename", PlayerInfo[playerid][enumfilename] = 0); to the /register command then add PlayerInfo[playerid][enumfilename] = dini_Int(file, "filename"); to the login!
 
Status
Not open for further replies.

Users who are viewing this thread

Top