Salutare tuturor, m-am gandit sa modific sistemul de register al lui @WiDuAlK astfel incat sa fie compatibil cu versiunea de MySQL r41-2(ultima),
deoarece vad ca apar fel de fel de tutoriale dar gresite sau inutile.

!!!Atentie acest tutorial este imbunatatit si structurat altfel, dar pleaca de la tutorialul lui WiDuAlK

Pasul 1:

//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)
Pasul 2:


//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
Pasul 3:

//Vom creea 2 enumeratii.

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

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

//Acum vom creea conexiunea in sine:

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.


Pasul 5:

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


Pasul 6:

//Folosim un stock ca sa facem mai usor Extragerea numelului.

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


Pasul 7:

//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;
}


Pasul 8:

//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;
}


Pasul 9:

//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;
}


Pasul 10:

Se va creea baza de date exact ca in imaginile din Tutorialul lui WidWalk

Tutorial Original @WiDuAlK: https://www.sa-mp.ro/forums/topic/20...gin-mysql-r39/


Descarcare mysql R41-2:https://github.com/pBlueG/SA-MP-MySQL/releases

!!Atentie parolele vor fi criptate cu SHA256