Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <a_mysql>
- #include <sscanf2>
- #undef MAX_PLAYERS
- #define MAX_PLAYERS 50
- #define MYSQL_HOST "127.0.0.1"
- #define MYSQL_USER "root"
- #define MYSQL_PASSWORD ""
- #define MYSQL_DATABASE "server"
- #define SCM SendClientMessage
- #define SPD ShowPlayerDialog
- #define DSP DIALOG_STYLE_PASSWORD
- #define DSI DIALOG_STYLE_INPUT
- #define DSM DIALOG_STYLE_MSGBOX
- #define func%0(%1) forward%0(%1); public%0(%1)
- new MySQL: g_SQL;
- enum E_PLAYERS
- {
- ID,
- Name[MAX_PLAYER_NAME],
- Password[65],
- Salt[17],
- Kills,
- Deaths,
- Cache: Cache_ID,
- };
- new PI[MAX_PLAYERS][E_PLAYERS];
- new g_MysqlRaceCheck[MAX_PLAYERS];
- enum
- {
- DIALOG_LOGIN,
- DIALOG_REGISTER
- };
- static Test;
- main() {}
- public OnGameModeInit()
- {
- new MySQLOpt: option_id = mysql_init_options();
- mysql_set_option(option_id, AUTO_RECONNECT, true);
- g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); // AUTO_RECONNECT is enabled for this connection handle only
- if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
- {
- print("MySQL konekcija neuspesna. Proverite podatke i databazu");
- SendRconCommand("exit");
- return 1;
- }
- print("MySQL konekcija, uspesna");
- SetupPlayerTable();
- return 1;
- }
- public OnGameModeExit()
- {
- mysql_close(g_SQL);
- return 1;
- }
- public OnPlayerConnect(playerid)
- {
- g_MysqlRaceCheck[playerid]++;
- static const empty_player[E_PLAYERS];
- PI[playerid] = empty_player;
- GetPlayerName(playerid, PI[playerid][Name], MAX_PLAYER_NAME);
- new query[103];
- mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", PI[playerid][Name]);
- mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- g_MysqlRaceCheck[playerid]++;
- if (cache_is_valid(PI[playerid][Cache_ID]))
- {
- cache_delete(PI[playerid][Cache_ID]);
- PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
- }
- return 1;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- new query[125];
- mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[playerid][Kills], PI[playerid][Deaths], PI[playerid][ID]);
- mysql_tquery(g_SQL, query);
- mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[killerid][Kills], PI[killerid][Deaths], PI[killerid][ID]);
- mysql_tquery(g_SQL, query);
- return 1;
- }
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- switch (dialogid)
- {
- case DIALOG_LOGIN:
- {
- if (!response) return Kick(playerid);
- new hashed_pass[65];
- SHA256_PassHash(inputtext, PI[playerid][Salt], hashed_pass, 65);
- if (strcmp(hashed_pass, PI[playerid][Password]) == 0)
- {
- SCM(playerid, -1, "Uspesno ste se ulogovali");
- cache_set_active(PI[playerid][Cache_ID]);
- AssignPlayerData(playerid);
- cache_delete(PI[playerid][Cache_ID]);
- PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
- SpawnPlayer(playerid);
- }
- else
- {
- SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Pogresna lozinka!\nUnesite vasu lozinku ispod", "Login", "Izlaz");
- }
- }
- case DIALOG_REGISTER:
- {
- if (!response) return Kick(playerid);
- if (strlen(inputtext) <= 5) return SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vasa lozinka ne sme biti ispod 5 karaktera", "Registruj se", "Izlaz");
- for (new i = 0; i < 16; i++) PI[playerid][Salt][i] = random(94) + 33;
- SHA256_PassHash(inputtext, PI[playerid][Salt], PI[playerid][Password], 65);
- new query[221];
- mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`username`, `password`, `salt`) VALUES ('%e', '%s', '%e')", PI[playerid][Name], PI[playerid][Password], PI[playerid][Salt]);
- mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
- }
- }
- return 1;
- }
- //-----------------------------------------------------
- func OnPlayerDataLoaded(playerid, race_check)
- {
- if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
- if(cache_num_rows() > 0)
- {
- cache_get_value(0, "password", PI[playerid][Password], 65);
- cache_get_value(0, "salt", PI[playerid][Salt], 17);
- PI[playerid][Cache_ID] = cache_save();
- SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Vas nalog postoji", "Login", "Izlaz");
- }
- else
- {
- SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vas nalog ne postoji\nUnesite lozinku", "Registracija", "Izlaz");
- }
- return 1;
- }
- func OnPlayerRegister(playerid)
- {
- PI[playerid][ID] = cache_insert_id();
- SpawnPlayer(playerid);
- return 1;
- }
- //-----------------------------------------------------
- AssignPlayerData(playerid)
- {
- cache_get_value_int(0, "id", PI[playerid][ID]);
- cache_get_value_int(0, "kills", PI[playerid][Kills]);
- cache_get_value_int(0, "deaths", PI[playerid][Deaths]);
- return 1;
- }
- SetupPlayerTable()
- {
- mysql_tquery(g_SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(24) NOT NULL,`password` char(64) NOT NULL,`salt` char(16) NOT NULL,`kills` mediumint(8) NOT NULL DEFAULT '0',`deaths` mediumint(8) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`))");
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment