Advertisement
JeffryUGP

[FS] MySQL Register-Login-System Beispielscript (R41-4)

Sep 14th, 2016
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.24 KB | None | 0 0
  1. /*============================================================================================================================*
  2. * Credits: Dieser Filterscript "Register-Login-System" wurde von Jeffry gemacht!                                              *
  3. *                                                                                                                             *
  4. *                                                                                                                             *
  5. * Kompatible MySQL Versionen: R40 - R41-4                                                                                     *
  6. *                                                                                                                             *
  7. * Made in October 2017.                                                                                                       *
  8. *                                                                                                                             *
  9. * Rechte des Benutzers:                                                                                                       *
  10. *                                                                                                                             *
  11. * -Es ist erlaubt diesen Filterscript zu modifizieren, solange keine Credits entfernt werden.                                 *
  12. * -Es ist erlaubt diesen Filterscript neu zu veröffentlichen, solange keine Credits entfernt werden.                          *
  13. *                                                                                                                             *
  14. * -Es ist nicht erlaubt dies als sein eigenes Werk darzustellen oder zu verkaufen.                                            *
  15. * -Es ist nicht erlaubt die Credits zu entfernen.                                                                             *
  16. *                                                                                                                             *
  17. * Danke.                                                                                                                      *
  18. * Viel Spaß damit! :)                                                                                                         *
  19. *                                                                                                                             *
  20. *=============================================================================================================================*/
  21. #include <a_samp>
  22. #include <a_mysql>
  23.  
  24. #define MYSQL_HOST    "127.0.0.1"      //IP Adresse des MySQL Servers
  25. #define MYSQL_USER    "root"           //Benutzername der angemeldet wird
  26. #define MYSQL_PASS    ""               //Passwort des Benutzers
  27. #define MYSQL_DBSE    "samp_db"        //Name der Datenbank
  28.  
  29. new MySQL:handle; //Die Connection-Handle, über die wir später auf die Tabellen der Datenbank zugreifen
  30.  
  31. //Dialog IDs (gegebenenfalls ändern, falls bereits belegt)
  32. #define DIALOG_REGISTER  1403
  33. #define DIALOG_LOGIN     2401
  34.  
  35. enum pDataEnum
  36. {
  37.     p_id,
  38.     bool:pLoggedIn,
  39.     pName[MAX_PLAYER_NAME],
  40.     pLevel,
  41.     pMoney,
  42.     pKills,
  43.     pDeaths
  44. }
  45. new PlayerInfo[MAX_PLAYERS][pDataEnum];
  46.  
  47. public OnFilterScriptInit()
  48. {
  49.     MySQL_SetupConnection();
  50.     return 1;
  51. }
  52.  
  53. public OnFilterScriptExit()
  54. {
  55.     mysql_close(handle);
  56.     return 1;
  57. }
  58.  
  59. public OnPlayerConnect(playerid)
  60. {
  61.     PlayerInfo[playerid][p_id]       = 0;
  62.     PlayerInfo[playerid][pLoggedIn]  = false;
  63.     PlayerInfo[playerid][pLevel]     = 0;
  64.     PlayerInfo[playerid][pMoney]     = 0;
  65.     PlayerInfo[playerid][pKills]     = 0;
  66.     PlayerInfo[playerid][pDeaths]    = 0;
  67.     GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
  68.     return 1;
  69. }
  70.  
  71. public OnPlayerRequestClass(playerid)
  72. {
  73.     //Wenn der Spieler die Class-Selection betritt prüfe, ob er bereits eingeloggt ist
  74.     if(!PlayerInfo[playerid][pLoggedIn])
  75.     {
  76.         //Wenn nicht, dann prüfe ob der Spieler ein Konto hat
  77.         //Dazu wird ein Query gesendet und ein neues Callback aufgerufen
  78.         //%e steht für einen geprüften String (sollte anstatt %s in Queries verwendet werden)
  79.         new query[128];
  80.         mysql_format(handle, query, sizeof(query), "SELECT id FROM users WHERE name = '%e'", PlayerInfo[playerid][pName]);
  81.  
  82.         //Das Query wird abgesendet und die playerid an OnUserCheck übergeben
  83.         mysql_pquery(handle, query, "OnUserCheck", "d", playerid);
  84.     }
  85.     return 1;
  86. }
  87.  
  88. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  89. {
  90.     if(dialogid == DIALOG_REGISTER)
  91.     {
  92.         //Spieler hat Abbrechen gewählt
  93.         if(!response) return Kick(playerid);
  94.  
  95.         //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
  96.         if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Bitte registriere Dich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
  97.  
  98.         //Wenn alles passt wird der Spieler in der Datenbank angelegt
  99.         //Als Verschlüsselung für das Passwort wird MD5 verwendet
  100.         new query[256];
  101.         mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password) VALUES ('%e', MD5('%e'))", PlayerInfo[playerid][pName], inputtext);
  102.  
  103.         //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
  104.         mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
  105.         return 1;
  106.     }
  107.     if(dialogid == DIALOG_LOGIN)
  108.     {
  109.         //Spieler hat Abbrechen gewählt
  110.         if(!response) return Kick(playerid);
  111.  
  112.         //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
  113.         if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
  114.  
  115.         //Wenn alles passt wird die Datenbank ausgelesen
  116.         new query[256];
  117.         mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e' AND password = MD5('%e')", PlayerInfo[playerid][pName], inputtext);
  118.  
  119.         //Das Query wird abgesendet und die playerid an OnUserLogin übergeben
  120.         mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
  121.         return 1;
  122.     }
  123.     return 0;
  124. }
  125.  
  126. public OnPlayerDisconnect(playerid, reason)
  127. {
  128.     //Speichere den Spieler wenn er der Server verlässt
  129.     SaveUserStats(playerid);
  130.     return 1;
  131. }
  132.  
  133. forward OnUserCheck(playerid);
  134. public OnUserCheck(playerid)
  135. {
  136.     //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
  137.     new rows;
  138.     cache_get_row_count(rows);
  139.     if(rows == 0)
  140.     {
  141.         //Der Spieler konnte nicht gefunden werden, er muss sich registrieren
  142.         ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Bitte registriere Dich:", "Ok", "Abbrechen");
  143.     }
  144.     else
  145.     {
  146.         //Es existiert ein Ergebnis, das heißt der Spieler ist registriert und muss sich einloggen
  147.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:", "Ok", "Abbrechen");
  148.     }
  149.     return 1;
  150. }
  151.  
  152. forward OnUserRegister(playerid);
  153. public OnUserRegister(playerid)
  154. {
  155.     //Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
  156.     PlayerInfo[playerid][p_id] = cache_insert_id();
  157.     PlayerInfo[playerid][pLoggedIn]  = true;
  158.     SendClientMessage(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
  159.     return 1;
  160. }
  161.  
  162. forward OnUserLogin(playerid);
  163. public OnUserLogin(playerid)
  164. {
  165.     //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
  166.     new rows;
  167.     cache_get_row_count(rows);
  168.     if(rows == 0)
  169.     {
  170.         //Der Spieler hat ein falsches Passwort eingegeben
  171.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
  172.     }
  173.     else
  174.     {
  175.         //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
  176.         //Wir lesen nun die erste Zeile des Caches aus (ID 0)
  177.         cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
  178.         cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
  179.         cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
  180.         cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
  181.         cache_get_value_name_int(0, "deaths", PlayerInfo[playerid][pDeaths]);
  182.         PlayerInfo[playerid][pLoggedIn]  = true;
  183.         SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
  184.         GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
  185.     }
  186.     return 1;
  187. }
  188.  
  189. public OnPlayerDeath(playerid, killerid, reason)
  190. {
  191.     //Beispielcode
  192.     if(killerid != INVALID_PLAYER_ID)
  193.     {
  194.         PlayerInfo[killerid][pKills]++;
  195.         GivePlayerMoney(killerid, 10);
  196.         PlayerInfo[killerid][pMoney] += 10;
  197.         if(PlayerInfo[killerid][pKills] > 3)
  198.         {
  199.             PlayerInfo[killerid][pLevel] = 1;
  200.         }
  201.     }
  202.     PlayerInfo[playerid][pDeaths]++;
  203.     return 1;
  204. }
  205.  
  206. stock SaveUserStats(playerid)
  207. {
  208.     //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
  209.     if(!PlayerInfo[playerid][pLoggedIn]) return 1;
  210.  
  211.     //Ansonsten speichere sie
  212.     new query[256];
  213.     mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
  214.         PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
  215.  
  216.     //Das Query wird abgesendet
  217.     mysql_pquery(handle, query);
  218.     return 1;
  219. }
  220.  
  221. stock MySQL_SetupConnection(ttl = 3)
  222. {
  223.     print("[MySQL] Verbindungsaufbau...");
  224.     //mysql_log();  //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
  225.  
  226.     handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DBSE);
  227.  
  228.     //Prüfen und gegebenenfalls wiederholen
  229.     if(mysql_errno(handle) != 0)
  230.     {
  231.         //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
  232.         if(ttl > 1)
  233.         {
  234.             //Versuche erneut eine Verbindung aufzubauen
  235.             print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  236.             printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
  237.             return MySQL_SetupConnection(ttl-1);
  238.         }
  239.         else
  240.         {
  241.             //Abbrechen und Server schließen
  242.             print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  243.             print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
  244.             print("[MySQL] Der Server wird heruntergefahren.");
  245.             return SendRconCommand("exit");
  246.         }
  247.     }
  248.     printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", _:handle);
  249.     return 1;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement