HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <cstrike>
  3. #include <sqlx>
  4.  
  5. enum Color
  6. {
  7. NORMAL = 1, // clients scr_concolor cvar color
  8. GREEN, // Green Color
  9. TEAM_COLOR, // Red, grey, blue
  10. GREY, // grey
  11. RED, // Red
  12. BLUE, // Blue
  13. }
  14.  
  15. new TeamName[][] =
  16. {
  17. "",
  18. "TERRORIST",
  19. "CT",
  20. "SPECTATOR"
  21. }
  22.  
  23. new Host[] = "host"
  24. new User[] = "user"
  25. new Pass[] = "password"
  26. new Db[] = "db"
  27.  
  28. new Handle:g_SqlTuple
  29. new g_Error[512]
  30.  
  31. enum _:Achieves // Define the available Achievements, dont forget commas
  32. {
  33. MURDER, // Done
  34. SURVIVOR, // Done
  35. AIMKEY, // Done
  36. EXECUTION, // Done
  37. ONEHPHERO // Done
  38. }
  39.  
  40. new const AchName[Achieves][] = // Define the Achievements Names, dont forget commas
  41. {
  42. "Kivgz",
  43. "Tllsre szletett",
  44. "Mester",
  45. "Vgrehajts kre",
  46. "Hs"
  47. }
  48.  
  49. new const AchDescription[Achieves][] = // Define the Achievements Description, dont forget commas
  50. {
  51. "lj meg 500 ellensget",
  52. "lj tl 250 krt",
  53. "lj 125 fejlvssel",
  54. "lj meg 5 ellenfelet egy krben",
  55. "lj meg 5 ellenfelet 1 HP-val"
  56. }
  57.  
  58. new const AchRequirement[Achieves] = // Define Requirements. For non progress achievements use 1 (Like Secret Phrase), dont forget commas
  59. {
  60. 500,
  61. 250,
  62. 125,
  63. 5,
  64. 5
  65. }
  66.  
  67. new const prefix[] = "^4[ClanTag] Achievements:^3"
  68.  
  69. new Achievement[33][Achieves]
  70. new iAchTag[33]
  71. new szTemp[555 char]
  72.  
  73. public plugin_init()
  74. {
  75. register_plugin("Achievements", "5.0", "fLaXXiE")
  76.  
  77. register_event("DeathMsg", "Event_DeathMsg", "a")
  78. register_logevent("EventRoundStart", 2, "1=Round_Start")
  79.  
  80. register_clcmd("say /achievements", "CmdAch")
  81. register_clcmd("say /ach", "CmdAch")
  82. register_clcmd("say /a", "CmdAch")
  83.  
  84. register_clcmd("say", "CmdSay")
  85. register_clcmd("say_team", "CmdSayTeam")
  86.  
  87. set_task(1.0, "MySql_Init")
  88. }
  89.  
  90. public CmdSayTeam(iPlayer)
  91. {
  92. new iTag[120]
  93. switch(iAchTag[iPlayer])
  94. {
  95. case 0: return PLUGIN_CONTINUE
  96. case 1: formatex(iTag, charsmax(iTag), "Kivgz")
  97. case 2: formatex(iTag, charsmax(iTag), "Tllsre szletett")
  98. case 3: formatex(iTag, charsmax(iTag), "Mester")
  99. case 4: formatex(iTag, charsmax(iTag), "Vgrehajts kre")
  100. case 5: formatex(iTag, charsmax(iTag), "Hs")
  101. }
  102.  
  103. new iMessage[192], szName[32], None[2][32], iChat[192]
  104. read_args(iMessage, 191)
  105. remove_quotes(iMessage)
  106.  
  107. formatex(None[0], 31, ""), formatex(None[1], 31, " ")
  108.  
  109. if(equal(iMessage, ""))
  110. return PLUGIN_HANDLED
  111.  
  112. if(!equali(iMessage, None[0]) && !equali(iMessage, None[1]))
  113. {
  114. get_user_name(iPlayer, szName, 31)
  115.  
  116. if(is_user_alive(iPlayer))
  117. {
  118. switch(cs_get_user_team(iPlayer))
  119. {
  120. case 1: formatex(iChat, 191, "^4[%s]^1 (Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
  121. case 2: formatex(iChat, 191, "^4[%s]^1 (Counter-Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
  122. case 3: formatex(iChat, 191, "^4[%s]^1 (Spectator)^3 %s^1 : %s", iTag, szName, iMessage)
  123. }
  124. }
  125. else
  126. {
  127. switch(cs_get_user_team(iPlayer))
  128. {
  129. case 1: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
  130. case 2: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Counter-Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
  131. case 3: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Spectator)^3 %s^1 : %s", iTag, szName, iMessage)
  132. }
  133. }
  134.  
  135. switch(cs_get_user_team(iPlayer))
  136. {
  137. case 1: ColorChat(0, RED, iChat)
  138. case 2: ColorChat(0, BLUE, iChat)
  139. case 3: ColorChat(0, GREY, iChat)
  140. }
  141. return PLUGIN_HANDLED_MAIN
  142. }
  143. return PLUGIN_CONTINUE
  144. }
  145.  
  146. public CmdSay(iPlayer)
  147. {
  148. new iTag[120]
  149. switch(iAchTag[iPlayer])
  150. {
  151. case 0: return PLUGIN_CONTINUE
  152. case 1: formatex(iTag, charsmax(iTag), "Kivgz")
  153. case 2: formatex(iTag, charsmax(iTag), "Tllsre szletett")
  154. case 3: formatex(iTag, charsmax(iTag), "Mester")
  155. case 4: formatex(iTag, charsmax(iTag), "Vgrehajts kre")
  156. case 5: formatex(iTag, charsmax(iTag), "Hs")
  157. }
  158.  
  159. new iMessage[192], szName[32], None[2][32], iChat[192]
  160. read_args(iMessage, 191)
  161. remove_quotes(iMessage)
  162.  
  163. formatex(None[0], 31, ""), formatex(None[1], 31, " ")
  164.  
  165. if(equal(iMessage, ""))
  166. return PLUGIN_HANDLED
  167.  
  168. if(!equali(iMessage, None[0]) && !equali(iMessage, None[1]))
  169. {
  170. get_user_name(iPlayer, szName, 31)
  171.  
  172. if(is_user_alive(iPlayer)) formatex(iChat, 191, "^4[%s]^3 %s^1 : %s", iTag, szName, iMessage)
  173. else formatex(iChat, 191, "^1*DEAD* ^4[%s]^3 %s^1 : %s", iTag, szName, iMessage)
  174.  
  175. switch(cs_get_user_team(iPlayer))
  176. {
  177. case 1: ColorChat(0, RED, iChat)
  178. case 2: ColorChat(0, BLUE, iChat)
  179. case 3: ColorChat(0, GREY, iChat)
  180. }
  181. return PLUGIN_HANDLED_MAIN
  182. }
  183. return PLUGIN_CONTINUE
  184. }
  185.  
  186. public client_putinserver(iPlayer)
  187. Load_MySql(iPlayer)
  188.  
  189. public client_disconnect(iPlayer)
  190. {
  191. Save_MySql(iPlayer)
  192. iAchTag[iPlayer] = 0
  193. }
  194.  
  195. public plugin_end()
  196. SQL_FreeHandle(g_SqlTuple)
  197.  
  198. public CmdAch(iPlayer)
  199. {
  200. new g_AchMenu = menu_create("\wAchievements^n^n", "Achievements_Handler")
  201.  
  202. new Key[6]
  203.  
  204. for(new iAch = 0; iAch < Achieves; iAch++)
  205. {
  206. if(Achievement[iPlayer][iAch] == 0) formatex(szTemp, charsmax(szTemp), "\d%s - [%s] [%d/%d]", AchName[iAch], AchDescription[iAch], Achievement[iPlayer][iAch], AchRequirement[iAch])
  207. else if(Achievement[iPlayer][iAch] >= AchRequirement[iAch]) formatex(szTemp, charsmax(szTemp), "\y%s \w- [\rCOMPLETED\w]", AchName[iAch])
  208. else formatex(szTemp, charsmax(szTemp), "\y%s \w- [\r%s\w]\w [\r%d\w/\r%d\w]", AchName[iAch], AchDescription[iAch], Achievement[iPlayer][iAch], AchRequirement[iAch])
  209. menu_additem(g_AchMenu, szTemp, Key)
  210. }
  211.  
  212. menu_setprop(g_AchMenu, MPROP_EXIT, MEXIT_ALL)
  213. menu_display(iPlayer, g_AchMenu, 0)
  214. }
  215.  
  216. public Achievements_Handler(iPlayer, g_AchMenu, item)
  217. {
  218. if(item == MENU_EXIT)
  219. {
  220. menu_destroy(g_AchMenu)
  221. return PLUGIN_HANDLED
  222. }
  223. else
  224. {
  225. if(Achievement[iPlayer][item] >= AchRequirement[item])
  226. {
  227. iAchTag[iPlayer] = item+1
  228. ColorChat (iPlayer, GREY, "%s Te kivlasztottad^4 %s^3 ezt", prefix, AchName[item])
  229. }
  230. else
  231. {
  232. ColorChat(iPlayer, GREY, "%s Nincs feloldva a kvetkez teljestmny.", prefix)
  233. }
  234. }
  235. return PLUGIN_CONTINUE
  236. }
  237.  
  238. ///////////////////////////////////////////////////
  239. ///////// START OF ACHIEVEMENT ACTIONS ////////////
  240. ///////////////////////////////////////////////////
  241.  
  242. public Event_DeathMsg()
  243. {
  244. new iKiller = read_data(1)
  245. new iVictim = read_data(2)
  246. new szName[33]; get_user_name(iKiller, szName, charsmax(szName))
  247.  
  248. if(is_user_alive(iKiller) && get_user_team(iKiller) != get_user_team(iVictim))
  249. {
  250. Achievement[iKiller][EXECUTION]++
  251.  
  252. if(Achievement[iKiller][EXECUTION] == AchRequirement[EXECUTION])
  253. {
  254. ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[EXECUTION])
  255. }
  256.  
  257. if(is_user_alive(iKiller) && get_user_team(iKiller) != get_user_team(iVictim))
  258. {
  259. Achievement[iKiller][MURDER]++
  260.  
  261. if(Achievement[iKiller][MURDER] == AchRequirement[MURDER])
  262. {
  263. ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[MURDER])
  264. }
  265.  
  266. }
  267.  
  268. if(get_user_health(iKiller) == 1)
  269. {
  270. Achievement[iKiller][ONEHPHERO]++
  271.  
  272. if(Achievement[iKiller][ONEHPHERO] == AchRequirement[ONEHPHERO])
  273. {
  274. ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[ONEHPHERO])
  275. }
  276. }
  277. if(read_data(3))
  278. {
  279. Achievement[iKiller][AIMKEY]++
  280.  
  281. if(Achievement[iKiller][AIMKEY] == AchRequirement[AIMKEY])
  282. {
  283. ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[AIMKEY])
  284. }
  285. }
  286. }
  287. return PLUGIN_CONTINUE
  288. }
  289.  
  290. public EventRoundStart()
  291. {
  292. new iPlayers[32], iNum, iPlayer, szName[33]
  293. get_players(iPlayers, iNum, "a")
  294.  
  295. for(new i = 0; i < iNum; i++)
  296. {
  297. iPlayer = iPlayers[i]
  298. get_user_name(iPlayer, szName, charsmax(szName))
  299.  
  300. if(Achievement[iPlayer][EXECUTION] < 5)
  301. Achievement[iPlayer][EXECUTION] = 0
  302.  
  303. if(is_user_alive(iPlayer))
  304. {
  305. Achievement[iPlayer][SURVIVOR]++
  306.  
  307. if(Achievement[iPlayer][SURVIVOR] == AchRequirement[SURVIVOR])
  308. {
  309. ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[SURVIVOR])
  310. }
  311. }
  312. }
  313. return PLUGIN_CONTINUE
  314. }
  315.  
  316. ///////////////////////////////////////////////////
  317. ////////// END OF ACHIEVEMENT ACTIONS /////////////
  318. ///////////////////////////////////////////////////
  319.  
  320. ///////////////////////////////////////////////////
  321. ///////// START OF ACHIEVEMENT SAVING /////////////
  322. ///////////////////////////////////////////////////
  323.  
  324. public MySql_Init()
  325. {
  326. g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
  327.  
  328. new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
  329.  
  330. if(SqlConnection == Empty_Handle)
  331. set_fail_state(g_Error)
  332.  
  333. new Handle:Queries
  334. Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS achievements(steamid varchar(32), tag varchar(32), murder SMALLINT(1), survivor SMALLINT(1), aimkey SMALLINT(1), threesome SMALLINT(1), onehphero SMALLINT(1))")
  335.  
  336. if(!SQL_Execute(Queries))
  337. {
  338. SQL_QueryError(Queries,g_Error,charsmax(g_Error))
  339. set_fail_state(g_Error)
  340. }
  341.  
  342. SQL_FreeHandle(Queries)
  343. SQL_FreeHandle(SqlConnection)
  344. }
  345.  
  346. public Load_MySql(iPlayer)
  347. {
  348. new szSteamId[32], szTemp[512]
  349. get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
  350.  
  351. new Data[1]
  352. Data[0] = iPlayer
  353.  
  354. format(szTemp,charsmax(szTemp),"SELECT * FROM `achievements` WHERE (`achievements`.`steamid` = '%s')", szSteamId)
  355. SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
  356. }
  357.  
  358. public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
  359. {
  360. if(FailState == TQUERY_CONNECT_FAILED)
  361. {
  362. log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
  363. }
  364. else if(FailState == TQUERY_QUERY_FAILED)
  365. {
  366. log_amx("Load Query failed. [%d] %s", Errcode, Error)
  367. }
  368.  
  369. new iPlayer
  370. iPlayer = Data[0]
  371.  
  372. if(SQL_NumResults(Query) < 1)
  373. {
  374. new szSteamId[32]
  375. get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
  376.  
  377. if (equal(szSteamId,"ID_PENDING"))
  378. return PLUGIN_HANDLED
  379.  
  380. new szTemp[512]
  381.  
  382. format(szTemp,charsmax(szTemp),"INSERT INTO `achievements` (`steamid` , `tag`, `murder`, `survivor`, `aimkey`, `execution`, `onehphero`)VALUES ('%s', '0', '0', '0', '0', '0', '0')", szSteamId)
  383. SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
  384. }
  385. else
  386. {
  387. iAchTag[iPlayer] = SQL_ReadResult(Query, 1)
  388. Achievement[iPlayer][MURDER] = SQL_ReadResult(Query, 2)
  389. Achievement[iPlayer][SURVIVOR] = SQL_ReadResult(Query, 3)
  390. Achievement[iPlayer][AIMKEY] = SQL_ReadResult(Query, 4)
  391. Achievement[iPlayer][EXECUTION] = SQL_ReadResult(Query, 5)
  392. Achievement[iPlayer][ONEHPHERO] = SQL_ReadResult(Query, 6)
  393. }
  394.  
  395. return PLUGIN_HANDLED
  396. }
  397.  
  398. public Save_MySql(iPlayer)
  399. {
  400. new szSteamId[32], szTemp[512]
  401. get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
  402.  
  403. format(szTemp,charsmax(szTemp),"UPDATE `achievements` SET `tag` = '%d', `murder` = '%d', `survivor` = '%d', `aimkey` = '%d', `execution` = '%d', `onehphero` = '%d' WHERE `achievements`.`steamid` = '%s';", iAchTag[iPlayer], Achievement[iPlayer][MURDER], Achievement[iPlayer][SURVIVOR], Achievement[iPlayer][AIMKEY], Achievement[iPlayer][EXECUTION], Achievement[iPlayer][ONEHPHERO], szSteamId)
  404.  
  405. SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
  406. }
  407.  
  408. public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
  409. {
  410. SQL_FreeHandle(Query)
  411. return PLUGIN_HANDLED
  412. }
  413. ///////////////////////////////////////////////////
  414. ////////// END OF ACHIEVEMENT SAVING //////////////
  415. ///////////////////////////////////////////////////
  416.  
  417. ///////////////////////////////////////////////////
  418. ///////// START OF ACHIEVEMENT COLORCHAT //////////
  419. ///////////////////////////////////////////////////
  420.  
  421. ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
  422. {
  423. static message[256];
  424.  
  425. switch(type)
  426. {
  427. case NORMAL: // clients scr_concolor cvar color
  428. {
  429. message[0] = 0x01;
  430. }
  431. case GREEN: // Green
  432. {
  433. message[0] = 0x04;
  434. }
  435. default: // White, Red, Blue
  436. {
  437. message[0] = 0x03;
  438. }
  439. }
  440.  
  441. vformat(message[1], 251, msg, 4);
  442.  
  443. // Make sure message is not longer than 192 character. Will crash the server.
  444. message[192] = '^0';
  445.  
  446. static team, ColorChange, index, MSG_Type;
  447.  
  448. if(id)
  449. {
  450. MSG_Type = MSG_ONE;
  451. index = id;
  452. } else {
  453. index = FindPlayer();
  454. MSG_Type = MSG_ALL;
  455. }
  456.  
  457. team = get_user_team(index);
  458. ColorChange = ColorSelection(index, MSG_Type, type);
  459.  
  460. ShowColorMessage(index, MSG_Type, message);
  461.  
  462. if(ColorChange)
  463. {
  464. Team_Info(index, MSG_Type, TeamName[team]);
  465. }
  466. }
  467.  
  468. ShowColorMessage(id, type, message[])
  469. {
  470. message_begin(type, get_user_msgid("SayText"), _, id);
  471. write_byte(id)
  472. write_string(message);
  473. message_end();
  474. }
  475.  
  476. Team_Info(id, type, team[])
  477. {
  478. message_begin(type, get_user_msgid("TeamInfo"), _, id);
  479. write_byte(id);
  480. write_string(team);
  481. message_end();
  482.  
  483. return 1;
  484. }
  485.  
  486. ColorSelection(index, type, Color:Type)
  487. {
  488. switch(Type)
  489. {
  490. case RED:
  491. {
  492. return Team_Info(index, type, TeamName[1]);
  493. }
  494. case BLUE:
  495. {
  496. return Team_Info(index, type, TeamName[2]);
  497. }
  498. case GREY:
  499. {
  500. return Team_Info(index, type, TeamName[0]);
  501. }
  502. }
  503.  
  504. return 0;
  505. }
  506.  
  507. FindPlayer()
  508. {
  509. static i;
  510. i = -1;
  511.  
  512. while(i <= get_maxplayers())
  513. {
  514. if(is_user_connected(++i))
  515. {
  516. return i;
  517. }
  518. }
  519.  
  520. return -1;
  521. }
  522. ///////////////////////////////////////////////////
  523. ///////// END OF ACHIEVEMENT COLORCHAT ////////////
  524. ///////////////////////////////////////////////////
  525.  
  526. ///////////////////////////////////////////////////
  527. ///////// Stock Start//////////////////////////////
  528. ///////////////////////////////////////////////////
  529. stock print_color(const id, const input[], any:...)
  530. {
  531. new count = 1, players[32]
  532. static msg[191]
  533. vformat(msg, 190, input, 3)
  534.  
  535. replace_all(msg, 190, "!g", "^4")
  536. replace_all(msg, 190, "!y", "^1")
  537. replace_all(msg, 190, "!t", "^3")
  538. replace_all(msg, 190, "", "á")
  539. replace_all(msg, 190, "", "é")
  540. replace_all(msg, 190, "", "í")
  541. replace_all(msg, 190, "", "ó")
  542. replace_all(msg, 190, "", "ö")
  543. replace_all(msg, 190, "", "ő")
  544. replace_all(msg, 190, "", "ú")
  545. replace_all(msg, 190, "", "ü")
  546. replace_all(msg, 190, "", "ű")
  547. replace_all(msg, 190, "", "Á")
  548. replace_all(msg, 190, "", "É")
  549. replace_all(msg, 190, "", "Í")
  550. replace_all(msg, 190, "", "Ó")
  551. replace_all(msg, 190, "", "Ö")
  552. replace_all(msg, 190, "", "Ő")
  553. replace_all(msg, 190, "", "Ú")
  554. replace_all(msg, 190, "", "Ü")
  555. replace_all(msg, 190, "", "Ű")
  556.  
  557. if (id) players[0] = id; else get_players(players, count, "ch")
  558. {
  559. for (new i = 0; i < count; i++)
  560. {
  561. if (is_user_connected(players[i]))
  562. {
  563. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
  564. write_byte(players[i])
  565. write_string(msg)
  566. message_end()
  567. }
  568. }
  569. }
  570. return PLUGIN_HANDLED
  571. }
  572. ///////////////////////////////////////////////////
  573. ///////// Stock END////////////////////////////////
  574. ///////////////////////////////////////////////////