Advertisement
razvan_xd

Pt. Victor Petrescu @ gta-mp.ro

Oct 27th, 2012
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.88 KB | None | 0 0
  1. //===================================[CREDITE]==================================
  2.  
  3. /*
  4.  
  5. 1. SA-MP DEV. TEAM - SQLITE
  6. 2. Y_LESS - DB_ESCAPE
  7. 3. AUTORUL FUNCTIEI "STRCPY" ( CRED CA DOUBLE-O-SEVEN )
  8. 4. AUTORUL MACRO-ULUI "ISNULL" ( ZEEX ? )
  9. 5. RAZVAN ^ XD - SCRIPTARE
  10.  
  11. */
  12.  
  13. //=================================[DEFINE-URI]=================================
  14.  
  15. #define     DIALOG_INREGISTRARE     ( 0 )   // ID-ul dialogului de inregistrare
  16. #define     DIALOG_LOGARE           ( 1 )   // ID-ul dialogului de logare
  17. #define     DIALOG_MSGBOX           ( 2 )   // ID-ul dialogului de mesaje informationale
  18.  
  19. #if !defined isnull
  20.     #define isnull(%1) \
  21.                 ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  22. #endif                                      // isnull() este un macro care verifica daca un string este "gol"
  23.  
  24. #define     FILTERSCRIPT                    // Necesar pentru ZCMD
  25.  
  26. //=================================[INCLUDE-URI]================================
  27.  
  28. #include    < a_samp >                      // Libraria principala
  29. #include    < zcmd >                        // Librarie folosita pentru prelucrarea mai eficienta a comenzilor
  30.  
  31. //=================================[VARIABILE]==================================
  32.  
  33. enum pInfo
  34. {
  35.     pNume [ MAX_PLAYER_NAME ], // Variabila aceasta va stoca numele jucatorului pentru a nu folosi mereu GetPlayerName() si/sau DB_Escape()
  36.     pOmoruri, // Variabila aceasta numarul de omoruri al jucatorului
  37.     pDecese // Variabila aceasta va stoca numarul de decese al jucatorului
  38. }
  39.  
  40. new
  41.     Statistici [ MAX_PLAYERS ] [ pInfo ], // Creeaza enumeratia
  42.     bool: Logat [ MAX_PLAYERS ], // Un "boolean" care va verifica daca jucatorul este logat
  43.     DB: DB // Baza de date SQLite
  44. ;
  45.  
  46. //==================================[COMENZI]===================================
  47.  
  48. CMD:stats ( playerid, params [ ] )
  49. {
  50.     if ( !Logat [ playerid ] ) return SendClientMessage ( playerid, 0xFFFFFFFF, "* Nu sunteti {FF0000}logat{FFFFFF} ."); // Se verifica daca jucatorul este logat; daca nu e logat, nu ii este permisa vizualizarea statisticilor
  51.  
  52.     new
  53.         string [ 128 ] // Se creaza un string care va stoca toate detaliile jucatorului
  54.     ;
  55.    
  56.     format ( string, sizeof ( string ), "\tStatisticile dvs, %s:\n\nOmoruri: %i\nDecese: %i\nBani: %i", Statistici [ playerid ] [ pNume ], Statistici [ playerid ] [ pOmoruri ], Statistici [ playerid ] [ pDecese ], GetPlayerMoney ( playerid ) ); // Se introduc date in string
  57.     ShowPlayerDialog ( playerid, DIALOG_MSGBOX, DIALOG_STYLE_MSGBOX, "Statisticile dvs.", string, "Ok", "" ); // Se afiseaza dialogul cu statisticile jucatorului
  58.  
  59.     return 1;
  60. }
  61.  
  62. //================================[CALLBACK-URI]================================
  63.  
  64. public OnFilterScriptInit ( )
  65. {
  66.  
  67.     DB = db_open ( "Jucatori.db" ); // Deschide baza de date
  68.     db_free_result ( db_query ( DB, "CREATE TABLE IF NOT EXISTS `Jucatori` ( `Nume Jucator` TEXT, `Parola` TEXT, `Omoruri` NUMERIC, `Decese` NUMERIC, `Bani` NUMERIC )" ) ); // Daca nu exista deja continutul bazei de date, il creeaza
  69.  
  70.     print ( "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\tSistem de inregistrare\n\t\tAutor: RaZVaN ^ xD\n\tContact: [email protected]\n\n\n\n\n\n\n\n\n\n\n\n\n\n" ); // Niste credite :)
  71.  
  72.     return 1;
  73. }
  74.  
  75. public OnFilterScriptExit ( )
  76. {
  77.  
  78.     db_close ( DB ); // Inchide baza de date
  79.  
  80.     return 1;
  81. }
  82.  
  83. public OnPlayerConnect ( playerid )
  84. {
  85.  
  86.     new
  87.         Query [ 128 ], // Creeaza un query care va fi trimis pentru a verifica daca un jucator are cont
  88.         DBResult: Rezultat, // Variabila va stoca rezultatul query-ului
  89.         Nume [ MAX_PLAYER_NAME ] // Variabila care va stoca TEMPORAR numele jucatorului
  90.     ;
  91.    
  92.     Statistici [ playerid ] [ pOmoruri ] = 0; // Se reseteaza variabila
  93.     Statistici [ playerid ] [ pDecese ] = 0; // ^^^^^^^^^^^^^^^^^^^^^^^
  94.     Logat [ playerid ] = false; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  95.    
  96.     GetPlayerName ( playerid, Nume, MAX_PLAYER_NAME ); // Se stocheaza numele jucatorului in variabila "Nume"
  97.     strcpy ( Statistici [ playerid ] [ pNume ], DB_Escape ( Nume ), MAX_PLAYER_NAME ); // Se introduce numele jucatorului in variabila "pNume" din enumeratie fara caractere care ar putea duce la SQL INJECTION
  98.  
  99.     format ( Query, sizeof ( Query ), "SELECT `Omoruri` FROM `Jucatori` WHERE `Nume Jucator` = '%s' LIMIT 1", Statistici [ playerid ] [ pNume ] ); // Verifica daca jucatorul are cont
  100.     Rezultat = db_query ( DB, Query ); // Rezultatul query-ului
  101.  
  102.     if ( db_num_rows ( Rezultat ) > 0 ) // Jucatorul are cont
  103.         ShowPlayerDialog ( playerid, DIALOG_LOGARE, DIALOG_STYLE_PASSWORD, "Logare", "Sunteti inregistrat.\n\nPentru a va loga, tastati parola in casuta de mai jos:", "Ok", ""); // Box-ul de logare
  104.     else // Inseamna ca jucatorul nu are cont
  105.         ShowPlayerDialog ( playerid, DIALOG_INREGISTRARE, DIALOG_STYLE_PASSWORD, "Inregistrare", "Nu sunteti inregistrat.\n\nPentru a va inregistra, tastati parola in casuta de mai jos:", "Ok", ""); // Box-ul de inregistrare
  106.  
  107.     db_free_result ( Rezultat ); // Elibereaza rezultatul pentru query
  108.  
  109.     return 1;
  110.  
  111. }
  112.  
  113. public OnPlayerDisconnect ( playerid, reason )
  114. {
  115.  
  116.     if ( Logat [ playerid ] ) // Se verifica daca jucatorul este logat
  117.     {
  118.  
  119.         new
  120.             Query [ 128 ] // Se creaza un string care va stoca query-ul de actualizare
  121.         ;
  122.  
  123.         format ( Query, sizeof ( Query ), "UPDATE `Jucatori` SET `Omoruri` = '%i', `Decese` = '%i', `Bani` = '%i' WHERE `Nume Jucator` = '%s'", Statistici [ playerid ] [ pOmoruri ], Statistici [ playerid ] [ pDecese ], GetPlayerMoney ( playerid ), Statistici [ playerid ] [ pNume ] ); // Se formateaza query-ul
  124.         db_free_result ( db_query ( DB, Query ) ); // Se executa query-ul
  125.  
  126.     }
  127.  
  128.     return 1;
  129.  
  130. }
  131.  
  132. public OnPlayerDeath ( playerid, killerid, reason )
  133. {
  134.  
  135.     Statistici [ playerid ] [ pDecese ] += 1; // Se adauga "un punct" la variabila "pDecese" a jucatorului "playerid"
  136.  
  137.     if ( killerid != INVALID_PLAYER_ID ) // Se verifica daca "playerid" a fost omorat de un jucator
  138.     {
  139.         Statistici [ killerid ] [ pOmoruri ] += 1; // Creste variabila "pOmoruri" a lui "killerid"
  140.         SetPlayerScore ( killerid, Statistici [ killerid ] [ pOmoruri ] ); // Se seteaza scorul lui "killerid"
  141.     }
  142.  
  143.     return 1;
  144.  
  145. }
  146.  
  147. public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext [ ] )
  148. {
  149.     switch ( dialogid )
  150.     {
  151.         case DIALOG_INREGISTRARE: // Jucatorul a raspuns la dialogul de inregistrare
  152.         {
  153.             if ( !response || isnull ( inputtext ) ) return ShowPlayerDialog ( playerid, DIALOG_INREGISTRARE, DIALOG_STYLE_PASSWORD, "Inregistrare", "Nu sunteti inregistrat.\n\nPentru a va inregistra, tastati parola in casuta de mai jos:", "Ok", ""); // In cazul in care jucatorul a inchis dialogul sau nu a scris nimic, ii reapare dialogul de inregistrare
  154.  
  155.             new
  156.                 query [ 256 ] // Se creaza un string care va stoca query-ul de inregistrare al jucatorului
  157.             ;
  158.  
  159.             format ( query, sizeof ( query ), "INSERT INTO `Jucatori` ( `Nume Jucator`, `Parola`, `Omoruri`, `Decese`, `Bani` ) VALUES ( '%s', '%s', '%i', '%i', '%i' )", Statistici [ playerid ] [ pNume ], DB_Escape ( inputtext ), Statistici [ playerid ] [ pOmoruri ], Statistici [ playerid ] [ pDecese ], GetPlayerMoney ( playerid ) ); // Se formateaza query-ul
  160.             db_free_result ( db_query ( DB, query ) ); // Se executa query-ul
  161.  
  162.             SendClientMessage ( playerid, 0xFFFFFFFF, "* Cont {00FF00}inregistrat {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
  163.            
  164.             Logat [ playerid ] = true; // Se seteaza variabila "Logat" pe adevarat pentru a arata ca jucatorul s-a logat.
  165.  
  166.             return 1;
  167.         }
  168.         case DIALOG_LOGARE:
  169.         {
  170.             if ( !response || isnull ( inputtext ) ) return ShowPlayerDialog ( playerid, DIALOG_LOGARE, DIALOG_STYLE_PASSWORD, "Logare", "Sunteti inregistrat.\n\nPentru a va loga, tastati parola in casuta de mai jos:", "Ok", ""); // In cazul in care jucatorul a inchis dialogul sau nu a scris nimic, ii reapare dialogul de logare
  171.  
  172.             new
  173.                 query [ 256 ], // Se creaza un string care va stoca query-ul de logare al jucatorului
  174.                 DBResult: Rezultat // Se creeaza o variabila care va stoca rezultatul query-ului
  175.             ;
  176.             format ( query, sizeof ( query ), "SELECT `Omoruri`, `Decese`, `Bani` FROM `Jucatori` WHERE `Nume Jucator` = '%s' AND `Parola` = '%s'", Statistici [ playerid ] [ pNume ], DB_Escape ( inputtext ) ); // Se verifica daca parola e corecta
  177.             Rezultat = db_query ( DB, query ); // Se executa query-ul
  178.             if ( db_num_rows ( Rezultat ) > 0 ) // Parola e corecta
  179.             {
  180.                 new
  181.                     tmp [ 16 ] // O variabila temporara care va stoca, pe rand, omorurile, decesele si banii jucatorului
  182.                 ;
  183.            
  184.                 db_get_field_assoc ( Rezultat, "Omoruri", tmp, sizeof ( tmp ) ); // Se extrag "omorurile" din baza de date
  185.                 Statistici [ playerid ] [ pOmoruri ] = strval ( tmp ); // Se seteaza variabila "pOmoruri" in conformitate cu ce s-a extras
  186.                 SetPlayerScore ( playerid, Statistici [ playerid ] [ pOmoruri ] ); // Se seteaza scorul de la "TAB" in conformitate cu variabila "pOmoruri"
  187.                
  188.                 db_get_field_assoc ( Rezultat, "Decese", tmp, sizeof ( tmp ) ); // Se extrag "decesele" din baza de date
  189.                 Statistici [ playerid ] [ pDecese ] = strval ( tmp ); // Se seteaza variabila "pDecese" in conformitate cu ce s-a extras
  190.                
  191.                 db_get_field_assoc ( Rezultat, "Bani", tmp, sizeof ( tmp ) ); // Se extrag "banii" din baza de date
  192.                 ResetPlayerMoney ( playerid ); // Se reseteaza banii jucatorului pe care ii detine in momentul logarii
  193.                 GivePlayerMoney ( playerid, strval ( tmp ) ); // Se dau jucatorului banii extrasi din baza de date
  194.                
  195.                 Logat [ playerid ] = true; // Se seteaza variabila "Logat" pe adevarat pentru a arata ca jucatorul s-a logat.
  196.                
  197.                 SendClientMessage ( playerid, 0xFFFFFFFF, "* V-ati {00FF00}logat {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
  198.             }
  199.            
  200.             else // Parola incorecta
  201.             {
  202.                 SendClientMessage ( playerid, 0xFFFFFFFF, "* Parola {FF0000}incorecta {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
  203.                 ShowPlayerDialog ( playerid, DIALOG_LOGARE, DIALOG_STYLE_PASSWORD, "Logare", "Sunteti inregistrat.\n\nPentru a va loga, tastati parola in casuta de mai jos:", "Ok", ""); // Retrimite boxul de logare jucatorului
  204.             }
  205.            
  206.             db_free_result ( Rezultat ); // Se elibereaza rezultatul query-ului
  207.  
  208.             return 1;
  209.         }
  210.     }
  211.     return 0;
  212. }
  213.  
  214. //==================================[FUNCTII]===================================
  215.  
  216. stock DB_Escape ( text [ ] ) // Aceasta functie impiedica SQL Injection ( Sursa: WIKI SA-MP )
  217. {
  218.  
  219.     new
  220.         ret [ 80 * 2 ],
  221.         ch,
  222.         i,
  223.         j
  224.     ;
  225.     while ( ( ch = text [ i++ ] ) && j < sizeof ( ret ) )
  226.     {
  227.         if ( ch == '\'' )
  228.         {
  229.             if ( j < sizeof ( ret ) - 2 )
  230.             {
  231.                 ret [ j++ ] = '\'';
  232.                 ret [ j++ ] = '\'';
  233.             }
  234.         }
  235.         else if ( j < sizeof ( ret ) )
  236.         {
  237.             ret [ j++ ] = ch;
  238.         }
  239.         else
  240.         {
  241.             j++;
  242.         }
  243.     }
  244.     ret [ sizeof ( ret ) - 1 ] = '\0';
  245.     return ret;
  246.  
  247. }
  248.  
  249. stock strcpy ( dest [ ], src [ ], size = sizeof ( dest ) ) // Functie folosita pentru copierea unui string
  250. {
  251.     dest [ 0 ] = '\0';
  252.     return strcat ( dest, src, size );
  253. }
  254.  
  255. //==============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement