Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //------------------------------------MYSQL-----------------------------------//
- #include <a_samp>
- #include <a_mysql>
- //-----------------------//
- new MySQL:handle;
- //-----------------------//
- #define MYSQL_HOST "localhost"
- #define MYSQL_USER "root"
- #define MYSQL_PASSWORD "" // po defaultu na localhostu nemate password, osim ukoliko ne koristite MAMP onda je password root
- #define MYSQL_DATABASE "samp"
- //-----------------------//
- #define DIALOG_LOGIN (0)
- #define DIALOG_REGISTER (1)
- //-----------------------//
- enum ENUM_PLAYER_DATA
- {
- SQLID, // sqlid, unikatni user id
- Password[65], // password, za ovo koristimo SHA256 password hash koji je dodat u zadnjoj samp verziji
- Salt[11], // nasumicno generisano da modifikuje originalni hash,
- RegDate[65] // datum registracije, ovo je samo "test" da vam pokazem kako da uzmete nesto iz tablice
- }
- new PlayerInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
- //-----------------------//
- public OnFilterScriptInit()
- {
- return 1;
- }
- //-----------------------//
- public OnFilterScriptExit()
- {
- return 1;
- }
- //-----------------------//
- public OnGameModeInit()
- {
- handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE); // ovde sada koristimo onaj vec definisani handle i pokusavamo da se konektujemo sa vec definisanim informacijama
- if(mysql_errno(handle) != 0 || handle == MYSQL_INVALID_HANDLE) // ukoliko postoji eror kod konekcije sa databazom ispisujemo sledece i zatvaramo konzolu ->
- {
- print("Konekcija sa databazom nije uspesna, pogledajte da li su sve informacije ispravne.");
- SendRconCommand("exit");
- return true;
- }
- mysql_tquery(handle, "CREATE TABLE IF NOT EXISTS `players` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(24) NOT NULL , `password` VARCHAR(65) NOT NULL , `salt` VARCHAR(11) NOT NULL , `regdate` DATETIME NOT NULL , PRIMARY KEY (`id`))");
- // Ovaj upit radi sledece:
- // Proverava da li postoji tabela players i ukoliko ne postoji kreira istu
- // id postavlja kao primary key i stavlja ga na auto increment sto znaci da prilikom svakog unosa u bazu id ce se sam podizati za jedan.
- // name postavlja kao string duzine 24 karaktera, mozete name staviti da bude i unique sto bi znacilo da je to ime jedinstveno i da se ne moze uneti drugi red sa istim imenom, ali meni je to nepotrebno zbog provere na konektu.
- // password stavljamo kao string isto duzine 65 karaktera
- // salt isto samo sto je duzina 11 karaktera
- // i na kraju regdate je datum registracije njega postavljamo kao DATETIME sto je u sustine vreme i datum.
- return true;
- }
- //-----------------------//
- public OnGameModeExit()
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerRequestClass(playerid, classid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerConnect(playerid)
- {
- new query[128], // ovde definisemo string za query koji cemo formatirati i poslati kao upit
- name[MAX_PLAYER_NAME]; // uzimamo ime igraca u ovu varijablu
- GetPlayerName(playerid, name, sizeof(name)); // uzimamo ime
- mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name=`%e` LIMIT 1", name); // ovaj upit uzima sve iz tablice sa vasim imenom, limit 1 znaci prekid pretrage na prvom nadjenom rezultatu
- mysql_tquery(handle, query, "CheckPlayerData", "i", playerid); // ovo je "threaded query" uzima sve ovo i salje ga na sledecu funkciju na proveru
- return true;
- }
- //-----------------------//
- public OnPlayerDisconnect(playerid)
- {
- new query[128];
- mysql_format(handle, query, sizeof(query), "UPDATE players SET money=`%d`, level=`%d`, skin=`%d` WHERE id=`%d`",
- PlayerInfo[playerid][Money], PlayerInfo[playerid][Level], PlayerInfo[playerid][Skin],
- PlayerInfo[playerid][SQLID]);
- mysql_tquery(handle, query);
- return true;
- }
- //-----------------------//
- public OnPlayerSpawn(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerDeath(playerid, killerid, reason)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleSpawn(vehicleid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleDeath(vehicleid, killerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerText(playerid, text[])
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerCommandText(playerid, cmdtext[])
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerExitVehicle(playerid, vehicleid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerStateChange(playerid, newstate, oldstate)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerEnterCheckpoint(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerLeaveCheckpoint(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerEnterRaceCheckpoint(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerLeaveRaceCheckpoint(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnRconCommand(cmd[])
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerRequestSpawn(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnObjectMoved(objectid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerObjectMoved(playerid, objectid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerPickUpPickup(playerid, pickupid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleMod(playerid, vehicleid, componentid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleRespray(playerid, vehicleid, color1, color2)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerSelectedMenuRow(playerid, row)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerExitedMenu(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- return 1;
- }
- //-----------------------//
- public OnRconLoginAttempt(ip[], password[], success)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerUpdate(playerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerStreamIn(playerid, forplayerid)
- {
- return 1;
- }
- //-----------------------//
- public OnPlayerStreamOut(playerid, forplayerid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleStreamIn(vehicleid, forplayerid)
- {
- return 1;
- }
- //-----------------------//
- public OnVehicleStreamOut(vehicleid, forplayerid)
- {
- return 1;
- }
- //-----------------------//
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- switch(dialogid)
- {
- case DIALOG_LOGIN:
- {
- if(!response) return Kick(playerid);
- new buf[65], name[MAX_PLAYER_NAME];
- SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], buf, 65);
- if(strcmp(buf, PlayerInfo[playerid][Password]) == 0)
- {
- // Password se podudara sa unesenim
- // Sada treba da uzmemo ostale podatke
- GetPlayerName(playerid, name, sizeof(name));
- mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name = `%e` LIMIT 1", name);
- mysql_tquery(handle, query, "OnAccountLoad", "i", playerid);
- // sve smo zavrsili, u funkciji OnAccountLoad idete dalje
- }
- else
- {
- // ukoliko lozinka nije ispravna vracamo dialog
- ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Lozinka koju ste uneli nije ispravna, pokusajte ponovo:", "Dalje", "Izlaz");
- }
- }
- case DIALOG_REGISTER:
- {
- if(!response) return Kick(playerid);
- if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // ako je lozinka kraca od 6 i duza od 20 karaktera vraca dialog
- {
- ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
- return true;
- }
- // kao sto sam rekao salt je random generisan key, sada cemo ga randomizirati:
- for (new i = 0; i < 10; i++) {
- PlayerInfo[playerid][Salt][i] = random(100) + 50;
- }
- PlayerInfo[playerid][Salt][10] = 0;
- SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], PlayerInfo[playerid][Password], 65);
- // sada unosimo u bazu podatke igraca
- new query[256], name[MAX_PLAYER_NAME];
- GetPlayerName(playerid, name, sizeof(name));
- mysql_format(handle, query, sizeof(query), "INSERT INTO players SET \
- name=`%e`,\
- password=`%e`,\
- salt=`%e`,\
- regdate=NOW()", name, PlayerInfo[playerid][Password], PlayerInfo[playerid][Salt]);
- mysql_tquery(handle, query, "OnPlayerRegister", "d", playerid);
- }
- }
- return true;
- }
- //-----------------------//
- public OnPlayerClickPlayer(playerid, clickedplayerid, source)
- {
- return 1;
- }
- //-----------------------//
- forward CheckPlayerData(playerid);
- public CheckPlayerData(playerid)
- {
- if(cache_num_rows() > 0)
- {
- // cache_num_rows > 0 znaci da u tablici postoji bar jedan rezultat sa tim imenom
- // sada uzimamo password i salt iz tablice i saljemo igraca na prijavu
- cache_get_value(0, "password", PlayerInfo[playerid][Password], 65);
- cache_get_value(0, "salt", PlayerInfo[playerid][Salt], 11);
- ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Vas racun je pronadjen, molimo vas upisite lozinku da se prijavite:", "Dalje", "Izlaz");
- }
- else {
- ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
- }
- return true;
- }
- //-----------------------//
- forward OnAccountLoad(playerid);
- public OnAccountLoad(playerid)
- {
- if(cache_num_rows() > 0) {
- cache_get_value_int(0, "id", PlayerInfo[playerid][SQLID]);
- cache_get_value(0, "regdate", PlayerInfo[playerid][RegDate], 65);
- // ovde ispod dodajete spawn, novac i slicno
- printf("SQLID: %d | Register date: %s", PlayerInfo[playerid][SQLID], PlayerInfo[playerid][RegDate]);
- SendClientMessage(playerid, -1, "Dobrodosli nazad.");
- }
- return true;
- }
- //-----------------------//
- forward OnPlayerRegister(playerid);
- public OnPlayerRegister(playerid)
- {
- PlayerInfo[playerid][SQLID] = cache_insert_id(); // uzimamo id igraca koji je unesen u bazu
- SendClientMessage(playerid, -1, "Registrovali ste se na server.");
- return true;
- }
- //-----------------------------------END--------------------------------------//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement