So zu Allererst Guten Abend liebe Breadfish-User,
ich stelle euch heute ein Tutorial vor, das ihr benutzen könnt wenn ihr MySQL als Registersystem vorhabt, dies ist eigentlich die Einfache Version.
1.) Was Braucht ihr?
Ihr braucht 2 Plugins & 2 Includes!
#include <a_mysql> // Und
#include <sscanf2>
Die Plugins müsst ihr dann in die Server.cfg einfügen (Plugins + Includes im .zip Paket!)
Bei Linux Servern müsst ihr bei der server.cfg noch das .so anhängen!
Also bei Windows sieht es so aus:
...
plugins mysql sscanf2
---------
Bei Linux sieht es so aus:
...
plugins mysql.so sscanf2.so
---------
2.)
Der Inhalt des Registersystems (MySQL-Erster Einbau):
enum playerinfo
{
Username[24],
Passwort[128],
Adminlv
};
new pInfo[MAX_PLAYERS][playerinfo];
#define host "localhost" //Das dürfte eigentlich bei jedem so sein. wenn nicht das localhost ändern!
#define mysqluser "" //Der Username den ihr als Loginname benutzt um ins Control Panel zu kommen. (z.B. phpMyAdmin)
#define mysqlpass "" //Das dazugehörige Passwort
#define database "" // Der name der erstellten DATENBANK!!! (NICHT TABELLE!!)
#define Dialog_Reg 1000 //Für GUI-Login/Registersystem
#define Dialog_Login 1001 //Für GUI-Login/Registersystem
Das MUSS oben hin, am besten unter euren Defines (oder unter den Includes)
--------
Kommen wir zum OnPlayerConnect-Callback (public OnPlayerConnect)
public OnPlayerConnect(playerid)
{
//.... Eure Sachen eben^^
new escname[MAX_PLAYER_NAME],name[MAX_PLAYER_NAME],query[200];
GetPlayerName(playerid,name,sizeof name); //Bekommt den Namen des Spielers
mysql_real_escape_string(name,escname); //Macht sicher das escname keine andere Definition bekommt.
format(query,sizeof(query),"SELECT * FROM `Name|eurer|Tabelle` WHERE `Nickname` = '%s'",escname); //so, Name|Eurer|Tabelle müsst ihr anpassen, z.B. Accounts
//Nickname ist eine Spalte der Tabelle und MUSS als erste eingefügt sein, falls bei euch was anderes ist, ist es nicht schlimm da es eine unbedeutende Variable ist
// Die ` Zeichen MÜSSEN auch da sein da er es sonst nicht erkennt.
// Das SELECT * FROM & Das WHERE müsste aus dem Englischen klar sein (Nehme * Von & Wo (Das * steht für nichts, da nichts genommen werden soll))
mysql_query(query); //Führt die Abfrage aus
mysql_store_result(); // Fragt die Ausgeführte Abfrage ab^^
if(mysql_num_rows() >= 1) // Wenn der Spieler einen Eintrag hat.
{
mysql_free_result(); // Leert die mysql_store_result-Abfrage.
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"Login","Passwort?","Login","Kick");
}
else
{
mysql_free_result(); // Leert die mysql_store_result-Abfrage.
ShowPlayerDialog(playerid,Dialog_Reg,DIALOG_STYLE_INPUT,"Register","Dein neues Passwort","Register","Kick");
}
return 1;
}
So sieht OnPlayerConnect aus
Nun OnGameModeInit()
public OnGameModeInit()
{
//...
Connect_to_Database(); // Erklärung steht im stock ;)
OnGameModeExit nicht vergessen
public OnGameModeExit()
{
mysql_close();
return 1;
}
Das war eigentlich jetzt Simpel...
Nun bei OnPlayerDisconnect(Das heißt Abspeichern)
public OnPlayerDisconnect(playerid,reason)
{
new query[200],escname[MAX_PLAYER_NAME],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof name);
mysql_real_escape_string(name,escname);
// Siehe OnPlayerConnect(das obere)
format(query,sizeof query,"UPDATE `Name|Der|Tabelle` SET `Adminlevel` = %d WHERE `Nickname` = '%s'",pInfo[playerid][Adminlv],escname);
mysql_query(query);
//UPDATE, soll die Tabelle Updaten und folgendes ändern, nämlich die Spalte nach SET unzwar wo Nickname = dein Name ist
mysql_free_result(); //Siehe oben
return 1;
}
Nun zu OnDialogResponse
//...
if(dialogid == Dialog_Reg)
{
if(!response) return Kick(playerid);
if(strlen(inputtext) < 3 || strlen(inputtext) > 24)
return ShowPlayerDialog(playerid,Dialog_Reg,DIALOG_STYLE_INPUT,"Register","Gib dein Passwort ein!","Register","Kick");
new query[200],name[24],escname[24];
GetPlayerName(playerid,name,sizeof name);
mysql_real_escape_string(name,escname);
format(query,sizeof query,"INSERT INTO `Name|Der|Tabelle` (Nickname,Passwort) VALUES('%s','%s')",escname,inputtext);
//INSERT INTO = (Tu in) VALUES = die Variablen (Es erstellt den Account)
mysql_query(query);
}
if(dialogid == Dialog_Login)
{
if(!strlen(inputtext))
return ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"Login","Passwort?","Login","Kick");
if(!response) return Kick(playerid);
new name[24],query[200],escname[24];
GetPlayerName(playerid,name,sizeof name);
GetFromAccount(name,"Passwort",pInfo[playerid][Passwort]); //Bekommt das Passwort aus der Tabelle des Users wo der Name ist
if(!strcmp(inputtext,pInfo[playerid][Passwort],true)) //Wenn das Passwort mit der eingabe übereinstimmt
{
mysql_real_escape_string(name,escname);
format(query,sizeof query,"SELECT * FROM `Name|Der|Tabelle` WHERE `Nickname` = '%s'",escname);
mysql_query(query);
mysql_store_result();
//Kennt ihr
while(mysql_fetch_row_format(query)) //Öffnet euren Account
sscanf(query,"e<p<|>s[24]s[128]d>",pInfo[playerid]); //e< ist für Enum p<|> ist ein teiler, d.h. | teilt die nachkommenden variablen z.B. Var1 | Var2 | Var3
//VORSICHT: DAS ENUM MUSS IN DER GLEICHEN REIHENFOLGE SEIN WIE DIE SPALTEN DER TABELLE!!!!!!!!!!
SpawnPlayer(playerid);
//usw
Jetzt braucht ihr noch die GetFromAccount-Funktion & die Connect_to_Database-Funktion
stock GetFromAccount(username[], obtaining[], holdingvar[])
{
new query[128];
format(query, sizeof(query), "SELECT `%s` FROM `Accounts` WHERE `Nickname` = '%s'", obtaining, username);
mysql_query(query);
mysql_store_result();
if(mysql_fetch_row(holdingvar) == 1)
{
mysql_free_result();
}
return 1;
}
Connect_to_Database()
{
mysql_connect(host,mysqluser,database,mysqlpass); //Verbindet mit der MySQL datenbank
if(mysql_ping()) //überprüft ob eine Verbindung besteht
return print("Verbindung hergestellt."); //Printet das die Verbindung erfolgreich hergestellt wurde.
else
{
mysql_connect(host,mysqluser,database,mysqlpass);
if(mysql_ping())
return print("Verbindung hergestellt.");
else
{
print("Es konnte keine Verbindung hergestellt werden. Der Server wird geschlossen.");
SendRconCommand("exit"); //Schließt den Server automatisch bzw. schaltet ihn aus
return true;
}
}
}
Nun ya das wars hier noch die .zip datei mit den Plugins + Includes
http://www.fileuploadx.de/364270
bitte schön
MfG [aKoE]nanyo
Kommis gerne gesehen
/Edit 1/
Fehler beseitigt
/Edit 2/
mysql_close(); eingefügt (Vergessen ;P)
/Edit 3/
Vorgabe hochgeladen
/Edit 4/
Aktualisiert
/Edit 5/
Neuer Download-Link