Advertisement
Guest User

MOD

a guest
May 7th, 2019
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.96 KB | None | 0 0
  1. //------------------------------------MYSQL-----------------------------------//
  2. #include <a_samp>
  3. #include <a_mysql>
  4. //-----------------------//
  5. new MySQL:handle;
  6. //-----------------------//
  7. #define MYSQL_HOST "localhost"
  8. #define MYSQL_USER "root"
  9. #define MYSQL_PASSWORD "" // po defaultu na localhostu nemate password, osim ukoliko ne koristite MAMP onda je password root
  10. #define MYSQL_DATABASE "samp"
  11. //-----------------------//
  12. #define DIALOG_LOGIN (0)
  13. #define DIALOG_REGISTER (1)
  14. //-----------------------//
  15. enum ENUM_PLAYER_DATA
  16. {
  17. SQLID, // sqlid, unikatni user id
  18. Password[65], // password, za ovo koristimo SHA256 password hash koji je dodat u zadnjoj samp verziji
  19. Salt[11], // nasumicno generisano da modifikuje originalni hash,
  20. RegDate[65] // datum registracije, ovo je samo "test" da vam pokazem kako da uzmete nesto iz tablice
  21. }
  22. new PlayerInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
  23. //-----------------------//
  24. public OnFilterScriptInit()
  25. {
  26. return 1;
  27. }
  28. //-----------------------//
  29. public OnFilterScriptExit()
  30. {
  31. return 1;
  32. }
  33. //-----------------------//
  34. public OnGameModeInit()
  35. {
  36. 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
  37.  
  38. if(mysql_errno(handle) != 0 || handle == MYSQL_INVALID_HANDLE) // ukoliko postoji eror kod konekcije sa databazom ispisujemo sledece i zatvaramo konzolu ->
  39. {
  40. print("Konekcija sa databazom nije uspesna, pogledajte da li su sve informacije ispravne.");
  41. SendRconCommand("exit");
  42. return true;
  43. }
  44.  
  45. 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`))");
  46.  
  47. // Ovaj upit radi sledece:
  48. // Proverava da li postoji tabela players i ukoliko ne postoji kreira istu
  49. // 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.
  50. // 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.
  51. // password stavljamo kao string isto duzine 65 karaktera
  52. // salt isto samo sto je duzina 11 karaktera
  53. // i na kraju regdate je datum registracije njega postavljamo kao DATETIME sto je u sustine vreme i datum.
  54. return true;
  55. }
  56. //-----------------------//
  57. public OnGameModeExit()
  58. {
  59. return 1;
  60. }
  61. //-----------------------//
  62. public OnPlayerRequestClass(playerid, classid)
  63. {
  64. return 1;
  65. }
  66. //-----------------------//
  67. public OnPlayerConnect(playerid)
  68. {
  69. new query[128], // ovde definisemo string za query koji cemo formatirati i poslati kao upit
  70. name[MAX_PLAYER_NAME]; // uzimamo ime igraca u ovu varijablu
  71.  
  72. GetPlayerName(playerid, name, sizeof(name)); // uzimamo ime
  73.  
  74. 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
  75. mysql_tquery(handle, query, "CheckPlayerData", "i", playerid); // ovo je "threaded query" uzima sve ovo i salje ga na sledecu funkciju na proveru
  76. return true;
  77. }
  78. //-----------------------//
  79. public OnPlayerDisconnect(playerid)
  80. {
  81. new query[128];
  82. mysql_format(handle, query, sizeof(query), "UPDATE players SET money=`%d`, level=`%d`, skin=`%d` WHERE id=`%d`",
  83. PlayerInfo[playerid][Money], PlayerInfo[playerid][Level], PlayerInfo[playerid][Skin],
  84. PlayerInfo[playerid][SQLID]);
  85. mysql_tquery(handle, query);
  86. return true;
  87. }
  88. //-----------------------//
  89. public OnPlayerSpawn(playerid)
  90. {
  91. return 1;
  92. }
  93. //-----------------------//
  94. public OnPlayerDeath(playerid, killerid, reason)
  95. {
  96. return 1;
  97. }
  98. //-----------------------//
  99. public OnVehicleSpawn(vehicleid)
  100. {
  101. return 1;
  102. }
  103. //-----------------------//
  104. public OnVehicleDeath(vehicleid, killerid)
  105. {
  106. return 1;
  107. }
  108. //-----------------------//
  109. public OnPlayerText(playerid, text[])
  110. {
  111. return 1;
  112. }
  113. //-----------------------//
  114. public OnPlayerCommandText(playerid, cmdtext[])
  115. {
  116. return 1;
  117. }
  118. //-----------------------//
  119. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  120. {
  121. return 1;
  122. }
  123. //-----------------------//
  124. public OnPlayerExitVehicle(playerid, vehicleid)
  125. {
  126. return 1;
  127. }
  128. //-----------------------//
  129. public OnPlayerStateChange(playerid, newstate, oldstate)
  130. {
  131. return 1;
  132. }
  133. //-----------------------//
  134. public OnPlayerEnterCheckpoint(playerid)
  135. {
  136. return 1;
  137. }
  138. //-----------------------//
  139. public OnPlayerLeaveCheckpoint(playerid)
  140. {
  141. return 1;
  142. }
  143. //-----------------------//
  144. public OnPlayerEnterRaceCheckpoint(playerid)
  145. {
  146. return 1;
  147. }
  148. //-----------------------//
  149. public OnPlayerLeaveRaceCheckpoint(playerid)
  150. {
  151. return 1;
  152. }
  153. //-----------------------//
  154. public OnRconCommand(cmd[])
  155. {
  156. return 1;
  157. }
  158. //-----------------------//
  159. public OnPlayerRequestSpawn(playerid)
  160. {
  161. return 1;
  162. }
  163. //-----------------------//
  164. public OnObjectMoved(objectid)
  165. {
  166. return 1;
  167. }
  168. //-----------------------//
  169. public OnPlayerObjectMoved(playerid, objectid)
  170. {
  171. return 1;
  172. }
  173. //-----------------------//
  174. public OnPlayerPickUpPickup(playerid, pickupid)
  175. {
  176. return 1;
  177. }
  178. //-----------------------//
  179. public OnVehicleMod(playerid, vehicleid, componentid)
  180. {
  181. return 1;
  182. }
  183. //-----------------------//
  184. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  185. {
  186. return 1;
  187. }
  188. //-----------------------//
  189. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  190. {
  191. return 1;
  192. }
  193. //-----------------------//
  194. public OnPlayerSelectedMenuRow(playerid, row)
  195. {
  196. return 1;
  197. }
  198. //-----------------------//
  199. public OnPlayerExitedMenu(playerid)
  200. {
  201. return 1;
  202. }
  203. //-----------------------//
  204. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  205. {
  206. return 1;
  207. }
  208. //-----------------------//
  209. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  210. {
  211. return 1;
  212. }
  213. //-----------------------//
  214. public OnRconLoginAttempt(ip[], password[], success)
  215. {
  216. return 1;
  217. }
  218. //-----------------------//
  219. public OnPlayerUpdate(playerid)
  220. {
  221. return 1;
  222. }
  223. //-----------------------//
  224. public OnPlayerStreamIn(playerid, forplayerid)
  225. {
  226. return 1;
  227. }
  228. //-----------------------//
  229. public OnPlayerStreamOut(playerid, forplayerid)
  230. {
  231. return 1;
  232. }
  233. //-----------------------//
  234. public OnVehicleStreamIn(vehicleid, forplayerid)
  235. {
  236. return 1;
  237. }
  238. //-----------------------//
  239. public OnVehicleStreamOut(vehicleid, forplayerid)
  240. {
  241. return 1;
  242. }
  243. //-----------------------//
  244. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  245. {
  246. switch(dialogid)
  247. {
  248. case DIALOG_LOGIN:
  249. {
  250. if(!response) return Kick(playerid);
  251.  
  252. new buf[65], name[MAX_PLAYER_NAME];
  253. SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], buf, 65);
  254.  
  255. if(strcmp(buf, PlayerInfo[playerid][Password]) == 0)
  256. {
  257. // Password se podudara sa unesenim
  258. // Sada treba da uzmemo ostale podatke
  259.  
  260. GetPlayerName(playerid, name, sizeof(name));
  261.  
  262. mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name = `%e` LIMIT 1", name);
  263. mysql_tquery(handle, query, "OnAccountLoad", "i", playerid);
  264.  
  265. // sve smo zavrsili, u funkciji OnAccountLoad idete dalje
  266. }
  267. else
  268. {
  269. // ukoliko lozinka nije ispravna vracamo dialog
  270. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Lozinka koju ste uneli nije ispravna, pokusajte ponovo:", "Dalje", "Izlaz");
  271. }
  272. }
  273.  
  274. case DIALOG_REGISTER:
  275. {
  276. if(!response) return Kick(playerid);
  277.  
  278. if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // ako je lozinka kraca od 6 i duza od 20 karaktera vraca dialog
  279. {
  280. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
  281. return true;
  282. }
  283.  
  284. // kao sto sam rekao salt je random generisan key, sada cemo ga randomizirati:
  285.  
  286. for (new i = 0; i < 10; i++) {
  287. PlayerInfo[playerid][Salt][i] = random(100) + 50;
  288. }
  289.  
  290. PlayerInfo[playerid][Salt][10] = 0;
  291. SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], PlayerInfo[playerid][Password], 65);
  292.  
  293. // sada unosimo u bazu podatke igraca
  294. new query[256], name[MAX_PLAYER_NAME];
  295. GetPlayerName(playerid, name, sizeof(name));
  296.  
  297. mysql_format(handle, query, sizeof(query), "INSERT INTO players SET \
  298. name=`%e`,\
  299. password=`%e`,\
  300. salt=`%e`,\
  301. regdate=NOW()", name, PlayerInfo[playerid][Password], PlayerInfo[playerid][Salt]);
  302.  
  303. mysql_tquery(handle, query, "OnPlayerRegister", "d", playerid);
  304. }
  305. }
  306. return true;
  307. }
  308. //-----------------------//
  309. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  310. {
  311. return 1;
  312. }
  313. //-----------------------//
  314. forward CheckPlayerData(playerid);
  315. public CheckPlayerData(playerid)
  316. {
  317. if(cache_num_rows() > 0)
  318. {
  319. // cache_num_rows > 0 znaci da u tablici postoji bar jedan rezultat sa tim imenom
  320. // sada uzimamo password i salt iz tablice i saljemo igraca na prijavu
  321.  
  322. cache_get_value(0, "password", PlayerInfo[playerid][Password], 65);
  323. cache_get_value(0, "salt", PlayerInfo[playerid][Salt], 11);
  324.  
  325. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Vas racun je pronadjen, molimo vas upisite lozinku da se prijavite:", "Dalje", "Izlaz");
  326. }
  327. else {
  328. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
  329. }
  330. return true;
  331. }
  332. //-----------------------//
  333. forward OnAccountLoad(playerid);
  334. public OnAccountLoad(playerid)
  335. {
  336. if(cache_num_rows() > 0) {
  337.  
  338. cache_get_value_int(0, "id", PlayerInfo[playerid][SQLID]);
  339. cache_get_value(0, "regdate", PlayerInfo[playerid][RegDate], 65);
  340.  
  341. // ovde ispod dodajete spawn, novac i slicno
  342.  
  343. printf("SQLID: %d | Register date: %s", PlayerInfo[playerid][SQLID], PlayerInfo[playerid][RegDate]);
  344.  
  345. SendClientMessage(playerid, -1, "Dobrodosli nazad.");
  346. }
  347. return true;
  348. }
  349. //-----------------------//
  350. forward OnPlayerRegister(playerid);
  351. public OnPlayerRegister(playerid)
  352. {
  353. PlayerInfo[playerid][SQLID] = cache_insert_id(); // uzimamo id igraca koji je unesen u bazu
  354. SendClientMessage(playerid, -1, "Registrovali ste se na server.");
  355. return true;
  356. }
  357.  
  358. //-----------------------------------END--------------------------------------//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement