Advertisement
JeffryUGP

[FS] MySQL Register-Login-System Beispielscript (R39-3)

Aug 14th, 2015
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.23 KB | None | 0 0
  1. /*============================================================================================================================*
  2. * Credits: Dieser Filterscript "Register-Login-System" wurde von Jeffry gemacht!                                              *
  3. *                                                                                                                             *
  4. *                                                                                                                             *
  5. * Kompatible MySQL Versionen: R39-3 bis R39-6                                                                                 *
  6. *                                                                                                                             *
  7. * Made in August 2015.                                                                                                        *
  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 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 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.     if(cache_get_row_count() == 0)
  138.     {
  139.         //Der Spieler konnte nicht gefunden werden, er muss sich registrieren
  140.         ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", "Bitte registriere Dich:", "Ok", "Abbrechen");
  141.     }
  142.     else
  143.     {
  144.         //Es existiert ein Ergebnis, das heißt der Spieler ist registriert und muss sich einloggen
  145.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:", "Ok", "Abbrechen");
  146.     }
  147.     return 1;
  148. }
  149.  
  150. forward OnUserRegister(playerid);
  151. public OnUserRegister(playerid)
  152. {
  153.     //Der Spieler wurde in die Datenbank eingetragen, es wird die id ausgelesen
  154.     PlayerInfo[playerid][p_id] = cache_insert_id();
  155.     SendClientMessage(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
  156.     return 1;
  157. }
  158.  
  159. forward OnUserLogin(playerid);
  160. public OnUserLogin(playerid)
  161. {
  162.     //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
  163.     if(cache_get_row_count() == 0)
  164.     {
  165.         //Der Spieler hat ein falsches Passwort eingegeben
  166.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
  167.     }
  168.     else
  169.     {
  170.         //Es existiert ein Ergebnis, das heißt der Spieler hat das richtige Passwort eingegeben
  171.         //Wir lesen nun die erste Zeile des Caches aus (ID 0)
  172.         PlayerInfo[playerid][p_id]       = cache_get_field_content_int(0, "id", handle);
  173.         PlayerInfo[playerid][pLevel]     = cache_get_field_content_int(0, "level", handle);
  174.         PlayerInfo[playerid][pMoney]     = cache_get_field_content_int(0, "money", handle);
  175.         PlayerInfo[playerid][pKills]     = cache_get_field_content_int(0, "kills", handle);
  176.         PlayerInfo[playerid][pDeaths]    = cache_get_field_content_int(0, "deaths", handle);
  177.         PlayerInfo[playerid][pLoggedIn]  = true;
  178.         SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt.");
  179.         GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
  180.     }
  181.     return 1;
  182. }
  183.  
  184. public OnPlayerDeath(playerid, killerid, reason)
  185. {
  186.     //Beispielcode
  187.     if(killerid != INVALID_PLAYER_ID)
  188.     {
  189.         PlayerInfo[killerid][pKills]++;
  190.         GivePlayerMoney(killerid, 10);
  191.         PlayerInfo[killerid][pMoney] += 10;
  192.         if(PlayerInfo[killerid][pKills] > 3)
  193.         {
  194.             PlayerInfo[killerid][pLevel] = 1;
  195.         }
  196.     }
  197.     PlayerInfo[playerid][pDeaths]++;
  198.     return 1;
  199. }
  200.  
  201. stock SaveUserStats(playerid)
  202. {
  203.     //Wenn der Spieler nicht eingeloggt ist, dann speichere seine Statistiken nicht
  204.     if(!PlayerInfo[playerid][pLoggedIn]) return 1;
  205.  
  206.     //Ansonsten speichere sie
  207.     new query[256];
  208.     mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
  209.         PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id]);
  210.  
  211.     //Das Query wird abgesendet
  212.     mysql_pquery(handle, query);
  213.     return 1;
  214. }
  215.  
  216. stock MySQL_SetupConnection(ttl = 3)
  217. {
  218.     print("[MySQL] Verbindungsaufbau...");
  219.     //mysql_log(LOG_ALL);  //<- Kommentar vor mysql_log entfernen um den MySQL Debug-Modus zu aktivieren
  220.  
  221.     handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DBSE, MYSQL_PASS);
  222.  
  223.     //Prüfen und gegebenenfalls wiederholen
  224.     if(mysql_errno(handle) != 0)
  225.     {
  226.         //Fehler im Verbindungsaufbau, prüfe ob ein weiterer Versuch gestartet werden soll
  227.         if(ttl > 1)
  228.         {
  229.             //Versuche erneut eine Verbindung aufzubauen
  230.             print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  231.             printf("[MySQL] Starte neuen Verbindungsversuch (TTL: %d).", ttl-1);
  232.             return MySQL_SetupConnection(ttl-1);
  233.         }
  234.         else
  235.         {
  236.             //Abbrechen und Server schließen
  237.             print("[MySQL] Es konnte keine Verbindung zur Datenbank hergestellt werden.");
  238.             print("[MySQL] Bitte prüfen Sie die Verbindungsdaten.");
  239.             print("[MySQL] Der Server wird heruntergefahren.");
  240.             return SendRconCommand("exit");
  241.         }
  242.     }
  243.     printf("[MySQL] Die Verbindung zur Datenbank wurde erfolgreich hergestellt! Handle: %d", handle);
  244.     return 1;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement