Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //===================================[CREDITE]==================================
- /*
- 1. SA-MP DEV. TEAM - SQLITE
- 2. Y_LESS - DB_ESCAPE
- 3. AUTORUL FUNCTIEI "STRCPY" ( CRED CA DOUBLE-O-SEVEN )
- 4. AUTORUL MACRO-ULUI "ISNULL" ( ZEEX ? )
- 5. RAZVAN ^ XD - SCRIPTARE
- */
- //=================================[DEFINE-URI]=================================
- #define DIALOG_INREGISTRARE ( 0 ) // ID-ul dialogului de inregistrare
- #define DIALOG_LOGARE ( 1 ) // ID-ul dialogului de logare
- #define DIALOG_MSGBOX ( 2 ) // ID-ul dialogului de mesaje informationale
- #if !defined isnull
- #define isnull(%1) \
- ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
- #endif // isnull() este un macro care verifica daca un string este "gol"
- #define FILTERSCRIPT // Necesar pentru ZCMD
- //=================================[INCLUDE-URI]================================
- #include < a_samp > // Libraria principala
- #include < zcmd > // Librarie folosita pentru prelucrarea mai eficienta a comenzilor
- //=================================[VARIABILE]==================================
- enum pInfo
- {
- pNume [ MAX_PLAYER_NAME ], // Variabila aceasta va stoca numele jucatorului pentru a nu folosi mereu GetPlayerName() si/sau DB_Escape()
- pOmoruri, // Variabila aceasta numarul de omoruri al jucatorului
- pDecese // Variabila aceasta va stoca numarul de decese al jucatorului
- }
- new
- Statistici [ MAX_PLAYERS ] [ pInfo ], // Creeaza enumeratia
- bool: Logat [ MAX_PLAYERS ], // Un "boolean" care va verifica daca jucatorul este logat
- DB: DB // Baza de date SQLite
- ;
- //==================================[COMENZI]===================================
- CMD:stats ( playerid, params [ ] )
- {
- 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
- new
- string [ 128 ] // Se creaza un string care va stoca toate detaliile jucatorului
- ;
- 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
- ShowPlayerDialog ( playerid, DIALOG_MSGBOX, DIALOG_STYLE_MSGBOX, "Statisticile dvs.", string, "Ok", "" ); // Se afiseaza dialogul cu statisticile jucatorului
- return 1;
- }
- //================================[CALLBACK-URI]================================
- public OnFilterScriptInit ( )
- {
- DB = db_open ( "Jucatori.db" ); // Deschide baza de date
- 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
- 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 :)
- return 1;
- }
- public OnFilterScriptExit ( )
- {
- db_close ( DB ); // Inchide baza de date
- return 1;
- }
- public OnPlayerConnect ( playerid )
- {
- new
- Query [ 128 ], // Creeaza un query care va fi trimis pentru a verifica daca un jucator are cont
- DBResult: Rezultat, // Variabila va stoca rezultatul query-ului
- Nume [ MAX_PLAYER_NAME ] // Variabila care va stoca TEMPORAR numele jucatorului
- ;
- Statistici [ playerid ] [ pOmoruri ] = 0; // Se reseteaza variabila
- Statistici [ playerid ] [ pDecese ] = 0; // ^^^^^^^^^^^^^^^^^^^^^^^
- Logat [ playerid ] = false; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- GetPlayerName ( playerid, Nume, MAX_PLAYER_NAME ); // Se stocheaza numele jucatorului in variabila "Nume"
- 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
- format ( Query, sizeof ( Query ), "SELECT `Omoruri` FROM `Jucatori` WHERE `Nume Jucator` = '%s' LIMIT 1", Statistici [ playerid ] [ pNume ] ); // Verifica daca jucatorul are cont
- Rezultat = db_query ( DB, Query ); // Rezultatul query-ului
- if ( db_num_rows ( Rezultat ) > 0 ) // Jucatorul are cont
- 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
- else // Inseamna ca jucatorul nu are cont
- 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
- db_free_result ( Rezultat ); // Elibereaza rezultatul pentru query
- return 1;
- }
- public OnPlayerDisconnect ( playerid, reason )
- {
- if ( Logat [ playerid ] ) // Se verifica daca jucatorul este logat
- {
- new
- Query [ 128 ] // Se creaza un string care va stoca query-ul de actualizare
- ;
- 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
- db_free_result ( db_query ( DB, Query ) ); // Se executa query-ul
- }
- return 1;
- }
- public OnPlayerDeath ( playerid, killerid, reason )
- {
- Statistici [ playerid ] [ pDecese ] += 1; // Se adauga "un punct" la variabila "pDecese" a jucatorului "playerid"
- if ( killerid != INVALID_PLAYER_ID ) // Se verifica daca "playerid" a fost omorat de un jucator
- {
- Statistici [ killerid ] [ pOmoruri ] += 1; // Creste variabila "pOmoruri" a lui "killerid"
- SetPlayerScore ( killerid, Statistici [ killerid ] [ pOmoruri ] ); // Se seteaza scorul lui "killerid"
- }
- return 1;
- }
- public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext [ ] )
- {
- switch ( dialogid )
- {
- case DIALOG_INREGISTRARE: // Jucatorul a raspuns la dialogul de inregistrare
- {
- 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
- new
- query [ 256 ] // Se creaza un string care va stoca query-ul de inregistrare al jucatorului
- ;
- 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
- db_free_result ( db_query ( DB, query ) ); // Se executa query-ul
- SendClientMessage ( playerid, 0xFFFFFFFF, "* Cont {00FF00}inregistrat {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
- Logat [ playerid ] = true; // Se seteaza variabila "Logat" pe adevarat pentru a arata ca jucatorul s-a logat.
- return 1;
- }
- case DIALOG_LOGARE:
- {
- 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
- new
- query [ 256 ], // Se creaza un string care va stoca query-ul de logare al jucatorului
- DBResult: Rezultat // Se creeaza o variabila care va stoca rezultatul query-ului
- ;
- 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
- Rezultat = db_query ( DB, query ); // Se executa query-ul
- if ( db_num_rows ( Rezultat ) > 0 ) // Parola e corecta
- {
- new
- tmp [ 16 ] // O variabila temporara care va stoca, pe rand, omorurile, decesele si banii jucatorului
- ;
- db_get_field_assoc ( Rezultat, "Omoruri", tmp, sizeof ( tmp ) ); // Se extrag "omorurile" din baza de date
- Statistici [ playerid ] [ pOmoruri ] = strval ( tmp ); // Se seteaza variabila "pOmoruri" in conformitate cu ce s-a extras
- SetPlayerScore ( playerid, Statistici [ playerid ] [ pOmoruri ] ); // Se seteaza scorul de la "TAB" in conformitate cu variabila "pOmoruri"
- db_get_field_assoc ( Rezultat, "Decese", tmp, sizeof ( tmp ) ); // Se extrag "decesele" din baza de date
- Statistici [ playerid ] [ pDecese ] = strval ( tmp ); // Se seteaza variabila "pDecese" in conformitate cu ce s-a extras
- db_get_field_assoc ( Rezultat, "Bani", tmp, sizeof ( tmp ) ); // Se extrag "banii" din baza de date
- ResetPlayerMoney ( playerid ); // Se reseteaza banii jucatorului pe care ii detine in momentul logarii
- GivePlayerMoney ( playerid, strval ( tmp ) ); // Se dau jucatorului banii extrasi din baza de date
- Logat [ playerid ] = true; // Se seteaza variabila "Logat" pe adevarat pentru a arata ca jucatorul s-a logat.
- SendClientMessage ( playerid, 0xFFFFFFFF, "* V-ati {00FF00}logat {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
- }
- else // Parola incorecta
- {
- SendClientMessage ( playerid, 0xFFFFFFFF, "* Parola {FF0000}incorecta {FFFFFF}." ); // Se trimite un mesaj de informare jucatorului
- 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
- }
- db_free_result ( Rezultat ); // Se elibereaza rezultatul query-ului
- return 1;
- }
- }
- return 0;
- }
- //==================================[FUNCTII]===================================
- stock DB_Escape ( text [ ] ) // Aceasta functie impiedica SQL Injection ( Sursa: WIKI SA-MP )
- {
- new
- ret [ 80 * 2 ],
- ch,
- i,
- j
- ;
- while ( ( ch = text [ i++ ] ) && j < sizeof ( ret ) )
- {
- if ( ch == '\'' )
- {
- if ( j < sizeof ( ret ) - 2 )
- {
- ret [ j++ ] = '\'';
- ret [ j++ ] = '\'';
- }
- }
- else if ( j < sizeof ( ret ) )
- {
- ret [ j++ ] = ch;
- }
- else
- {
- j++;
- }
- }
- ret [ sizeof ( ret ) - 1 ] = '\0';
- return ret;
- }
- stock strcpy ( dest [ ], src [ ], size = sizeof ( dest ) ) // Functie folosita pentru copierea unui string
- {
- dest [ 0 ] = '\0';
- return strcat ( dest, src, size );
- }
- //==============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement