Login & Register using Y_INI

Vezi subiectul anterior Vezi subiectul urmator In jos

Login & Register using Y_INI

Mesaj Scris de Andrei la data de Mar Feb 16, 2016 3:37 pm

Introducere

Salut. Am decis sa fac un tutorial login & register folosind Y_INI deoarece unii nu vreti sa va complicati cu mysql. Eu am sa va explic pas cu pas ce trebuie sa faceti ca sa va creeati propriul vostru sistem. Acest tutorial include Y_INI si desigur, login & register cu dialoguri.


Ce este Y_INI ?

Y_INI este un sistem ce citeste si scrie infor###### intr-un timp foarte rapid. De aceea multi apeleaza la acest sistem creeat de Y_LESS.

Ce aduce nou acest sistem de reading & writer fata de celelalte ?

Y_INI a fost dovedit a fi cel mai rapid cititor de date si cel mai rapid in a scrie o informatie. Dupa cum stim Y_Less este creatorul. Pentru mai multe detalii vizitati aici http://forum.sa-mp.c...ad.php?t=175565.

Inainte de a incepe tutorialul trebuie sa va instalati include-ul [ LINK DOWNLOAD http://forum.sa-mp.c...ad.php?t=175565. ]. Odata ce ati descarcat fisierul trebuie sa plasati folderul YSI in pawno/include. apoi desigur introduceti in gamemode printre primele linii " #include <YSI\y_ini> ".

Acum suntem gata sa incepem primul pas, fiti atenti si nu omiteti niciun pas.

Step 1

Definim anumite dialoguri ce ne va ajuta sa creeam login si register
Cod:
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

Mai definim niste culori pentru un design mai frumos
Cod:
#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"

Step 2

Vom folosi o enumerare, pentru a stoca variabilele noastre.
Cod:
enum pInfo
{
    pPass,
    pCash,
    pAdmin,
    pKills,
    pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];

Step 3

Acum, vom crea o funcție pentru a încărca datele utilizatorului.
Cod:
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
    INI_Int("Password",PlayerInfo[playerid][pPass]);
    INI_Int("Cash",PlayerInfo[playerid][pCash]);
    INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
    INI_Int("Kills",PlayerInfo[playerid][pKills]);
    INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
    return 1;
}


Step 4

Acum să creăm o functie de stoc simplu.
Cod:
stock UserPath(playerid)
{
    new string[128],playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,playername,sizeof(playername));
    format(string,sizeof(string),PATH,playername);
    return string;
}


Sub stock UserPath adaugati
Cod:
/*Credits to Dracoblue*/
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;
}

Stocul de mai sus este un simplu "Hasher", și vor fi folosite pentru a codifica parolele utilizatorilor, creditele acordate lui Dracoblue.

Step 5

Vom folosi acum callback-ul "OnPlayerConnect" pentru a verifica dacă jucătorul este înregistrat sau nu.
Cod:
public OnPlayerConnect(playerid)
{
    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"Type your password below to login.","Login","Quit");
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
    }
    return 1;
}

Vom folosi funcția nativ "fexist" pentru a căuta fișierul nostru. Parametrii sunt setati să funcționeze pe stoc-ul pe care l-am creat. Dacă fișierul există, veți primi o "Autentificare" de dialog. Dacă nu, veți primi un dialog de registru.

Step 6

Acum va trebui sa creeam dialogrile pentru login si register
Cod:
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"Registering...",""COL_RED"You have entered an invalid password.\n"COL_WHITE"Type your password below to register a new account.","Register","Quit");
                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);

                SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
                SpawnPlayer(playerid);
                ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Super! Sistemul tau de login si register merge perfect, dai un relog pt a iti salva datele","Ok","");
            }
        }

        case DIALOG_LOGIN:
        {
            if ( !response ) return Kick ( playerid );
            if( response )
            {
                if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
                {
                    INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
                    GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
                    ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"You have successfully logged in!","Ok","");
                }
                else
                {
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_RED"You have entered an incorrect password.\n"COL_WHITE"Type your password below to login.","Login","Quit");
                }
                return 1;
            }
        }
    }
    return 1;
}

Step 7

Iar acum va trebui sa salvam datele cand jucatorul paraseste serverul
Cod:
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);
    return 1;
}

Iar pentru a stoca kill-urile sau death-urile folositi PlayerInfo[killerid][pKills]++;  PlayerInfo[playerid][pDeaths]++; si asa si cu celelalte variabile.
avatar
Andrei
Admin Forum

Mesaje : 22
gCash : 1785
Multumiri : 1
Data de inscriere : 11/02/2016
Varsta : 18
Localizare : Romania, Bucuresti

Vezi profilul utilizatorului http://gaming-dispatch.forumer.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum