Exiled - Gaming Romania este o comunitate bazata pe gaming-ul profesionist.


Cum sa faci sistem register

 



Vezi subiectul anterior Vezi subiectul urmator In jos   Mesaj • Pagina 1 din 1

z3!uSs
#1

Dum Feb 24, 2013 11:30 am

z3!uSs
Exiled Skill +4
Exiled Skill +4
Salut astazi am decis sa fac un tutorial pentru creerea unui sistem de inregistrare/logare pe Y_INI al 2 lea cel mai bun sistem de salvare existent!
Sa incepem

Pasul 1:
adaugam in capul gamemodului
Cod:

#include < a_samp >
#include <YSI/y_ini>

Pasul 2:
Definim urmatoarele


Cod:
#define Register 1// id dialog Register (se poate incurca daca aveti alt dialog definit cu 1)
#define Login 2// id dialog Register (se poate incurca daca aveti alt dialog definit cu 1)
#define Sfolder "/Utilizatori/%s.ini" //Folderul unde se va salva

Pasul 3:
Facem un nou "enum"

Cod:
enum pINF
{
  pPass,    pCash,
  pAdmin,  pKills,
  pDeaths
}
new PlayerInfo[MAX_PLAYERS][pINF];
Pasul 4:
Punem acest cod la OnPlayerConnect


Cod:
if(fexist(UserPath(playerid)))//Variabila ce verifica daca exista contul
    {
        INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,"Login","Scrie parola mai jos pentru a te loga.","Login","Quit");
    }
    else//Functia care spune ca daca contul nu exista acesta se va creea
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,"Registering...","Scrie parola mai jos pentru a creea un cont nou !!","Register","Quit");
    }


Pasul 5:
Adaugati la OnPlayerDialogResponse urmatoarele:


Cod:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch( dialogid )// functia care face switch intre dialoguri
    {
        case Register://dialogul de inregistrare
        {
            if (!response) //aceasta functie este in caz ca playerul nu raspunde , daca nu raspunde ii va da automat kick!
              return Kick(playerid);
            if(response)//Aceasta functie daca raspunde ii va crea contul
            {
                if(!strlen(inputtext)) return ShowPlayerDialog(playerid, Register, DIALOG_STYLE_INPUT, "Inregistrare","Tu nu ai introdus nici o parola in casuta.\nScrie parola mai jos pentru a crea un cont nou!.","Register","Quit");//Functia care ii spune ca daca nu introduce o parola nu ii creaza contul
                new INI:File = INI_Open(UserPath(playerid));//Functia care deschide scrierea fisierelor
                INI_SetTag(File,"data");//functia care ii pune tagul la inceputul contului
                INI_WriteInt(File,"Password",udb_hash(inputtext));//functia care salveaza statistica
                INI_WriteInt(File,"Cash",0);//functia care salveaza statistica
                INI_WriteInt(File,"Adminl",0);//functia care salveaza statistica
                INI_WriteInt(File,"Kills",0);//functia care salveaza statistica
                INI_WriteInt(File,"Deaths",0);//functia care salveaza statistica
                INI_Close(File);//Functia ce inchide salvarea
                SpawnPlayer(playerid);//Functia ce spawneaza playeru
            }
        }

        case DIALOG_LOGIN:
        {
            if ( !response ) return Kick ( playerid );//aceasta functie este in caz ca playerul nu raspunde , daca nu raspunde ii va da automat kick!
            if( response )Aceasta functie il va lasa pe jucator sa intre pe server si ii va da statisticile inapoi!
            {
                if(udb_hash(inputtext) == PlayerInfo[playerid][parola])//Aici citeste Hashul de la parola
                {
                    INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);// Aici loadeaza
                    GivePlayerMoney(playerid, PlayerInfo[playerid][money]);//iar aici ii da bani playerului
                }
                else// aceasta functie ii spune ca nu a introdus bine parola sa o mai introduca odata!
                {
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,"Login","Tu ai introdus o parola gresita!.\nScrie parola in casuta de mai jos!!.","Login","Quit");
                }
                return 1;
            }
        }
    }
    return 1;
}
Pasul 6:
Punem La OnPlayerDisconnect urmatorul cod


Cod:
public OnPlayerDisconnect(playerid, reason)
{
    new INI:File = INI_Open(UserPath(playerid));//Functia care deschide salvarea
    INI_SetTag(File,"data");Functia care scrie tagul
    INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));Functia ce salveaza statsticile
    INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);Functia ce salveaza statsticile
    INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);Functia ce salveaza statsticile
    INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);Functia ce salveaza statsticile
    INI_Close(File);Functia ce inchide salvarea
    return 1;
}

Pasul 7:
Acum adaugam la OnPlayerDeath


Cod:
public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;//functia ce ii pune kilurile pe +
    PlayerInfo[playerid][pDeaths]++;//functia ce ii pune mortille pe +
    return 1;
}

Pasul 8:
Pune urmatoarea functie

Cod:
forward LoadUser_data(playerid,name[],value[]);//Forwardul functie
public LoadUser_data(playerid,name[],value[])//Functia
{
    INI_Int("Password",PlayerInfo[playerid][pPass]);//Functia ce loadeaza parola
    INI_Int("Cash",PlayerInfo[playerid][pCash]);//Functia ce loadeaza banii
    INI_Int("Admin",PlayerInfo[playerid][pAdmin]);//functia ce loadeaza adminul
    INI_Int("Kills",PlayerInfo[playerid][pKills]);//functia ce salveaza killurile
    INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);//Functia ce salveaza deathurile
    return 1;
}

Pasul 9:
Punem Functia de hash
Important: creditele ii revin lui DracoBlue


Cod:
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;
}
Pasul 10:
Punem undeva in gamemode functia pentru partita salvari.

Cod:

stock UserPath(playerid)
{
    new string[128],playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,playername,sizeof(playername));
    format(string,sizeof(string),Sfolder,playername);
    return string;
}

Vezi subiectul anterior Vezi subiectul urmator Sus   Mesaj • Pagina 1 din 1