Advertisement
Guest User

Untitled

a guest
May 18th, 2013
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 14.47 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3.  
  4. // Optional kannst du natürlich, falls du das noch nicht gemacht hast, MAX_PLAYERS verringern
  5. // Das ist äußerst resourcenschonender und schneller!
  6. #undef MAX_PLAYERS
  7. #define MAX_PLAYERS 5
  8. // Die Zahl der max. Spieleranzahl musst du natürlich anpassen!
  9.  
  10. #define DIALOG_REGISTER 1 // Anpassen, falls notwendig [Konstanten sollten immer groß geschrieben werden und vom Namen her klar sein]
  11. #define DIALOG_LOGIN 2 // Anpassen, falls notwendig [Konstanten sollten immer groß geschrieben werden und vom Namen her klar sein]
  12.  
  13. new mycon; // Würde ich verwenden, (mycon = MySQLConnection), um sicherzugehen (Siehe OnGameModeInit)
  14.  
  15. enum UserData
  16. {
  17.     Username[MAX_PLAYER_NAME+1], // +1 wegen dem Null-Terminator '\0'
  18.     Geld, // Zum Test der Integerfunktion
  19.     Float:Leben, // Zum Test der Float Funktion
  20.     LastLogin[11], // Zum Test der Stringfunktion - XX/XX/XXXX + '\0' = 11 Zeichen
  21.     bool:Logged, // Ist der Spieler eingeloggt?
  22.     LoginDataCacheID //[ID für cache_save]
  23. }
  24. new User[MAX_PLAYERS][UserData];
  25.  
  26.  
  27. forward LoadPlayerDataSequence(playerid, l_step);
  28. forward KickPlayer(playerid);
  29.  
  30. public OnGameModeInit()
  31. {
  32.     mycon = mysql_connect("localhost","Username","Database","Passwort"); // Startet die Verbindung zur MySQL Datenbank (Angaben müssen angepasst werden!)
  33.     // mycon müsste wenn es geklappt hat nun 1 sein, ansonsten seid ihr nicht verbunden!
  34.     return 1;
  35. }
  36.  
  37. public OnGameModeExit()
  38. {
  39.     mysql_close(); // Das gibt es nach wie vor!
  40.     return 1;
  41. }
  42.  
  43. public OnPlayerConnect(playerid)
  44. {
  45.     // Als allererstes sichern wir den Namen des Spielers
  46.     GetPlayerName(playerid,User[playerid][Username],MAX_PLAYER_NAME);
  47.    
  48.     // Da wir diesen haben, kommt auch gleich der 1. Query!
  49.     new query[60 + MAX_PLAYER_NAME]; // Anpassen, je nachdem wie groß der Text in mysql_format ist! (Ohne %e)
  50.     mysql_format(mycon, query, sizeof(query), "SELECT * FROM `User` WHERE `Name` = '%e'",User[playerid][Username]); //[gleich alle Daten holen]
  51.     // So - Was habe ich hier gemacht?
  52.     // Folgendes: die Variable "query" hat nun den daneben eingegeben formatted Text bekommen
  53.     // Wir zählen die Anzahl der Einträge, die in der Tabelle "User" sind, wo der Name "Spielername einfügen" ist.
  54.     // Vielleicht fragt ihr euch, warum %e ? %e ist ein String, der speziell von mysql_format schon escaped wurde
  55.     // also spezielle Zeichen werden abgeändert, damit sie korrekt abgespeichert werden können
  56.    
  57.     mysql_function_query(mycon, query, true, "LoadPlayerDataSequence","dd",playerid,1);
  58.     // So - Was habe ich hier gemacht?
  59.     // Ganz einfach, jetzt haben wir die Query rausgeschickt und dazu den Cache angeschalten!
  60.     // Die Antwort erhalten wir nun in LoadPlayerDataSequence
  61.     // Wie du unten sehen kannst enthält LoadPlayerDataSequence 2 Parameter, die, die ich oben angegeben habe!
  62.     return 1; // Das nicht vergessen ;)
  63. }
  64.  
  65. public OnPlayerDisconnect(playerid, reason)
  66. {
  67.     if(User[playerid][Logged]) // Er soll nur gespeichert werden, wenn er auch aktiv war, also eingeloggt!
  68.     {
  69.         SavePlayerData(playerid); // Ich finde es extrem angenehm, es woanders zusammengefasst vorzufinden
  70.     }
  71.     ResetPlayerVariables(playerid); // Das Resetten kann eine lange Liste werden und auch das finde ich im unteren Bereich angenehmer
  72.     // ResetPlayerVariables sollte aber aus Sicherheitsgründen auch für nicht eingeloggte Spieler gelten
  73.     return 1;
  74. }
  75.  
  76. // Callback Nr. 5 - OnPlayerSpawn
  77. public OnPlayerSpawn(playerid)
  78. {
  79.     // Da ich nicht weiß, wo ihr spawnen wollt, müsst ihr die Position selbst reinmachen!
  80.     // Das ist notwendig, da ihr sonst womöglich durch die Map fallt!
  81.     SetPlayerPos(playerid, 0.0, 0.0, 0.0); // Anpassen!
  82.     return 1;
  83. }
  84.  
  85. public OnPlayerRequestSpawn(playerid)
  86. {
  87.     if(!User[playerid][Logged]) return 0; // Solange der Spieler nicht eingeloggt ist, soll er nicht spawnen können!
  88.     return 1; // Ermöglicht das Spawnen!
  89. }
  90.  
  91. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  92. {
  93.     switch(dialogid)
  94.     {
  95.         case DIALOG_REGISTER: // Nehmen wir zuerst den Register-Dialog
  96.         {
  97.             if(!response) // Wenn er den 2. Button (Abbrechen) gedrückt wurde
  98.             {
  99.                 // Hier schicken wir den Spieler vom Server
  100.                 SendClientMessage(playerid,0xFF0000FF,"Bitte benutzen Sie /q, um das Spiel zu beenden!");
  101.                 SetTimerEx("KickPlayer",250,0,"i",playerid);
  102.                 return 1;
  103.             }
  104.             // Kein else nötig, da wir oben returnt haben
  105.             new InputLength = strlen(inputtext); // [so spart man sich ein strlen]
  106.             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?]
  107.             // if(!inputtext[0] || !(3 <= strlen(inputtext) <= 25)) // Für Fortgeschrittene
  108.             {
  109.                 // Da die Eingabe wegen Länge oder gar keiner Eingabe fehlgeschlagen ist, bitten wir ihn erneut um eine Eingabe, diesmal mit Hinweis (in Rot!)
  110.                 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");
  111.                 return 1;
  112.             }
  113.             // Da das geklappt hat, lassen wir ihn auf den Server, davor aber legen wir einen Eintrag für ihn in der Datenbank ab
  114.             new query[128+MAX_PLAYER_NAME], year, month, day;
  115.             getdate(year, month, day);
  116.             format(query, sizeof(query),"%d/%d/%d",day,month,year); // Damit wir keine extra Variable noch extra erstellen müssen
  117.             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);
  118.             mysql_function_query(mycon, query, false, "", ""); // Hier brauchen wir keine Werte aus der Datenbank, also Cache = false und der Rest leer
  119.             User[playerid][Logged] = true;
  120.             SpawnPlayer(playerid);
  121.             return 1;
  122.             // Register fertig!
  123.         }
  124.         case DIALOG_LOGIN:
  125.         {
  126.             if(!response) // Wenn er den 2. Button (Abbrechen) gedrückt hat
  127.             {
  128.                 // Hier schicken wir den Spieler vom Server
  129.                 SendClientMessage(playerid,0xFF0000FF,"Bitte benutzen Sie /q, um das Spiel zu beenden!");
  130.                 SetTimerEx("KickPlayer",250,0,"i",playerid);
  131.                 return 1;
  132.             }
  133.             // Kein else nötig, da wir oben returnt haben
  134.             new InputLength = strlen(inputtext); // [so spart man sich ein strlen]
  135.             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?]
  136.             // if(!inputtext[0] || !(3 <= strlen(inputtext) <= 25)) // Für Fortgeschrittene
  137.             {
  138.                 // Da die Eingabe wegen Länge oder gar keiner Eingabe fehlgeschlagen ist, bitten wir ihn erneut um eine Eingabe, wieder mit Hinweis (in Rot!)
  139.                 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");
  140.                 return 1;
  141.             }
  142.             /*
  143.             // So hier müssen wir nun Abfragen ob das Passwort denn dasselbe ist!
  144.             new query[80 + MAX_PLAYER_NAME];
  145.             mysql_format(mycon, query, sizeof(query), "SELECT COUNT(*) AS `count` FROM `User` WHERE `Name` = '%e' AND `Passwort` = '%e'",User[playerid][Username],inputtext);
  146.             // Hier ganz einfach, wie beim anderen COUNT, wird hier auch gezählt, ob es diesen Eintrag, wo Name und Passwort gleich sind, gibt!
  147.             mysql_function_query(mycon, query, true, "LoadPlayerDataSequence","dd",playerid,2); // Step 2
  148.             // Das ganze schicken wir ab!
  149.             */
  150.             //[wir haben alle Daten schon per cache_save gespeichert, also benutzen wir sie doch!]
  151.             cache_set_active(User[playerid][LoginDataCacheID]);
  152.             new UserPassword[64];
  153.             cache_get_field_content(0, "Passwort", UserPassword);
  154.             if(strcmp(UserPassword, inputtext) == 0) { //[Passwort richtig]
  155.                 User[playerid][Geld] = cache_get_field_content_int(0,"Geld");
  156.                 User[playerid][Leben] = cache_get_field_content_float(0,"Leben");
  157.                 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!]
  158.                 User[playerid][Logged] = true;
  159.                 SpawnPlayer(playerid);
  160.                
  161.                 cache_delete(User[playerid][LoginDataCacheID]);
  162.                 User[playerid][LoginDataCacheID] = 0;
  163.             }
  164.             else {
  165.                 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");
  166.                 return 1;
  167.             }
  168.             //cache_set_active(0); //[erst möglich ab R21, setzt aktive Cache zurück]
  169.             return 1;
  170.         }
  171.     }
  172.     return 1;
  173. }
  174.  
  175. public LoadPlayerDataSequence(playerid, l_step) //[dadurch, dass wir cache_save benutzt haben, sparen wir uns den Parameter 'l_step']
  176. {
  177.     if(User[playerid][LoginDataCacheID] <= 0) //[überprüfe, ob Cache schon gespeichert wurde]
  178.         User[playerid][LoginDataCacheID] = cache_save(); //[wir speichern die Cache, um sie nicht mehr per Query abrufen zu müssen]
  179.     //switch(l_step) // Damit man nicht ewig if(...) else if(...) usw. schreiben muss
  180.     //{
  181.         //case 1:
  182.         //{
  183.     // Jetzt gucken wir, ob es einen Eintrag gibt
  184.     //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
  185.     new Rows, Fields;
  186.     cache_get_data(Rows, Fields);
  187.     if(Rows) // Wenn [Rows] 1 oder höher ist (Keine Angst, höher als 1 kann sie nicht kommen)
  188.     {
  189.         // Der Eintrag existiert, also lassen wir den Spieler einloggen
  190.         ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort Eingabe - Loginsequenz]","{FFFFFF}Bitte geben Sie Ihr Passwort ein!","Login","Abbrechen");
  191.         //return 1; //[muss nicht sein]
  192.     }
  193.     else
  194.     {
  195.         // Es gibt keinen Eintrag, also ist er neu und muss sich registrieren
  196.         ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{00FF00}[Passwort eingabe - Registrierung]","{FFFFFF}Bitte geben Sie Ihr gewünschtes Passwort ein!","Register","Abbrechen");
  197.         //return 1; //[muss nicht sein]
  198.     }
  199.         //}
  200.         //case 2:
  201.         //{
  202.             /*
  203.             // Jetzt gucken wir, ob es einen Eintrag gibt
  204.             new count = cache_get_field_content_int(0,"count");
  205.             if(count) // Wenn count 1 oder höher ist
  206.             {
  207.                 // Der Eintrag existiert, also lassen wir den Spieler nun die Spielerdaten laden und danach den Spieler spawnen
  208.                 new query[60 + MAX_PLAYER_NAME];
  209.                 mysql_format(mycon,query, sizeof(query), "SELECT * FROM `User` WHERE `Name` = '%e'",User[playerid][Username]);
  210.                 mysql_function_query(mycon,query,true,"LoadPlayerDataSequence","dd",playerid,3);
  211.                 return 1;
  212.             }
  213.             else
  214.             {
  215.                 // Es gibt keinen Eintrag, also ist das Passwort falsch
  216.                 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");
  217.                 return 1;
  218.             }
  219.             */
  220.         //}
  221.         //case 3:
  222.         //{
  223.             // Wir laden nun die Spielerdaten
  224.             // Der Vorteil bei den cache-Funktionen ist, dass sie am Ende kein mysql_free_result brauchen sondern direkt danach den Cache leeren
  225.             /*User[playerid][Geld] = cache_get_field_content_int(0,"Geld");
  226.             User[playerid][Leben] = cache_get_field_content_float(0,"Leben");
  227.             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!]
  228.             User[playerid][Logged] = true;
  229.             SpawnPlayer(playerid);
  230.             return 1;
  231.             */
  232.             // Fertig!
  233.         //}
  234.         /*default:
  235.         {
  236.             // Falls er hier auftauchen sollte, was eigentlich unwahrscheinlich ist, wird er aufgefordert zu reconnecten, und gleichzeitig gekickt!
  237.             SendClientMessage(playerid,0xFF0000FF,"Es könnte ein Bug aufgetreten sein! Bitte reconnecten Sie!");
  238.             SetTimerEx("KickPlayer",250,0,"i",playerid); // Wegen einem Bug von SA:MP muss der Kick nun per Timer ablaufen, damit die Nachricht auftaucht!
  239.             return 1;
  240.         }*/
  241.     //}
  242.     return 1;
  243. }
  244.  
  245. stock SavePlayerData(playerid)
  246. {
  247.     // Hier speichern wir noch die Daten ab
  248.     new query[100 + MAX_PLAYER_NAME];
  249.     mysql_format(mycon,query, sizeof(query), "UPDATE `User` SET `Geld` = %d WHERE `Name` = '%e'",User[playerid][Geld],User[playerid][Username]);
  250.     mysql_function_query(mycon,query,false,"","");
  251.     mysql_format(mycon,query, sizeof(query),"UPDATE `User` SET `Leben` = %.1f WHERE `Name` = '%e'",User[playerid][Leben],User[playerid][Username]);
  252.     mysql_function_query(mycon,query,false,"","");
  253.     new day,month,year; getdate(year,month,day);
  254.     format(User[playerid][LastLogin],11,"%d/%d/%d",day,month,year);
  255.     mysql_format(mycon,query, sizeof(query),"UPDATE `User` SET `LastLogin` = '%e' WHERE `Name` = '%e'",User[playerid][LastLogin],User[playerid][Username]);
  256.     mysql_function_query(mycon,query,false,"","");
  257.     return 1;
  258. }
  259.  
  260. stock ResetPlayerVariables(playerid)
  261. {
  262.     // Und hier noch Resetten
  263.     User[playerid][Geld] = 0;
  264.     User[playerid][Leben] = 0.0;
  265.     strdel(User[playerid][Username],0,MAX_PLAYER_NAME+1);
  266.     strdel(User[playerid][LastLogin],0,11);
  267.     User[playerid][Logged] = false;
  268.     User[playerid][LoginDataCacheID] = 0;
  269.     return 1;
  270. }
  271.  
  272. public KickPlayer(playerid)
  273.     return Kick(playerid);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement