Advertisement
Guest User

Untitled

a guest
Apr 6th, 2014
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.73 KB | None | 0 0
  1. #include <a_samp>
  2. #include <a_mysql>
  3. #include <easydialog>
  4. #include <zcmd>
  5.  
  6. //-----------------------------------------------------
  7.  
  8. #define MAX_LOG_TRIES (4)
  9. #define MAX_PASS_LENGTH (40)
  10.  
  11. #define NEWB_SKIN (299) // claude's skin
  12.  
  13. /* MySQL Credentials */
  14. #define SQL_HOST "localhost"
  15. #define SQL_USER "root"
  16. #define SQL_PASS ""
  17. #define SQL_DB "rp"
  18.  
  19. /* Used for position arrays */
  20. #define posArr{%0} %0[0], %0[1], %0[2]
  21. #define posArrEx{%0} %0[0], %0[1], %0[2], %0[3]
  22.  
  23. #define DIALOG_REGISTER 1
  24. #define DIALOG_LOGIN 2
  25.  
  26. //-----------------------------------------------------
  27.  
  28. native WP_Hash(buffer[], len, const str[]);
  29.  
  30. //-----------------------------------------------------
  31.  
  32. /* Credits to RyDeR` */
  33. stock randomString(strDest[], strLen = 30)
  34. {
  35. while(strLen--)
  36. strDest[strLen] = random(2) ? (random(26) + (random(2) ? 'a' : 'A')) : (random(10) + '0');
  37. }
  38.  
  39. //-----------------------------------------------------
  40.  
  41. static Float:g_newbSpawn[4] = {1815.2614,-1369.6233,15.0781,270.4365};
  42.  
  43. enum e_pInfo
  44. {
  45. pSQLid,
  46. pPass[129],
  47. pSalt[30],
  48. Float:pHealth,
  49. Float:pPos[4],
  50. pInterior,
  51. pVirtualWorld,
  52. pSkin
  53. }
  54.  
  55. new
  56. g_PlayerInfo[MAX_PLAYERS][e_pInfo],
  57. g_Logged[MAX_PLAYERS char],
  58. g_LogTries[MAX_PLAYERS char],
  59. g_Died[MAX_PLAYERS char],
  60. g_Handle;
  61.  
  62. //-----------------------------------------------------
  63.  
  64. main(){}
  65.  
  66. //-----------------------------------------------------
  67.  
  68. public OnGameModeInit()
  69. {
  70. SetGameModeText("MySQL R-7 Gamemode");
  71. UsePlayerPedAnims();
  72. DisableInteriorEnterExits();
  73.  
  74. mySQL_init();
  75. TextDraws_Init();
  76. return 1;
  77. }
  78.  
  79. public OnGameModeExit()
  80. {
  81. mysql_close(g_Handle);
  82. return 1;
  83. }
  84.  
  85. //-----------------------------------------------------
  86.  
  87. stock mySQL_init()
  88. {
  89. g_Handle = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
  90.  
  91. /* Table Structure - kind of messy, I know. */
  92. mysql_function_query(g_Handle, "CREATE TABLE IF NOT EXISTS `users` ( \
  93. `id` int(11) NOT NULL AUTO_INCREMENT, \
  94. `name` varchar(24) NOT NULL, \
  95. `pass` varchar(129) NOT NULL, \
  96. `salt` varchar(30) NOT NULL, \
  97. `health` float NOT NULL, \
  98. `X` float NOT NULL, \
  99. `Y` float NOT NULL, \
  100. `Z` float NOT NULL, \
  101. `A` float NOT NULL, \
  102. `interior` int(11) NOT NULL, \
  103. `vw` int(11) NOT NULL, \
  104. `skin` int(11) NOT NULL, \
  105. PRIMARY KEY (`id`) \
  106. )", false, "SendQuery", "");
  107. return 1;
  108. }
  109.  
  110. forward SendQuery();
  111. public SendQuery()
  112. {
  113. // callback for queries that don't fetch data
  114. return 1;
  115. }
  116.  
  117. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  118. {
  119. if(dialogid == DIALOG_REGISTER)
  120. {
  121. if(!response)
  122. {
  123. return SendClientMessage(playerid, -1, "SERVER: You have left the server."), Kick(playerid);
  124. }
  125.  
  126. if(isnull(inputtext)) {
  127. return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{1564F5}Register", "Type in a password below to register an account.", "Okay", "Cancel");
  128. }
  129.  
  130. if(strlen(inputtext) >= MAX_PASS_LENGTH) {
  131. return SendClientMessage(playerid, -1, "SERVER: Password must not be more than 40 characters"), ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{1564F5}Register", "Type in a password below to register an account.", "Okay", "Cancel");
  132. }
  133.  
  134. new
  135. Salt[30],
  136. hash[129];
  137.  
  138. randomString(Salt, 30);
  139. format(hash, sizeof(hash), "%s%s", Salt, inputtext);
  140.  
  141. WP_Hash(hash, sizeof(hash), hash);
  142. CreateAccount(playerid, Salt, hash);
  143.  
  144. format(hash, sizeof(hash), "SERVER: Welcome %s", returnNameEx(playerid));
  145. SendClientMessage(playerid, -1, hash);
  146.  
  147. g_PlayerInfo[playerid][pSkin] = NEWB_SKIN;
  148.  
  149. ToggleMainMenu(playerid, 0);
  150. SetCameraBehindPlayer(playerid);
  151. SetPlayerPos(playerid, posArr{g_newbSpawn});
  152. SetPlayerFacingAngle(playerid, g_newbSpawn[3]);
  153. SetPlayerSkin(playerid, NEWB_SKIN);
  154. return 1;
  155. }
  156. if(dialogid == DIALOG_LOGIN)
  157. {
  158. if(!response || !strlen(inputtext)) {
  159. return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{1564F5}Login", "Type in your password below to log in.", "Okay", "Cancel");
  160. }
  161.  
  162. new
  163. hashedinput[129];
  164.  
  165. format(hashedinput, sizeof(hashedinput), "%s%s", g_PlayerInfo[playerid][pSalt], inputtext);
  166. WP_Hash(hashedinput, 129, hashedinput);
  167.  
  168. if(!strcmp(hashedinput, g_PlayerInfo[playerid][pPass]))
  169. {
  170. LoadAccount(playerid);
  171. }
  172. else
  173. {
  174. g_LogTries[playerid]++;
  175. SendClientMessage(playerid, -1, "SERVER: Invalid password!");
  176. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{1564F5}Login", "Type in your password below to log in.", "Okay", "Cancel");
  177. }
  178. if(g_LogTries[playerid] == MAX_LOG_TRIES)
  179. {
  180. return SendClientMessage(playerid, -1, "SERVER: Too many login attempts."), Kick(playerid);
  181. }
  182. return 1;
  183. }
  184. return 1;
  185. }
  186.  
  187. //-----------------------------------------------------
  188.  
  189. public OnPlayerConnect(playerid)
  190. {
  191. ToggleMainMenu(playerid, 1);
  192. SetTimerEx("SafeOnPlayerConnect", 250, 0, "d", playerid);
  193. return 1;
  194. }
  195.  
  196. forward SafeOnPlayerConnect(playerid);
  197. public SafeOnPlayerConnect(playerid)
  198. {
  199. g_Logged[playerid] = 255;
  200. g_LogTries[playerid] = 0;
  201. g_Died[playerid] = 0;
  202.  
  203. SetSpawnInfo(playerid, 0, NEWB_SKIN, posArr{g_newbSpawn}-4.0, 0.0, 0, 0, 0, 0, 0, 0);
  204. SpawnPlayer(playerid);
  205.  
  206. CheckAccount(playerid);
  207. return 1;
  208. }
  209.  
  210. public OnPlayerDisconnect(playerid, reason)
  211. {
  212. SaveAccount(playerid);
  213. return 1;
  214. }
  215.  
  216. //-----------------------------------------------------
  217.  
  218. public OnPlayerSpawn(playerid)
  219. {
  220. if(g_Logged[playerid] == 255) {
  221. g_Logged[playerid] = 0;
  222. clearScreen(playerid);
  223.  
  224. SetPlayerCameraPos(playerid, posArr{g_newbSpawn});
  225. SetPlayerCameraLookAt(playerid, posArr{g_newbSpawn});
  226. }
  227.  
  228. if(g_Died[playerid]) {
  229. SetCameraBehindPlayer(playerid);
  230. SetPlayerPos(playerid, posArr{g_newbSpawn});
  231. SetPlayerFacingAngle(playerid, g_newbSpawn[3]);
  232. }
  233. return 1;
  234. }
  235.  
  236. public OnPlayerDeath(playerid, killerid, reason)
  237. {
  238. g_Died[playerid] = 1;
  239. return 1;
  240. }
  241.  
  242. //-----------------------------------------------------
  243.  
  244. stock CheckAccount(playerid)
  245. {
  246. new query[82];
  247.  
  248. format(query, sizeof(query), "SELECT id, pass, salt FROM `users` WHERE `name` = '%s' LIMIT 1", returnName(playerid));
  249. mysql_function_query(g_Handle, query, true, "OnAccountCheck", "d", playerid);
  250. return 1;
  251. }
  252.  
  253. forward OnAccountCheck(playerid);
  254. public OnAccountCheck(playerid)
  255. {
  256. if(playerid != INVALID_PLAYER_ID) { // prevent crashes
  257.  
  258. new rows, fields;
  259. cache_get_data(rows, fields, g_Handle);
  260.  
  261. if(rows) {
  262. new
  263. id[30];
  264.  
  265. cache_get_row(0, 0, id, g_Handle); g_PlayerInfo[playerid][pSQLid] = strval(id);
  266. cache_get_row(0, 1, g_PlayerInfo[playerid][pPass], g_Handle);
  267. cache_get_row(0, 2, g_PlayerInfo[playerid][pSalt], g_Handle);
  268.  
  269. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{1564F5}Login", "Type in your password below to log in.", "Okay", "Cancel");
  270. }
  271.  
  272. else {
  273. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{1564F5}Register", "Type in a password below to register an account.", "Okay", "Cancel");
  274. }
  275. }
  276. return 1;
  277. }
  278.  
  279. //-----------------------------------------------------
  280.  
  281. stock LoadAccount(playerid)
  282. {
  283. new query[128];
  284.  
  285. format(query, sizeof(query), "SELECT * FROM `users` WHERE `id` = %d", g_PlayerInfo[playerid][pSQLid]);
  286. mysql_function_query(g_Handle, query, true, "OnAccountLoad", "d", playerid);
  287. }
  288.  
  289. forward OnAccountLoad(playerid);
  290. public OnAccountLoad(playerid)
  291. {
  292. ToggleMainMenu(playerid, 0);
  293. SetCameraBehindPlayer(playerid);
  294.  
  295. new temp[40];
  296. format(temp, sizeof(temp), "SERVER: Welcome %s", returnNameEx(playerid));
  297. SendClientMessage(playerid, -1, temp);
  298.  
  299. // Field indexes are relative to the query.
  300. cache_get_row(0, 4, temp), g_PlayerInfo[playerid][pHealth] = floatstr(temp),
  301. cache_get_row(0, 5, temp), g_PlayerInfo[playerid][pPos][0] = floatstr(temp),
  302. cache_get_row(0, 6, temp), g_PlayerInfo[playerid][pPos][1] = strval(temp),
  303. cache_get_row(0, 7, temp), g_PlayerInfo[playerid][pPos][2] = strval(temp),
  304. cache_get_row(0, 8, temp), g_PlayerInfo[playerid][pPos][3] = strval(temp),
  305. cache_get_row(0, 9, temp), g_PlayerInfo[playerid][pInterior] = strval(temp),
  306. cache_get_row(0, 10, temp), g_PlayerInfo[playerid][pVirtualWorld] = strval(temp),
  307. cache_get_row(0, 11, temp), g_PlayerInfo[playerid][pSkin] = strval(temp);
  308.  
  309. SetPlayerHealth(playerid, g_PlayerInfo[playerid][pHealth]);
  310. SetPlayerPos(playerid, posArr{g_PlayerInfo[playerid][pPos]});
  311. SetPlayerFacingAngle(playerid, g_PlayerInfo[playerid][pPos][3]);
  312. SetPlayerInterior(playerid, g_PlayerInfo[playerid][pInterior]);
  313. SetPlayerVirtualWorld(playerid, g_PlayerInfo[playerid][pVirtualWorld]);
  314. SetPlayerSkin(playerid, g_PlayerInfo[playerid][pSkin]);
  315. return 1;
  316. }
  317.  
  318. //-----------------------------------------------------
  319.  
  320. stock CreateAccount(playerid, salt[], pass[129])
  321. {
  322. new query[240];
  323. format(query, sizeof(query), "INSERT INTO `users` (name, salt, pass) VALUES (\'%s\', \'%s\', \'%s\')",
  324. returnName(playerid),
  325. salt,
  326. pass
  327. );
  328.  
  329. mysql_function_query(g_Handle, query, false, "OnAccountCreate", "d", playerid);
  330. }
  331.  
  332. forward OnAccountCreate(playerid);
  333. public OnAccountCreate(playerid)
  334. {
  335. g_PlayerInfo[playerid][pSQLid] = cache_insert_id();
  336. return 1;
  337. }
  338.  
  339. stock SaveAccount(playerid)
  340. {
  341. new
  342. query[300],
  343. Float:pos[4],
  344. Float:health;
  345.  
  346. GetPlayerPos(playerid, posArr{pos});
  347. GetPlayerFacingAngle(playerid, pos[3]);
  348. GetPlayerHealth(playerid, health);
  349.  
  350. format(query, sizeof(query), "UPDATE `users` SET health = %.1f, X = %.2f, Y = %.2f, Z = %.2f, A = %.2f, interior = %d, vw = %d, skin = %d WHERE `id` = %d",
  351. health,
  352. posArrEx{pos},
  353. GetPlayerInterior(playerid),
  354. GetPlayerVirtualWorld(playerid),
  355. GetPlayerSkin(playerid),
  356. g_PlayerInfo[playerid][pSQLid]
  357. );
  358.  
  359. mysql_function_query(g_Handle, query, false, "SendQuery", "");
  360. return 1;
  361. }
  362.  
  363. //-----------------------------------------------------
  364.  
  365. stock returnName(playerid)
  366. {
  367. new name[24];
  368. GetPlayerName(playerid, name, 24);
  369. return name;
  370. }
  371.  
  372. stock returnNameEx(playerid)
  373. {
  374. new name[24];
  375. GetPlayerName(playerid, name, 24);
  376.  
  377. for(new x=0; x<24; x++) {
  378. if(name[x] == '_') {
  379. name[x] = ' ';
  380. }
  381. }
  382.  
  383. return name;
  384. }
  385.  
  386. stock clearScreen(playerid)
  387. {
  388. for(new i; i<100; i++) {
  389. SendClientMessage(playerid, -1, "");
  390. }
  391. return 1;
  392. }
  393.  
  394. //-----------------------------------------------------
  395.  
  396. new
  397. Text:MainMenu[4];
  398.  
  399. stock TextDraws_Init()
  400. {
  401. /* Bottom Bar */
  402. MainMenu[0] = TextDrawCreate(250.000000, 343.000000, "~n~~n~~n~~n~~n~~n~");
  403. TextDrawAlignment(MainMenu[0], 2);
  404. TextDrawBackgroundColor(MainMenu[0], 255);
  405. TextDrawFont(MainMenu[0], 1);
  406. TextDrawLetterSize(MainMenu[0], 1.000000, 2.000000);
  407. TextDrawColor(MainMenu[0], -16776961);
  408. TextDrawSetOutline(MainMenu[0], 1);
  409. TextDrawSetProportional(MainMenu[0], 1);
  410. TextDrawUseBox(MainMenu[0], 1);
  411. TextDrawBoxColor(MainMenu[0], 255);
  412. TextDrawTextSize(MainMenu[0], 90.000000, 803.000000);
  413.  
  414. /* Top Bar */
  415. MainMenu[1] = TextDrawCreate(250.000000, -12.000000, "~n~~n~~n~~n~~n~~n~");
  416. TextDrawAlignment(MainMenu[1], 2);
  417. TextDrawBackgroundColor(MainMenu[1], 255);
  418. TextDrawFont(MainMenu[1], 1);
  419. TextDrawLetterSize(MainMenu[1], 1.000000, 2.000000);
  420. TextDrawColor(MainMenu[1], -16776961);
  421. TextDrawSetOutline(MainMenu[1], 1);
  422. TextDrawSetProportional(MainMenu[1], 1);
  423. TextDrawUseBox(MainMenu[1], 1);
  424. TextDrawBoxColor(MainMenu[1], 255);
  425. TextDrawTextSize(MainMenu[1], 90.000000, 918.000000);
  426.  
  427. /* Top Colored Bar */
  428. MainMenu[2] = TextDrawCreate(729.000000, 99.000000, "_");
  429. TextDrawBackgroundColor(MainMenu[2], 255);
  430. TextDrawFont(MainMenu[2], 1);
  431. TextDrawLetterSize(MainMenu[2], 50.000000, 0.099999);
  432. TextDrawColor(MainMenu[2], -16776961);
  433. TextDrawSetOutline(MainMenu[2], 0);
  434. TextDrawSetProportional(MainMenu[2], 1);
  435. TextDrawSetShadow(MainMenu[2], 1);
  436. TextDrawUseBox(MainMenu[2], 1);
  437. TextDrawBoxColor(MainMenu[2], 0x1564F5FF);
  438. TextDrawTextSize(MainMenu[2], -5.000000, 1031.000000);
  439.  
  440. /* Bottom Colored Bar */
  441. MainMenu[3] = TextDrawCreate(729.000000, 340.000000, "_");
  442. TextDrawBackgroundColor(MainMenu[3], 255);
  443. TextDrawFont(MainMenu[3], 1);
  444. TextDrawLetterSize(MainMenu[3], 50.000000, 0.099999);
  445. TextDrawColor(MainMenu[3], -16776961);
  446. TextDrawSetOutline(MainMenu[3], 0);
  447. TextDrawSetProportional(MainMenu[3], 1);
  448. TextDrawSetShadow(MainMenu[3], 1);
  449. TextDrawUseBox(MainMenu[3], 1);
  450. TextDrawBoxColor(MainMenu[3], 0x1564F5FF);
  451. TextDrawTextSize(MainMenu[3], -5.000000, 1031.000000);
  452. return 1;
  453. }
  454.  
  455. stock ToggleMainMenu(playerid, toggle)
  456. {
  457. for(new i=0; i<sizeof(MainMenu); i++) {
  458. if(toggle) {
  459. TextDrawShowForPlayer(playerid, MainMenu[i]);
  460. TogglePlayerControllable(playerid, 0);
  461. }
  462.  
  463. else {
  464. TextDrawHideForPlayer(playerid, MainMenu[i]);
  465. TogglePlayerControllable(playerid, 1);
  466. }
  467. }
  468. return 1;
  469. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement