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
Pasul 2:
Definim urmatoarele
Pasul 3:
Facem un nou "enum"
Punem acest cod la OnPlayerConnect
Pasul 5:
Adaugati la OnPlayerDialogResponse urmatoarele:
Punem La OnPlayerDisconnect urmatorul cod
Pasul 7:
Acum adaugam la OnPlayerDeath
Pasul 8:
Pune urmatoarea functie
Pasul 9:
Punem Functia de hash
Important: creditele ii revin lui DracoBlue
Punem undeva in gamemode functia pentru partita salvari.
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];
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;
}
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;
}
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;
}