iPixel99

Untitled

Jun 8th, 2023
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 49.74 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cromchat>
  4. #include <crxranks_const>
  5. #include <csx>
  6. #include <fakemeta>
  7. #include <nvault>
  8. #include <sqlx>
  9.  
  10. #if AMXX_VERSION_NUM < 183 || !defined set_dhudmessage
  11. #tryinclude <dhudmessage>
  12.  
  13. #if !defined _dhudmessage_included
  14. #error "dhudmessage.inc" is missing in your "scripting/include" folder. Download it from: "https://amxx-bg.info/inc/"
  15. #endif
  16. #endif
  17.  
  18. #if !defined client_disconnected
  19. #define client_disconnected client_disconnect
  20. #endif
  21.  
  22. #if !defined replace_string
  23. #define replace_string replace_all
  24. #endif
  25.  
  26. new const PLUGIN_VERSION[] = "3.10"
  27. const Float:DELAY_ON_CONNECT = 5.0
  28. const Float:HUD_REFRESH_FREQ = 1.0
  29. const Float:DELAY_ON_CHANGE = 0.1
  30. const MAX_SQL_LENGTH = 512
  31. const MAX_QUERY_LENGTH = 256
  32. const MAX_SOUND_LENGTH = 128
  33. const MAX_SQL_PLAYER_LENGTH = 64
  34. const MAX_SQL_RANK_LENGTH = CRXRANKS_MAX_RANK_LENGTH * 2
  35. const MAX_TEAM_LENGTH = 10
  36. const TASK_HUD = 304500
  37.  
  38. #if !defined MAX_NAME_LENGTH
  39. const MAX_NAME_LENGTH = 32
  40. #endif
  41.  
  42. #if !defined MAX_PLAYERS
  43. const MAX_PLAYERS = 32
  44. #endif
  45.  
  46. new const ARG_CURRENT_XP[] = "$current_xp$"
  47. new const ARG_NEXT_XP[] = "$next_xp$"
  48. new const ARG_XP_NEEDED[] = "$xp_needed$"
  49. new const ARG_LEVEL[] = "$level$"
  50. new const ARG_NEXT_LEVEL[] = "$next_level$"
  51. new const ARG_RANK[] = "$rank$"
  52. new const ARG_NEXT_RANK[] = "$next_rank$"
  53. new const ARG_MAX_LEVELS[] = "$max_levels$"
  54. new const ARG_LINE_BREAK[] = "$br$"
  55. new const ARG_NAME[] = "$name$"
  56.  
  57. new const XPREWARD_KILL[] = "kill"
  58. new const XPREWARD_HEADSHOT[] = "headshot"
  59. new const XPREWARD_TEAMKILL[] = "teamkill"
  60. new const XPREWARD_SUICIDE[] = "suicide"
  61. new const XPREWARD_DEATH[] = "death"
  62.  
  63. new const XPREWARD_BOMB_PLANTED[] = "bomb_planted"
  64. new const XPREWARD_BOMB_DEFUSED[] = "bomb_defused"
  65. new const XPREWARD_BOMB_EXPLODED[] = "bomb_exploded"
  66.  
  67. new const XPREWARD_TEAM_WIN[] = "team_win"
  68. new const XPREWARD_TEAM_LOSE[] = "team_lose"
  69. new const XPREWARD_TEAM_WIN_CT[] = "team_win_ct"
  70. new const XPREWARD_TEAM_WIN_T[] = "team_win_t"
  71. new const XPREWARD_TEAM_LOSE_CT[] = "team_lose_ct"
  72. new const XPREWARD_TEAM_LOSE_T[] = "team_lose_t"
  73.  
  74. #define clr(%1) %1 == -1 ? random(256) : %1
  75.  
  76. #define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
  77. g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 0, 0.1, 1.0, 0.1, 0.1
  78.  
  79. #define HUDINFO_PARAMS_DEAD clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
  80. g_eSettings[HUDINFO_POSITION_DEAD][0], g_eSettings[HUDINFO_POSITION_DEAD][1], 0, 0.1, 1.0, 0.1, 0.1
  81.  
  82. #define XP_NOTIFIER_PARAMS_GET clr(g_eSettings[XP_NOTIFIER_COLOR_GET][0]), clr(g_eSettings[XP_NOTIFIER_COLOR_GET][1]), clr(g_eSettings[XP_NOTIFIER_COLOR_GET][2]),\
  83. g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime = g_eSettings[XP_NOTIFIER_DURATION]
  84.  
  85. #define XP_NOTIFIER_PARAMS_LOSE clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][0]), clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][1]), clr(g_eSettings[XP_NOTIFIER_COLOR_LOSE][2]),\
  86. g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime = g_eSettings[XP_NOTIFIER_DURATION]
  87.  
  88. enum _:SaveLoad
  89. {
  90. SL_SAVE_DATA,
  91. SL_LOAD_DATA
  92. }
  93.  
  94. enum _:Objects
  95. {
  96. OBJ_HUDINFO,
  97. OBJ_XP_NOTIFIER
  98. }
  99.  
  100. enum _:SaveTypes
  101. {
  102. SAVE_NICKNAME,
  103. SAVE_IP,
  104. SAVE_STEAMID
  105. }
  106.  
  107. enum _:SaveInterval
  108. {
  109. SAVE_ON_DISCONNECT,
  110. SAVE_ON_DEATH,
  111. SAVE_ON_ROUND_END,
  112. SAVE_ON_XP_CHANGE
  113. }
  114.  
  115. enum _:SaveMethods
  116. {
  117. SAVE_NVAULT,
  118. SAVE_MYSQL
  119. }
  120.  
  121. enum _:HUDInfoVisibility
  122. {
  123. VIS_ALL_PLAYERS,
  124. VIS_ONLY_ALIVE,
  125. VIS_ONLY_DEAD,
  126. VIS_DEAD_FREEZE_TIME
  127. }
  128.  
  129. enum _:Sections
  130. {
  131. SECTION_NONE,
  132. SECTION_SETTINGS,
  133. SECTION_RANKS,
  134. SECTION_XP_REWARDS
  135. }
  136.  
  137. enum _:PlayerData
  138. {
  139. XP,
  140. Level,
  141. NextXP,
  142. Rank[CRXRANKS_MAX_RANK_LENGTH],
  143. NextRank[CRXRANKS_MAX_RANK_LENGTH],
  144. HUDInfo[CRXRANKS_MAX_HUDINFO_LENGTH],
  145. SaveInfo[CRXRANKS_MAX_PLAYER_INFO_LENGTH],
  146. bool:HudInfoEnabled,
  147. bool:IsOnFinalLevel,
  148. bool:IsVIP,
  149. bool:IsBot
  150. }
  151.  
  152. enum _:Settings
  153. {
  154. SAVE_TYPE,
  155. SAVE_INTERVAL,
  156. bool:USE_MYSQL,
  157. SQL_HOST[MAX_NAME_LENGTH],
  158. SQL_USER[MAX_NAME_LENGTH],
  159. SQL_PASSWORD[MAX_NAME_LENGTH],
  160. SQL_DATABASE[MAX_NAME_LENGTH],
  161. SQL_TABLE[MAX_NAME_LENGTH],
  162. LEVELUP_MESSAGE_TYPE,
  163. LEVELUP_SOUND[MAX_SOUND_LENGTH],
  164. bool:LEVELUP_SCREEN_FADE_ENABLED,
  165. LEVELUP_SCREEN_FADE_COLOR[4],
  166. LEVELDN_SOUND[MAX_SOUND_LENGTH],
  167. bool:LEVELDN_SCREEN_FADE_ENABLED,
  168. LEVELDN_SCREEN_FADE_COLOR[4],
  169. FINAL_LEVEL_FLAGS[MAX_NAME_LENGTH],
  170. FINAL_LEVEL_FLAGS_BIT,
  171. VIP_FLAGS[MAX_NAME_LENGTH],
  172. VIP_FLAGS_BIT,
  173. VAULT_NAME[MAX_NAME_LENGTH],
  174. TEAM_LOCK,
  175. MINIMUM_PLAYERS,
  176. bool:IGNORE_BOTS,
  177. bool:USE_COMBINED_EVENTS,
  178. bool:NOTIFY_ON_KILL,
  179. bool:HUDINFO_ENABLED,
  180. HUDINFO_VISIBILITY,
  181. bool:HUDINFO_TEAM_LOCK,
  182. bool:HUDINFO_OTHER_PLAYERS,
  183. HUDINFO_COLOR[3],
  184. Float:HUDINFO_POSITION[2],
  185. Float:HUDINFO_POSITION_DEAD[2],
  186. bool:HUDINFO_USE_DHUD,
  187. HUDINFO_FORMAT[CRXRANKS_MAX_HUDINFO_LENGTH],
  188. HUDINFO_FORMAT_FINAL[CRXRANKS_MAX_HUDINFO_LENGTH],
  189. HUDINFO_INVALID_TEXT[MAX_NAME_LENGTH],
  190. bool:XP_NOTIFIER_ENABLED,
  191. XP_NOTIFIER_COLOR_GET[3],
  192. XP_NOTIFIER_COLOR_LOSE[3],
  193. Float:XP_NOTIFIER_POSITION[2],
  194. Float:XP_NOTIFIER_DURATION,
  195. bool:XP_NOTIFIER_USE_DHUD
  196. }
  197.  
  198. new g_eSettings[Settings]
  199. new g_ePlayerData[MAX_PLAYERS + 1][PlayerData]
  200. new g_szMaxLevels[CRXRANKS_MAX_XP_LENGTH]
  201. new g_szSqlError[MAX_SQL_LENGTH]
  202. new Handle:g_iSqlTuple
  203. new Array:g_aLevels
  204. new Array:g_aRankNames
  205. new Trie:g_tSettings
  206. new Trie:g_tXPRewards
  207. new Trie:g_tXPRewardsVIP
  208. new bool:g_bIsCstrike
  209. new bool:g_bFreezeTime
  210.  
  211. new g_iVault
  212. new g_iMaxLevels
  213. new g_iFlagZ
  214. new g_iScreenFade
  215. new g_iObject[2]
  216.  
  217. new g_fwdUserLevelUpdated
  218. new g_fwdUserReceiveXP
  219. new g_fwdUserXPUpdated
  220. new g_fwdUserNameChanged
  221.  
  222. // !!!
  223. public amxbans_admin_connect(id)
  224. {
  225. if(g_ePlayerData[id][Level] == g_iMaxLevels && g_eSettings[FINAL_LEVEL_FLAGS])
  226. {
  227. set_user_flags(id, g_eSettings[FINAL_LEVEL_FLAGS_BIT])
  228. remove_user_flags(id, g_iFlagZ)
  229. }
  230. }
  231.  
  232. public plugin_init()
  233. {
  234. register_plugin("OciXCrom's Rank System", PLUGIN_VERSION, "OciXCrom")
  235. register_cvar("CRXRankSystem", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
  236.  
  237. register_dictionary("RankSystem.txt")
  238.  
  239. register_event("DeathMsg", "OnPlayerKilled", "a")
  240. register_event("SayText", "OnSayText", "a", "2=#Cstrike_Name_Change")
  241.  
  242. if(g_eSettings[HUDINFO_VISIBILITY] == VIS_DEAD_FREEZE_TIME)
  243. {
  244. register_event("HLTV", "OnFreezeTimeStart", "a", "1=0", "2=0")
  245. register_logevent("OnRoundStart", 2, "1=Round_Start")
  246. }
  247.  
  248. if(g_eSettings[SAVE_INTERVAL] == SAVE_ON_ROUND_END)
  249. {
  250. register_logevent("OnRoundEnd", 2, "1=Round_End")
  251. }
  252.  
  253. if(g_bIsCstrike)
  254. {
  255. register_event("SendAudio", "OnTeamWin", "a", "2&%!MRAD_terwin", "2&%!MRAD_ctwin")
  256. }
  257.  
  258. register_clcmd("say /xplist", "Cmd_XPList", ADMIN_BAN)
  259. register_clcmd("say_team /xplist", "Cmd_XPList", ADMIN_BAN)
  260. register_clcmd("say /hudinfo", "Cmd_HudInfo", ADMIN_ALL)
  261. register_clcmd("say_team /hudinfo", "Cmd_HudInfo", ADMIN_ALL)
  262. register_concmd("crxranks_give_xp", "Cmd_GiveXP", ADMIN_RCON, "<nick|#userid> <amount>")
  263. register_concmd("crxranks_reset_xp", "Cmd_ResetXP", ADMIN_RCON, "<nick|#userid>")
  264.  
  265. if(g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
  266. {
  267. g_iScreenFade = get_user_msgid("ScreenFade")
  268. }
  269.  
  270. g_fwdUserLevelUpdated = CreateMultiForward("crxranks_user_level_updated", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
  271. g_fwdUserReceiveXP = CreateMultiForward("crxranks_user_receive_xp", ET_STOP, FP_CELL, FP_CELL, FP_CELL)
  272. g_fwdUserXPUpdated = CreateMultiForward("crxranks_user_xp_updated", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
  273.  
  274. if(g_eSettings[USE_MYSQL])
  275. {
  276. g_iSqlTuple = SQL_MakeDbTuple(g_eSettings[SQL_HOST], g_eSettings[SQL_USER], g_eSettings[SQL_PASSWORD], g_eSettings[SQL_DATABASE])
  277.  
  278. new iErrorCode, Handle:iSqlConnection = SQL_Connect(g_iSqlTuple, iErrorCode, g_szSqlError, charsmax(g_szSqlError))
  279.  
  280. if(iSqlConnection == Empty_Handle)
  281. {
  282. log_amx(g_szSqlError)
  283. log_amx("%L", LANG_SERVER, "CRXRANKS_MYSQL_FAILED")
  284. g_eSettings[USE_MYSQL] = false
  285. }
  286. else
  287. {
  288. SQL_FreeHandle(iSqlConnection)
  289. }
  290.  
  291. new szQuery[MAX_QUERY_LENGTH]
  292.  
  293. formatex(szQuery, charsmax(szQuery), "CREATE TABLE IF NOT EXISTS `%s` (`Player` VARCHAR(%i) NOT NULL, `XP` INT(%i) NOT NULL, `Level` INT(%i) NOT NULL,\
  294. `Next XP` INT(%i) NOT NULL, `Rank` VARCHAR(%i) NOT NULL, `Next Rank` VARCHAR(%i) NOT NULL, PRIMARY KEY(Player));",\
  295. g_eSettings[SQL_TABLE], MAX_SQL_PLAYER_LENGTH, CRXRANKS_MAX_XP_LENGTH, CRXRANKS_MAX_XP_LENGTH, CRXRANKS_MAX_XP_LENGTH,\
  296. MAX_SQL_RANK_LENGTH, MAX_SQL_RANK_LENGTH)
  297.  
  298. SQL_ThreadQuery(g_iSqlTuple, "QueryHandler", szQuery)
  299. }
  300.  
  301. if(!g_eSettings[USE_MYSQL])
  302. {
  303. g_iVault = nvault_open(g_eSettings[VAULT_NAME])
  304. }
  305. }
  306.  
  307. public plugin_precache()
  308. {
  309. new szModname[MAX_NAME_LENGTH]
  310. get_modname(szModname, charsmax(szModname))
  311.  
  312. if(equal(szModname, "cstrike") || equal(szModname, "czero"))
  313. {
  314. g_bIsCstrike = true
  315. }
  316.  
  317. g_aLevels = ArrayCreate(1)
  318. ArrayPushCell(g_aLevels, 0)
  319.  
  320. g_aRankNames = ArrayCreate(MAX_NAME_LENGTH)
  321. ArrayPushString(g_aRankNames, "")
  322.  
  323. g_tSettings = TrieCreate()
  324. g_tXPRewards = TrieCreate()
  325. g_tXPRewardsVIP = TrieCreate()
  326.  
  327. ReadFile()
  328. }
  329.  
  330. public plugin_cfg()
  331. {
  332. if(g_eSettings[HUDINFO_VISIBILITY] == VIS_DEAD_FREEZE_TIME && get_cvar_num("mp_freezetime"))
  333. {
  334. g_bFreezeTime = true
  335. }
  336. }
  337.  
  338. public plugin_end()
  339. {
  340. ArrayDestroy(g_aLevels)
  341. ArrayDestroy(g_aRankNames)
  342. TrieDestroy(g_tSettings)
  343. TrieDestroy(g_tXPRewards)
  344. TrieDestroy(g_tXPRewardsVIP)
  345. DestroyForward(g_fwdUserLevelUpdated)
  346.  
  347. if(g_eSettings[USE_MYSQL])
  348. {
  349. SQL_FreeHandle(g_iSqlTuple)
  350. }
  351. else
  352. {
  353. nvault_close(g_iVault)
  354. }
  355. }
  356.  
  357. ReadFile()
  358. {
  359. new szFilename[256]
  360. get_configsdir(szFilename, charsmax(szFilename))
  361. add(szFilename, charsmax(szFilename), "/RankSystem.ini")
  362.  
  363. new iFilePointer = fopen(szFilename, "rt")
  364.  
  365. if(iFilePointer)
  366. {
  367. new szData[CRXRANKS_MAX_HUDINFO_LENGTH + MAX_NAME_LENGTH], szValue[CRXRANKS_MAX_HUDINFO_LENGTH], szMap[MAX_NAME_LENGTH], szKey[MAX_NAME_LENGTH]
  368. new szTemp[4][5], bool:bRead = true, bool:bHasDeadPosition, i, iSize, iSection = SECTION_NONE
  369. get_mapname(szMap, charsmax(szMap))
  370.  
  371. while(!feof(iFilePointer))
  372. {
  373. fgets(iFilePointer, szData, charsmax(szData))
  374. trim(szData)
  375.  
  376. switch(szData[0])
  377. {
  378. case EOS, '#', ';': continue
  379. case '-':
  380. {
  381. iSize = strlen(szData)
  382.  
  383. if(szData[iSize - 1] == '-')
  384. {
  385. szData[0] = ' '
  386. szData[iSize - 1] = ' '
  387. trim(szData)
  388.  
  389. if(contain(szData, "*") != -1)
  390. {
  391. strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '*')
  392. copy(szValue, strlen(szKey), szMap)
  393. bRead = equal(szValue, szKey) ? true : false
  394. }
  395. else
  396. {
  397. static const szAll[] = "#all"
  398. bRead = equal(szData, szAll) || equali(szData, szMap)
  399. }
  400. }
  401. else continue
  402. }
  403. case '[':
  404. {
  405. iSize = strlen(szData)
  406.  
  407. if(szData[iSize - 1] == ']')
  408. {
  409. switch(szData[1])
  410. {
  411. case 'S', 's': iSection = SECTION_SETTINGS
  412. case 'R', 'r': iSection = SECTION_RANKS
  413. case 'X', 'x': iSection = SECTION_XP_REWARDS
  414. default: iSection = SECTION_NONE
  415. }
  416. }
  417. else continue
  418. }
  419. default:
  420. {
  421. if(!bRead || iSection == SECTION_NONE)
  422. {
  423. continue
  424. }
  425.  
  426. strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
  427. trim(szKey); trim(szValue)
  428.  
  429. switch(iSection)
  430. {
  431. case SECTION_SETTINGS:
  432. {
  433. TrieSetString(g_tSettings, szKey, szValue)
  434.  
  435. if(equal(szKey, "CHAT_PREFIX"))
  436. {
  437. if(g_bIsCstrike)
  438. {
  439. CC_SetPrefix(szValue)
  440. }
  441. else
  442. {
  443. copy(CC_PREFIX, charsmax(CC_PREFIX), szValue)
  444. }
  445. }
  446. else if(equal(szKey, "SAVE_TYPE"))
  447. {
  448. g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAME, SAVE_STEAMID)
  449. }
  450. else if(equal(szKey, "SAVE_INTERVAL"))
  451. {
  452. g_eSettings[SAVE_INTERVAL] = clamp(str_to_num(szValue), SAVE_ON_DISCONNECT, SAVE_ON_XP_CHANGE)
  453. }
  454. else if(equal(szKey, "USE_MYSQL"))
  455. {
  456. g_eSettings[USE_MYSQL] = _:clamp(str_to_num(szValue), false, true)
  457. }
  458. else if(equal(szKey, "SQL_HOST"))
  459. {
  460. copy(g_eSettings[SQL_HOST], charsmax(g_eSettings[SQL_HOST]), szValue)
  461. }
  462. else if(equal(szKey, "SQL_USER"))
  463. {
  464. copy(g_eSettings[SQL_USER], charsmax(g_eSettings[SQL_USER]), szValue)
  465. }
  466. else if(equal(szKey, "SQL_PASSWORD"))
  467. {
  468. copy(g_eSettings[SQL_PASSWORD], charsmax(g_eSettings[SQL_PASSWORD]), szValue)
  469. }
  470. else if(equal(szKey, "SQL_DATABASE"))
  471. {
  472. copy(g_eSettings[SQL_DATABASE], charsmax(g_eSettings[SQL_DATABASE]), szValue)
  473. }
  474. else if(equal(szKey, "SQL_TABLE"))
  475. {
  476. copy(g_eSettings[SQL_TABLE], charsmax(g_eSettings[SQL_TABLE]), szValue)
  477. }
  478. else if(equal(szKey, "XP_COMMANDS"))
  479. {
  480. while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
  481. {
  482. trim(szKey); trim(szValue)
  483. register_clcmd(szKey, "Cmd_XP")
  484. }
  485. }
  486. else if(equal(szKey, "LEVELUP_MESSAGE_TYPE"))
  487. {
  488. g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 0, 2)
  489. }
  490. else if(equal(szKey, "LEVELUP_SOUND"))
  491. {
  492. copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)
  493.  
  494. if(szValue[0])
  495. {
  496. precache_sound_if_found(szValue)
  497. }
  498. }
  499. else if(equal(szKey, "LEVELUP_SCREEN_FADE_ENABLED"))
  500. {
  501. g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  502. }
  503. else if(equal(szKey, "LEVELUP_SCREEN_FADE_COLOR"))
  504. {
  505. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
  506.  
  507. for(i = 0; i < 4; i++)
  508. {
  509. g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  510. }
  511. }
  512. else if(equal(szKey, "LEVELDN_SOUND"))
  513. {
  514. copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)
  515.  
  516. if(szValue[0])
  517. {
  518. precache_sound_if_found(szValue)
  519. }
  520. }
  521. else if(equal(szKey, "LEVELDN_SCREEN_FADE_ENABLED"))
  522. {
  523. g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  524. }
  525. else if(equal(szKey, "LEVELDN_SCREEN_FADE_COLOR"))
  526. {
  527. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
  528.  
  529. for(i = 0; i < 4; i++)
  530. {
  531. g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  532. }
  533. }
  534. else if(equal(szKey, "FINAL_LEVEL_FLAGS"))
  535. {
  536. copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
  537. g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
  538. g_iFlagZ = read_flags("z")
  539. }
  540. else if(equal(szKey, "VIP_FLAGS"))
  541. {
  542. copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
  543. g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
  544. }
  545. else if(equal(szKey, "VAULT_NAME"))
  546. {
  547. copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
  548. }
  549. else if(equal(szKey, "TEAM_LOCK"))
  550. {
  551. g_eSettings[TEAM_LOCK] = str_to_num(szValue)
  552. }
  553. else if(equal(szKey, "MINIMUM_PLAYERS"))
  554. {
  555. g_eSettings[MINIMUM_PLAYERS] = clamp(str_to_num(szValue), 0, 32)
  556. }
  557. else if(equal(szKey, "IGNORE_BOTS"))
  558. {
  559. g_eSettings[IGNORE_BOTS] = _:clamp(str_to_num(szValue), false, true)
  560. }
  561. else if(equal(szKey, "USE_COMBINED_EVENTS"))
  562. {
  563. g_eSettings[USE_COMBINED_EVENTS] = _:clamp(str_to_num(szValue), false, true)
  564. }
  565. else if(equal(szKey, "NOTIFY_ON_KILL"))
  566. {
  567. g_eSettings[NOTIFY_ON_KILL] = _:clamp(str_to_num(szValue), false, true)
  568. }
  569. else if(equal(szKey, "HUDINFO_ENABLED"))
  570. {
  571. g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  572. }
  573. else if(equal(szKey, "HUDINFO_VISIBILITY") || equal(szKey, "HUDINFO_ALIVE_ONLY") /* changed in v3.9 */ )
  574. {
  575. g_eSettings[HUDINFO_VISIBILITY] = clamp(str_to_num(szValue), VIS_ALL_PLAYERS, VIS_DEAD_FREEZE_TIME)
  576. }
  577. else if(equal(szKey, "HUDINFO_TEAM_LOCK"))
  578. {
  579. g_eSettings[HUDINFO_TEAM_LOCK] = _:clamp(str_to_num(szValue), false, true)
  580. }
  581. else if(equal(szKey, "HUDINFO_OTHER_PLAYERS"))
  582. {
  583. g_eSettings[HUDINFO_OTHER_PLAYERS] = _:clamp(str_to_num(szValue), false, true)
  584. }
  585. else if(equal(szKey, "HUDINFO_COLOR"))
  586. {
  587. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  588.  
  589. for(i = 0; i < 3; i++)
  590. {
  591. g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  592. }
  593. }
  594. else if(equal(szKey, "HUDINFO_POSITION"))
  595. {
  596. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
  597.  
  598. for(i = 0; i < 2; i++)
  599. {
  600. g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.0, 1.0)
  601. }
  602. }
  603. else if(equal(szKey, "HUDINFO_POSITION_DEAD"))
  604. {
  605. bHasDeadPosition = true
  606. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
  607.  
  608. for(i = 0; i < 2; i++)
  609. {
  610. g_eSettings[HUDINFO_POSITION_DEAD][i] = _:floatclamp(str_to_float(szTemp[i]), -1.0, 1.0)
  611. }
  612. }
  613. else if(equal(szKey, "HUDINFO_USE_DHUD"))
  614. {
  615. g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), false, true)
  616.  
  617. if(!g_eSettings[HUDINFO_USE_DHUD])
  618. {
  619. g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
  620. }
  621. }
  622. else if(equal(szKey, "HUDINFO_FORMAT"))
  623. {
  624. copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
  625. }
  626. else if(equal(szKey, "HUDINFO_FORMAT_FINAL"))
  627. {
  628. copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
  629. }
  630. else if(equal(szKey, "HUDINFO_INVALID_TEXT"))
  631. {
  632. copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
  633. }
  634. else if(equal(szKey, "XP_NOTIFIER_ENABLED"))
  635. {
  636. g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  637. }
  638. else if(equal(szKey, "XP_NOTIFIER_COLOR_GET"))
  639. {
  640. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  641.  
  642. for(i = 0; i < 3; i++)
  643. {
  644. g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  645. }
  646. }
  647. else if(equal(szKey, "XP_NOTIFIER_COLOR_LOSE"))
  648. {
  649. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  650.  
  651. for(i = 0; i < 3; i++)
  652. {
  653. g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  654. }
  655. }
  656. else if(equal(szKey, "XP_NOTIFIER_POSITION"))
  657. {
  658. parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
  659.  
  660. for(i = 0; i < 2; i++)
  661. {
  662. g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.0, 1.0)
  663. }
  664. }
  665. else if(equal(szKey, "XP_NOTIFIER_DURATION"))
  666. {
  667. g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0, float(cellmax))
  668. }
  669. else if(equal(szKey, "XP_NOTIFIER_USE_DHUD"))
  670. {
  671. g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), false, true)
  672.  
  673. if(!g_eSettings[XP_NOTIFIER_USE_DHUD])
  674. {
  675. g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
  676. }
  677. }
  678. }
  679. case SECTION_RANKS:
  680. {
  681. ArrayPushCell(g_aLevels, g_iMaxLevels == 0 ? 0 : max(str_to_num(szValue), 0))
  682. ArrayPushString(g_aRankNames, szKey)
  683. g_iMaxLevels++
  684. }
  685. case SECTION_XP_REWARDS:
  686. {
  687. static szReward[2][16]
  688. szReward[1][0] = EOS
  689.  
  690. parse(szValue, szReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
  691. TrieSetCell(g_tXPRewards, szKey, str_to_num(szReward[0]))
  692.  
  693. if(szReward[1][0])
  694. {
  695. TrieSetCell(g_tXPRewardsVIP, szKey, str_to_num(szReward[1]))
  696. }
  697. }
  698. }
  699. }
  700. }
  701. }
  702.  
  703. if(!bHasDeadPosition)
  704. {
  705. for(i = 0; i < 2; i++)
  706. {
  707. g_eSettings[HUDINFO_POSITION_DEAD][i] = _:g_eSettings[HUDINFO_POSITION][i]
  708. }
  709. }
  710.  
  711. num_to_str(g_iMaxLevels, g_szMaxLevels, charsmax(g_szMaxLevels))
  712. fclose(iFilePointer)
  713. }
  714. }
  715.  
  716. public client_connect(id)
  717. {
  718. reset_player_stats(id)
  719.  
  720. switch(g_eSettings[SAVE_TYPE])
  721. {
  722. case SAVE_NICKNAME: get_user_name(id, g_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]))
  723. case SAVE_IP: get_user_ip(id, g_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]), 1)
  724. case SAVE_STEAMID: get_user_authid(id, g_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]))
  725. }
  726.  
  727. save_or_load(id, g_ePlayerData[id][SaveInfo], SL_LOAD_DATA)
  728.  
  729. g_ePlayerData[id][IsBot] = is_user_bot(id) != 0
  730. set_task(DELAY_ON_CONNECT, "update_vip_status", id)
  731.  
  732. if(g_eSettings[HUDINFO_ENABLED])
  733. {
  734. set_task(HUD_REFRESH_FREQ, "DisplayHUD", id + TASK_HUD, .flags = "b")
  735. }
  736. }
  737.  
  738. public client_disconnected(id)
  739. {
  740. if(g_eSettings[SAVE_INTERVAL] != SAVE_ON_XP_CHANGE)
  741. {
  742. save_or_load(id, g_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
  743. }
  744.  
  745. remove_task(id + TASK_HUD)
  746. }
  747.  
  748. public OnSayText(iMsg, iDestination, iEntity)
  749. {
  750. g_fwdUserNameChanged = register_forward(FM_ClientUserInfoChanged, "OnNameChange", 1)
  751. }
  752.  
  753. public OnNameChange(id)
  754. {
  755. if(!is_user_connected(id))
  756. {
  757. return
  758. }
  759.  
  760. new szName[MAX_NAME_LENGTH]
  761. get_user_name(id, szName, charsmax(szName))
  762.  
  763. if(g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
  764. {
  765. save_or_load(id, g_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
  766. copy(g_ePlayerData[id][SaveInfo], charsmax(g_ePlayerData[][SaveInfo]), szName)
  767.  
  768. if(g_eSettings[USE_MYSQL])
  769. {
  770. reset_player_stats(id)
  771. }
  772.  
  773. save_or_load(id, szName, SL_LOAD_DATA)
  774. update_hudinfo(id)
  775. }
  776.  
  777. update_vip_status(id)
  778. unregister_forward(FM_ClientUserInfoChanged, g_fwdUserNameChanged, 1)
  779. }
  780.  
  781. public DisplayHUD(id)
  782. {
  783. id -= TASK_HUD
  784.  
  785. if(!g_ePlayerData[id][HudInfoEnabled])
  786. {
  787. return
  788. }
  789.  
  790. new bool:bIsAlive, iTarget
  791.  
  792. bIsAlive = is_user_alive(id) != 0
  793. iTarget = id
  794.  
  795. if(bIsAlive)
  796. {
  797. switch(g_eSettings[HUDINFO_VISIBILITY])
  798. {
  799. case VIS_ONLY_DEAD: return
  800. case VIS_DEAD_FREEZE_TIME:
  801. {
  802. if(!g_bFreezeTime)
  803. {
  804. return
  805. }
  806. }
  807. }
  808. }
  809. else
  810. {
  811. if(g_eSettings[HUDINFO_VISIBILITY] == VIS_ONLY_ALIVE)
  812. {
  813. return
  814. }
  815.  
  816. if(g_eSettings[HUDINFO_OTHER_PLAYERS])
  817. {
  818. iTarget = pev(id, pev_iuser2)
  819. }
  820. }
  821.  
  822. if(!iTarget)
  823. {
  824. return
  825. }
  826.  
  827. if(g_eSettings[TEAM_LOCK] && g_eSettings[HUDINFO_TEAM_LOCK] && get_user_team(iTarget) != g_eSettings[TEAM_LOCK])
  828. {
  829. return
  830. }
  831.  
  832. if(g_eSettings[HUDINFO_USE_DHUD])
  833. {
  834. if(bIsAlive)
  835. {
  836. set_dhudmessage(HUDINFO_PARAMS)
  837. }
  838. else
  839. {
  840. set_dhudmessage(HUDINFO_PARAMS_DEAD)
  841. }
  842.  
  843. show_dhudmessage(id, g_ePlayerData[iTarget][HUDInfo])
  844. }
  845. else
  846. {
  847. if(bIsAlive)
  848. {
  849. set_hudmessage(HUDINFO_PARAMS)
  850. }
  851. else
  852. {
  853. set_hudmessage(HUDINFO_PARAMS_DEAD)
  854. }
  855.  
  856. ShowSyncHudMsg(id, g_iObject[OBJ_HUDINFO], g_ePlayerData[iTarget][HUDInfo])
  857. }
  858. }
  859.  
  860. public bomb_planted(id)
  861. {
  862. give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_PLANTED), CRXRANKS_XPS_REWARD)
  863. }
  864.  
  865. public bomb_defused(id)
  866. {
  867. give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_DEFUSED), CRXRANKS_XPS_REWARD)
  868. }
  869.  
  870. public bomb_explode(id)
  871. {
  872. give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_EXPLODED), CRXRANKS_XPS_REWARD)
  873. }
  874.  
  875. public Cmd_XP(id)
  876. {
  877. if(g_ePlayerData[id][Level] == g_iMaxLevels)
  878. {
  879. CC_SendMessage(id, "%L", id, "CRXRANKS_RANKINFO_FINAL", g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
  880. }
  881. else
  882. {
  883. CC_SendMessage(id, "%L", id, "CRXRANKS_RANKINFO_NORMAL", g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
  884. g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
  885. }
  886.  
  887. return PLUGIN_HANDLED
  888. }
  889.  
  890. public Cmd_XPList(id, iLevel, iCid)
  891. {
  892. if(!cmd_access(id, iLevel, iCid, 1))
  893. {
  894. return PLUGIN_HANDLED
  895. }
  896.  
  897. new szTitle[128]
  898. formatex(szTitle, charsmax(szTitle), "%L", id, "CRXRANKS_MENU_TITLE")
  899.  
  900. new iPlayers[MAX_PLAYERS], iPnum, iMenu = menu_create(szTitle, "XPList_Handler")
  901. get_players(iPlayers, iPnum); SortCustom1D(iPlayers, iPnum, "sort_players_by_xp")
  902.  
  903. for(new szItem[128], szName[MAX_NAME_LENGTH], iPlayer, i; i < iPnum; i++)
  904. {
  905. iPlayer = iPlayers[i]
  906. get_user_name(iPlayer, szName, charsmax(szName))
  907. formatex(szItem, charsmax(szItem), "%L", id, "CRXRANKS_ITEM_FORMAT", g_ePlayerData[iPlayer][XP], szName, g_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
  908. menu_additem(iMenu, szItem)
  909. }
  910.  
  911. menu_display(id, iMenu)
  912. return PLUGIN_HANDLED
  913. }
  914.  
  915. public Cmd_HudInfo(id, iLevel, iCid)
  916. {
  917. if(!cmd_access(id, iLevel, iCid, 1))
  918. {
  919. return PLUGIN_HANDLED
  920. }
  921.  
  922. if(!g_eSettings[HUDINFO_ENABLED])
  923. {
  924. CC_SendMessage(id, "%L", id, "CRXRANKS_HUDINFO_UNAVAILABLE")
  925. return PLUGIN_HANDLED
  926. }
  927.  
  928. g_ePlayerData[id][HudInfoEnabled] = !g_ePlayerData[id][HudInfoEnabled]
  929. CC_SendMessage(id, "%L", id, g_ePlayerData[id][HudInfoEnabled] ? "CRXRANKS_HUDINFO_ENABLED" : "CRXRANKS_HUDINFO_DISABLED")
  930. return PLUGIN_HANDLED
  931. }
  932.  
  933. public XPList_Handler(id, iMenu, iItem)
  934. {
  935. menu_destroy(iMenu)
  936. return PLUGIN_HANDLED
  937. }
  938.  
  939. public Cmd_GiveXP(id, iLevel, iCid)
  940. {
  941. if(!cmd_access(id, iLevel, iCid, 3))
  942. {
  943. return PLUGIN_HANDLED
  944. }
  945.  
  946. new szPlayer[MAX_NAME_LENGTH]
  947. read_argv(1, szPlayer, charsmax(szPlayer))
  948.  
  949. new iPlayer = cmd_target(id, szPlayer, 0)
  950.  
  951. if(!iPlayer)
  952. {
  953. return PLUGIN_HANDLED
  954. }
  955.  
  956. new szName[2][MAX_NAME_LENGTH], szAmount[CRXRANKS_MAX_XP_LENGTH]
  957. read_argv(2, szAmount, charsmax(szAmount))
  958. get_user_name(id, szName[0], charsmax(szName[]))
  959. get_user_name(iPlayer, szName[1], charsmax(szName[]))
  960.  
  961. new szKey[MAX_NAME_LENGTH], iXP = str_to_num(szAmount)
  962. give_user_xp(iPlayer, iXP, CRXRANKS_XPS_ADMIN)
  963.  
  964. if(iXP >= 0)
  965. {
  966. copy(szKey, charsmax(szKey), "CRXRANKS_GIVE_XP")
  967. }
  968. else
  969. {
  970. copy(szKey, charsmax(szKey), "CRXRANKS_TAKE_XP")
  971. iXP *= -1
  972. }
  973.  
  974. CC_LogMessage(0, _, "%L", id, szKey, szName[0], iXP, szName[1])
  975. return PLUGIN_HANDLED
  976. }
  977.  
  978. public Cmd_ResetXP(id, iLevel, iCid)
  979. {
  980. if(!cmd_access(id, iLevel, iCid, 2))
  981. {
  982. return PLUGIN_HANDLED
  983. }
  984.  
  985. new szPlayer[MAX_NAME_LENGTH]
  986. read_argv(1, szPlayer, charsmax(szPlayer))
  987.  
  988. new iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
  989.  
  990. if(!iPlayer)
  991. {
  992. return PLUGIN_HANDLED
  993. }
  994.  
  995. new szName[2][MAX_NAME_LENGTH]
  996. get_user_name(id, szName[0], charsmax(szName[]))
  997. get_user_name(iPlayer, szName[1], charsmax(szName[]))
  998.  
  999. g_ePlayerData[iPlayer][XP] = 0
  1000. check_level(iPlayer, true)
  1001. CC_LogMessage(0, _, "%L", id, "CRXRANKS_RESET_XP", szName[0], szName[1])
  1002.  
  1003. if(g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
  1004. {
  1005. save_or_load(iPlayer, g_ePlayerData[iPlayer][SaveInfo], SL_SAVE_DATA)
  1006. }
  1007.  
  1008. return PLUGIN_HANDLED
  1009. }
  1010.  
  1011. public OnFreezeTimeStart()
  1012. {
  1013. g_bFreezeTime = true
  1014. }
  1015.  
  1016. public OnRoundStart()
  1017. {
  1018. g_bFreezeTime = false
  1019. }
  1020.  
  1021. public OnRoundEnd()
  1022. {
  1023. new iPlayers[32], iPnum
  1024. get_players(iPlayers, iPnum)
  1025.  
  1026. for(new i, iPlayer; i < iPnum; i++)
  1027. {
  1028. iPlayer = iPlayers[i]
  1029. save_or_load(iPlayer, g_ePlayerData[iPlayer][SaveInfo], SL_SAVE_DATA)
  1030. }
  1031. }
  1032.  
  1033. public OnTeamWin()
  1034. {
  1035. new szTeam[MAX_TEAM_LENGTH], szWinTeam[MAX_TEAM_LENGTH], szLoseTeam[MAX_TEAM_LENGTH]
  1036. read_data(2, szTeam, charsmax(szTeam))
  1037. copy(szWinTeam, charsmax(szWinTeam), szTeam[7] == 'c' ? "CT" : "TERRORIST")
  1038. copy(szLoseTeam, charsmax(szLoseTeam), szTeam[7] == 'c' ? "TERRORIST" : "CT")
  1039.  
  1040. if(xp_reward_is_set(XPREWARD_TEAM_WIN))
  1041. {
  1042. reward_team(szWinTeam, XPREWARD_TEAM_WIN)
  1043. }
  1044.  
  1045. if(xp_reward_is_set(XPREWARD_TEAM_LOSE))
  1046. {
  1047. reward_team(szLoseTeam, XPREWARD_TEAM_LOSE)
  1048. }
  1049.  
  1050. if(szWinTeam[0] == 'C')
  1051. {
  1052. if(xp_reward_is_set(XPREWARD_TEAM_WIN_CT))
  1053. {
  1054. reward_team(szWinTeam, XPREWARD_TEAM_WIN_CT)
  1055. }
  1056.  
  1057. if(xp_reward_is_set(XPREWARD_TEAM_LOSE_T))
  1058. {
  1059. reward_team(szLoseTeam, XPREWARD_TEAM_LOSE_T)
  1060. }
  1061. }
  1062. else
  1063. {
  1064. if(xp_reward_is_set(XPREWARD_TEAM_WIN_T))
  1065. {
  1066. reward_team(szWinTeam, XPREWARD_TEAM_WIN_T)
  1067. }
  1068.  
  1069. if(xp_reward_is_set(XPREWARD_TEAM_LOSE_CT))
  1070. {
  1071. reward_team(szLoseTeam, XPREWARD_TEAM_LOSE_CT)
  1072. }
  1073. }
  1074. }
  1075.  
  1076. public OnPlayerKilled()
  1077. {
  1078. new szWeapon[16], iAttacker = read_data(1), iVictim = read_data(2), iXP
  1079. read_data(4, szWeapon, charsmax(szWeapon))
  1080.  
  1081. if(!is_user_connected(iVictim))
  1082. {
  1083. return
  1084. }
  1085.  
  1086. if(g_eSettings[SAVE_INTERVAL] == SAVE_ON_DEATH)
  1087. {
  1088. save_or_load(iVictim, g_ePlayerData[iVictim][SaveInfo], SL_SAVE_DATA)
  1089. }
  1090.  
  1091. if(iAttacker == iVictim || equal(szWeapon, "worldspawn") || equal(szWeapon, "door", 4) || equal(szWeapon, "trigger_hurt"))
  1092. {
  1093. iXP = get_xp_reward(iVictim, XPREWARD_SUICIDE)
  1094.  
  1095. if(g_eSettings[USE_COMBINED_EVENTS])
  1096. {
  1097. iXP += get_xp_reward(iVictim, XPREWARD_DEATH)
  1098. }
  1099.  
  1100. give_user_xp(iVictim, iXP, CRXRANKS_XPS_REWARD)
  1101.  
  1102. if(should_send_kill_message(iXP))
  1103. {
  1104. CC_SendMessage(iVictim, "%L", iVictim, iXP > 0 ? "CRXRANKS_NOTIFY_SUICIDE_GET" : "CRXRANKS_NOTIFY_SUICIDE_LOSE", abs(iXP))
  1105. }
  1106.  
  1107. return
  1108. }
  1109.  
  1110. if(!is_user_connected(iAttacker))
  1111. {
  1112. return
  1113. }
  1114.  
  1115. new iReward, iTemp
  1116.  
  1117. if(iAttacker == iVictim)
  1118. {
  1119. iTemp = get_xp_reward(iAttacker, XPREWARD_SUICIDE)
  1120. iReward += iTemp
  1121.  
  1122. if(should_skip(iTemp))
  1123. {
  1124. goto @GIVE_REWARD
  1125. }
  1126. }
  1127. else if(get_user_team(iAttacker) == get_user_team(iVictim))
  1128. {
  1129. iTemp = get_xp_reward(iAttacker, XPREWARD_TEAMKILL)
  1130. iReward += iTemp
  1131.  
  1132. if(should_skip(iTemp))
  1133. {
  1134. goto @GIVE_REWARD
  1135. }
  1136. }
  1137. else
  1138. {
  1139. iTemp = get_xp_reward(iAttacker, szWeapon)
  1140. iReward += iTemp
  1141.  
  1142. if(should_skip(iTemp))
  1143. {
  1144. goto @GIVE_REWARD
  1145. }
  1146.  
  1147. if(read_data(3))
  1148. {
  1149. iTemp = get_xp_reward(iAttacker, XPREWARD_HEADSHOT)
  1150. iReward += iTemp
  1151.  
  1152. if(should_skip(iTemp))
  1153. {
  1154. goto @GIVE_REWARD
  1155. }
  1156. }
  1157.  
  1158. iReward += get_xp_reward(iAttacker, XPREWARD_KILL)
  1159. }
  1160.  
  1161. @GIVE_REWARD:
  1162. iXP = give_user_xp(iAttacker, iReward, CRXRANKS_XPS_REWARD)
  1163.  
  1164. if(should_send_kill_message(iXP))
  1165. {
  1166. new szName[MAX_NAME_LENGTH]
  1167. get_user_name(iVictim, szName, charsmax(szName))
  1168. CC_SendMessage(iAttacker, "%L", iAttacker, iXP > 0 ? "CRXRANKS_NOTIFY_KILL_GET" : "CRXRANKS_NOTIFY_KILL_LOSE", abs(iXP), szName)
  1169. }
  1170.  
  1171. iXP = give_user_xp(iVictim, get_xp_reward(iVictim, XPREWARD_DEATH), CRXRANKS_XPS_REWARD)
  1172.  
  1173. if(should_send_kill_message(iXP))
  1174. {
  1175. CC_SendMessage(iVictim, "%L", iVictim, iXP > 0 ? "CRXRANKS_NOTIFY_DEATH_GET" : "CRXRANKS_NOTIFY_DEATH_LOSE", abs(iXP))
  1176. }
  1177. }
  1178.  
  1179. public sort_players_by_xp(id1, id2)
  1180. {
  1181. return g_ePlayerData[id2][XP] - g_ePlayerData[id1][XP]
  1182. }
  1183.  
  1184. public QueryHandler(iFailState, Handle:iQuery, szError[], iErrorCode)
  1185. {
  1186. check_and_log_query_error(iFailState, szError, iErrorCode)
  1187. }
  1188.  
  1189. check_and_log_query_error(iFailState, const szError[], iErrorCode)
  1190. {
  1191. switch(iFailState)
  1192. {
  1193. case TQUERY_CONNECT_FAILED: log_amx("[SQL Error] Connection failed (%i): %s", iErrorCode, szError)
  1194. case TQUERY_QUERY_FAILED: log_amx("[SQL Error] Query failed (%i): %s", iErrorCode, szError)
  1195. }
  1196. }
  1197.  
  1198. bool:xp_reward_is_set(const szReward[])
  1199. {
  1200. return TrieKeyExists(g_tXPRewards, szReward)
  1201. }
  1202.  
  1203. reward_team(const szTeam[], const szReward[])
  1204. {
  1205. new iPlayers[MAX_PLAYERS], iPnum
  1206. get_players(iPlayers, iPnum, "e", szTeam)
  1207.  
  1208. for(new i, iPlayer; i < iPnum; i++)
  1209. {
  1210. iPlayer = iPlayers[i]
  1211. give_user_xp(iPlayer, get_xp_reward(iPlayer, szReward), CRXRANKS_XPS_REWARD)
  1212. }
  1213. }
  1214.  
  1215. save_or_load(const id, const szInfo[], const iType)
  1216. {
  1217. if(!szInfo[0])
  1218. {
  1219. return
  1220. }
  1221.  
  1222. switch(iType)
  1223. {
  1224. case SL_SAVE_DATA:
  1225. {
  1226. if(g_eSettings[USE_MYSQL])
  1227. {
  1228. new szQuery[MAX_QUERY_LENGTH], szPlayer[MAX_SQL_PLAYER_LENGTH], szRank[MAX_SQL_RANK_LENGTH], szNextRank[MAX_SQL_RANK_LENGTH]
  1229.  
  1230. SQL_QuoteString(Empty_Handle, szPlayer, charsmax(szPlayer), szInfo)
  1231. SQL_QuoteString(Empty_Handle, szRank, charsmax(szRank), g_ePlayerData[id][Rank])
  1232. SQL_QuoteString(Empty_Handle, szNextRank, charsmax(szNextRank), g_ePlayerData[id][NextRank])
  1233.  
  1234. formatex(szQuery, charsmax(szQuery), "REPLACE INTO `%s` (`Player`, `XP`, `Level`, `Next XP`, `Rank`, `Next Rank`) VALUES ('%s', '%i', '%i', '%i', '%s', '%s');",\
  1235. g_eSettings[SQL_TABLE], szPlayer, g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][NextXP], szRank, szNextRank)
  1236. SQL_ThreadQuery(g_iSqlTuple, "QueryHandler", szQuery)
  1237. }
  1238. else
  1239. {
  1240. new szData[CRXRANKS_MAX_XP_LENGTH]
  1241. num_to_str(g_ePlayerData[id][XP], szData, charsmax(szData))
  1242. nvault_set(g_iVault, szInfo, szData)
  1243. }
  1244. }
  1245. case SL_LOAD_DATA:
  1246. {
  1247. if(g_eSettings[USE_MYSQL])
  1248. {
  1249. new szPlayer[MAX_SQL_PLAYER_LENGTH]
  1250. SQL_QuoteString(Empty_Handle, szPlayer, charsmax(szPlayer), szInfo)
  1251.  
  1252. new szQuery[MAX_QUERY_LENGTH]
  1253. formatex(szQuery, charsmax(szQuery), "SELECT XP FROM `%s` WHERE Player = '%s';", g_eSettings[SQL_TABLE], szPlayer)
  1254.  
  1255. new iData[1]; iData[0] = id
  1256. SQL_ThreadQuery(g_iSqlTuple, "QueryLoadData", szQuery, iData, sizeof(iData))
  1257. }
  1258. else
  1259. {
  1260. new iData = nvault_get(g_iVault, szInfo)
  1261. g_ePlayerData[id][XP] = iData ? clamp(iData, 0) : 0
  1262. check_level(id, false)
  1263. }
  1264. }
  1265. }
  1266. }
  1267.  
  1268. public QueryLoadData(iFailState, Handle:iQuery, szError[], iErrorCode, iData[], iSize)
  1269. {
  1270. new id = iData[0]
  1271.  
  1272. if(SQL_NumResults(iQuery))
  1273. {
  1274. g_ePlayerData[id][XP] = SQL_ReadResult(iQuery, 0)
  1275. }
  1276.  
  1277. check_level(id, false)
  1278. }
  1279.  
  1280. get_xp_reward(const id, const szKey[])
  1281. {
  1282. new iReward
  1283.  
  1284. if(g_ePlayerData[id][IsVIP])
  1285. {
  1286. if(TrieKeyExists(g_tXPRewardsVIP, szKey))
  1287. {
  1288. TrieGetCell(g_tXPRewardsVIP, szKey, iReward)
  1289. return iReward
  1290. }
  1291. }
  1292.  
  1293. if(TrieKeyExists(g_tXPRewards, szKey))
  1294. {
  1295. TrieGetCell(g_tXPRewards, szKey, iReward)
  1296. return iReward
  1297. }
  1298.  
  1299. return 0
  1300. }
  1301.  
  1302. give_user_xp(const id, iXP, CRXRanks_XPSources:iSource = CRXRANKS_XPS_PLUGIN)
  1303. {
  1304. if(!iXP)
  1305. {
  1306. return 0
  1307. }
  1308.  
  1309. if(g_eSettings[IGNORE_BOTS] && g_ePlayerData[id][IsBot])
  1310. {
  1311. return 0
  1312. }
  1313.  
  1314. if(iSource == CRXRANKS_XPS_REWARD)
  1315. {
  1316. if(g_eSettings[MINIMUM_PLAYERS] && get_playersnum() < g_eSettings[MINIMUM_PLAYERS])
  1317. {
  1318. return 0
  1319. }
  1320.  
  1321. if(g_eSettings[TEAM_LOCK] && get_user_team(id) != g_eSettings[TEAM_LOCK])
  1322. {
  1323. return 0
  1324. }
  1325. }
  1326.  
  1327. update_vip_status(id)
  1328.  
  1329. new iReturn
  1330. ExecuteForward(g_fwdUserReceiveXP, iReturn, id, iXP, iSource)
  1331.  
  1332. switch(iReturn)
  1333. {
  1334. case CRXRANKS_HANDLED: return 0
  1335. case CRXRANKS_CONTINUE: { }
  1336. default:
  1337. {
  1338. if(iReturn != 0)
  1339. {
  1340. iXP = iReturn
  1341. }
  1342. }
  1343. }
  1344.  
  1345. g_ePlayerData[id][XP] += iXP
  1346.  
  1347. if(g_ePlayerData[id][XP] < 0)
  1348. {
  1349. g_ePlayerData[id][XP] = 0
  1350. }
  1351.  
  1352. if(g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
  1353. {
  1354. save_or_load(id, g_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
  1355. }
  1356.  
  1357. check_level(id, true)
  1358. ExecuteForward(g_fwdUserXPUpdated, iReturn, id, g_ePlayerData[id][XP], iSource)
  1359.  
  1360. if(g_eSettings[XP_NOTIFIER_ENABLED])
  1361. {
  1362. new szKey[MAX_NAME_LENGTH], bool:bPositive
  1363. bPositive = iXP >= 0
  1364.  
  1365. copy(szKey, charsmax(szKey), bPositive ? "CRXRANKS_XP_NOTIFIER_GET" : "CRXRANKS_XP_NOTIFIER_LOSE")
  1366.  
  1367. if(g_eSettings[XP_NOTIFIER_USE_DHUD])
  1368. {
  1369. if(bPositive)
  1370. {
  1371. set_dhudmessage(XP_NOTIFIER_PARAMS_GET)
  1372. }
  1373. else
  1374. {
  1375. set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)
  1376. }
  1377.  
  1378. show_dhudmessage(id, "%L", id, szKey, abs(iXP))
  1379. }
  1380. else
  1381. {
  1382. if(bPositive)
  1383. {
  1384. set_hudmessage(XP_NOTIFIER_PARAMS_GET)
  1385. }
  1386. else
  1387. {
  1388. set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)
  1389. }
  1390.  
  1391. ShowSyncHudMsg(id, g_iObject[OBJ_XP_NOTIFIER], "%L", id, szKey, abs(iXP))
  1392. }
  1393. }
  1394.  
  1395. return iXP
  1396. }
  1397.  
  1398. precache_sound_if_found(const szValue[])
  1399. {
  1400. new szSound[MAX_SOUND_LENGTH]
  1401. format(szSound, charsmax(szSound), "sound/%s", szValue)
  1402.  
  1403. if(file_exists(szSound))
  1404. {
  1405. precache_sound(szValue)
  1406. }
  1407. else
  1408. {
  1409. log_amx("ERROR: sound file ^"%s^" not found", szValue)
  1410. }
  1411. }
  1412.  
  1413. reset_player_stats(const id)
  1414. {
  1415. g_ePlayerData[id][XP] = 0
  1416. g_ePlayerData[id][Level] = 0
  1417. g_ePlayerData[id][NextXP] = 0
  1418. g_ePlayerData[id][Rank][0] = EOS
  1419. g_ePlayerData[id][NextRank][0] = EOS
  1420. g_ePlayerData[id][HUDInfo][0] = EOS
  1421. g_ePlayerData[id][HudInfoEnabled] = true
  1422. g_ePlayerData[id][IsOnFinalLevel] = false
  1423. g_ePlayerData[id][IsVIP] = false
  1424. g_ePlayerData[id][IsBot] = false
  1425. }
  1426.  
  1427. bool:has_argument(const szMessage[], const szArg[])
  1428. {
  1429. return contain(szMessage, szArg) != -1
  1430. }
  1431.  
  1432. bool:should_skip(const iNum)
  1433. {
  1434. return (iNum != 0 && !g_eSettings[USE_COMBINED_EVENTS])
  1435. }
  1436.  
  1437. bool:should_send_kill_message(const iXP)
  1438. {
  1439. return (g_eSettings[NOTIFY_ON_KILL] && iXP != 0)
  1440. }
  1441.  
  1442. update_hudinfo(const id)
  1443. {
  1444. if(!g_eSettings[HUDINFO_ENABLED])
  1445. {
  1446. return
  1447. }
  1448.  
  1449. new szMessage[CRXRANKS_MAX_HUDINFO_LENGTH], szPlaceHolder[MAX_NAME_LENGTH], bool:bIsOnFinal
  1450.  
  1451. bIsOnFinal = g_ePlayerData[id][IsOnFinalLevel]
  1452. copy(szMessage, charsmax(szMessage), g_eSettings[bIsOnFinal ? HUDINFO_FORMAT_FINAL : HUDINFO_FORMAT])
  1453.  
  1454. if(has_argument(szMessage, ARG_CURRENT_XP))
  1455. {
  1456. num_to_str(g_ePlayerData[id][XP], szPlaceHolder, charsmax(szPlaceHolder))
  1457. replace_string(szMessage, charsmax(szMessage), ARG_CURRENT_XP, szPlaceHolder)
  1458. }
  1459.  
  1460. if(has_argument(szMessage, ARG_NEXT_XP))
  1461. {
  1462. num_to_str(g_ePlayerData[id][NextXP], szPlaceHolder, charsmax(szPlaceHolder))
  1463. replace_string(szMessage, charsmax(szMessage), ARG_NEXT_XP, szPlaceHolder)
  1464. }
  1465.  
  1466. if(has_argument(szMessage, ARG_XP_NEEDED))
  1467. {
  1468. num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHolder, charsmax(szPlaceHolder))
  1469. replace_string(szMessage, charsmax(szMessage), ARG_XP_NEEDED, szPlaceHolder)
  1470. }
  1471.  
  1472. if(has_argument(szMessage, ARG_LEVEL))
  1473. {
  1474. num_to_str(g_ePlayerData[id][Level], szPlaceHolder, charsmax(szPlaceHolder))
  1475. replace_string(szMessage, charsmax(szMessage), ARG_LEVEL, szPlaceHolder)
  1476. }
  1477.  
  1478. if(has_argument(szMessage, ARG_NEXT_LEVEL))
  1479. {
  1480. num_to_str(g_ePlayerData[id][bIsOnFinal ? Level : Level + 1], szPlaceHolder, charsmax(szPlaceHolder))
  1481. replace_string(szMessage, charsmax(szMessage), ARG_NEXT_LEVEL, szPlaceHolder)
  1482. }
  1483.  
  1484. replace_string(szMessage, charsmax(szMessage), ARG_MAX_LEVELS, g_szMaxLevels)
  1485.  
  1486. if(has_argument(szMessage, ARG_NAME))
  1487. {
  1488. get_user_name(id, szPlaceHolder, charsmax(szPlaceHolder))
  1489. replace_string(szMessage, charsmax(szMessage), ARG_NAME, szPlaceHolder)
  1490. }
  1491.  
  1492. replace_string(szMessage, charsmax(szMessage), ARG_RANK, g_ePlayerData[id][Rank])
  1493. replace_string(szMessage, charsmax(szMessage), ARG_NEXT_RANK, g_ePlayerData[id][NextRank])
  1494. replace_string(szMessage, charsmax(szMessage), ARG_LINE_BREAK, "^n")
  1495. copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
  1496. }
  1497.  
  1498. check_level(const id, const bool:bNotify)
  1499. {
  1500. new iLevel, i
  1501.  
  1502. for(i = 1; i < g_iMaxLevels + 1; i++)
  1503. {
  1504. if(g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevels, i))
  1505. {
  1506. iLevel++
  1507. }
  1508. }
  1509.  
  1510. if(iLevel != g_ePlayerData[id][Level])
  1511. {
  1512. new bool:bLevelUp, iReturn
  1513. bLevelUp = iLevel > g_ePlayerData[id][Level]
  1514. g_ePlayerData[id][Level] = iLevel
  1515. ArrayGetString(g_aRankNames, iLevel, g_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))
  1516.  
  1517. if(iLevel < g_iMaxLevels)
  1518. {
  1519. g_ePlayerData[id][IsOnFinalLevel] = false
  1520. g_ePlayerData[id][NextXP] = ArrayGetCell(g_aLevels, iLevel + 1)
  1521. ArrayGetString(g_aRankNames, iLevel + 1, g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
  1522. }
  1523. else
  1524. {
  1525. g_ePlayerData[id][IsOnFinalLevel] = true
  1526. g_ePlayerData[id][NextXP] = ArrayGetCell(g_aLevels, iLevel)
  1527. copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])
  1528.  
  1529. if(g_eSettings[FINAL_LEVEL_FLAGS])
  1530. {
  1531. set_user_flags(id, g_eSettings[FINAL_LEVEL_FLAGS_BIT])
  1532. remove_user_flags(id, g_iFlagZ)
  1533. }
  1534. }
  1535.  
  1536. ExecuteForward(g_fwdUserLevelUpdated, iReturn, id, iLevel, bLevelUp)
  1537.  
  1538. if(bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
  1539. {
  1540. new szName[MAX_NAME_LENGTH]
  1541. get_user_name(id, szName, charsmax(szName))
  1542.  
  1543. if(g_eSettings[LEVELUP_MESSAGE_TYPE] == 2)
  1544. {
  1545. new iPlayers[MAX_PLAYERS], iPlayer, iPnum
  1546. get_players(iPlayers, iPnum)
  1547.  
  1548. for(i = 0; i < iPnum; i++)
  1549. {
  1550. iPlayer = iPlayers[i]
  1551. CC_SendMessage(iPlayer, "%L", iPlayer, bLevelUp ? "CRXRANKS_LEVEL_REACHED" : "CRXRANKS_LEVEL_LOST", szName, g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
  1552. }
  1553. }
  1554. else
  1555. {
  1556. CC_SendMessage(id, "%L", id, bLevelUp ? "CRXRANKS_LEVEL_REACHED" : "CRXRANKS_LEVEL_LOST", szName, g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
  1557. }
  1558.  
  1559. if(bLevelUp && g_eSettings[LEVELUP_SOUND][0])
  1560. {
  1561. emit_sound(id, CHAN_AUTO, g_eSettings[LEVELUP_SOUND], 1.0, ATTN_NORM, 0, PITCH_NORM)
  1562. }
  1563. else if(!bLevelUp && g_eSettings[LEVELDN_SOUND][0])
  1564. {
  1565. emit_sound(id, CHAN_AUTO, g_eSettings[LEVELDN_SOUND], 1.0, ATTN_NORM, 0, PITCH_NORM)
  1566. }
  1567.  
  1568. if(g_eSettings[bLevelUp ? LEVELUP_SCREEN_FADE_ENABLED : LEVELDN_SCREEN_FADE_ENABLED])
  1569. {
  1570. message_begin(MSG_ONE, g_iScreenFade, {0, 0, 0}, id)
  1571. write_short(1<<10)
  1572. write_short(1<<10)
  1573. write_short(0)
  1574.  
  1575. if(bLevelUp)
  1576. {
  1577. write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
  1578. write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
  1579. write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
  1580. write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
  1581. }
  1582. else
  1583. {
  1584. write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
  1585. write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
  1586. write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
  1587. write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
  1588. }
  1589.  
  1590. message_end()
  1591. }
  1592. }
  1593. }
  1594.  
  1595. update_hudinfo(id)
  1596. }
  1597.  
  1598. public update_vip_status(id)
  1599. {
  1600. if(is_user_connected(id) && g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
  1601. {
  1602. g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
  1603. }
  1604. }
  1605.  
  1606. public plugin_natives()
  1607. {
  1608. register_library("crxranks")
  1609. register_native("crxranks_get_chat_prefix", "_crxranks_get_chat_prefix")
  1610. register_native("crxranks_get_final_flags", "_crxranks_get_final_flags")
  1611. register_native("crxranks_get_hudinfo_format", "_crxranks_get_hudinfo_format")
  1612. register_native("crxranks_get_max_levels", "_crxranks_get_max_levels")
  1613. register_native("crxranks_get_rank_by_level", "_crxranks_get_rank_by_level")
  1614. register_native("crxranks_get_save_type", "_crxranks_get_save_type")
  1615. register_native("crxranks_get_setting", "_crxranks_get_setting")
  1616. register_native("crxranks_get_user_hudinfo", "_crxranks_get_user_hudinfo")
  1617. register_native("crxranks_get_user_level", "_crxranks_get_user_level")
  1618. register_native("crxranks_get_user_next_rank", "_crxranks_get_user_next_rank")
  1619. register_native("crxranks_get_user_next_xp", "_crxranks_get_user_next_xp")
  1620. register_native("crxranks_get_user_rank", "_crxranks_get_user_rank")
  1621. register_native("crxranks_get_user_xp", "_crxranks_get_user_xp")
  1622. register_native("crxranks_get_vault_name", "_crxranks_get_vault_name")
  1623. register_native("crxranks_get_vip_flags", "_crxranks_get_vip_flags")
  1624. register_native("crxranks_get_xp_for_level", "_crxranks_get_xp_for_level")
  1625. register_native("crxranks_get_xp_reward", "_crxranks_get_xp_reward")
  1626. register_native("crxranks_give_user_xp", "_crxranks_give_user_xp")
  1627. register_native("crxranks_has_user_hudinfo", "_crxranks_has_user_hudinfo")
  1628. register_native("crxranks_is_hi_using_dhud", "_crxranks_is_hi_using_dhud")
  1629. register_native("crxranks_is_hud_enabled", "_crxranks_is_hud_enabled")
  1630. register_native("crxranks_is_sfdn_enabled", "_crxranks_is_sfdn_enabled")
  1631. register_native("crxranks_is_sfup_enabled", "_crxranks_is_sfup_enabled")
  1632. register_native("crxranks_is_user_on_final", "_crxranks_is_user_on_final")
  1633. register_native("crxranks_is_user_vip", "_crxranks_is_user_vip")
  1634. register_native("crxranks_is_using_mysql", "_crxranks_is_using_mysql")
  1635. register_native("crxranks_is_xpn_enabled", "_crxranks_is_xpn_enabled")
  1636. register_native("crxranks_is_xpn_using_dhud", "_crxranks_is_xpn_using_dhud")
  1637. register_native("crxranks_set_user_xp", "_crxranks_set_user_xp")
  1638. register_native("crxranks_using_comb_events", "_crxranks_using_comb_events")
  1639. register_native("crxranks_xp_reward_is_set", "_crxranks_xp_reward_is_set")
  1640. }
  1641.  
  1642. public _crxranks_get_chat_prefix(iPlugin, iParams)
  1643. {
  1644. set_string(1, CC_PREFIX, get_param(2))
  1645. }
  1646.  
  1647. public _crxranks_get_final_flags(iPlugin, iParams)
  1648. {
  1649. set_string(1, g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
  1650. return g_eSettings[FINAL_LEVEL_FLAGS_BIT]
  1651. }
  1652.  
  1653. public _crxranks_get_hudinfo_format(iPlugin, iParams)
  1654. {
  1655. set_string(2, g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL : HUDINFO_FORMAT], get_param(3))
  1656. }
  1657.  
  1658. public _crxranks_get_max_levels(iPlugin, iParams)
  1659. {
  1660. return g_iMaxLevels
  1661. }
  1662.  
  1663. public _crxranks_get_rank_by_level(iPlugin, iParams)
  1664. {
  1665. new iLevel = get_param(1)
  1666.  
  1667. if(iLevel < 1 || iLevel > g_iMaxLevels)
  1668. {
  1669. return 0
  1670. }
  1671.  
  1672. new szRank[CRXRANKS_MAX_RANK_LENGTH]
  1673. ArrayGetString(g_aRankNames, iLevel, szRank, charsmax(szRank))
  1674. set_string(2, szRank, get_param(3))
  1675. return 1
  1676. }
  1677.  
  1678. public _crxranks_get_save_type(iPlugin, iParams)
  1679. {
  1680. return g_eSettings[SAVE_TYPE]
  1681. }
  1682.  
  1683. public bool:_crxranks_get_setting(iPlugin, iParams)
  1684. {
  1685. new szKey[MAX_NAME_LENGTH], szValue[CRXRANKS_MAX_HUDINFO_LENGTH], bool:bReturn
  1686. get_string(1, szKey, charsmax(szKey))
  1687.  
  1688. bReturn = TrieGetString(g_tSettings, szKey, szValue, charsmax(szValue))
  1689. set_string(2, szValue, get_param(3))
  1690. return bReturn
  1691. }
  1692.  
  1693. public _crxranks_get_user_hudinfo(iPlugin, iParams)
  1694. {
  1695. set_string(2, g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
  1696. }
  1697.  
  1698. public _crxranks_get_user_level(iPlugin, iParams)
  1699. {
  1700. return g_ePlayerData[get_param(1)][Level]
  1701. }
  1702.  
  1703. public _crxranks_get_user_next_rank(iPlugin, iParams)
  1704. {
  1705. set_string(2, g_ePlayerData[get_param(1)][NextRank], get_param(3))
  1706. }
  1707.  
  1708. public _crxranks_get_user_next_xp(iPlugin, iParams)
  1709. {
  1710. return g_ePlayerData[get_param(1)][NextXP]
  1711. }
  1712.  
  1713. public _crxranks_get_user_rank(iPlugin, iParams)
  1714. {
  1715. set_string(2, g_ePlayerData[get_param(1)][Rank], get_param(3))
  1716. }
  1717.  
  1718. public _crxranks_get_user_xp(iPlugin, iParams)
  1719. {
  1720. return g_ePlayerData[get_param(1)][XP]
  1721. }
  1722.  
  1723. public _crxranks_get_vault_name(iPlugin, iParams)
  1724. {
  1725. set_string(1, g_eSettings[VAULT_NAME], get_param(2))
  1726. }
  1727.  
  1728. public _crxranks_get_vip_flags(iPlugin, iParams)
  1729. {
  1730. set_string(1, g_eSettings[VIP_FLAGS], get_param(2))
  1731. return g_eSettings[VIP_FLAGS_BIT]
  1732. }
  1733.  
  1734. public _crxranks_get_xp_for_level(iPlugin, iParams)
  1735. {
  1736. new iLevel = get_param(1)
  1737.  
  1738. if(iLevel < 1 || iLevel > g_iMaxLevels)
  1739. {
  1740. return -1
  1741. }
  1742.  
  1743. return ArrayGetCell(g_aLevels, iLevel)
  1744. }
  1745.  
  1746. public _crxranks_get_xp_reward(iPlugin, iParams)
  1747. {
  1748. new szReward[CRXRANKS_MAX_XP_REWARD_LENGTH]
  1749. get_string(2, szReward, charsmax(szReward))
  1750. return get_xp_reward(get_param(1), szReward)
  1751. }
  1752.  
  1753. public _crxranks_give_user_xp(iPlugin, iParams)
  1754. {
  1755. new szReward[CRXRANKS_MAX_XP_REWARD_LENGTH], iReward, id = get_param(1)
  1756. get_string(3, szReward, charsmax(szReward))
  1757.  
  1758. if(szReward[0])
  1759. {
  1760. iReward = get_xp_reward(id, szReward)
  1761.  
  1762. if(iReward)
  1763. {
  1764. give_user_xp(id, iReward, CRXRanks_XPSources:get_param(4))
  1765. }
  1766.  
  1767. return iReward
  1768. }
  1769.  
  1770. iReward = get_param(2)
  1771. give_user_xp(id, iReward, CRXRanks_XPSources:get_param(4))
  1772. return iReward
  1773. }
  1774.  
  1775. public bool:_crxranks_has_user_hudinfo(iPlugin, iParams)
  1776. {
  1777. return g_ePlayerData[get_param(1)][HudInfoEnabled]
  1778. }
  1779.  
  1780. public bool:_crxranks_is_hi_using_dhud(iPlugin, iParams)
  1781. {
  1782. return g_eSettings[HUDINFO_USE_DHUD]
  1783. }
  1784.  
  1785. public bool:_crxranks_is_hud_enabled(iPlugin, iParams)
  1786. {
  1787. return g_eSettings[HUDINFO_ENABLED]
  1788. }
  1789.  
  1790. public bool:_crxranks_is_sfdn_enabled(iPlugin, iParams)
  1791. {
  1792. return g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]
  1793. }
  1794.  
  1795. public bool:_crxranks_is_sfup_enabled(iPlugin, iParams)
  1796. {
  1797. return g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]
  1798. }
  1799.  
  1800. public bool:_crxranks_is_user_on_final(iPlugin, iParams)
  1801. {
  1802. return g_ePlayerData[get_param(1)][IsOnFinalLevel]
  1803. }
  1804.  
  1805. public bool:_crxranks_is_user_vip(iPlugin, iParams)
  1806. {
  1807. return g_ePlayerData[get_param(1)][IsVIP]
  1808. }
  1809.  
  1810. public bool:_crxranks_is_using_mysql(iPlugin, iParams)
  1811. {
  1812. return g_eSettings[USE_MYSQL]
  1813. }
  1814.  
  1815. public bool:_crxranks_is_xpn_enabled(iPlugin, iParams)
  1816. {
  1817. return g_eSettings[XP_NOTIFIER_ENABLED]
  1818. }
  1819.  
  1820. public bool:_crxranks_is_xpn_using_dhud(iPlugin, iParams)
  1821. {
  1822. return g_eSettings[XP_NOTIFIER_USE_DHUD]
  1823. }
  1824.  
  1825.  
  1826. public bool:_crxranks_set_user_xp(iPlugin, iParams)
  1827. {
  1828. new iReturn, id = get_param(1), CRXRanks_XPSources:iSource = CRXRanks_XPSources:get_param(3)
  1829. g_ePlayerData[id][XP] = clamp(get_param(2), 0)
  1830.  
  1831. if(g_eSettings[SAVE_INTERVAL] == SAVE_ON_XP_CHANGE)
  1832. {
  1833. save_or_load(id, g_ePlayerData[id][SaveInfo], SL_SAVE_DATA)
  1834. }
  1835.  
  1836. check_level(id, true)
  1837. ExecuteForward(g_fwdUserXPUpdated, iReturn, id, g_ePlayerData[id][XP], iSource)
  1838. }
  1839.  
  1840. public bool:_crxranks_using_comb_events(iPlugin, iParams)
  1841. {
  1842. return g_eSettings[USE_COMBINED_EVENTS]
  1843. }
  1844.  
  1845. public bool:_crxranks_xp_reward_is_set(iPlugin, iParams)
  1846. {
  1847. new szReward[CRXRANKS_MAX_XP_REWARD_LENGTH]
  1848. get_string(1, szReward, charsmax(szReward))
  1849. return xp_reward_is_set(szReward)
  1850. }
  1851.  
Add Comment
Please, Sign In to add comment