Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <a_mysql>
- // Optional kannst du natürlich, falls du das noch nicht gemacht hast, MAX_PLAYERS verringern
- // Das ist äußerst resourcenschonender und schneller!
- #undef MAX_PLAYERS
- #define MAX_PLAYERS 5
- // Die Zahl der max. Spieleranzahl musst du natürlich anpassen!
- #define DIALOG_REGISTER 1 // Anpassen, falls notwendig [Konstanten sollten immer groß geschrieben werden und vom Namen her klar sein]
- #define DIALOG_LOGIN 2 // Anpassen, falls notwendig [Konstanten sollten immer groß geschrieben werden und vom Namen her klar sein]
- new mycon; // Würde ich verwenden, (mycon = MySQLConnection), um sicherzugehen (Siehe OnGameModeInit)
- enum UserData
- {
- Username[MAX_PLAYER_NAME+1], // +1 wegen dem Null-Terminator '\0'
- Geld, // Zum Test der Integerfunktion
- Float:Leben, // Zum Test der Float Funktion
- LastLogin[11], // Zum Test der Stringfunktion - XX/XX/XXXX + '\0' = 11 Zeichen
- bool:Logged, // Ist der Spieler eingeloggt?
- LoginDataCacheID //[ID für cache_save]
- }
- new User[MAX_PLAYERS][UserData];
- forward LoadPlayerDataSequence(playerid, l_step);
- forward KickPlayer(playerid);
- public OnGameModeInit()
- {
- mycon = mysql_connect("localhost","Username","Database","Passwort"); // Startet die Verbindung zur MySQL Datenbank (Angaben müssen angepasst werden!)
- // mycon müsste wenn es geklappt hat nun 1 sein, ansonsten seid ihr nicht verbunden!
- return 1;
- }
- public OnGameModeExit()
- {
- mysql_close(); // Das gibt es nach wie vor!
- return 1;
- }
- public OnPlayerConnect(playerid)
- {
- // Als allererstes sichern wir den Namen des Spielers
- GetPlayerName(playerid,User[playerid][Username],MAX_PLAYER_NAME);
- // Da wir diesen haben, kommt auch gleich der 1. Query!
- new query[60 + MAX_PLAYER_NAME]; // Anpassen, je nachdem wie groß der Text in mysql_format ist! (Ohne %e)
- mysql_format(mycon, query, sizeof(query), "SELECT * FROM `User` WHERE `Name` = '%e'",User[playerid][Username]); //[gleich alle Daten holen]
- // So - Was habe ich hier gemacht?
- // Folgendes: die Variable "query" hat nun den daneben eingegeben formatted Text bekommen
- // Wir zählen die Anzahl der Einträge, die in der Tabelle "User" sind, wo der Name "Spielername einfügen" ist.
- // Vielleicht fragt ihr euch, warum %e ? %e ist ein String, der speziell von mysql_format schon escaped wurde
- // also spezielle Zeichen werden abgeändert, damit sie korrekt abgespeichert werden können
- mysql_function_query(mycon, query, true, "LoadPlayerDataSequence","dd",playerid,1);
- // So - Was habe ich hier gemacht?
- // Ganz einfach, jetzt haben wir die Query rausgeschickt und dazu den Cache angeschalten!
- // Die Antwort erhalten wir nun in LoadPlayerDataSequence
- // Wie du unten sehen kannst enthält LoadPlayerDataSequence 2 Parameter, die, die ich oben angegeben habe!
- return 1; // Das nicht vergessen ;)
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- if(User[playerid][Logged]) // Er soll nur gespeichert werden, wenn er auch aktiv war, also eingeloggt!
- {
- SavePlayerData(playerid); // Ich finde es extrem angenehm, es woanders zusammengefasst vorzufinden
- }
- ResetPlayerVariables(playerid); // Das Resetten kann eine lange Liste werden und auch das finde ich im unteren Bereich angenehmer
- // ResetPlayerVariables sollte aber aus Sicherheitsgründen auch für nicht eingeloggte Spieler gelten
- return 1;
- }
- // Callback Nr. 5 - OnPlayerSpawn
- public OnPlayerSpawn(playerid)
- {
- // Da ich nicht weiß, wo ihr spawnen wollt, müsst ihr die Position selbst reinmachen!
- // Das ist notwendig, da ihr sonst womöglich durch die Map fallt!
- SetPlayerPos(playerid, 0.0, 0.0, 0.0); // Anpassen!
- return 1;
- }
- public OnPlayerRequestSpawn(playerid)
- {
- if(!User[playerid][Logged]) return 0; // Solange der Spieler nicht eingeloggt ist, soll er nicht spawnen können!
- return 1; // Ermöglicht das Spawnen!
- }
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- switch(dialogid)
- {
- case DIALOG_REGISTER: // Nehmen wir zuerst den Register-Dialog
- {
- if(!response) // Wenn er den 2. Button (Abbrechen) gedrückt wurde
- {
- // Hier schicken wir den Spieler vom Server
- SendClientMessage(playerid,0xFF0000FF,"Bitte benutzen Sie /q, um das Spiel zu beenden!");
- SetTimerEx("KickPlayer",250,0,"i",playerid);
- return 1;
- }
- // Kein else nötig, da wir oben returnt haben
- new InputLength = strlen(inputtext); // [so spart man sich ein strlen]
- if(/*!strlen(inputtext) || */InputLength < 3 || InputLength > 25) // Für Anfänger (nehmen wir diese!) [wozu einmal überprüfen, ob strlen gleich 0 ist und danach gleich kleiner als 3?]
- // if(!inputtext[0] || !(3 <= strlen(inputtext) <= 25)) // Für Fortgeschrittene
- {
- // Da die Eingabe wegen Länge oder gar keiner Eingabe fehlgeschlagen ist, bitten wir ihn erneut um eine Eingabe, diesmal mit Hinweis (in Rot!)
- ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Registrierung]","{FFFFFF}Bitte geben Sie Ihr gewünschtes Passwort ein!\n{FF0000}Bitte zwischen 3 & 25 Zeichen!","Register","Abbrechen");
- return 1;
- }
- // Da das geklappt hat, lassen wir ihn auf den Server, davor aber legen wir einen Eintrag für ihn in der Datenbank ab
- new query[128+MAX_PLAYER_NAME], year, month, day;
- getdate(year, month, day);
- format(query, sizeof(query),"%d/%d/%d",day,month,year); // Damit wir keine extra Variable noch extra erstellen müssen
- mysql_format(mycon, query, sizeof(query), "INSERT INTO `User` (`Name`, `Passwort`, `Geld`, `Leben`, `LastLogin`) VALUES('%e','%e',0,100.0,'%e')", User[playerid][Username], inputtext, query);
- mysql_function_query(mycon, query, false, "", ""); // Hier brauchen wir keine Werte aus der Datenbank, also Cache = false und der Rest leer
- User[playerid][Logged] = true;
- SpawnPlayer(playerid);
- return 1;
- // Register fertig!
- }
- case DIALOG_LOGIN:
- {
- if(!response) // Wenn er den 2. Button (Abbrechen) gedrückt hat
- {
- // Hier schicken wir den Spieler vom Server
- SendClientMessage(playerid,0xFF0000FF,"Bitte benutzen Sie /q, um das Spiel zu beenden!");
- SetTimerEx("KickPlayer",250,0,"i",playerid);
- return 1;
- }
- // Kein else nötig, da wir oben returnt haben
- new InputLength = strlen(inputtext); // [so spart man sich ein strlen]
- if(/*!strlen(inputtext) || */InputLength < 3 || InputLength > 25) // Wie gesagt, Für Anfänger [wozu einmal überprüfen, ob strlen gleich 0 ist und danach gleich kleiner als 3?]
- // if(!inputtext[0] || !(3 <= strlen(inputtext) <= 25)) // Für Fortgeschrittene
- {
- // Da die Eingabe wegen Länge oder gar keiner Eingabe fehlgeschlagen ist, bitten wir ihn erneut um eine Eingabe, wieder mit Hinweis (in Rot!)
- ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Loginsequenz]","{FFFFFF}Bitte geben Sie Ihr Passwort ein!\n{FF0000}Es hat mindestens 3 Zeichen!","Login","Abbrechen");
- return 1;
- }
- /*
- // So hier müssen wir nun Abfragen ob das Passwort denn dasselbe ist!
- new query[80 + MAX_PLAYER_NAME];
- mysql_format(mycon, query, sizeof(query), "SELECT COUNT(*) AS `count` FROM `User` WHERE `Name` = '%e' AND `Passwort` = '%e'",User[playerid][Username],inputtext);
- // Hier ganz einfach, wie beim anderen COUNT, wird hier auch gezählt, ob es diesen Eintrag, wo Name und Passwort gleich sind, gibt!
- mysql_function_query(mycon, query, true, "LoadPlayerDataSequence","dd",playerid,2); // Step 2
- // Das ganze schicken wir ab!
- */
- //[wir haben alle Daten schon per cache_save gespeichert, also benutzen wir sie doch!]
- cache_set_active(User[playerid][LoginDataCacheID]);
- new UserPassword[64];
- cache_get_field_content(0, "Passwort", UserPassword);
- if(strcmp(UserPassword, inputtext) == 0) { //[Passwort richtig]
- User[playerid][Geld] = cache_get_field_content_int(0,"Geld");
- User[playerid][Leben] = cache_get_field_content_float(0,"Leben");
- cache_get_field_content(0,"LastLogin",User[playerid][LastLogin], 11); //[ganz böse, wenn man Strings abrufen will die in ein enum-Array gespeichert werden sollen, immer selbst die Länge angeben!]
- User[playerid][Logged] = true;
- SpawnPlayer(playerid);
- cache_delete(User[playerid][LoginDataCacheID]);
- User[playerid][LoginDataCacheID] = 0;
- }
- else {
- ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Loginsequenz]","{FFFFFF}Bitte geben Sie Ihr richtiges Passwort ein!\n{FF0000}Die vorherige Eingabe war falsch!","Login","Abbrechen");
- return 1;
- }
- //cache_set_active(0); //[erst möglich ab R21, setzt aktive Cache zurück]
- return 1;
- }
- }
- return 1;
- }
- public LoadPlayerDataSequence(playerid, l_step) //[dadurch, dass wir cache_save benutzt haben, sparen wir uns den Parameter 'l_step']
- {
- if(User[playerid][LoginDataCacheID] <= 0) //[überprüfe, ob Cache schon gespeichert wurde]
- User[playerid][LoginDataCacheID] = cache_save(); //[wir speichern die Cache, um sie nicht mehr per Query abrufen zu müssen]
- //switch(l_step) // Damit man nicht ewig if(...) else if(...) usw. schreiben muss
- //{
- //case 1:
- //{
- // Jetzt gucken wir, ob es einen Eintrag gibt
- //new count = cache_get_field_content_int(0,"count"); // Hier holen wir uns den Integer als der "count", die wir temporär in MySQL erstellt haben und stecken sie in die Variable count
- new Rows, Fields;
- cache_get_data(Rows, Fields);
- if(Rows) // Wenn [Rows] 1 oder höher ist (Keine Angst, höher als 1 kann sie nicht kommen)
- {
- // Der Eintrag existiert, also lassen wir den Spieler einloggen
- ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Loginsequenz]","{FFFFFF}Bitte geben Sie Ihr Passwort ein!","Login","Abbrechen");
- //return 1; //[muss nicht sein]
- }
- else
- {
- // Es gibt keinen Eintrag, also ist er neu und muss sich registrieren
- ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort eingabe - Registrierung]","{FFFFFF}Bitte geben Sie Ihr gewünschtes Passwort ein!","Register","Abbrechen");
- //return 1; //[muss nicht sein]
- }
- //}
- //case 2:
- //{
- /*
- // Jetzt gucken wir, ob es einen Eintrag gibt
- new count = cache_get_field_content_int(0,"count");
- if(count) // Wenn count 1 oder höher ist
- {
- // Der Eintrag existiert, also lassen wir den Spieler nun die Spielerdaten laden und danach den Spieler spawnen
- new query[60 + MAX_PLAYER_NAME];
- mysql_format(mycon,query, sizeof(query), "SELECT * FROM `User` WHERE `Name` = '%e'",User[playerid][Username]);
- mysql_function_query(mycon,query,true,"LoadPlayerDataSequence","dd",playerid,3);
- return 1;
- }
- else
- {
- // Es gibt keinen Eintrag, also ist das Passwort falsch
- ShowPlayerDialog(playerid, Dialog_Login, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Loginsequenz]","{FFFFFF}Bitte geben Sie Ihr richtiges Passwort ein!\n{FF0000}Die vorherige Eingabe war falsch!","Login","Abbrechen");
- return 1;
- }
- */
- //}
- //case 3:
- //{
- // Wir laden nun die Spielerdaten
- // Der Vorteil bei den cache-Funktionen ist, dass sie am Ende kein mysql_free_result brauchen sondern direkt danach den Cache leeren
- /*User[playerid][Geld] = cache_get_field_content_int(0,"Geld");
- User[playerid][Leben] = cache_get_field_content_float(0,"Leben");
- cache_get_field_content(0,"LastLogin",User[playerid][LastLogin], 11); //[ganz böse, wenn man Strings abrufen will die in ein enum-Array gespeichert werden sollen, immer selbst die Länge angeben!]
- User[playerid][Logged] = true;
- SpawnPlayer(playerid);
- return 1;
- */
- // Fertig!
- //}
- /*default:
- {
- // Falls er hier auftauchen sollte, was eigentlich unwahrscheinlich ist, wird er aufgefordert zu reconnecten, und gleichzeitig gekickt!
- SendClientMessage(playerid,0xFF0000FF,"Es könnte ein Bug aufgetreten sein! Bitte reconnecten Sie!");
- SetTimerEx("KickPlayer",250,0,"i",playerid); // Wegen einem Bug von SA:MP muss der Kick nun per Timer ablaufen, damit die Nachricht auftaucht!
- return 1;
- }*/
- //}
- return 1;
- }
- stock SavePlayerData(playerid)
- {
- // Hier speichern wir noch die Daten ab
- new query[100 + MAX_PLAYER_NAME];
- mysql_format(mycon,query, sizeof(query), "UPDATE `User` SET `Geld` = %d WHERE `Name` = '%e'",User[playerid][Geld],User[playerid][Username]);
- mysql_function_query(mycon,query,false,"","");
- mysql_format(mycon,query, sizeof(query),"UPDATE `User` SET `Leben` = %.1f WHERE `Name` = '%e'",User[playerid][Leben],User[playerid][Username]);
- mysql_function_query(mycon,query,false,"","");
- new day,month,year; getdate(year,month,day);
- format(User[playerid][LastLogin],11,"%d/%d/%d",day,month,year);
- mysql_format(mycon,query, sizeof(query),"UPDATE `User` SET `LastLogin` = '%e' WHERE `Name` = '%e'",User[playerid][LastLogin],User[playerid][Username]);
- mysql_function_query(mycon,query,false,"","");
- return 1;
- }
- stock ResetPlayerVariables(playerid)
- {
- // Und hier noch Resetten
- User[playerid][Geld] = 0;
- User[playerid][Leben] = 0.0;
- strdel(User[playerid][Username],0,MAX_PLAYER_NAME+1);
- strdel(User[playerid][LastLogin],0,11);
- User[playerid][Logged] = false;
- User[playerid][LoginDataCacheID] = 0;
- return 1;
- }
- public KickPlayer(playerid)
- return Kick(playerid);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement