Guest User

Untitled

a guest
Jul 4th, 2018
94
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <nvault>
  4.  
  5. // Comment or remove this line in order to run the plugin on a mod different than Counter-Strike.
  6. #define USE_CSTRIKE
  7.  
  8. #if defined USE_CSTRIKE
  9.     #include <cromchat>
  10.     #include <csx>
  11. #else
  12. new CC_PREFIX[64]
  13. #endif
  14.  
  15. #if AMXX_VERSION_NUM < 183
  16.     #include <dhudmessage>
  17. #endif
  18.  
  19. #if defined client_disconnected
  20.     #define client_disconnect client_disconnected
  21. #endif
  22.  
  23. #define PLUGIN_VERSION "2.1.1+logs"
  24. #define DELAY_ON_CONNECT 2.0
  25. #define HUD_REFRESH_FREQ 1.0
  26. #define DELAY_ON_CHANGE 0.1
  27. #define MAX_HUDINFO_LENGTH 192
  28. #define MAX_SOUND_LENGTH 128
  29. #define MAX_PLAYER_INFO_LENGTH 35
  30. #define MAX_RANK_LENGTH 32
  31. #define MAX_XP_REWARD_LENGTH 32
  32. #define MAX_XP_LENGTH 16
  33. #define LOG_FILE "crxranks.log"
  34.  
  35. #if !defined MAX_NAME_LENGTH
  36.     #define MAX_NAME_LENGTH 32
  37. #endif
  38.  
  39. #define ARG_CURRENT_XP          "$current_xp$"
  40. #define ARG_NEXT_XP             "$next_xp$"
  41. #define ARG_XP_NEEDED           "$xp_needed$"
  42. #define ARG_LEVEL               "$level$"
  43. #define ARG_NEXT_LEVEL          "$next_level$"
  44. #define ARG_RANK                "$rank$"
  45. #define ARG_NEXT_RANK           "$next_rank$"
  46. #define ARG_MAX_LEVELS          "$max_levels$"
  47. #define ARG_LINE_BREAK          "$br$"
  48.  
  49. #define XPREWARD_KILL           "kill"
  50. #define XPREWARD_HEADSHOT       "headshot"
  51. #define XPREWARD_TEAMKILL       "teamkill"
  52. #define XPREWARD_SUICIDE        "suicide"
  53.  
  54. #if defined USE_CSTRIKE
  55. #define XPREWARD_BOMB_PLANTED   "bomb_planted"
  56. #define XPREWARD_BOMB_DEFUSED   "bomb_defused"
  57. #define XPREWARD_BOMB_EXPLODED  "bomb_exploded"
  58. #endif
  59.  
  60. #define clr(%1) %1 == -1 ? random(256) : %1
  61.  
  62. #define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
  63. g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 0, 0.1, 1.0, 0.1, 0.1
  64.  
  65. #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]),\
  66. g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime = g_eSettings[XP_NOTIFIER_DURATION]
  67.  
  68. #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]),\
  69. g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime = g_eSettings[XP_NOTIFIER_DURATION]
  70.  
  71. enum (+= 32)
  72. {
  73.     TASK_HUD = 20000,
  74.     TASK_READ
  75. }
  76.  
  77. enum
  78. {
  79.     VAULT_WRITE = 0,
  80.     VAULT_READ
  81. }
  82.  
  83. enum
  84. {
  85.     OBJ_HUDINFO = 0,
  86.     OBJ_XP_NOTIFIER
  87. }
  88.  
  89. enum
  90. {
  91.     SAVE_NICKNAME = 0,
  92.     SAVE_IP,
  93.     SAVE_STEAMID
  94. }
  95.  
  96. enum _:Sections
  97. {
  98.     SECTION_NONE = 0,
  99.     SECTION_SETTINGS,
  100.     SECTION_RANKS,
  101.     SECTION_XP_REWARDS
  102. }
  103.  
  104. enum _:PlayerData
  105. {
  106.     XP,
  107.     Level,
  108.     NextXP,
  109.     Rank[MAX_RANK_LENGTH],
  110.     NextRank[MAX_RANK_LENGTH],
  111.     HUDInfo[MAX_HUDINFO_LENGTH],
  112.     bool:IsOnFinalLevel,
  113.     bool:IsVIP
  114. }
  115.  
  116. enum _:Settings
  117. {
  118.     SAVE_TYPE,
  119.     LEVELUP_MESSAGE_TYPE,
  120.     LEVELUP_SOUND[MAX_SOUND_LENGTH],
  121.     bool:LEVELUP_SCREEN_FADE_ENABLED,
  122.     LEVELUP_SCREEN_FADE_COLOR[4],
  123.     LEVELDN_SOUND[MAX_SOUND_LENGTH],
  124.     bool:LEVELDN_SCREEN_FADE_ENABLED,
  125.     LEVELDN_SCREEN_FADE_COLOR[4],
  126.     FINAL_LEVEL_FLAGS[32],
  127.     FINAL_LEVEL_FLAGS_BIT,
  128.     VIP_FLAGS[32],
  129.     VIP_FLAGS_BIT,
  130.     VAULT_NAME[32],
  131.     bool:HUDINFO_ENABLED,
  132.     bool:HUDINFO_ALIVE_ONLY,
  133.     HUDINFO_COLOR[3],
  134.     Float:HUDINFO_POSITION[2],
  135.     bool:HUDINFO_USE_DHUD,
  136.     HUDINFO_FORMAT[MAX_HUDINFO_LENGTH],
  137.     HUDINFO_FORMAT_FINAL[MAX_HUDINFO_LENGTH],
  138.     HUDINFO_INVALID_TEXT[32],
  139.     bool:XP_NOTIFIER_ENABLED,
  140.     XP_NOTIFIER_COLOR_GET[3],
  141.     XP_NOTIFIER_COLOR_LOSE[3],
  142.     Float:XP_NOTIFIER_POSITION[2],
  143.     Float:XP_NOTIFIER_DURATION,
  144.     bool:XP_NOTIFIER_USE_DHUD
  145. }
  146.  
  147. new g_eSettings[Settings]
  148. new g_ePlayerData[33][PlayerData]
  149. new g_szMaxLevels[MAX_XP_LENGTH]
  150. new Array:g_aLevels
  151. new Array:g_aRankNames
  152. new Trie:g_tXPRewards
  153. new Trie:g_tXPRewardsVIP
  154.  
  155. new g_iVault
  156. new g_iMaxLevels
  157. new g_iObject[2]
  158. new g_iScreenFade
  159. new g_iFlagZ
  160. new g_fwdUserLevelUpdated
  161.  
  162. public plugin_init()
  163. {
  164.     log_to_file(LOG_FILE, "Plugin init started.")
  165.     register_plugin("OciXCrom's Rank System", PLUGIN_VERSION, "OciXCrom")
  166.     register_cvar("CRXRankSystem", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
  167.     register_event("DeathMsg", "OnPlayerKilled", "a")
  168.    
  169.     #if defined USE_CSTRIKE
  170.     register_dictionary("RankSystem.txt")
  171.     #else
  172.     register_dictionary("RankSystemNoColors.txt")
  173.     #endif
  174.    
  175.     register_clcmd("say /xplist", "Cmd_XPList", ADMIN_BAN)
  176.     register_clcmd("say_team /xplist", "Cmd_XPList", ADMIN_BAN)
  177.     register_concmd("crxranks_give_xp", "Cmd_GiveXP", ADMIN_RCON, "<nick|#userid> <amount>")
  178.     register_concmd("crxranks_reset_xp", "Cmd_ResetXP", ADMIN_RCON, "<nick|#userid>")
  179.    
  180.     if(g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
  181.         g_iScreenFade = get_user_msgid("ScreenFade")
  182.  
  183.     g_fwdUserLevelUpdated = CreateMultiForward("crxranks_user_level_updated", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
  184. }
  185.  
  186. public plugin_precache()
  187. {
  188.     log_to_file(LOG_FILE, "Plugin precache started.")
  189.     g_aLevels = ArrayCreate(16)
  190.     ArrayPushCell(g_aLevels, 0)
  191.     g_aRankNames = ArrayCreate(32)
  192.     ArrayPushString(g_aRankNames, "")
  193.     g_tXPRewards = TrieCreate()
  194.     g_tXPRewardsVIP = TrieCreate()
  195.     ReadFile()
  196. }
  197.  
  198. public plugin_end()
  199. {
  200.     log_to_file(LOG_FILE, "The plugin has ended.")
  201.     ArrayDestroy(g_aLevels)
  202.     ArrayDestroy(g_aRankNames)
  203.     TrieDestroy(g_tXPRewards)
  204.     TrieDestroy(g_tXPRewardsVIP)
  205.     DestroyForward(g_fwdUserLevelUpdated)
  206.     nvault_close(g_iVault)
  207. }
  208.  
  209. ReadFile()
  210. {
  211.     new szConfigsName[256], szFilename[256]
  212.     get_configsdir(szConfigsName, charsmax(szConfigsName))
  213.     formatex(szFilename, charsmax(szFilename), "%s/RankSystem.ini", szConfigsName)
  214.    
  215.     new iFilePointer = fopen(szFilename, "rt")
  216.    
  217.     if(iFilePointer)
  218.     {
  219.         new szData[192], szValue[96], szMap[32], szKey[32], szTemp[4][5], bool:bRead = true, i, iSize, iSection = SECTION_NONE
  220.         get_mapname(szMap, charsmax(szMap))
  221.        
  222.         while(!feof(iFilePointer))
  223.         {
  224.             fgets(iFilePointer, szData, charsmax(szData))
  225.             trim(szData)
  226.            
  227.             switch(szData[0])
  228.             {
  229.                 case EOS, '#', ';': continue
  230.                 case '-':
  231.                 {
  232.                     iSize = strlen(szData)
  233.                    
  234.                     if(szData[iSize - 1] == '-')
  235.                     {
  236.                         szData[0] = ' '
  237.                         szData[iSize - 1] = ' '
  238.                         trim(szData)
  239.                        
  240.                         if(contain(szData, "*") != -1)
  241.                         {
  242.                             strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '*')
  243.                             copy(szValue, strlen(szKey), szMap)
  244.                             bRead = equal(szValue, szKey) ? true : false
  245.                         }
  246.                         else
  247.                         {
  248.                             static const szAll[] = "#all"
  249.                             bRead = equal(szData, szAll) || equali(szData, szMap)
  250.                         }
  251.                     }
  252.                     else continue
  253.                 }
  254.                 case '[':
  255.                 {
  256.                     iSize = strlen(szData)
  257.                    
  258.                     if(szData[iSize - 1] == ']')
  259.                     {
  260.                         switch(szData[1])
  261.                         {
  262.                             case 'S', 's': iSection = SECTION_SETTINGS
  263.                             case 'R', 'r': iSection = SECTION_RANKS
  264.                             case 'X', 'x': iSection = SECTION_XP_REWARDS
  265.                             default: iSection = SECTION_NONE
  266.                         }
  267.                     }
  268.                     else continue
  269.                 }
  270.                 default:
  271.                 {
  272.                     if(!bRead || iSection == SECTION_NONE)
  273.                         continue
  274.                        
  275.                     strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
  276.                     trim(szKey); trim(szValue)
  277.                            
  278.                     if(!szValue[0])
  279.                         continue
  280.                        
  281.                     switch(iSection)
  282.                     {
  283.                         case SECTION_SETTINGS:
  284.                         {
  285.                             if(equal(szKey, "CHAT_PREFIX"))
  286.                             {
  287.                                 #if defined USE_CSTRIKE
  288.                                 CC_SetPrefix(szValue)
  289.                                 #else
  290.                                 copy(CC_PREFIX, charsmax(CC_PREFIX), szValue)
  291.                                 #endif
  292.                             }
  293.                             else if(equal(szKey, "SAVE_TYPE"))
  294.                                 g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAME, SAVE_STEAMID)
  295.                             else if(equal(szKey, "XP_COMMANDS"))
  296.                             {
  297.                                 while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
  298.                                 {
  299.                                     trim(szKey); trim(szValue)
  300.                                     register_clcmd(szKey, "Cmd_XP")
  301.                                 }
  302.                             }
  303.                             else if(equal(szKey, "LEVELUP_MESSAGE_TYPE"))
  304.                                 g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 0, 2)
  305.                             else if(equal(szKey, "LEVELUP_SOUND"))
  306.                             {
  307.                                 copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)
  308.                                
  309.                                 if(szValue[0])
  310.                                     precache_sound(szValue)
  311.                             }
  312.                             else if(equal(szKey, "LEVELUP_SCREEN_FADE_ENABLED"))
  313.                                 g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  314.                             else if(equal(szKey, "LEVELUP_SCREEN_FADE_COLOR"))
  315.                             {
  316.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
  317.                                
  318.                                 for(i = 0; i < 4; i++)
  319.                                     g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  320.                             }
  321.                             else if(equal(szKey, "LEVELDN_SOUND"))
  322.                             {
  323.                                 copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)
  324.                                
  325.                                 if(szValue[0])
  326.                                     precache_sound(szValue)
  327.                             }
  328.                             else if(equal(szKey, "LEVELDN_SCREEN_FADE_ENABLED"))
  329.                                 g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  330.                             else if(equal(szKey, "LEVELDN_SCREEN_FADE_COLOR"))
  331.                             {
  332.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
  333.                                
  334.                                 for(i = 0; i < 4; i++)
  335.                                     g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  336.                             }
  337.                             else if(equal(szKey, "FINAL_LEVEL_FLAGS"))
  338.                             {
  339.                                 copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
  340.                                 g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
  341.                                 g_iFlagZ = read_flags("z")
  342.                             }
  343.                             else if(equal(szKey, "VIP_FLAGS"))
  344.                             {
  345.                                 copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
  346.                                 g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
  347.                             }
  348.                             else if(equal(szKey, "VAULT_NAME"))
  349.                             {
  350.                                 g_iVault = nvault_open(szValue)
  351.                                 copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
  352.                             }
  353.                             else if(equal(szKey, "HUDINFO_ENABLED"))
  354.                                 g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  355.                             else if(equal(szKey, "HUDINFO_ALIVE_ONLY"))
  356.                                 g_eSettings[HUDINFO_ALIVE_ONLY] = _:clamp(str_to_num(szValue), false, true)
  357.                             else if(equal(szKey, "HUDINFO_COLOR"))
  358.                             {
  359.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  360.                                
  361.                                 for(i = 0; i < 3; i++)
  362.                                     g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  363.                             }
  364.                             else if(equal(szKey, "HUDINFO_POSITION"))
  365.                             {
  366.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
  367.                                
  368.                                 for(i = 0; i < 2; i++)
  369.                                     g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.0, 1.0)
  370.                             }
  371.                             else if(equal(szKey, "HUDINFO_USE_DHUD"))
  372.                             {
  373.                                 g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), false, true)
  374.                                
  375.                                 if(!g_eSettings[HUDINFO_USE_DHUD])
  376.                                     g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
  377.                             }
  378.                             else if(equal(szKey, "HUDINFO_FORMAT"))
  379.                                 copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
  380.                             else if(equal(szKey, "HUDINFO_FORMAT_FINAL"))
  381.                                 copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
  382.                             else if(equal(szKey, "HUDINFO_INVALID_TEXT"))
  383.                                 copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
  384.                             else if(equal(szKey, "XP_NOTIFIER_ENABLED"))
  385.                                 g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), false, true)
  386.                             else if(equal(szKey, "XP_NOTIFIER_COLOR_GET"))
  387.                             {
  388.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  389.                                
  390.                                 for(i = 0; i < 3; i++)
  391.                                     g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  392.                             }
  393.                             else if(equal(szKey, "XP_NOTIFIER_COLOR_LOSE"))
  394.                             {
  395.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
  396.                                
  397.                                 for(i = 0; i < 3; i++)
  398.                                     g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1, 255)
  399.                             }
  400.                             else if(equal(szKey, "XP_NOTIFIER_POSITION"))
  401.                             {
  402.                                 parse(szValue, szTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
  403.                                
  404.                                 for(i = 0; i < 2; i++)
  405.                                     g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.0, 1.0)
  406.                             }
  407.                             else if(equal(szKey, "XP_NOTIFIER_DURATION"))
  408.                                 g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0, float(cellmax))
  409.                             else if(equal(szKey, "XP_NOTIFIER_USE_DHUD"))
  410.                             {
  411.                                 g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), false, true)
  412.                                
  413.                                 if(!g_eSettings[XP_NOTIFIER_USE_DHUD])
  414.                                     g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
  415.                             }
  416.                         }
  417.                         case SECTION_RANKS:
  418.                         {
  419.                             ArrayPushCell(g_aLevels, clamp(str_to_num(szValue), 0))
  420.                             ArrayPushString(g_aRankNames, szKey)
  421.                             g_iMaxLevels++
  422.                         }
  423.                         case SECTION_XP_REWARDS:
  424.                         {
  425.                             static szReward[2][16]
  426.                             szReward[1][0] = EOS
  427.                            
  428.                             parse(szValue, szReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
  429.                             TrieSetCell(g_tXPRewards, szKey, str_to_num(szReward[0]))
  430.                            
  431.                             if(szReward[1][0])
  432.                                 TrieSetCell(g_tXPRewardsVIP, szKey, str_to_num(szReward[1]))
  433.                         }
  434.                     }
  435.                 }
  436.             }
  437.         }
  438.        
  439.         num_to_str(g_iMaxLevels, g_szMaxLevels, charsmax(g_szMaxLevels))
  440.         fclose(iFilePointer)
  441.     }
  442. }
  443.  
  444. public client_authorized(id)
  445. {
  446.     new szName[32], szAuth[35]
  447.     get_user_name(id, szName, charsmax(szName))
  448.     get_user_authid(id, szAuth, charsmax(szAuth))
  449.     log_to_file(LOG_FILE, "%s [%s] connected.", szName, szAuth)
  450.     reset_stats(id)
  451.     set_task(DELAY_ON_CONNECT, "ReadData", id + TASK_READ)
  452. }
  453.    
  454. public ReadData(id)
  455. {
  456.     id -= TASK_READ
  457.    
  458.     new szInfo[MAX_PLAYER_INFO_LENGTH]
  459.     get_user_saveinfo(id, szInfo, charsmax(szInfo))
  460.     use_vault(id, szInfo, VAULT_READ)
  461.     update_vip_status(id)
  462.    
  463.     if(g_eSettings[HUDINFO_ENABLED])
  464.         set_task(HUD_REFRESH_FREQ, "DisplayHUD", id + TASK_HUD, .flags = "b")
  465. }
  466.  
  467. public client_disconnect(id)
  468. {
  469.     new szName[32], szAuth[35]
  470.     get_user_name(id, szName, charsmax(szName))
  471.     get_user_authid(id, szAuth, charsmax(szAuth))
  472.     log_to_file(LOG_FILE, "%s [%s] disconnected.", szName, szAuth)
  473.    
  474.     new szInfo[MAX_PLAYER_INFO_LENGTH]
  475.     get_user_saveinfo(id, szInfo, charsmax(szInfo))
  476.     use_vault(id, szInfo, VAULT_WRITE)
  477.     remove_task(id + TASK_HUD)
  478. }
  479.  
  480. public client_infochanged(id)
  481. {
  482.     if(!is_user_connected(id))
  483.         return
  484.        
  485.     static const szKey[] = "name"
  486.     static szNewName[MAX_NAME_LENGTH], szOldName[MAX_NAME_LENGTH]
  487.     get_user_info(id, szKey, szNewName, charsmax(szNewName))
  488.     get_user_name(id, szOldName, charsmax(szOldName))
  489.    
  490.     if(!equal(szNewName, szOldName))
  491.     {      
  492.         if(g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
  493.         {
  494.             use_vault(id, szOldName, VAULT_WRITE)
  495.             use_vault(id, szNewName, VAULT_READ)
  496.             update_hudinfo(id)
  497.         }
  498.        
  499.         set_task(DELAY_ON_CHANGE, "update_vip_status", id)
  500.     }
  501. }
  502.  
  503. public DisplayHUD(id)
  504. {
  505.     id -= TASK_HUD
  506.    
  507.     if(!is_user_alive(id) && g_eSettings[HUDINFO_ALIVE_ONLY])
  508.         return
  509.    
  510.     if(g_eSettings[HUDINFO_USE_DHUD])
  511.     {
  512.         set_dhudmessage(HUDINFO_PARAMS)
  513.         show_dhudmessage(id, g_ePlayerData[id][HUDInfo])
  514.     }
  515.     else
  516.     {
  517.         set_hudmessage(HUDINFO_PARAMS)
  518.         ShowSyncHudMsg(id, g_iObject[OBJ_HUDINFO], g_ePlayerData[id][HUDInfo])
  519.     }
  520. }
  521.  
  522. #if defined USE_CSTRIKE
  523. public bomb_planted(id)
  524.     give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_PLANTED))
  525.    
  526. public bomb_defused(id)
  527.     give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_DEFUSED))
  528.    
  529. public bomb_explode(id)
  530.     give_user_xp(id, get_xp_reward(id, XPREWARD_BOMB_EXPLODED))
  531. #endif
  532.  
  533. public Cmd_XP(id)
  534. {  
  535.     if(g_ePlayerData[id][Level] == g_iMaxLevels)
  536.         send_message(id, false, "%L", id, "CRXRANKS_RANKINFO_FINAL", g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
  537.     else
  538.     {
  539.         send_message(id, false, "%L", id, "CRXRANKS_RANKINFO_NORMAL", g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
  540.         g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
  541.     }
  542.    
  543.     return PLUGIN_HANDLED
  544. }
  545.  
  546. public Cmd_XPList(id, iLevel, iCid)
  547. {
  548.     if(!cmd_access(id, iLevel, iCid, 1))
  549.         return PLUGIN_HANDLED
  550.        
  551.     new szTitle[128]
  552.     formatex(szTitle, charsmax(szTitle), "%L", id, "CRXRANKS_MENU_TITLE")
  553.    
  554.     new iPlayers[32], iPnum, iMenu = menu_create(szTitle, "XPList_Handler")
  555.     get_players(iPlayers, iPnum); SortCustom1D(iPlayers, iPnum, "sort_players_by_xp")
  556.    
  557.     for(new szItem[128], szName[32], iPlayer, i; i < iPnum; i++)
  558.     {
  559.         iPlayer = iPlayers[i]
  560.         get_user_name(iPlayer, szName, charsmax(szName))
  561.         formatex(szItem, charsmax(szItem), "%L", id, "CRXRANKS_ITEM_FORMAT", g_ePlayerData[iPlayer][XP], szName, g_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
  562.         menu_additem(iMenu, szItem)
  563.     }
  564.    
  565.     menu_display(id, iMenu)
  566.     return PLUGIN_HANDLED
  567. }
  568.  
  569. public XPList_Handler(id, iMenu, iItem)
  570. {
  571.     menu_destroy(iMenu)
  572.     return PLUGIN_HANDLED
  573. }
  574.  
  575. public Cmd_GiveXP(id, iLevel, iCid)
  576. {  
  577.     if(!cmd_access(id, iLevel, iCid, 3))
  578.         return PLUGIN_HANDLED
  579.    
  580.     new szPlayer[MAX_NAME_LENGTH]
  581.     read_argv(1, szPlayer, charsmax(szPlayer))
  582.    
  583.     new iPlayer = cmd_target(id, szPlayer, 0)
  584.    
  585.     if(!iPlayer)
  586.         return PLUGIN_HANDLED
  587.        
  588.     new szName[2][MAX_NAME_LENGTH], szAmount[MAX_XP_LENGTH]
  589.     read_argv(2, szAmount, charsmax(szAmount))
  590.     get_user_name(id, szName[0], charsmax(szName[]))
  591.     get_user_name(iPlayer, szName[1], charsmax(szName[]))
  592.    
  593.     new szKey[32], iXP = str_to_num(szAmount)
  594.     give_user_xp(iPlayer, iXP)
  595.    
  596.     if(iXP >= 0)
  597.         copy(szKey, charsmax(szKey), "CRXRANKS_GIVE_XP")
  598.     else
  599.     {
  600.         copy(szKey, charsmax(szKey), "CRXRANKS_TAKE_XP")
  601.         iXP *= -1
  602.     }
  603.    
  604.     send_message(0, true, "%L", id, szKey, szName[0], iXP, szName[1])
  605.     return PLUGIN_HANDLED
  606. }
  607.  
  608. public Cmd_ResetXP(id, iLevel, iCid)
  609. {  
  610.     if(!cmd_access(id, iLevel, iCid, 2))
  611.         return PLUGIN_HANDLED
  612.    
  613.     new szPlayer[MAX_NAME_LENGTH]
  614.     read_argv(1, szPlayer, charsmax(szPlayer))
  615.    
  616.     new iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
  617.    
  618.     if(!iPlayer)
  619.         return PLUGIN_HANDLED
  620.        
  621.     new szName[2][MAX_NAME_LENGTH]
  622.     get_user_name(id, szName[0], charsmax(szName[]))
  623.     get_user_name(iPlayer, szName[1], charsmax(szName[]))
  624.     g_ePlayerData[iPlayer][XP] = 0
  625.     check_level(iPlayer, true)
  626.     send_message(0, true, "%L", id, "CRXRANKS_RESET_XP", szName[0], szName[1])
  627.     return PLUGIN_HANDLED
  628. }
  629.  
  630. public OnPlayerKilled()
  631. {
  632.     new iAttacker = read_data(1), iVictim = read_data(2)
  633.    
  634.     if(!is_user_connected(iAttacker) || !is_user_connected(iVictim))
  635.         return
  636.        
  637.     new iReward
  638.        
  639.     if(iAttacker == iVictim)
  640.     {
  641.         iReward = get_xp_reward(iAttacker, XPREWARD_SUICIDE)
  642.         goto @GIVE_REWARD
  643.     }
  644.        
  645.     if(get_user_team(iAttacker) == get_user_team(iVictim))
  646.     {
  647.         iReward = get_xp_reward(iAttacker, XPREWARD_TEAMKILL)
  648.         goto @GIVE_REWARD
  649.     }
  650.        
  651.     iReward = get_xp_reward(iAttacker, XPREWARD_KILL)
  652.    
  653.     if(read_data(3))
  654.         iReward += get_xp_reward(iAttacker, XPREWARD_HEADSHOT)
  655.        
  656.     new szWeapon[16]
  657.     read_data(4, szWeapon, charsmax(szWeapon))
  658.    
  659.     iReward += get_xp_reward(iAttacker, szWeapon)
  660.    
  661.     @GIVE_REWARD:
  662.     give_user_xp(iAttacker, iReward)
  663. }
  664.  
  665. public sort_players_by_xp(id1, id2)
  666. {
  667.     if(g_ePlayerData[id1][XP] > g_ePlayerData[id2][XP])
  668.         return -1
  669.     else if(g_ePlayerData[id1][XP] < g_ePlayerData[id2][XP])
  670.         return 1
  671.    
  672.     return 0
  673. }
  674.  
  675. use_vault(const id, const szInfo[], const iType)
  676. {
  677.     static szAuth[35]
  678.     get_user_authid(id, szAuth, charsmax(szAuth))
  679.     log_to_file(LOG_FILE, "%s data for %s [%s]", iType == VAULT_WRITE ? "Saving" : "Loading", szInfo, szAuth)
  680.  
  681.     if(!szInfo[0])
  682.         return
  683.        
  684.     switch(iType)
  685.     {
  686.         case VAULT_WRITE:
  687.         {
  688.             static szData[MAX_XP_LENGTH]
  689.             num_to_str(g_ePlayerData[id][XP], szData, charsmax(szData))
  690.             nvault_set(g_iVault, szInfo, szData)
  691.         }
  692.         case VAULT_READ:
  693.         {
  694.             g_ePlayerData[id][XP] = clamp(nvault_get(g_iVault, szInfo), 0)
  695.             check_level(id, false)
  696.         }
  697.     }
  698. }
  699.  
  700. get_xp_reward(const id, const szKey[])
  701. {
  702.     static iReward
  703.    
  704.     if(g_ePlayerData[id][IsVIP])
  705.     {
  706.         if(TrieKeyExists(g_tXPRewardsVIP, szKey))
  707.         {
  708.             TrieGetCell(g_tXPRewardsVIP, szKey, iReward)
  709.             return iReward
  710.         }
  711.     }
  712.    
  713.     if(TrieKeyExists(g_tXPRewards, szKey))
  714.     {
  715.         TrieGetCell(g_tXPRewards, szKey, iReward)
  716.         return iReward
  717.     }
  718.    
  719.     return 0
  720. }
  721.  
  722. give_user_xp(const id, iXP)
  723. {
  724.     if(!iXP)
  725.         return
  726.        
  727.     g_ePlayerData[id][XP] += iXP
  728.    
  729.     if(g_ePlayerData[id][XP] < 0)
  730.         g_ePlayerData[id][XP] = 0
  731.    
  732.     if(!check_level(id, true))
  733.         update_hudinfo(id)
  734.        
  735.     if(g_eSettings[XP_NOTIFIER_ENABLED])
  736.     {
  737.         static szKey[32], bool:bPositive
  738.         bPositive = iXP >= 0
  739.        
  740.         if(bPositive)
  741.             copy(szKey, charsmax(szKey), "CRXRANKS_XP_NOTIFIER_GET")
  742.         else
  743.         {
  744.             copy(szKey, charsmax(szKey), "CRXRANKS_XP_NOTIFIER_LOSE")
  745.             iXP *= -1
  746.         }
  747.            
  748.         if(g_eSettings[XP_NOTIFIER_USE_DHUD])
  749.         {
  750.             if(bPositive) set_dhudmessage(XP_NOTIFIER_PARAMS_GET)
  751.             else set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)              
  752.             show_dhudmessage(id, "%L", id, szKey, iXP)
  753.         }
  754.         else
  755.         {
  756.             if(bPositive) set_hudmessage(XP_NOTIFIER_PARAMS_GET)
  757.             else set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)               
  758.             ShowSyncHudMsg(id, g_iObject[OBJ_XP_NOTIFIER], "%L", id, szKey, iXP)
  759.         }
  760.     }          
  761. }
  762.  
  763. get_user_saveinfo(const id, szInfo[MAX_PLAYER_INFO_LENGTH], const iLen)
  764. {
  765.     switch(g_eSettings[SAVE_TYPE])
  766.     {
  767.         case SAVE_NICKNAME: get_user_name(id, szInfo, iLen)
  768.         case SAVE_IP: get_user_ip(id, szInfo, iLen, 1)
  769.         case SAVE_STEAMID: get_user_authid(id, szInfo, iLen)
  770.     }
  771. }
  772.  
  773. reset_stats(const id)
  774. {
  775.     g_ePlayerData[id][XP] = 0
  776.     g_ePlayerData[id][Level] = 0
  777.     g_ePlayerData[id][NextXP] = 0
  778.     g_ePlayerData[id][Rank][0] = EOS
  779.     g_ePlayerData[id][NextRank][0] = EOS
  780.     g_ePlayerData[id][HUDInfo][0] = EOS
  781.     g_ePlayerData[id][IsOnFinalLevel] = false
  782.     g_ePlayerData[id][IsVIP] = false
  783. }
  784.  
  785. bool:has_argument(const szMessage[], const szArg[])
  786.     return contain(szMessage, szArg) != -1
  787.    
  788. send_message(const id, const bool:bLog, const szInput[], any:...)
  789. {
  790.     static szMessage[192]
  791.     vformat(szMessage, charsmax(szMessage), szInput, 4)
  792.    
  793.     #if defined USE_CSTRIKE
  794.     bLog ? CC_LogMessage(id, _, szMessage) : CC_SendMessage(id, szMessage)
  795.     #else
  796.     format(szMessage, charsmax(szMessage), "%s %s", CC_PREFIX, szMessage)
  797.     client_print(id, print_chat, szMessage)
  798.    
  799.     if(bLog)
  800.         log_amx(szMessage)
  801.     #endif
  802. }
  803.  
  804. update_hudinfo(const id)
  805. {
  806.     if(!g_eSettings[HUDINFO_ENABLED])
  807.         return
  808.        
  809.     static szMessage[MAX_HUDINFO_LENGTH], szPlaceHolder[32], bool:bIsOnFinal
  810.     bIsOnFinal = g_ePlayerData[id][IsOnFinalLevel]
  811.     copy(szMessage, charsmax(szMessage), g_eSettings[bIsOnFinal ? HUDINFO_FORMAT_FINAL : HUDINFO_FORMAT])
  812.    
  813.     if(has_argument(szMessage, ARG_CURRENT_XP))
  814.     {
  815.         num_to_str(g_ePlayerData[id][XP], szPlaceHolder, charsmax(szPlaceHolder))
  816.         replace_all(szMessage, charsmax(szMessage), ARG_CURRENT_XP, szPlaceHolder)
  817.     }
  818.    
  819.     if(has_argument(szMessage, ARG_NEXT_XP))
  820.     {
  821.         num_to_str(g_ePlayerData[id][NextXP], szPlaceHolder, charsmax(szPlaceHolder))
  822.         replace_all(szMessage, charsmax(szMessage), ARG_NEXT_XP, szPlaceHolder)
  823.     }
  824.    
  825.     if(has_argument(szMessage, ARG_XP_NEEDED))
  826.     {
  827.         num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHolder, charsmax(szPlaceHolder))
  828.         replace_all(szMessage, charsmax(szMessage), ARG_XP_NEEDED, szPlaceHolder)
  829.     }
  830.    
  831.     if(has_argument(szMessage, ARG_LEVEL))
  832.     {
  833.         num_to_str(g_ePlayerData[id][Level], szPlaceHolder, charsmax(szPlaceHolder))
  834.         replace_all(szMessage, charsmax(szMessage), ARG_LEVEL, szPlaceHolder)
  835.     }
  836.    
  837.     if(has_argument(szMessage, ARG_NEXT_LEVEL))
  838.     {
  839.         num_to_str(g_ePlayerData[id][bIsOnFinal ? Level : Level + 1], szPlaceHolder, charsmax(szPlaceHolder))
  840.         replace_all(szMessage, charsmax(szMessage), ARG_NEXT_LEVEL, szPlaceHolder)
  841.     }
  842.    
  843.     if(has_argument(szMessage, ARG_MAX_LEVELS))
  844.         replace_all(szMessage, charsmax(szMessage), ARG_MAX_LEVELS, g_szMaxLevels)
  845.    
  846.     replace_all(szMessage, charsmax(szMessage), ARG_RANK, g_ePlayerData[id][Rank])
  847.     replace_all(szMessage, charsmax(szMessage), ARG_NEXT_RANK, g_ePlayerData[id][NextRank])
  848.     replace_all(szMessage, charsmax(szMessage), ARG_LINE_BREAK, "^n")
  849.    
  850.     copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
  851. }
  852.  
  853. bool:check_level(const id, const bool:bNotify)
  854. {
  855.     static iLevel, i
  856.     iLevel = 0
  857.    
  858.     for(i = 1; i < g_iMaxLevels + 1; i++)
  859.     {
  860.         if(g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevels, i))
  861.             iLevel++
  862.     }
  863.    
  864.     if(iLevel != g_ePlayerData[id][Level])
  865.     {
  866.         static bool:bLevelUp, iReturn
  867.         bLevelUp = iLevel > g_ePlayerData[id][Level]
  868.         g_ePlayerData[id][Level] = iLevel
  869.        
  870.         ExecuteForward(g_fwdUserLevelUpdated, iReturn, id, iLevel, bLevelUp)
  871.         ArrayGetString(g_aRankNames, iLevel, g_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))
  872.        
  873.         if(iLevel < g_iMaxLevels)
  874.         {
  875.             g_ePlayerData[id][IsOnFinalLevel] = false
  876.             g_ePlayerData[id][NextXP] = ArrayGetCell(g_aLevels, iLevel + 1)
  877.             ArrayGetString(g_aRankNames, iLevel + 1, g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
  878.         }
  879.         else
  880.         {
  881.             g_ePlayerData[id][IsOnFinalLevel] = true
  882.             g_ePlayerData[id][NextXP] = ArrayGetCell(g_aLevels, iLevel)
  883.             copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])
  884.            
  885.             if(g_eSettings[FINAL_LEVEL_FLAGS])
  886.             {
  887.                 set_user_flags(id, g_eSettings[FINAL_LEVEL_FLAGS])
  888.                 remove_user_flags(id, g_iFlagZ)
  889.             }
  890.         }
  891.            
  892.         if(bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
  893.         {
  894.             static szMessage[128], szName[32], bool:bGlobalMsg
  895.             get_user_name(id, szName, charsmax(szName))
  896.             bGlobalMsg = g_eSettings[LEVELUP_MESSAGE_TYPE] == 2
  897.            
  898.             formatex(szMessage, charsmax(szMessage), "%L", bGlobalMsg ? LANG_PLAYER : id,\
  899.             bLevelUp ? "CRXRANKS_LEVEL_REACHED" : "CRXRANKS_LEVEL_LOST", szName, g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
  900.             send_message(bGlobalMsg ? 0 : id, false, szMessage)
  901.            
  902.             if(bLevelUp && g_eSettings[LEVELUP_SOUND][0])
  903.                 emit_sound(id, CHAN_AUTO, g_eSettings[LEVELUP_SOUND], 1.0, ATTN_NORM, 0, PITCH_NORM)
  904.             else if(!bLevelUp && g_eSettings[LEVELDN_SOUND][0])
  905.                 emit_sound(id, CHAN_AUTO, g_eSettings[LEVELDN_SOUND], 1.0, ATTN_NORM, 0, PITCH_NORM)
  906.                
  907.             if(g_eSettings[bLevelUp ? LEVELUP_SCREEN_FADE_ENABLED : LEVELDN_SCREEN_FADE_ENABLED])
  908.             {
  909.                 message_begin(MSG_ONE, g_iScreenFade, {0, 0, 0}, id)
  910.                 write_short(1<<10)
  911.                 write_short(1<<10)
  912.                 write_short(0x0000)
  913.                
  914.                 if(bLevelUp)
  915.                 {
  916.                     write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
  917.                     write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
  918.                     write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
  919.                     write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
  920.                 }
  921.                 else
  922.                 {
  923.                     write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
  924.                     write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
  925.                     write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
  926.                     write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
  927.                 }
  928.                
  929.                 message_end()
  930.             }
  931.         }
  932.        
  933.         update_hudinfo(id)
  934.         return true
  935.     }
  936.    
  937.     return false
  938. }
  939.  
  940. public update_vip_status(id)
  941. {
  942.     if(g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
  943.         g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
  944. }
  945.  
  946. public plugin_natives()
  947. {
  948.     register_library("crxranks")
  949.     register_native("crxranks_get_chat_prefix",         "_crxranks_get_chat_prefix")
  950.     register_native("crxranks_get_final_flags",         "_crxranks_get_final_flags")
  951.     register_native("crxranks_get_hudinfo_format",      "_crxranks_get_hudinfo_format")
  952.     register_native("crxranks_get_max_levels",          "_crxranks_get_max_levels")
  953.     register_native("crxranks_get_rank_by_level",       "_crxranks_get_rank_by_level")
  954.     register_native("crxranks_get_save_type",           "_crxranks_get_save_type")
  955.     register_native("crxranks_get_user_hudinfo",        "_crxranks_get_user_hudinfo")
  956.     register_native("crxranks_get_user_level",          "_crxranks_get_user_level")
  957.     register_native("crxranks_get_user_next_rank",      "_crxranks_get_user_next_rank")
  958.     register_native("crxranks_get_user_next_xp",        "_crxranks_get_user_next_xp")
  959.     register_native("crxranks_get_user_rank",           "_crxranks_get_user_rank")
  960.     register_native("crxranks_get_user_xp",             "_crxranks_get_user_xp")
  961.     register_native("crxranks_get_vault_name",          "_crxranks_get_vault_name")
  962.     register_native("crxranks_get_vip_flags",           "_crxranks_get_vip_flags")
  963.     register_native("crxranks_get_xp_for_level",        "_crxranks_get_xp_for_level")
  964.     register_native("crxranks_get_xp_reward",           "_crxranks_get_xp_reward")
  965.     register_native("crxranks_give_user_xp",            "_crxranks_give_user_xp")
  966.     register_native("crxranks_hi_is_using_dhud",        "_crxranks_hi_is_using_dhud")
  967.     register_native("crxranks_is_hud_enabled",          "_crxranks_is_hud_enabled")
  968.     register_native("crxranks_is_sfdn_enabled",         "_crxranks_is_sfdn_enabled")
  969.     register_native("crxranks_is_sfup_enabled",         "_crxranks_is_sfup_enabled")
  970.     register_native("crxranks_is_user_on_final",        "_crxranks_is_user_on_final")
  971.     register_native("crxranks_is_user_vip",             "_crxranks_is_user_vip")
  972.     register_native("crxranks_is_xpn_enabled",          "_crxranks_is_xpn_enabled")
  973.     register_native("crxranks_xpn_is_using_dhud",       "_crxranks_xpn_is_using_dhud")
  974. }
  975.  
  976. public _crxranks_get_chat_prefix(iPlugin, iParams)
  977.     set_string(1, CC_PREFIX, get_param(2))
  978.  
  979. public _crxranks_get_final_flags(iPlugin, iParams)
  980. {
  981.     set_string(1, g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
  982.     return g_eSettings[FINAL_LEVEL_FLAGS_BIT]
  983. }
  984.  
  985. public _crxranks_get_hudinfo_format(iPlugin, iParams)
  986.     set_string(2, g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL : HUDINFO_FORMAT], get_param(3))
  987.    
  988. public _crxranks_get_max_levels(iPlugin, iParams)
  989.     return g_iMaxLevels
  990.    
  991. public _crxranks_get_rank_by_level(iPlugin, iParams)
  992. {
  993.     static iLevel
  994.     iLevel = get_param(1)
  995.    
  996.     if(iLevel < 1 || iLevel > g_iMaxLevels)
  997.         return 0
  998.        
  999.     static szRank[MAX_RANK_LENGTH]
  1000.     ArrayGetString(g_aRankNames, iLevel, szRank, charsmax(szRank))
  1001.     set_string(2, szRank, get_param(3))
  1002.     return 1
  1003. }
  1004.  
  1005. public _crxranks_get_save_type(iPlugin, iParams)
  1006.     return g_eSettings[SAVE_TYPE]
  1007.  
  1008. public _crxranks_get_user_hudinfo(iPlugin, iParams)
  1009.     set_string(2, g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
  1010.    
  1011. public _crxranks_get_user_level(iPlugin, iParams)
  1012.     return g_ePlayerData[get_param(1)][Level]
  1013.    
  1014. public _crxranks_get_user_next_rank(iPlugin, iParams)
  1015.     set_string(2, g_ePlayerData[get_param(1)][NextRank], get_param(3))
  1016.    
  1017. public _crxranks_get_user_next_xp(iPlugin, iParams)
  1018.     return g_ePlayerData[get_param(1)][NextXP] 
  1019.    
  1020. public _crxranks_get_user_rank(iPlugin, iParams)
  1021.     set_string(2, g_ePlayerData[get_param(1)][Rank], get_param(3))
  1022.    
  1023. public _crxranks_get_user_xp(iPlugin, iParams)
  1024.     return g_ePlayerData[get_param(1)][XP]
  1025.    
  1026. public _crxranks_get_vault_name(iPlugin, iParams)
  1027.     set_string(1, g_eSettings[VAULT_NAME], get_param(2))
  1028.    
  1029. public _crxranks_get_vip_flags(iPlugin, iParams)
  1030. {
  1031.     set_string(1, g_eSettings[VIP_FLAGS], get_param(2))
  1032.     return g_eSettings[VIP_FLAGS_BIT]
  1033. }
  1034.    
  1035. public _crxranks_get_xp_for_level(iPlugin, iParams)
  1036. {
  1037.     static iLevel
  1038.     iLevel = get_param(1)
  1039.    
  1040.     if(iLevel < 1 || iLevel > g_iMaxLevels)
  1041.         return -1
  1042.        
  1043.     return ArrayGetCell(g_aLevels, iLevel)
  1044. }
  1045.  
  1046. public _crxranks_get_xp_reward(iPlugin, iParams)
  1047. {
  1048.     static szReward[MAX_XP_REWARD_LENGTH]
  1049.     get_string(2, szReward, charsmax(szReward))
  1050.     return get_xp_reward(get_param(1), szReward)
  1051. }
  1052.    
  1053. public _crxranks_give_user_xp(iPlugin, iParams)
  1054. {
  1055.     static szReward[MAX_XP_REWARD_LENGTH], iReward, id
  1056.     szReward[0] = EOS
  1057.     get_string(3, szReward, charsmax(szReward))
  1058.     id = get_param(1)
  1059.    
  1060.     if(szReward[0])
  1061.     {
  1062.         iReward = get_xp_reward(id, szReward)
  1063.        
  1064.         if(iReward)
  1065.             give_user_xp(id, iReward)
  1066.            
  1067.         return iReward
  1068.     }
  1069.    
  1070.     iReward = get_param(2)
  1071.     give_user_xp(id, iReward)
  1072.     return iReward
  1073. }
  1074.  
  1075. public bool:_crxranks_hi_is_using_dhud(iPlugin, iParams)
  1076.     return g_eSettings[HUDINFO_USE_DHUD]
  1077.  
  1078. public bool:_crxranks_is_hud_enabled(iPlugin, iParams)
  1079.     return g_eSettings[HUDINFO_ENABLED]
  1080.    
  1081. public bool:_crxranks_is_sfdn_enabled(iPlugin, iParams)
  1082.     return g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]
  1083.  
  1084. public bool:_crxranks_is_sfup_enabled(iPlugin, iParams)
  1085.     return g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]
  1086.  
  1087. public bool:_crxranks_is_user_on_final(iPlugin, iParams)
  1088.     return g_ePlayerData[get_param(1)][IsOnFinalLevel]
  1089.    
  1090. public bool:_crxranks_is_user_vip(iPlugin, iParams)
  1091.     return g_ePlayerData[get_param(1)][IsVIP]
  1092.    
  1093. public bool:_crxranks_is_xpn_enabled(iPlugin, iParams)
  1094.     return g_eSettings[XP_NOTIFIER_ENABLED]
  1095.    
  1096. public bool:_crxranks_xpn_is_using_dhud(iPlugin, iParams)
  1097.     return g_eSettings[XP_NOTIFIER_USE_DHUD]
RAW Paste Data