Jump to content

[PAWN] Tutorial register/login Mysql R40+


ZeCo
 Share

Recommended Posts

Salutare, aceast sistem de register/login este compatibil cu MySQL r41-2, aceasta fiind ulitima versiune.

 

** Acest tutorial nu este 100% facut de mine **, eu doar am participat la el impreuna cu Deadric

-----------------

1. pas

//La inceputul gamemode-ului punem 
#include <a_mysql>
//Definim si o scurtatura care ne va ajuta:
#define Functie:%0(%1) forward%0(%1); public%0(%1)

 

2. pas

//Definim "Manerul" care ne va ajuta sa facem conexiunea.
new MySQL: g_handle;
//Si inca o variabila ce ne va ajuta sa facem si mai util sistemul de conectare la baza de date:
new Connection = 0;//o initializam cu 0

 

3. pas

enum//Aceasta enumeratie contine Dialog-urile.
{
	DIALOG_LOGIN,
	DIALOG_REGISTER
};

enum fData
{
	pSQLID,
	pPassword[65]
};
new FoxData[MAX_PLAYERS][fData];

 

4. pas

Functie: ConnectToSQLServer()
{
	if(Connection == 0)
	{
        g_handle = mysql_connect("", "", "", "");
	}
  	else
    {
      	g_handle = mysql_connect("", "", "", "");
    }
	if(mysql_errno() != 0)
	{
		print("Could not connect to database!");
		SendRconCommand("exit");
	}else{print("Connection established!");}
	
}
//Astfel nu ne vom mai chinui sa schimbam toate datele de fiecare data, sichimbam doar variabila Connection din 0 in 1 si vice-versa.

 

5. pas

	// Punem la callback-ul OnGamemodeInit()
 	ConnectToSQLServer();//astefel se initializeaza conexiunea
	
	// Si la callback-ul OnGamemodeExit()
 	mysql_close(g_handle);//astfel se opreste conexiunea

 

6. pas

// Folosim un stock, asa facem mai usor Extragerea numelului.

stock GetName(playerid)
{
	new Name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, Name, sizeof(Name));
	return Name;
}

 

7. pas

//Acum avem nevoie de un callback, care va fi apelat in momentul in care player-ul intra pe server:

Functie: OnPlayerLogin(playerid)
{
    new rows
    cache_get_row_count(rows);
    if(rows)// atunci cand playerul se inregistreaza i se vor creea niste randuri. Daca i se gasesc atunci cand se va conecta ii va da:
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Logheaza-te!", "Te rog sa-ti introduci parola contului mai jos!", "Logare", "Exit");// dialogul register
    }
    else// daca nu i se gasesc randurile, mai exact contul este inexistent, atunci i se va da urmatorul dialog
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Inregistrare", "Trebuie sa iti creezi un cont ca sa joci pe server.\nTasteaza mai jos o parola, pentru a te inregistra!", "Inregistreaza", "Exit");// dialogul register
    }
    return 1;
}

//La callback-ul OnPlayerConnect(playerid) vom adauga:

public OnPlayerConnect(playerid)
{
    new query[100];// definim query(interogarea)
    mysql_format(g_handle, query, sizeof(query), "SELECT * FROM `conturi` WHERE `Nume` = '%e'", GetName(playerid));// mysql format face interogarile/setarile/obtiunile/updateurile la baza de date
    //handle reprezinta conectarea la mysql, query si sizeof(queri) reprezinta interogarea
    //"SELECT * FROM `conturi` WHERE `Nume` = '%e'"- Selecteaza de la tabelul cu conturi, unde numele este %s(de exemplu eu am numele Widualk pe sa-mp. Mi se va extrage numele si
    mysql_pquery(handle, query, "OnPlayerLogin", "i", playerid);// se va interoga OnPlayerLogin. Adica mai pe scurt , cand se conecteaza se va verifica daca are cont sau nu acel player.
    return 1;
}

 

8. pas

//Vom creea dialog-urile folosite pana acum la callback-ul OnDialogResponse

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new query[128], ip[25];// se creaza interogarea si ip.
    switch(dialogid)// se va folosi switch pentru a selecta dialogul
    {
        case DIALOG_REGISTER:// daca se va selecta dialogul register
        {
            if(!response)
                    return Kick(playerid);// daca se va apasa pe butonul Exit ii va da kick
            if(response)// daca se apasa pe Butonul inregistrare se vor face urmatoarele verificari
            {
                if(!strlen(inputtext))// daca nu e scris nimic la parola
                        return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Introdu-ti o parola pentru a te inregistra pe server! n", "Inregistreaza", "Exit");// ii va da din nou dialogul register cu mesajul specific
                new Hashhhh[65];
                SHA256_PassHash(inputtext, "78sdjs86d2h", Hashhhh, sizeof(Hashhhh));
                GetPlayerIp(playerid, ip, sizeof(ip));// definim ip-ul de mai sus
                mysql_format(handle, query, sizeof(query), "INSERT INTO `conturi` (`Nume`, `Parola`, IP) VALUES ('%e', '%e', '%e')", GetName(playerid), Hashhhh, ip);// se insereaza in tabelul cu conturi numele playerului, parola pe care a scris-o si ip pe care il are
                mysql_pquery(handle, query, "", "");// se va trimite setarile si se va interoga callback-ul OnRegistration
                SpawnPlayer(playerid); // ii da spawn
            }
            return 1;
        }
        case DIALOG_LOGIN:// daca se va selecta dialogul de login
        {
            if(!response) return Kick(playerid);// si se va apasa pe butonul exit ii va da kick
            if(response)//daca se apasa pe butonul LOGARE se va face urmatoarele verificari
            {
                if(!strlen(inputtext))// daca nu a scris nimic la parola
                        return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu login cu mesajul specific
                // daca se va trece peste aceasta verificare se vor face urmatoarele:
                new Hashhhh[65];
                SHA256_PassHash(inputtext, "78sdjs86d2h", Hashhhh, sizeof(Hashhhh));
                mysql_format(handle, query, sizeof(query), "SELECT * FROM `conturi` WHERE `Nume`='%e' AND `Parola` = '%e'", GetName(playerid),Hashhhh);// va fi selectata parola de la tabelul cu conturi
				mysql_pquery(handle, query, "OnLogin", "i", playerid);// se va face apel la baza si se va interoga CallBackUl OnLogin (Tquery = take query sau ia interogare in romana)
            }
            return 1;
        }
    }
    return 1;
}

 

9. pas

//Acum vom creea callback-ul apelat de dialog-ul Login:

Functie: OnLogin(playerid)// facem publicul
{
    new rows;// definim randurile
    cache_get_row_count(rows);
    if(rows)// daca playerul are randuri(adica daca are cont creat, odata cu contul se creeaza randurile)
    {
        cache_get_value_name(0, "Parola", FoxData[playerid][pPassword]);// i se vaextrage parola si i se verifica daca coincide cu numele. Se foloseste new-ul temporar pentru extragerea parolei, ea retinandu-se temporar(pana cand se deconecteaza jucatorul)
        cache_get_value_name_int(0, "ID", FoxData[playerid][pSQLID]);// i se va extrage id-ul din baza de date
        SpawnPlayer(playerid);
    }
    else// altfel , daca parola este gresita
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu mesajul specific.
    }
    return 1;
}
Edited by Capital
Link to comment
Share on other sites

Bravo! Ce pot sa spun, cel mai tare tutorial de la tutorialele mele, cel mai folositor si desigur, deloc furat de aici // asa ca felicitari! Continua tot asa si SAMP-ul va fi fost mort deja cand dau eu capacitatea la anu'. Acum vine si rugamintea mea: incearca sa faci ceva original, sau daca nu e original, macar incearca sa intelegi cu adevarat tutorialul, astfel fiind capabil de al distribui si reproduce in propriul tau fel.

 

Sper ca ai inteles ce am vrut sa zic si iti urez o seara frumoasa si succes in continuare!

Edited by Capital
Am scos link-ul, motiv: reclama.
Link to comment
Share on other sites

On 11/4/2018 at 7:49 PM, Amaroq said:

Bravo! Ce pot sa spun, cel mai tare tutorial de la tutorialele mele, cel mai folositor si desigur, deloc furat de aici // asa ca felicitari! Continua tot asa si SAMP-ul va fi fost mort deja cand dau eu capacitatea la anu'. Acum vine si rugamintea mea: incearca sa faci ceva original, sau daca nu e original, macar incearca sa intelegi cu adevarat tutorialul, astfel fiind capabil de al distribui si reproduce in propriul tau fel.

 

Sper ca ai inteles ce am vrut sa zic si iti urez o seara frumoasa si succes in continuare!

1. Deodata ce am participat la acest sistem am dreptul sa il postez.

2. de ce ar muri sa-mp-ul? 

Edited by Capital
Link to comment
Share on other sites

3 minutes ago, Popa said:

@Capital are dreptate domnul amaroq copy paste pe banda, vezi ca in quote se vede linku inca, si nu e reclama, reclama e cand zici "hai pe serveru lu ghita" nu ca dai un link pe un forum cu pawn

deci, te rog sa mergi acolo si sa trimiti PM lui Deadric, sa il intrebi de unde a luat Script-ul si l-a editat.

Link to comment
Share on other sites

  • ZeCo locked this topic
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.