BE-Shomy

Untitled

Mar 17th, 2018
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <Pawn.CMD>
  4. #include <sscanf2>
  5.  
  6. #undef MAX_PLAYERS
  7. #define MAX_PLAYERS 50
  8.  
  9. #define MYSQL_HOST "127.0.0.1"
  10. #define MYSQL_USER "root"
  11. #define MYSQL_PASSWORD ""
  12. #define MYSQL_DATABASE "server"
  13.  
  14. #define SCM SendClientMessage
  15. #define SPD ShowPlayerDialog
  16. #define DSP DIALOG_STYLE_PASSWORD
  17. #define DSI DIALOG_STYLE_INPUT
  18. #define DSM DIALOG_STYLE_MSGBOX
  19.  
  20. #define func%0(%1) forward%0(%1); public%0(%1)
  21.  
  22. new MySQL: g_SQL;
  23.  
  24. enum E_PLAYERS
  25. {
  26. ID,
  27. Name[MAX_PLAYER_NAME],
  28. Password[65],
  29. Salt[17],
  30. Kills,
  31. Deaths,
  32.  
  33. Cache: Cache_ID,
  34. };
  35. new PI[MAX_PLAYERS][E_PLAYERS];
  36.  
  37. new g_MysqlRaceCheck[MAX_PLAYERS];
  38.  
  39. enum
  40. {
  41.  
  42. DIALOG_LOGIN,
  43. DIALOG_REGISTER
  44. };
  45.  
  46. main() {}
  47.  
  48.  
  49. public OnGameModeInit()
  50. {
  51. new MySQLOpt: option_id = mysql_init_options();
  52.  
  53. mysql_set_option(option_id, AUTO_RECONNECT, true);
  54.  
  55. g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); // AUTO_RECONNECT is enabled for this connection handle only
  56. if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
  57. {
  58. print("MySQL konekcija neuspesna. Proverite podatke i databazu");
  59. SendRconCommand("exit");
  60. return 1;
  61. }
  62.  
  63. print("MySQL konekcija, uspesna");
  64.  
  65. SetupPlayerTable();
  66. return 1;
  67. }
  68.  
  69. public OnGameModeExit()
  70. {
  71. mysql_close(g_SQL);
  72. return 1;
  73. }
  74.  
  75. public OnPlayerConnect(playerid)
  76. {
  77. g_MysqlRaceCheck[playerid]++;
  78.  
  79. static const empty_player[E_PLAYERS];
  80. PI[playerid] = empty_player;
  81.  
  82. GetPlayerName(playerid, PI[playerid][Name], MAX_PLAYER_NAME);
  83.  
  84. new query[103];
  85. mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", PI[playerid][Name]);
  86. mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
  87. return 1;
  88. }
  89.  
  90. public OnPlayerDisconnect(playerid, reason)
  91. {
  92. g_MysqlRaceCheck[playerid]++;
  93.  
  94. if (cache_is_valid(PI[playerid][Cache_ID]))
  95. {
  96. cache_delete(PI[playerid][Cache_ID]);
  97. PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
  98. }
  99. return 1;
  100. }
  101.  
  102. public OnPlayerDeath(playerid, killerid, reason)
  103. {
  104. PI[ playerid ][ Deaths ]++;
  105. PI[ killerid ][ Kills ]++;
  106.  
  107. new query[125];
  108. 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]);
  109. mysql_tquery(g_SQL, query);
  110.  
  111. 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]);
  112. mysql_tquery(g_SQL, query);
  113. return 1;
  114. }
  115.  
  116. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  117. {
  118. switch (dialogid)
  119. {
  120. case DIALOG_LOGIN:
  121. {
  122. if (!response) return Kick(playerid);
  123.  
  124. new hashed_pass[65];
  125. SHA256_PassHash(inputtext, PI[playerid][Salt], hashed_pass, 65);
  126.  
  127. if (strcmp(hashed_pass, PI[playerid][Password]) == 0)
  128. {
  129. SCM(playerid, -1, "Uspesno ste se ulogovali");
  130.  
  131. cache_set_active(PI[playerid][Cache_ID]);
  132.  
  133. AssignPlayerData(playerid);
  134.  
  135. cache_delete(PI[playerid][Cache_ID]);
  136. PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
  137.  
  138. SpawnPlayer(playerid);
  139. }
  140. else
  141. {
  142. SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Pogresna lozinka!\nUnesite vasu lozinku ispod", "Login", "Izlaz");
  143. }
  144. }
  145. case DIALOG_REGISTER:
  146. {
  147. if (!response) return Kick(playerid);
  148.  
  149. if (strlen(inputtext) <= 5) return SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vasa lozinka ne sme biti ispod 5 karaktera", "Registruj se", "Izlaz");
  150.  
  151. for (new i = 0; i < 16; i++) PI[playerid][Salt][i] = random(94) + 33;
  152. SHA256_PassHash(inputtext, PI[playerid][Salt], PI[playerid][Password], 65);
  153.  
  154. new query[221];
  155. 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]);
  156. mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
  157. }
  158. }
  159. return 1;
  160. }
  161.  
  162. //-----------------------------------------------------
  163.  
  164. func OnPlayerDataLoaded(playerid, race_check)
  165. {
  166. if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
  167.  
  168. if(cache_num_rows() > 0)
  169. {
  170. cache_get_value(0, "password", PI[playerid][Password], 65);
  171. cache_get_value(0, "salt", PI[playerid][Salt], 17);
  172.  
  173. PI[playerid][Cache_ID] = cache_save();
  174.  
  175. SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Vas nalog postoji", "Login", "Izlaz");
  176.  
  177. }
  178. else
  179. {
  180. SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vas nalog ne postoji\nUnesite lozinku", "Registracija", "Izlaz");
  181. }
  182. return 1;
  183. }
  184.  
  185. func OnPlayerRegister(playerid)
  186. {
  187. PI[playerid][ID] = cache_insert_id();
  188.  
  189. SpawnPlayer(playerid);
  190. return 1;
  191. }
  192.  
  193. //-----------------------------------------------------
  194.  
  195. AssignPlayerData(playerid)
  196. {
  197. cache_get_value_int(0, "id", PI[playerid][ID]);
  198.  
  199. cache_get_value_int(0, "kills", PI[playerid][Kills]);
  200. cache_get_value_int(0, "deaths", PI[playerid][Deaths]);
  201.  
  202. return 1;
  203. }
  204.  
  205. SetupPlayerTable()
  206. {
  207. 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`))");
  208. return 1;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment