Raised This Month: $51 Target: $400
 12% 

OciXCrom's Rank System [XP|Levels|Ranks]


Post New Thread Reply   
 
Thread Tools Display Modes
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 08-14-2018 , 15:52   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #61

I really don't think that showing the city, country or similar stuff is relevant to a Rank System. I won't add that to the main plugin, but here's an edited version:

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <geoip>
#include <nvault>

// Comment or remove this line in order to run the plugin on a mod different than Counter-Strike.
#define USE_CSTRIKE

#if defined USE_CSTRIKE
    #include <cromchat>
    #include <csx>
#else
new CC_PREFIX[64]
#endif

#if AMXX_VERSION_NUM < 183
    #include <dhudmessage>
#endif

#include <crxranks_const>

#if defined client_disconnected
    #define client_disconnect client_disconnected
#endif

#define PLUGIN_VERSION "2.3.2-geoip"
#define DELAY_ON_CONNECT 5.0
#define HUD_REFRESH_FREQ 1.0
#define DELAY_ON_CHANGE 0.1
#define MAX_HUDINFO_LENGTH 192
#define MAX_SOUND_LENGTH 128
#define MAX_PLAYER_INFO_LENGTH 35
#define MAX_RANK_LENGTH 32
#define MAX_XP_REWARD_LENGTH 32
#define MAX_XP_LENGTH 16
#define TASK_HUD 304500

#if !defined MAX_NAME_LENGTH
    #define MAX_NAME_LENGTH 32
#endif

#define ARG_CURRENT_XP             "$current_xp$"
#define ARG_NEXT_XP             "$next_xp$"
#define ARG_XP_NEEDED             "$xp_needed$"
#define ARG_LEVEL                 "$level$"
#define ARG_NEXT_LEVEL             "$next_level$"
#define ARG_RANK                 "$rank$"
#define ARG_NEXT_RANK             "$next_rank$"
#define ARG_MAX_LEVELS            "$max_levels$"
#define ARG_LINE_BREAK             "$br$"
#define ARG_NAME                 "$name$"
#define ARG_CITY                "$city$"

#define XPREWARD_KILL            "kill"
#define XPREWARD_HEADSHOT         "headshot"
#define XPREWARD_TEAMKILL         "teamkill"
#define XPREWARD_SUICIDE         "suicide"

#if defined USE_CSTRIKE
    #define XPREWARD_BOMB_PLANTED     "bomb_planted"
    #define XPREWARD_BOMB_DEFUSED     "bomb_defused"
    #define XPREWARD_BOMB_EXPLODED     "bomb_exploded"
#endif

#define clr(%1) %1 == -1 ? random(256) : %1

#define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 00.11.00.10.1

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

enum
{
    
VAULT_WRITE 0,
    
VAULT_READ
}

enum
{
    
OBJ_HUDINFO 0,
    
OBJ_XP_NOTIFIER
}

enum
{
    
SAVE_NICKNAME 0,
    
SAVE_IP,
    
SAVE_STEAMID
}

enum _:Sections
{
    
SECTION_NONE 0,
    
SECTION_SETTINGS,
    
SECTION_RANKS,
    
SECTION_XP_REWARDS
}

enum _:PlayerData
{
    
XP,
    
Level,
    
NextXP,
    
Rank[MAX_RANK_LENGTH],
    
NextRank[MAX_RANK_LENGTH],
    
HUDInfo[MAX_HUDINFO_LENGTH],
    
City[MAX_NAME_LENGTH],
    
bool:IsOnFinalLevel,
    
bool:IsVIP
}

enum _:Settings
{
    
SAVE_TYPE,
    
LEVELUP_MESSAGE_TYPE,
    
LEVELUP_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELUP_SCREEN_FADE_ENABLED,
    
LEVELUP_SCREEN_FADE_COLOR[4],
    
LEVELDN_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELDN_SCREEN_FADE_ENABLED,
    
LEVELDN_SCREEN_FADE_COLOR[4],
    
FINAL_LEVEL_FLAGS[32],
    
FINAL_LEVEL_FLAGS_BIT,
    
VIP_FLAGS[32],
    
VIP_FLAGS_BIT,
    
VAULT_NAME[32],
    
TEAM_LOCK,
    
MINIMUM_PLAYERS,
    
bool:USE_COMBINED_EVENTS,
    
bool:HUDINFO_ENABLED,
    
bool:HUDINFO_ALIVE_ONLY,
    
bool:HUDINFO_TEAM_LOCK,
    
bool:HUDINFO_OTHER_PLAYERS,
    
HUDINFO_COLOR[3],
    
Float:HUDINFO_POSITION[2],
    
bool:HUDINFO_USE_DHUD,
    
HUDINFO_FORMAT[MAX_HUDINFO_LENGTH],
    
HUDINFO_FORMAT_FINAL[MAX_HUDINFO_LENGTH],
    
HUDINFO_INVALID_TEXT[32],
    
bool:XP_NOTIFIER_ENABLED,
    
XP_NOTIFIER_COLOR_GET[3],
    
XP_NOTIFIER_COLOR_LOSE[3],
    
Float:XP_NOTIFIER_POSITION[2],
    
Float:XP_NOTIFIER_DURATION,
    
bool:XP_NOTIFIER_USE_DHUD
}

new 
g_eSettings[Settings]
new 
g_ePlayerData[33][PlayerData]
new 
g_szMaxLevels[MAX_XP_LENGTH]
new Array:
g_aLevels
new Array:g_aRankNames
new Trie:g_tXPRewards
new Trie:g_tXPRewardsVIP

new g_iVault
new g_iMaxLevels
new g_iObject[2]
new 
g_iScreenFade
new g_iFlagZ
new g_fwdUserLevelUpdated
new g_fwdUserReceiveXP

public plugin_init()
{
    
register_plugin("OciXCrom's Rank System"PLUGIN_VERSION"OciXCrom")
    
register_cvar("CRXRankSystem"PLUGIN_VERSIONFCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
    
register_event("DeathMsg""OnPlayerKilled""a")
    
    
#if defined USE_CSTRIKE
    
register_dictionary("RankSystem.txt")
    
#else
    
register_dictionary("RankSystemNoColors.txt")
    
#endif
    
    
register_clcmd("say /xplist""Cmd_XPList"ADMIN_BAN)
    
register_clcmd("say_team /xplist""Cmd_XPList"ADMIN_BAN)
    
register_concmd("crxranks_give_xp""Cmd_GiveXP"ADMIN_RCON"<nick|#userid> <amount>")
    
register_concmd("crxranks_reset_xp""Cmd_ResetXP"ADMIN_RCON"<nick|#userid>")
    
    if(
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
        
g_iScreenFade get_user_msgid("ScreenFade")

    
g_fwdUserLevelUpdated CreateMultiForward("crxranks_user_level_updated"ET_IGNOREFP_CELLFP_CELLFP_CELL)
    
g_fwdUserReceiveXP CreateMultiForward("crxranks_user_receive_xp"ET_STOPFP_CELLFP_CELLFP_CELL)
}

public 
plugin_precache()
{
    
g_aLevels ArrayCreate(16)
    
ArrayPushCell(g_aLevels0)
    
g_aRankNames ArrayCreate(32)
    
ArrayPushString(g_aRankNames"")
    
g_tXPRewards TrieCreate()
    
g_tXPRewardsVIP TrieCreate()
    
ReadFile()
}

public 
plugin_end()
{
    
ArrayDestroy(g_aLevels)
    
ArrayDestroy(g_aRankNames)
    
TrieDestroy(g_tXPRewards)
    
TrieDestroy(g_tXPRewardsVIP)
    
DestroyForward(g_fwdUserLevelUpdated)
    
nvault_close(g_iVault)
}

ReadFile()
{
    new 
szConfigsName[256], szFilename[256]
    
get_configsdir(szConfigsNamecharsmax(szConfigsName))
    
formatex(szFilenamecharsmax(szFilename), "%s/RankSystem.ini"szConfigsName)
    
    new 
iFilePointer fopen(szFilename"rt")
    
    if(
iFilePointer)
    {
        new 
szData[192], szValue[96], szMap[32], szKey[32], szTemp[4][5], bool:bRead trueiiSizeiSection SECTION_NONE
        get_mapname
(szMapcharsmax(szMap))
        
        while(!
feof(iFilePointer))
        {
            
fgets(iFilePointerszDatacharsmax(szData))
            
trim(szData)
            
            switch(
szData[0])
            {
                case 
EOS'#'';': continue
                case 
'-':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == '-')
                    {
                        
szData[0] = ' '
                        
szData[iSize 1] = ' '
                        
trim(szData)
                        
                        if(
contain(szData"*") != -1)
                        {
                            
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '*')
                            
copy(szValuestrlen(szKey), szMap)
                            
bRead equal(szValueszKey) ? true false
                        
}
                        else
                        {
                            static const 
szAll[] = "#all"
                            
bRead equal(szDataszAll) || equali(szDataszMap)
                        }
                    }
                    else continue
                }
                case 
'[':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == ']')
                    {
                        switch(
szData[1])
                        {
                            case 
'S''s'iSection SECTION_SETTINGS
                            
case 'R''r'iSection SECTION_RANKS
                            
case 'X''x'iSection SECTION_XP_REWARDS
                            
default: iSection SECTION_NONE
                        
}
                    }
                    else continue
                }
                default:
                {
                    if(!
bRead || iSection == SECTION_NONE)
                        continue
                        
                    
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '=')
                    
trim(szKey); trim(szValue)
                            
                    if(!
szValue[0])
                        continue
                        
                    switch(
iSection)
                    {
                        case 
SECTION_SETTINGS:
                        {
                            if(
equal(szKey"CHAT_PREFIX"))
                            {
                                
#if defined USE_CSTRIKE
                                
CC_SetPrefix(szValue)
                                
#else
                                
copy(CC_PREFIXcharsmax(CC_PREFIX), szValue)
                                
#endif
                            
}
                            else if(
equal(szKey"SAVE_TYPE"))
                                
g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAMESAVE_STEAMID)
                            else if(
equal(szKey"XP_COMMANDS"))
                            {
                                while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                                {
                                    
trim(szKey); trim(szValue)
                                    
register_clcmd(szKey"Cmd_XP")
                                }
                            }
                            else if(
equal(szKey"LEVELUP_MESSAGE_TYPE"))
                                
g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 02)
                            else if(
equal(szKey"LEVELUP_SOUND"))
                            {
                                
copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"LEVELDN_SOUND"))
                            {
                                
copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"FINAL_LEVEL_FLAGS"))
                            {
                                
copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
                                
g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
                                
g_iFlagZ read_flags("z")
                            }
                            else if(
equal(szKey"VIP_FLAGS"))
                            {
                                
copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
                                
g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
                            }
                            else if(
equal(szKey"VAULT_NAME"))
                            {
                                
g_iVault nvault_open(szValue)
                                
copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
                            }
                            else if(
equal(szKey"TEAM_LOCK"))
                                
g_eSettings[TEAM_LOCK] = str_to_num(szValue)
                            else if(
equal(szKey"MINIMUM_PLAYERS"))
                                
g_eSettings[MINIMUM_PLAYERS] = clamp(str_to_num(szValue), 032)
                            else if(
equal(szKey"USE_COMBINED_EVENTS"))
                                
g_eSettings[USE_COMBINED_EVENTS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ENABLED"))
                                
g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ALIVE_ONLY"))
                                
g_eSettings[HUDINFO_ALIVE_ONLY] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_TEAM_LOCK"))
                                
g_eSettings[HUDINFO_TEAM_LOCK] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_OTHER_PLAYERS"))
                                
g_eSettings[HUDINFO_OTHER_PLAYERS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"HUDINFO_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"HUDINFO_USE_DHUD"))
                            {
                                
g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[HUDINFO_USE_DHUD])
                                    
g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
                            }
                            else if(
equal(szKey"HUDINFO_FORMAT"))
                                
copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
                            else if(
equal(szKey"HUDINFO_FORMAT_FINAL"))
                                
copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
                            else if(
equal(szKey"HUDINFO_INVALID_TEXT"))
                                
copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
                            else if(
equal(szKey"XP_NOTIFIER_ENABLED"))
                                
g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_GET"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_LOSE"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_DURATION"))
                                
g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0float(cellmax))
                            else if(
equal(szKey"XP_NOTIFIER_USE_DHUD"))
                            {
                                
g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[XP_NOTIFIER_USE_DHUD])
                                    
g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
                            }
                        }
                        case 
SECTION_RANKS:
                        {
                            
ArrayPushCell(g_aLevelsclamp(str_to_num(szValue), 0))
                            
ArrayPushString(g_aRankNamesszKey)
                            
g_iMaxLevels++
                        }
                        case 
SECTION_XP_REWARDS:
                        {
                            static 
szReward[2][16]
                            
szReward[1][0] = EOS
                            
                            parse
(szValueszReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
                            
TrieSetCell(g_tXPRewardsszKeystr_to_num(szReward[0]))
                            
                            if(
szReward[1][0])
                                
TrieSetCell(g_tXPRewardsVIPszKeystr_to_num(szReward[1]))
                        }
                    }
                }
            }
        }
        
        
num_to_str(g_iMaxLevelsg_szMaxLevelscharsmax(g_szMaxLevels))
        
fclose(iFilePointer)
    }
}

public 
client_connect(id)
{
    
reset_stats(id)
    
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_READ)
    
set_task(DELAY_ON_CONNECT"update_vip_status"id)
    
    if(
g_eSettings[HUDINFO_ENABLED])
        
set_task(HUD_REFRESH_FREQ"DisplayHUD"id TASK_HUD, .flags "b")
}

public 
client_disconnect(id)
{
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_WRITE)
    
remove_task(id TASK_HUD)
}

public 
client_infochanged(id)
{
    if(!
is_user_connected(id))
        return
        
    static const 
szKey[] = "name"
    
static szNewName[MAX_NAME_LENGTH], szOldName[MAX_NAME_LENGTH]
    
get_user_info(idszKeyszNewNamecharsmax(szNewName))
    
get_user_name(idszOldNamecharsmax(szOldName))
    
    if(!
equal(szNewNameszOldName))
    {        
        if(
g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
        {
            
use_vault(idszOldNameVAULT_WRITE)
            
use_vault(idszNewNameVAULT_READ)
            
update_hudinfo(id)
        }
        
        
set_task(DELAY_ON_CHANGE"update_vip_status"id)
    }
}

public 
DisplayHUD(id)
{
    
id -= TASK_HUD
    
    
static iTarget
    iTarget 
id
    
    
if(!is_user_alive(id))
    {        
        if(
g_eSettings[HUDINFO_ALIVE_ONLY])
            return
            
        if(
g_eSettings[HUDINFO_OTHER_PLAYERS])
            
iTarget pev(idpev_iuser2)
    }
    
    if(!
iTarget)
        return

    if(
g_eSettings[TEAM_LOCK] && g_eSettings[HUDINFO_TEAM_LOCK] && get_user_team(iTarget) != g_eSettings[TEAM_LOCK])
        return
    
    if(
g_eSettings[HUDINFO_USE_DHUD])
    {
        
set_dhudmessage(HUDINFO_PARAMS)
        
show_dhudmessage(idg_ePlayerData[iTarget][HUDInfo])
    }
    else
    {
        
set_hudmessage(HUDINFO_PARAMS)
        
ShowSyncHudMsg(idg_iObject[OBJ_HUDINFO], g_ePlayerData[iTarget][HUDInfo])
    }
}

#if defined USE_CSTRIKE
public bomb_planted(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_PLANTED), CRXRANKS_XPS_REWARD)
    
public 
bomb_defused(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_DEFUSED), CRXRANKS_XPS_REWARD)
    
public 
bomb_explode(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_EXPLODED), CRXRANKS_XPS_REWARD)
#endif

public Cmd_XP(id)
{    
    if(
g_ePlayerData[id][Level] == g_iMaxLevels)
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_FINAL"g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
    else
    {
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_NORMAL"g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
        
g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
    }
    
    return 
PLUGIN_HANDLED
}

public 
Cmd_XPList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED
        
    
new szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L"id"CRXRANKS_MENU_TITLE")
    
    new 
iPlayers[32], iPnumiMenu menu_create(szTitle"XPList_Handler")
    
get_players(iPlayersiPnum); SortCustom1D(iPlayersiPnum"sort_players_by_xp")
    
    for(new 
szItem[128], szName[32], iPlayeriiPnumi++)
    {
        
iPlayer iPlayers[i]
        
get_user_name(iPlayerszNamecharsmax(szName))
        
formatex(szItemcharsmax(szItem), "%L"id"CRXRANKS_ITEM_FORMAT"g_ePlayerData[iPlayer][XP], szNameg_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
        
menu_additem(iMenuszItem)
    }
    
    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
XPList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
Cmd_GiveXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid3))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayer0)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH], szAmount[MAX_XP_LENGTH]
    
read_argv(2szAmountcharsmax(szAmount))
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
    new 
szKey[32], iXP str_to_num(szAmount)
    
give_user_xp(iPlayeriXPCRXRANKS_XPS_ADMIN)
    
    if(
iXP >= 0)
        
copy(szKeycharsmax(szKey), "CRXRANKS_GIVE_XP")
    else
    {
        
copy(szKeycharsmax(szKey), "CRXRANKS_TAKE_XP")
        
iXP *= -1
    
}
    
    
send_message(0true"%L"idszKeyszName[0], iXPszName[1])
    return 
PLUGIN_HANDLED
}

public 
Cmd_ResetXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid2))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayerCMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH]
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
g_ePlayerData[iPlayer][XP] = 0
    check_level
(iPlayertrue)
    
send_message(0true"%L"id"CRXRANKS_RESET_XP"szName[0], szName[1])
    return 
PLUGIN_HANDLED
}

public 
OnPlayerKilled()
{
    new 
iAttacker read_data(1), iVictim read_data(2)
    
    if(!
is_user_connected(iAttacker) || !is_user_connected(iVictim))
        return
        
    new 
iRewardiTemp
    
    
if(iAttacker == iVictim)
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_SUICIDE)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else if(
get_user_team(iAttacker) == get_user_team(iVictim))
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_TEAMKILL)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else
    {
        new 
szWeapon[16]
        
read_data(4szWeaponcharsmax(szWeapon))
        
        
iTemp get_xp_reward(iAttackerszWeapon)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
            
        
if(read_data(3))
        {
            
iTemp get_xp_reward(iAttackerXPREWARD_HEADSHOT)
            
iReward += iTemp
            
            
if(should_skip(iTemp))
                goto @
GIVE_REWARD
        
}
        
        
iReward += get_xp_reward(iAttackerXPREWARD_KILL)
    }
    
    @
GIVE_REWARD:
    
give_user_xp(iAttackeriRewardCRXRANKS_XPS_REWARD)
}

public 
sort_players_by_xp(id1id2)
{
    if(
g_ePlayerData[id1][XP] > g_ePlayerData[id2][XP])
        return -
1
    
else if(g_ePlayerData[id1][XP] < g_ePlayerData[id2][XP])
        return 
1
    
    
return 0
}

use_vault(const id, const szInfo[], const iType)
{
    if(!
szInfo[0])
        return
        
    switch(
iType)
    {
        case 
VAULT_WRITE:
        {
            static 
szData[MAX_XP_LENGTH]
            
num_to_str(g_ePlayerData[id][XP], szDatacharsmax(szData))
            
nvault_set(g_iVaultszInfoszData)
        }
        case 
VAULT_READ:
        {
            static 
iData
            iData 
nvault_get(g_iVaultszInfo)
            
g_ePlayerData[id][XP] = iData clamp(iData0) : 0
            check_level
(idfalse)
        }
    }
}

get_xp_reward(const id, const szKey[])
{
    static 
iReward
    
    
if(g_ePlayerData[id][IsVIP])
    {
        if(
TrieKeyExists(g_tXPRewardsVIPszKey))
        {
            
TrieGetCell(g_tXPRewardsVIPszKeyiReward)
            return 
iReward
        
}
    }
    
    if(
TrieKeyExists(g_tXPRewardsszKey))
    {
        
TrieGetCell(g_tXPRewardsszKeyiReward)
        return 
iReward
    
}
    
    return 
0
}

give_user_xp(const idiXPCRXRanks_XPSources:iSource CRXRANKS_XPS_PLUGIN)
{
    if(!
iXP)
        return

    if(
iSource == CRXRANKS_XPS_REWARD)
    {
        if(
g_eSettings[MINIMUM_PLAYERS] && get_playersnum() < g_eSettings[MINIMUM_PLAYERS])
            return;

        if(
g_eSettings[TEAM_LOCK] && get_user_team(id) != g_eSettings[TEAM_LOCK])
            return
    }
        
    static 
iReturn
    ExecuteForward
(g_fwdUserReceiveXPiReturnidiXPiSource)
    
    switch(
iReturn)
    {
        case 
CRXRANKS_HANDLED: return
        case 
CRXRANKS_CONTINUE: { }
        default:
        {
            if(
iReturn != 0)
                
iXP iReturn
        
}
    }
        
    
g_ePlayerData[id][XP] += iXP
    
    
if(g_ePlayerData[id][XP] < 0)
        
g_ePlayerData[id][XP] = 0
    
    
if(!check_level(idtrue))
        
update_hudinfo(id)
        
    if(
g_eSettings[XP_NOTIFIER_ENABLED])
    {
        static 
szKey[32], bool:bPositive
        bPositive 
iXP >= 0
        
        
if(bPositive)
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_GET")
        else
        {
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_LOSE")
            
iXP *= -1
        
}
            
        if(
g_eSettings[XP_NOTIFIER_USE_DHUD])
        {
            if(
bPositiveset_dhudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
show_dhudmessage(id"%L"idszKeyiXP)
        }
        else
        {
            if(
bPositiveset_hudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
ShowSyncHudMsg(idg_iObject[OBJ_XP_NOTIFIER], "%L"idszKeyiXP)
        }
    }            
}

get_user_saveinfo(const idszInfo[MAX_PLAYER_INFO_LENGTH], const iLen)
{
    switch(
g_eSettings[SAVE_TYPE])
    {
        case 
SAVE_NICKNAME:    get_user_name(idszInfoiLen)
        case 
SAVE_IPget_user_ip(idszInfoiLen1)
        case 
SAVE_STEAMIDget_user_authid(idszInfoiLen)
    }
}

reset_stats(const id)
{
    
g_ePlayerData[id][XP] = 0
    g_ePlayerData
[id][Level] = 0
    g_ePlayerData
[id][NextXP] = 0
    g_ePlayerData
[id][Rank][0] = EOS
    g_ePlayerData
[id][NextRank][0] = EOS
    g_ePlayerData
[id][HUDInfo][0] = EOS
    g_ePlayerData
[id][IsOnFinalLevel] = false
    g_ePlayerData
[id][IsVIP] = false
}

bool:has_argument(const szMessage[], const szArg[])
    return 
contain(szMessageszArg) != -1
    
bool
:should_skip(const iNum)
    return (
iNum != && !g_eSettings[USE_COMBINED_EVENTS])
    
send_message(const id, const bool:bLog, const szInput[], any:...)
{
    static 
szMessage[192]
    
vformat(szMessagecharsmax(szMessage), szInput4)
    
    
#if defined USE_CSTRIKE
    
bLog CC_LogMessage(id_szMessage) : CC_SendMessage(idszMessage)
    
#else
    
format(szMessagecharsmax(szMessage), "%s %s"CC_PREFIXszMessage)
    
client_print(idprint_chatszMessage)
    
    if(
bLog)
        
log_amx(szMessage)
    
#endif
}

update_hudinfo(const id)
{
    if(!
g_eSettings[HUDINFO_ENABLED])
        return
        
    static 
szMessage[MAX_HUDINFO_LENGTH], szPlaceHolder[32], bool:bIsOnFinal
    bIsOnFinal 
g_ePlayerData[id][IsOnFinalLevel]
    
copy(szMessagecharsmax(szMessage), g_eSettings[bIsOnFinal HUDINFO_FORMAT_FINAL HUDINFO_FORMAT])
    
    if(
has_argument(szMessageARG_CURRENT_XP))
    {
        
num_to_str(g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_CURRENT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_XP))
    {
        
num_to_str(g_ePlayerData[id][NextXP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_XP_NEEDED))
    {
        
num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_XP_NEEDEDszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][Level], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][bIsOnFinal Level Level 1], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_MAX_LEVELS))
        
replace_all(szMessagecharsmax(szMessage), ARG_MAX_LEVELSg_szMaxLevels)

    if(
has_argument(szMessageARG_NAME))
    {
        
get_user_name(idszPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NAMEszPlaceHolder)
    }

    if(
has_argument(szMessageARG_CITY))
        
replace_all(szMessagecharsmax(szMessage), ARG_CITYg_ePlayerData[id][City])
    
    
replace_all(szMessagecharsmax(szMessage), ARG_RANKg_ePlayerData[id][Rank])
    
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_RANKg_ePlayerData[id][NextRank])
    
replace_all(szMessagecharsmax(szMessage), ARG_LINE_BREAK"^n")
    
    
copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
}

bool:check_level(const id, const bool:bNotify)
{
    static 
iLeveli
    iLevel 
0
    
    
for(1g_iMaxLevels 1i++)
    {
        if(
g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevelsi))
            
iLevel++
    }
    
    if(
iLevel != g_ePlayerData[id][Level])
    {
        static 
bool:bLevelUpiReturn
        bLevelUp 
iLevel g_ePlayerData[id][Level]
        
g_ePlayerData[id][Level] = iLevel
        
        ExecuteForward
(g_fwdUserLevelUpdatediReturnidiLevelbLevelUp)
        
ArrayGetString(g_aRankNamesiLevelg_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))
        
        if(
iLevel g_iMaxLevels)
        {
            
g_ePlayerData[id][IsOnFinalLevel] = false
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel 1)
            
ArrayGetString(g_aRankNamesiLevel 1g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
        }
        else
        {
            
g_ePlayerData[id][IsOnFinalLevel] = true
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel)
            
copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])
            
            if(
g_eSettings[FINAL_LEVEL_FLAGS])
            {
                
set_user_flags(idg_eSettings[FINAL_LEVEL_FLAGS])
                
remove_user_flags(idg_iFlagZ)
            }
        }
            
        if(
bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
        {
            static 
szMessage[128], szName[32], bool:bGlobalMsg
            get_user_name
(idszNamecharsmax(szName))
            
bGlobalMsg g_eSettings[LEVELUP_MESSAGE_TYPE] == 2
            
            formatex
(szMessagecharsmax(szMessage), "%L"bGlobalMsg LANG_PLAYER id,\
            
bLevelUp "CRXRANKS_LEVEL_REACHED" "CRXRANKS_LEVEL_LOST"szNameg_ePlayerData[id][Level], g_ePlayerData[id][Rank])
            
send_message(bGlobalMsg idfalseszMessage)
            
            if(
bLevelUp && g_eSettings[LEVELUP_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELUP_SOUND], 1.0ATTN_NORM0PITCH_NORM)
            else if(!
bLevelUp && g_eSettings[LEVELDN_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELDN_SOUND], 1.0ATTN_NORM0PITCH_NORM)
                
            if(
g_eSettings[bLevelUp LEVELUP_SCREEN_FADE_ENABLED LEVELDN_SCREEN_FADE_ENABLED])
            {
                
message_begin(MSG_ONEg_iScreenFade, {000}, id)
                
write_short(1<<10)
                
write_short(1<<10)
                
write_short(0x0000)
                
                if(
bLevelUp)
                {
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
                }
                else
                {
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
                }
                
                
message_end()
            }
        }
        
        
update_hudinfo(id)
        return 
true
    
}
    
    return 
false
}

public 
update_vip_status(id)
{
    if(
is_user_connected(id))
    {
        new 
szIP[16]
        
get_user_ip(idszIPcharsmax(szIP), 1)
        
geoip_city(szIPg_ePlayerData[id][City], charsmax(g_ePlayerData[][City]))

        if(
g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
            
g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
    }
}

public 
plugin_natives()
{
    
register_library("crxranks")
    
register_native("crxranks_get_chat_prefix",         "_crxranks_get_chat_prefix")
    
register_native("crxranks_get_final_flags",         "_crxranks_get_final_flags")
    
register_native("crxranks_get_hudinfo_format",         "_crxranks_get_hudinfo_format")
    
register_native("crxranks_get_max_levels",             "_crxranks_get_max_levels")
    
register_native("crxranks_get_rank_by_level",         "_crxranks_get_rank_by_level")
    
register_native("crxranks_get_save_type",             "_crxranks_get_save_type")
    
register_native("crxranks_get_user_hudinfo",         "_crxranks_get_user_hudinfo")
    
register_native("crxranks_get_user_level",             "_crxranks_get_user_level")
    
register_native("crxranks_get_user_next_rank",         "_crxranks_get_user_next_rank")
    
register_native("crxranks_get_user_next_xp",         "_crxranks_get_user_next_xp")
    
register_native("crxranks_get_user_rank",             "_crxranks_get_user_rank")
    
register_native("crxranks_get_user_xp",             "_crxranks_get_user_xp")
    
register_native("crxranks_get_vault_name",             "_crxranks_get_vault_name")
    
register_native("crxranks_get_vip_flags",             "_crxranks_get_vip_flags")
    
register_native("crxranks_get_xp_for_level",         "_crxranks_get_xp_for_level")
    
register_native("crxranks_get_xp_reward",             "_crxranks_get_xp_reward")
    
register_native("crxranks_give_user_xp",             "_crxranks_give_user_xp")
    
register_native("crxranks_hi_is_using_dhud",        "_crxranks_hi_is_using_dhud")
    
register_native("crxranks_is_hud_enabled",             "_crxranks_is_hud_enabled")
    
register_native("crxranks_is_sfdn_enabled",         "_crxranks_is_sfdn_enabled")
    
register_native("crxranks_is_sfup_enabled",         "_crxranks_is_sfup_enabled")
    
register_native("crxranks_is_user_on_final",         "_crxranks_is_user_on_final")
    
register_native("crxranks_is_user_vip",                "_crxranks_is_user_vip")
    
register_native("crxranks_is_xpn_enabled",             "_crxranks_is_xpn_enabled")
    
register_native("crxranks_using_comb_events",        "_crxranks_using_comb_events")
    
register_native("crxranks_xpn_is_using_dhud",        "_crxranks_xpn_is_using_dhud")
}

public 
_crxranks_get_chat_prefix(iPluginiParams)
    
set_string(1CC_PREFIXget_param(2))

public 
_crxranks_get_final_flags(iPluginiParams)
{
    
set_string(1g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
    return 
g_eSettings[FINAL_LEVEL_FLAGS_BIT]
}

public 
_crxranks_get_hudinfo_format(iPluginiParams)
    
set_string(2g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL HUDINFO_FORMAT], get_param(3))
    
public 
_crxranks_get_max_levels(iPluginiParams)
    return 
g_iMaxLevels
    
public _crxranks_get_rank_by_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return 
0
        
    
static szRank[MAX_RANK_LENGTH]
    
ArrayGetString(g_aRankNamesiLevelszRankcharsmax(szRank))
    
set_string(2szRankget_param(3))
    return 
1
}

public 
_crxranks_get_save_type(iPluginiParams)
    return 
g_eSettings[SAVE_TYPE]

public 
_crxranks_get_user_hudinfo(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
    
public 
_crxranks_get_user_level(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][Level]
    
public 
_crxranks_get_user_next_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][NextRank], get_param(3))
    
public 
_crxranks_get_user_next_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][NextXP]    
    
public 
_crxranks_get_user_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][Rank], get_param(3))
    
public 
_crxranks_get_user_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][XP]
    
public 
_crxranks_get_vault_name(iPluginiParams)
    
set_string(1g_eSettings[VAULT_NAME], get_param(2))
    
public 
_crxranks_get_vip_flags(iPluginiParams)
{
    
set_string(1g_eSettings[VIP_FLAGS], get_param(2))
    return 
g_eSettings[VIP_FLAGS_BIT]
}
    
public 
_crxranks_get_xp_for_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return -
1
        
    
return ArrayGetCell(g_aLevelsiLevel)
}

public 
_crxranks_get_xp_reward(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH]
    
get_string(2szRewardcharsmax(szReward))
    return 
get_xp_reward(get_param(1), szReward)
}
    
public 
_crxranks_give_user_xp(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH], iRewardid
    szReward
[0] = EOS
    get_string
(3szRewardcharsmax(szReward))
    
id get_param(1)
    
    if(
szReward[0])
    {
        
iReward get_xp_reward(idszReward)
        
        if(
iReward)
            
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
            
        return 
iReward
    
}
    
    
iReward get_param(2)
    
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
    return 
iReward
}

public 
bool:_crxranks_hi_is_using_dhud(iPluginiParams)
    return 
g_eSettings[HUDINFO_USE_DHUD]

public 
bool:_crxranks_is_hud_enabled(iPluginiParams)
    return 
g_eSettings[HUDINFO_ENABLED]
    
public 
bool:_crxranks_is_sfdn_enabled(iPluginiParams)
    return 
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_sfup_enabled(iPluginiParams)
    return 
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_user_on_final(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsOnFinalLevel]
    
public 
bool:_crxranks_is_user_vip(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsVIP]
    
public 
bool:_crxranks_is_xpn_enabled(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_ENABLED]
    
public 
bool:_crxranks_using_comb_events(iPluginiParams)
    return 
g_eSettings[USE_COMBINED_EVENTS]
    
public 
bool:_crxranks_xpn_is_using_dhud(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_USE_DHUD
What do you mean by "HUD of online players"?
__________________

Last edited by OciXCrom; 08-16-2018 at 13:25.
OciXCrom is offline
Send a message via Skype™ to OciXCrom
tarsisd2
Veteran Member
Join Date: Feb 2016
Location: brazil
Old 08-14-2018 , 17:14   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #62

Quote:
Originally Posted by OciXCrom View Post
I really don't think that showing the city, country or similar stuff is relevant to a Rank System. I won't add that to the main plugin, but here's an edited version:

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <geoip>
#include <nvault>

// Comment or remove this line in order to run the plugin on a mod different than Counter-Strike.
#define USE_CSTRIKE

#if defined USE_CSTRIKE
    #include <cromchat>
    #include <csx>
#else
new CC_PREFIX[64]
#endif

#if AMXX_VERSION_NUM < 183
    #include <dhudmessage>
#endif

#include <crxranks_const>

#if defined client_disconnected
    #define client_disconnect client_disconnected
#endif

#define PLUGIN_VERSION "2.3.2-geoip"
#define DELAY_ON_CONNECT 5.0
#define HUD_REFRESH_FREQ 1.0
#define DELAY_ON_CHANGE 0.1
#define MAX_HUDINFO_LENGTH 192
#define MAX_SOUND_LENGTH 128
#define MAX_PLAYER_INFO_LENGTH 35
#define MAX_RANK_LENGTH 32
#define MAX_XP_REWARD_LENGTH 32
#define MAX_XP_LENGTH 16
#define TASK_HUD 304500

#if !defined MAX_NAME_LENGTH
    #define MAX_NAME_LENGTH 32
#endif

#define ARG_CURRENT_XP             "$current_xp$"
#define ARG_NEXT_XP             "$next_xp$"
#define ARG_XP_NEEDED             "$xp_needed$"
#define ARG_LEVEL                 "$level$"
#define ARG_NEXT_LEVEL             "$next_level$"
#define ARG_RANK                 "$rank$"
#define ARG_NEXT_RANK             "$next_rank$"
#define ARG_MAX_LEVELS            "$max_levels$"
#define ARG_LINE_BREAK             "$br$"
#define ARG_NAME                 "$name$"
#define ARG_CITY                "$city$"

#define XPREWARD_KILL            "kill"
#define XPREWARD_HEADSHOT         "headshot"
#define XPREWARD_TEAMKILL         "teamkill"
#define XPREWARD_SUICIDE         "suicide"

#if defined USE_CSTRIKE
    #define XPREWARD_BOMB_PLANTED     "bomb_planted"
    #define XPREWARD_BOMB_DEFUSED     "bomb_defused"
    #define XPREWARD_BOMB_EXPLODED     "bomb_exploded"
#endif

#define clr(%1) %1 == -1 ? random(256) : %1

#define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 00.11.00.10.1

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

enum
{
    
VAULT_WRITE 0,
    
VAULT_READ
}

enum
{
    
OBJ_HUDINFO 0,
    
OBJ_XP_NOTIFIER
}

enum
{
    
SAVE_NICKNAME 0,
    
SAVE_IP,
    
SAVE_STEAMID
}

enum _:Sections
{
    
SECTION_NONE 0,
    
SECTION_SETTINGS,
    
SECTION_RANKS,
    
SECTION_XP_REWARDS
}

enum _:PlayerData
{
    
XP,
    
Level,
    
NextXP,
    
Rank[MAX_RANK_LENGTH],
    
NextRank[MAX_RANK_LENGTH],
    
HUDInfo[MAX_HUDINFO_LENGTH],
    
City[MAX_NAME_LENGTH],
    
bool:IsOnFinalLevel,
    
bool:IsVIP
}

enum _:Settings
{
    
SAVE_TYPE,
    
LEVELUP_MESSAGE_TYPE,
    
LEVELUP_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELUP_SCREEN_FADE_ENABLED,
    
LEVELUP_SCREEN_FADE_COLOR[4],
    
LEVELDN_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELDN_SCREEN_FADE_ENABLED,
    
LEVELDN_SCREEN_FADE_COLOR[4],
    
FINAL_LEVEL_FLAGS[32],
    
FINAL_LEVEL_FLAGS_BIT,
    
VIP_FLAGS[32],
    
VIP_FLAGS_BIT,
    
VAULT_NAME[32],
    
TEAM_LOCK,
    
MINIMUM_PLAYERS,
    
bool:USE_COMBINED_EVENTS,
    
bool:HUDINFO_ENABLED,
    
bool:HUDINFO_ALIVE_ONLY,
    
bool:HUDINFO_TEAM_LOCK,
    
bool:HUDINFO_OTHER_PLAYERS,
    
HUDINFO_COLOR[3],
    
Float:HUDINFO_POSITION[2],
    
bool:HUDINFO_USE_DHUD,
    
HUDINFO_FORMAT[MAX_HUDINFO_LENGTH],
    
HUDINFO_FORMAT_FINAL[MAX_HUDINFO_LENGTH],
    
HUDINFO_INVALID_TEXT[32],
    
bool:XP_NOTIFIER_ENABLED,
    
XP_NOTIFIER_COLOR_GET[3],
    
XP_NOTIFIER_COLOR_LOSE[3],
    
Float:XP_NOTIFIER_POSITION[2],
    
Float:XP_NOTIFIER_DURATION,
    
bool:XP_NOTIFIER_USE_DHUD
}

new 
g_eSettings[Settings]
new 
g_ePlayerData[33][PlayerData]
new 
g_szMaxLevels[MAX_XP_LENGTH]
new Array:
g_aLevels
new Array:g_aRankNames
new Trie:g_tXPRewards
new Trie:g_tXPRewardsVIP

new g_iVault
new g_iMaxLevels
new g_iObject[2]
new 
g_iScreenFade
new g_iFlagZ
new g_fwdUserLevelUpdated
new g_fwdUserReceiveXP

public plugin_init()
{
    
register_plugin("OciXCrom's Rank System"PLUGIN_VERSION"OciXCrom")
    
register_cvar("CRXRankSystem"PLUGIN_VERSIONFCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
    
register_event("DeathMsg""OnPlayerKilled""a")
    
    
#if defined USE_CSTRIKE
    
register_dictionary("RankSystem.txt")
    
#else
    
register_dictionary("RankSystemNoColors.txt")
    
#endif
    
    
register_clcmd("say /xplist""Cmd_XPList"ADMIN_BAN)
    
register_clcmd("say_team /xplist""Cmd_XPList"ADMIN_BAN)
    
register_concmd("crxranks_give_xp""Cmd_GiveXP"ADMIN_RCON"<nick|#userid> <amount>")
    
register_concmd("crxranks_reset_xp""Cmd_ResetXP"ADMIN_RCON"<nick|#userid>")
    
    if(
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
        
g_iScreenFade get_user_msgid("ScreenFade")

    
g_fwdUserLevelUpdated CreateMultiForward("crxranks_user_level_updated"ET_IGNOREFP_CELLFP_CELLFP_CELL)
    
g_fwdUserReceiveXP CreateMultiForward("crxranks_user_receive_xp"ET_STOPFP_CELLFP_CELLFP_CELL)
}

public 
plugin_precache()
{
    
g_aLevels ArrayCreate(16)
    
ArrayPushCell(g_aLevels0)
    
g_aRankNames ArrayCreate(32)
    
ArrayPushString(g_aRankNames"")
    
g_tXPRewards TrieCreate()
    
g_tXPRewardsVIP TrieCreate()
    
ReadFile()
}

public 
plugin_end()
{
    
ArrayDestroy(g_aLevels)
    
ArrayDestroy(g_aRankNames)
    
TrieDestroy(g_tXPRewards)
    
TrieDestroy(g_tXPRewardsVIP)
    
DestroyForward(g_fwdUserLevelUpdated)
    
nvault_close(g_iVault)
}

ReadFile()
{
    new 
szConfigsName[256], szFilename[256]
    
get_configsdir(szConfigsNamecharsmax(szConfigsName))
    
formatex(szFilenamecharsmax(szFilename), "%s/RankSystem.ini"szConfigsName)
    
    new 
iFilePointer fopen(szFilename"rt")
    
    if(
iFilePointer)
    {
        new 
szData[192], szValue[96], szMap[32], szKey[32], szTemp[4][5], bool:bRead trueiiSizeiSection SECTION_NONE
        get_mapname
(szMapcharsmax(szMap))
        
        while(!
feof(iFilePointer))
        {
            
fgets(iFilePointerszDatacharsmax(szData))
            
trim(szData)
            
            switch(
szData[0])
            {
                case 
EOS'#'';': continue
                case 
'-':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == '-')
                    {
                        
szData[0] = ' '
                        
szData[iSize 1] = ' '
                        
trim(szData)
                        
                        if(
contain(szData"*") != -1)
                        {
                            
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '*')
                            
copy(szValuestrlen(szKey), szMap)
                            
bRead equal(szValueszKey) ? true false
                        
}
                        else
                        {
                            static const 
szAll[] = "#all"
                            
bRead equal(szDataszAll) || equali(szDataszMap)
                        }
                    }
                    else continue
                }
                case 
'[':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == ']')
                    {
                        switch(
szData[1])
                        {
                            case 
'S''s'iSection SECTION_SETTINGS
                            
case 'R''r'iSection SECTION_RANKS
                            
case 'X''x'iSection SECTION_XP_REWARDS
                            
default: iSection SECTION_NONE
                        
}
                    }
                    else continue
                }
                default:
                {
                    if(!
bRead || iSection == SECTION_NONE)
                        continue
                        
                    
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '=')
                    
trim(szKey); trim(szValue)
                            
                    if(!
szValue[0])
                        continue
                        
                    switch(
iSection)
                    {
                        case 
SECTION_SETTINGS:
                        {
                            if(
equal(szKey"CHAT_PREFIX"))
                            {
                                
#if defined USE_CSTRIKE
                                
CC_SetPrefix(szValue)
                                
#else
                                
copy(CC_PREFIXcharsmax(CC_PREFIX), szValue)
                                
#endif
                            
}
                            else if(
equal(szKey"SAVE_TYPE"))
                                
g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAMESAVE_STEAMID)
                            else if(
equal(szKey"XP_COMMANDS"))
                            {
                                while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                                {
                                    
trim(szKey); trim(szValue)
                                    
register_clcmd(szKey"Cmd_XP")
                                }
                            }
                            else if(
equal(szKey"LEVELUP_MESSAGE_TYPE"))
                                
g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 02)
                            else if(
equal(szKey"LEVELUP_SOUND"))
                            {
                                
copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"LEVELDN_SOUND"))
                            {
                                
copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"FINAL_LEVEL_FLAGS"))
                            {
                                
copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
                                
g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
                                
g_iFlagZ read_flags("z")
                            }
                            else if(
equal(szKey"VIP_FLAGS"))
                            {
                                
copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
                                
g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
                            }
                            else if(
equal(szKey"VAULT_NAME"))
                            {
                                
g_iVault nvault_open(szValue)
                                
copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
                            }
                            else if(
equal(szKey"TEAM_LOCK"))
                                
g_eSettings[TEAM_LOCK] = str_to_num(szValue)
                            else if(
equal(szKey"MINIMUM_PLAYERS"))
                                
g_eSettings[MINIMUM_PLAYERS] = clamp(str_to_num(szValue), 032)
                            else if(
equal(szKey"USE_COMBINED_EVENTS"))
                                
g_eSettings[USE_COMBINED_EVENTS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ENABLED"))
                                
g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ALIVE_ONLY"))
                                
g_eSettings[HUDINFO_ALIVE_ONLY] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_TEAM_LOCK"))
                                
g_eSettings[HUDINFO_TEAM_LOCK] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_OTHER_PLAYERS"))
                                
g_eSettings[HUDINFO_OTHER_PLAYERS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"HUDINFO_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"HUDINFO_USE_DHUD"))
                            {
                                
g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[HUDINFO_USE_DHUD])
                                    
g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
                            }
                            else if(
equal(szKey"HUDINFO_FORMAT"))
                                
copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
                            else if(
equal(szKey"HUDINFO_FORMAT_FINAL"))
                                
copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
                            else if(
equal(szKey"HUDINFO_INVALID_TEXT"))
                                
copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
                            else if(
equal(szKey"XP_NOTIFIER_ENABLED"))
                                
g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_GET"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_LOSE"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_DURATION"))
                                
g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0float(cellmax))
                            else if(
equal(szKey"XP_NOTIFIER_USE_DHUD"))
                            {
                                
g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[XP_NOTIFIER_USE_DHUD])
                                    
g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
                            }
                        }
                        case 
SECTION_RANKS:
                        {
                            
ArrayPushCell(g_aLevelsclamp(str_to_num(szValue), 0))
                            
ArrayPushString(g_aRankNamesszKey)
                            
g_iMaxLevels++
                        }
                        case 
SECTION_XP_REWARDS:
                        {
                            static 
szReward[2][16]
                            
szReward[1][0] = EOS
                            
                            parse
(szValueszReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
                            
TrieSetCell(g_tXPRewardsszKeystr_to_num(szReward[0]))
                            
                            if(
szReward[1][0])
                                
TrieSetCell(g_tXPRewardsVIPszKeystr_to_num(szReward[1]))
                        }
                    }
                }
            }
        }
        
        
num_to_str(g_iMaxLevelsg_szMaxLevelscharsmax(g_szMaxLevels))
        
fclose(iFilePointer)
    }
}

public 
client_connect(id)
{
    
reset_stats(id)
    
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_READ)
    
set_task(DELAY_ON_CONNECT"update_vip_status"id)
    
    if(
g_eSettings[HUDINFO_ENABLED])
        
set_task(HUD_REFRESH_FREQ"DisplayHUD"id TASK_HUD, .flags "b")
}

public 
client_disconnect(id)
{
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_WRITE)
    
remove_task(id TASK_HUD)
}

public 
client_infochanged(id)
{
    if(!
is_user_connected(id))
        return
        
    static const 
szKey[] = "name"
    
static szNewName[MAX_NAME_LENGTH], szOldName[MAX_NAME_LENGTH]
    
get_user_info(idszKeyszNewNamecharsmax(szNewName))
    
get_user_name(idszOldNamecharsmax(szOldName))
    
    if(!
equal(szNewNameszOldName))
    {        
        if(
g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
        {
            
use_vault(idszOldNameVAULT_WRITE)
            
use_vault(idszNewNameVAULT_READ)
            
update_hudinfo(id)
        }
        
        
set_task(DELAY_ON_CHANGE"update_vip_status"id)
    }
}

public 
DisplayHUD(id)
{
    
id -= TASK_HUD
    
    
static iTarget
    iTarget 
id
    
    
if(!is_user_alive(id))
    {        
        if(
g_eSettings[HUDINFO_ALIVE_ONLY])
            return
            
        if(
g_eSettings[HUDINFO_OTHER_PLAYERS])
            
iTarget pev(idpev_iuser2)
    }
    
    if(!
iTarget)
        return

    if(
g_eSettings[TEAM_LOCK] && g_eSettings[HUDINFO_TEAM_LOCK] && get_user_team(iTarget) != g_eSettings[TEAM_LOCK])
        return
    
    if(
g_eSettings[HUDINFO_USE_DHUD])
    {
        
set_dhudmessage(HUDINFO_PARAMS)
        
show_dhudmessage(idg_ePlayerData[iTarget][HUDInfo])
    }
    else
    {
        
set_hudmessage(HUDINFO_PARAMS)
        
ShowSyncHudMsg(idg_iObject[OBJ_HUDINFO], g_ePlayerData[iTarget][HUDInfo])
    }
}

#if defined USE_CSTRIKE
public bomb_planted(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_PLANTED), CRXRANKS_XPS_REWARD)
    
public 
bomb_defused(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_DEFUSED), CRXRANKS_XPS_REWARD)
    
public 
bomb_explode(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_EXPLODED), CRXRANKS_XPS_REWARD)
#endif

public Cmd_XP(id)
{    
    if(
g_ePlayerData[id][Level] == g_iMaxLevels)
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_FINAL"g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
    else
    {
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_NORMAL"g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
        
g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
    }
    
    return 
PLUGIN_HANDLED
}

public 
Cmd_XPList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED
        
    
new szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L"id"CRXRANKS_MENU_TITLE")
    
    new 
iPlayers[32], iPnumiMenu menu_create(szTitle"XPList_Handler")
    
get_players(iPlayersiPnum); SortCustom1D(iPlayersiPnum"sort_players_by_xp")
    
    for(new 
szItem[128], szName[32], iPlayeriiPnumi++)
    {
        
iPlayer iPlayers[i]
        
get_user_name(iPlayerszNamecharsmax(szName))
        
formatex(szItemcharsmax(szItem), "%L"id"CRXRANKS_ITEM_FORMAT"g_ePlayerData[iPlayer][XP], szNameg_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
        
menu_additem(iMenuszItem)
    }
    
    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
XPList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
Cmd_GiveXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid3))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayer0)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH], szAmount[MAX_XP_LENGTH]
    
read_argv(2szAmountcharsmax(szAmount))
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
    new 
szKey[32], iXP str_to_num(szAmount)
    
give_user_xp(iPlayeriXPCRXRANKS_XPS_ADMIN)
    
    if(
iXP >= 0)
        
copy(szKeycharsmax(szKey), "CRXRANKS_GIVE_XP")
    else
    {
        
copy(szKeycharsmax(szKey), "CRXRANKS_TAKE_XP")
        
iXP *= -1
    
}
    
    
send_message(0true"%L"idszKeyszName[0], iXPszName[1])
    return 
PLUGIN_HANDLED
}

public 
Cmd_ResetXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid2))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayerCMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH]
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
g_ePlayerData[iPlayer][XP] = 0
    check_level
(iPlayertrue)
    
send_message(0true"%L"id"CRXRANKS_RESET_XP"szName[0], szName[1])
    return 
PLUGIN_HANDLED
}

public 
OnPlayerKilled()
{
    new 
iAttacker read_data(1), iVictim read_data(2)
    
    if(!
is_user_connected(iAttacker) || !is_user_connected(iVictim))
        return
        
    new 
iRewardiTemp
    
    
if(iAttacker == iVictim)
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_SUICIDE)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else if(
get_user_team(iAttacker) == get_user_team(iVictim))
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_TEAMKILL)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else
    {
        new 
szWeapon[16]
        
read_data(4szWeaponcharsmax(szWeapon))
        
        
iTemp get_xp_reward(iAttackerszWeapon)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
            
        
if(read_data(3))
        {
            
iTemp get_xp_reward(iAttackerXPREWARD_HEADSHOT)
            
iReward += iTemp
            
            
if(should_skip(iTemp))
                goto @
GIVE_REWARD
        
}
        
        
iReward += get_xp_reward(iAttackerXPREWARD_KILL)
    }
    
    @
GIVE_REWARD:
    
give_user_xp(iAttackeriRewardCRXRANKS_XPS_REWARD)
}

public 
sort_players_by_xp(id1id2)
{
    if(
g_ePlayerData[id1][XP] > g_ePlayerData[id2][XP])
        return -
1
    
else if(g_ePlayerData[id1][XP] < g_ePlayerData[id2][XP])
        return 
1
    
    
return 0
}

use_vault(const id, const szInfo[], const iType)
{
    if(!
szInfo[0])
        return
        
    switch(
iType)
    {
        case 
VAULT_WRITE:
        {
            static 
szData[MAX_XP_LENGTH]
            
num_to_str(g_ePlayerData[id][XP], szDatacharsmax(szData))
            
nvault_set(g_iVaultszInfoszData)
        }
        case 
VAULT_READ:
        {
            static 
iData
            iData 
nvault_get(g_iVaultszInfo)
            
g_ePlayerData[id][XP] = iData clamp(iData0) : 0
            check_level
(idfalse)
        }
    }
}

get_xp_reward(const id, const szKey[])
{
    static 
iReward
    
    
if(g_ePlayerData[id][IsVIP])
    {
        if(
TrieKeyExists(g_tXPRewardsVIPszKey))
        {
            
TrieGetCell(g_tXPRewardsVIPszKeyiReward)
            return 
iReward
        
}
    }
    
    if(
TrieKeyExists(g_tXPRewardsszKey))
    {
        
TrieGetCell(g_tXPRewardsszKeyiReward)
        return 
iReward
    
}
    
    return 
0
}

give_user_xp(const idiXPCRXRanks_XPSources:iSource CRXRANKS_XPS_PLUGIN)
{
    if(!
iXP)
        return

    if(
iSource == CRXRANKS_XPS_REWARD)
    {
        if(
g_eSettings[MINIMUM_PLAYERS] && get_playersnum() < g_eSettings[MINIMUM_PLAYERS])
            return;

        if(
g_eSettings[TEAM_LOCK] && get_user_team(id) != g_eSettings[TEAM_LOCK])
            return
    }
        
    static 
iReturn
    ExecuteForward
(g_fwdUserReceiveXPiReturnidiXPiSource)
    
    switch(
iReturn)
    {
        case 
CRXRANKS_HANDLED: return
        case 
CRXRANKS_CONTINUE: { }
        default:
        {
            if(
iReturn != 0)
                
iXP iReturn
        
}
    }
        
    
g_ePlayerData[id][XP] += iXP
    
    
if(g_ePlayerData[id][XP] < 0)
        
g_ePlayerData[id][XP] = 0
    
    
if(!check_level(idtrue))
        
update_hudinfo(id)
        
    if(
g_eSettings[XP_NOTIFIER_ENABLED])
    {
        static 
szKey[32], bool:bPositive
        bPositive 
iXP >= 0
        
        
if(bPositive)
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_GET")
        else
        {
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_LOSE")
            
iXP *= -1
        
}
            
        if(
g_eSettings[XP_NOTIFIER_USE_DHUD])
        {
            if(
bPositiveset_dhudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
show_dhudmessage(id"%L"idszKeyiXP)
        }
        else
        {
            if(
bPositiveset_hudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
ShowSyncHudMsg(idg_iObject[OBJ_XP_NOTIFIER], "%L"idszKeyiXP)
        }
    }            
}

get_user_saveinfo(const idszInfo[MAX_PLAYER_INFO_LENGTH], const iLen)
{
    switch(
g_eSettings[SAVE_TYPE])
    {
        case 
SAVE_NICKNAME:    get_user_name(idszInfoiLen)
        case 
SAVE_IPget_user_ip(idszInfoiLen1)
        case 
SAVE_STEAMIDget_user_authid(idszInfoiLen)
    }
}

reset_stats(const id)
{
    
g_ePlayerData[id][XP] = 0
    g_ePlayerData
[id][Level] = 0
    g_ePlayerData
[id][NextXP] = 0
    g_ePlayerData
[id][Rank][0] = EOS
    g_ePlayerData
[id][NextRank][0] = EOS
    g_ePlayerData
[id][HUDInfo][0] = EOS
    g_ePlayerData
[id][IsOnFinalLevel] = false
    g_ePlayerData
[id][IsVIP] = false
}

bool:has_argument(const szMessage[], const szArg[])
    return 
contain(szMessageszArg) != -1
    
bool
:should_skip(const iNum)
    return (
iNum != && !g_eSettings[USE_COMBINED_EVENTS])
    
send_message(const id, const bool:bLog, const szInput[], any:...)
{
    static 
szMessage[192]
    
vformat(szMessagecharsmax(szMessage), szInput4)
    
    
#if defined USE_CSTRIKE
    
bLog CC_LogMessage(id_szMessage) : CC_SendMessage(idszMessage)
    
#else
    
format(szMessagecharsmax(szMessage), "%s %s"CC_PREFIXszMessage)
    
client_print(idprint_chatszMessage)
    
    if(
bLog)
        
log_amx(szMessage)
    
#endif
}

update_hudinfo(const id)
{
    if(!
g_eSettings[HUDINFO_ENABLED])
        return
        
    static 
szMessage[MAX_HUDINFO_LENGTH], szPlaceHolder[32], bool:bIsOnFinal
    bIsOnFinal 
g_ePlayerData[id][IsOnFinalLevel]
    
copy(szMessagecharsmax(szMessage), g_eSettings[bIsOnFinal HUDINFO_FORMAT_FINAL HUDINFO_FORMAT])
    
    if(
has_argument(szMessageARG_CURRENT_XP))
    {
        
num_to_str(g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_CURRENT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_XP))
    {
        
num_to_str(g_ePlayerData[id][NextXP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_XP_NEEDED))
    {
        
num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_XP_NEEDEDszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][Level], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][bIsOnFinal Level Level 1], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_MAX_LEVELS))
        
replace_all(szMessagecharsmax(szMessage), ARG_MAX_LEVELSg_szMaxLevels)

    if(
has_argument(szMessageARG_NAME))
    {
        
get_user_name(idszPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NAMEszPlaceHolder)
    }

    if(
has_argument(szMessageARG_CITY))
        
replace_all(szMessagecharsmax(szMessage), ARG_CITYszPlaceHolder)
    
    
replace_all(szMessagecharsmax(szMessage), ARG_RANKg_ePlayerData[id][Rank])
    
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_RANKg_ePlayerData[id][NextRank])
    
replace_all(szMessagecharsmax(szMessage), ARG_LINE_BREAK"^n")
    
    
copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
}

bool:check_level(const id, const bool:bNotify)
{
    static 
iLeveli
    iLevel 
0
    
    
for(1g_iMaxLevels 1i++)
    {
        if(
g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevelsi))
            
iLevel++
    }
    
    if(
iLevel != g_ePlayerData[id][Level])
    {
        static 
bool:bLevelUpiReturn
        bLevelUp 
iLevel g_ePlayerData[id][Level]
        
g_ePlayerData[id][Level] = iLevel
        
        ExecuteForward
(g_fwdUserLevelUpdatediReturnidiLevelbLevelUp)
        
ArrayGetString(g_aRankNamesiLevelg_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))
        
        if(
iLevel g_iMaxLevels)
        {
            
g_ePlayerData[id][IsOnFinalLevel] = false
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel 1)
            
ArrayGetString(g_aRankNamesiLevel 1g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
        }
        else
        {
            
g_ePlayerData[id][IsOnFinalLevel] = true
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel)
            
copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])
            
            if(
g_eSettings[FINAL_LEVEL_FLAGS])
            {
                
set_user_flags(idg_eSettings[FINAL_LEVEL_FLAGS])
                
remove_user_flags(idg_iFlagZ)
            }
        }
            
        if(
bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
        {
            static 
szMessage[128], szName[32], bool:bGlobalMsg
            get_user_name
(idszNamecharsmax(szName))
            
bGlobalMsg g_eSettings[LEVELUP_MESSAGE_TYPE] == 2
            
            formatex
(szMessagecharsmax(szMessage), "%L"bGlobalMsg LANG_PLAYER id,\
            
bLevelUp "CRXRANKS_LEVEL_REACHED" "CRXRANKS_LEVEL_LOST"szNameg_ePlayerData[id][Level], g_ePlayerData[id][Rank])
            
send_message(bGlobalMsg idfalseszMessage)
            
            if(
bLevelUp && g_eSettings[LEVELUP_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELUP_SOUND], 1.0ATTN_NORM0PITCH_NORM)
            else if(!
bLevelUp && g_eSettings[LEVELDN_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELDN_SOUND], 1.0ATTN_NORM0PITCH_NORM)
                
            if(
g_eSettings[bLevelUp LEVELUP_SCREEN_FADE_ENABLED LEVELDN_SCREEN_FADE_ENABLED])
            {
                
message_begin(MSG_ONEg_iScreenFade, {000}, id)
                
write_short(1<<10)
                
write_short(1<<10)
                
write_short(0x0000)
                
                if(
bLevelUp)
                {
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
                }
                else
                {
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
                }
                
                
message_end()
            }
        }
        
        
update_hudinfo(id)
        return 
true
    
}
    
    return 
false
}

public 
update_vip_status(id)
{
    if(
is_user_connected(id))
    {
        new 
szIP[16]
        
geoip_city(szIPg_ePlayerData[id][City], charsmax(g_ePlayerData[][City]))

        if(
g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
            
g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
    }
}

public 
plugin_natives()
{
    
register_library("crxranks")
    
register_native("crxranks_get_chat_prefix",         "_crxranks_get_chat_prefix")
    
register_native("crxranks_get_final_flags",         "_crxranks_get_final_flags")
    
register_native("crxranks_get_hudinfo_format",         "_crxranks_get_hudinfo_format")
    
register_native("crxranks_get_max_levels",             "_crxranks_get_max_levels")
    
register_native("crxranks_get_rank_by_level",         "_crxranks_get_rank_by_level")
    
register_native("crxranks_get_save_type",             "_crxranks_get_save_type")
    
register_native("crxranks_get_user_hudinfo",         "_crxranks_get_user_hudinfo")
    
register_native("crxranks_get_user_level",             "_crxranks_get_user_level")
    
register_native("crxranks_get_user_next_rank",         "_crxranks_get_user_next_rank")
    
register_native("crxranks_get_user_next_xp",         "_crxranks_get_user_next_xp")
    
register_native("crxranks_get_user_rank",             "_crxranks_get_user_rank")
    
register_native("crxranks_get_user_xp",             "_crxranks_get_user_xp")
    
register_native("crxranks_get_vault_name",             "_crxranks_get_vault_name")
    
register_native("crxranks_get_vip_flags",             "_crxranks_get_vip_flags")
    
register_native("crxranks_get_xp_for_level",         "_crxranks_get_xp_for_level")
    
register_native("crxranks_get_xp_reward",             "_crxranks_get_xp_reward")
    
register_native("crxranks_give_user_xp",             "_crxranks_give_user_xp")
    
register_native("crxranks_hi_is_using_dhud",        "_crxranks_hi_is_using_dhud")
    
register_native("crxranks_is_hud_enabled",             "_crxranks_is_hud_enabled")
    
register_native("crxranks_is_sfdn_enabled",         "_crxranks_is_sfdn_enabled")
    
register_native("crxranks_is_sfup_enabled",         "_crxranks_is_sfup_enabled")
    
register_native("crxranks_is_user_on_final",         "_crxranks_is_user_on_final")
    
register_native("crxranks_is_user_vip",                "_crxranks_is_user_vip")
    
register_native("crxranks_is_xpn_enabled",             "_crxranks_is_xpn_enabled")
    
register_native("crxranks_using_comb_events",        "_crxranks_using_comb_events")
    
register_native("crxranks_xpn_is_using_dhud",        "_crxranks_xpn_is_using_dhud")
}

public 
_crxranks_get_chat_prefix(iPluginiParams)
    
set_string(1CC_PREFIXget_param(2))

public 
_crxranks_get_final_flags(iPluginiParams)
{
    
set_string(1g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
    return 
g_eSettings[FINAL_LEVEL_FLAGS_BIT]
}

public 
_crxranks_get_hudinfo_format(iPluginiParams)
    
set_string(2g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL HUDINFO_FORMAT], get_param(3))
    
public 
_crxranks_get_max_levels(iPluginiParams)
    return 
g_iMaxLevels
    
public _crxranks_get_rank_by_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return 
0
        
    
static szRank[MAX_RANK_LENGTH]
    
ArrayGetString(g_aRankNamesiLevelszRankcharsmax(szRank))
    
set_string(2szRankget_param(3))
    return 
1
}

public 
_crxranks_get_save_type(iPluginiParams)
    return 
g_eSettings[SAVE_TYPE]

public 
_crxranks_get_user_hudinfo(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
    
public 
_crxranks_get_user_level(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][Level]
    
public 
_crxranks_get_user_next_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][NextRank], get_param(3))
    
public 
_crxranks_get_user_next_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][NextXP]    
    
public 
_crxranks_get_user_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][Rank], get_param(3))
    
public 
_crxranks_get_user_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][XP]
    
public 
_crxranks_get_vault_name(iPluginiParams)
    
set_string(1g_eSettings[VAULT_NAME], get_param(2))
    
public 
_crxranks_get_vip_flags(iPluginiParams)
{
    
set_string(1g_eSettings[VIP_FLAGS], get_param(2))
    return 
g_eSettings[VIP_FLAGS_BIT]
}
    
public 
_crxranks_get_xp_for_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return -
1
        
    
return ArrayGetCell(g_aLevelsiLevel)
}

public 
_crxranks_get_xp_reward(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH]
    
get_string(2szRewardcharsmax(szReward))
    return 
get_xp_reward(get_param(1), szReward)
}
    
public 
_crxranks_give_user_xp(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH], iRewardid
    szReward
[0] = EOS
    get_string
(3szRewardcharsmax(szReward))
    
id get_param(1)
    
    if(
szReward[0])
    {
        
iReward get_xp_reward(idszReward)
        
        if(
iReward)
            
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
            
        return 
iReward
    
}
    
    
iReward get_param(2)
    
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
    return 
iReward
}

public 
bool:_crxranks_hi_is_using_dhud(iPluginiParams)
    return 
g_eSettings[HUDINFO_USE_DHUD]

public 
bool:_crxranks_is_hud_enabled(iPluginiParams)
    return 
g_eSettings[HUDINFO_ENABLED]
    
public 
bool:_crxranks_is_sfdn_enabled(iPluginiParams)
    return 
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_sfup_enabled(iPluginiParams)
    return 
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_user_on_final(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsOnFinalLevel]
    
public 
bool:_crxranks_is_user_vip(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsVIP]
    
public 
bool:_crxranks_is_xpn_enabled(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_ENABLED]
    
public 
bool:_crxranks_using_comb_events(iPluginiParams)
    return 
g_eSettings[USE_COMBINED_EVENTS]
    
public 
bool:_crxranks_xpn_is_using_dhud(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_USE_DHUD
What do you mean by "HUD of online players"?
i meant HUD of Alive players, to show only on buytime, then fade, while spectators hud stay on, my mistake

thanks very much

other ideia is to make a list of ranks avalable, players types /ranklist and see all the available ranks and points necessary, i'm using like 53 levels!
tarsisd2 is offline
tarsisd2
Veteran Member
Join Date: Feb 2016
Location: brazil
Old 08-14-2018 , 22:50   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #63

Quote:
Originally Posted by OciXCrom View Post
I really don't think that showing the city, country or similar stuff is relevant to a Rank System. I won't add that to the main plugin, but here's an edited version:

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <geoip>
#include <nvault>

// Comment or remove this line in order to run the plugin on a mod different than Counter-Strike.
#define USE_CSTRIKE

#if defined USE_CSTRIKE
    #include <cromchat>
    #include <csx>
#else
new CC_PREFIX[64]
#endif

#if AMXX_VERSION_NUM < 183
    #include <dhudmessage>
#endif

#include <crxranks_const>

#if defined client_disconnected
    #define client_disconnect client_disconnected
#endif

#define PLUGIN_VERSION "2.3.2-geoip"
#define DELAY_ON_CONNECT 5.0
#define HUD_REFRESH_FREQ 1.0
#define DELAY_ON_CHANGE 0.1
#define MAX_HUDINFO_LENGTH 192
#define MAX_SOUND_LENGTH 128
#define MAX_PLAYER_INFO_LENGTH 35
#define MAX_RANK_LENGTH 32
#define MAX_XP_REWARD_LENGTH 32
#define MAX_XP_LENGTH 16
#define TASK_HUD 304500

#if !defined MAX_NAME_LENGTH
    #define MAX_NAME_LENGTH 32
#endif

#define ARG_CURRENT_XP             "$current_xp$"
#define ARG_NEXT_XP             "$next_xp$"
#define ARG_XP_NEEDED             "$xp_needed$"
#define ARG_LEVEL                 "$level$"
#define ARG_NEXT_LEVEL             "$next_level$"
#define ARG_RANK                 "$rank$"
#define ARG_NEXT_RANK             "$next_rank$"
#define ARG_MAX_LEVELS            "$max_levels$"
#define ARG_LINE_BREAK             "$br$"
#define ARG_NAME                 "$name$"
#define ARG_CITY                "$city$"

#define XPREWARD_KILL            "kill"
#define XPREWARD_HEADSHOT         "headshot"
#define XPREWARD_TEAMKILL         "teamkill"
#define XPREWARD_SUICIDE         "suicide"

#if defined USE_CSTRIKE
    #define XPREWARD_BOMB_PLANTED     "bomb_planted"
    #define XPREWARD_BOMB_DEFUSED     "bomb_defused"
    #define XPREWARD_BOMB_EXPLODED     "bomb_exploded"
#endif

#define clr(%1) %1 == -1 ? random(256) : %1

#define HUDINFO_PARAMS clr(g_eSettings[HUDINFO_COLOR][0]), clr(g_eSettings[HUDINFO_COLOR][1]), clr(g_eSettings[HUDINFO_COLOR][2]),\
g_eSettings[HUDINFO_POSITION][0], g_eSettings[HUDINFO_POSITION][1], 00.11.00.10.1

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

#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]),\
g_eSettings[XP_NOTIFIER_POSITION][0], g_eSettings[XP_NOTIFIER_POSITION][1], .holdtime g_eSettings[XP_NOTIFIER_DURATION]

enum
{
    
VAULT_WRITE 0,
    
VAULT_READ
}

enum
{
    
OBJ_HUDINFO 0,
    
OBJ_XP_NOTIFIER
}

enum
{
    
SAVE_NICKNAME 0,
    
SAVE_IP,
    
SAVE_STEAMID
}

enum _:Sections
{
    
SECTION_NONE 0,
    
SECTION_SETTINGS,
    
SECTION_RANKS,
    
SECTION_XP_REWARDS
}

enum _:PlayerData
{
    
XP,
    
Level,
    
NextXP,
    
Rank[MAX_RANK_LENGTH],
    
NextRank[MAX_RANK_LENGTH],
    
HUDInfo[MAX_HUDINFO_LENGTH],
    
City[MAX_NAME_LENGTH],
    
bool:IsOnFinalLevel,
    
bool:IsVIP
}

enum _:Settings
{
    
SAVE_TYPE,
    
LEVELUP_MESSAGE_TYPE,
    
LEVELUP_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELUP_SCREEN_FADE_ENABLED,
    
LEVELUP_SCREEN_FADE_COLOR[4],
    
LEVELDN_SOUND[MAX_SOUND_LENGTH],
    
bool:LEVELDN_SCREEN_FADE_ENABLED,
    
LEVELDN_SCREEN_FADE_COLOR[4],
    
FINAL_LEVEL_FLAGS[32],
    
FINAL_LEVEL_FLAGS_BIT,
    
VIP_FLAGS[32],
    
VIP_FLAGS_BIT,
    
VAULT_NAME[32],
    
TEAM_LOCK,
    
MINIMUM_PLAYERS,
    
bool:USE_COMBINED_EVENTS,
    
bool:HUDINFO_ENABLED,
    
bool:HUDINFO_ALIVE_ONLY,
    
bool:HUDINFO_TEAM_LOCK,
    
bool:HUDINFO_OTHER_PLAYERS,
    
HUDINFO_COLOR[3],
    
Float:HUDINFO_POSITION[2],
    
bool:HUDINFO_USE_DHUD,
    
HUDINFO_FORMAT[MAX_HUDINFO_LENGTH],
    
HUDINFO_FORMAT_FINAL[MAX_HUDINFO_LENGTH],
    
HUDINFO_INVALID_TEXT[32],
    
bool:XP_NOTIFIER_ENABLED,
    
XP_NOTIFIER_COLOR_GET[3],
    
XP_NOTIFIER_COLOR_LOSE[3],
    
Float:XP_NOTIFIER_POSITION[2],
    
Float:XP_NOTIFIER_DURATION,
    
bool:XP_NOTIFIER_USE_DHUD
}

new 
g_eSettings[Settings]
new 
g_ePlayerData[33][PlayerData]
new 
g_szMaxLevels[MAX_XP_LENGTH]
new Array:
g_aLevels
new Array:g_aRankNames
new Trie:g_tXPRewards
new Trie:g_tXPRewardsVIP

new g_iVault
new g_iMaxLevels
new g_iObject[2]
new 
g_iScreenFade
new g_iFlagZ
new g_fwdUserLevelUpdated
new g_fwdUserReceiveXP

public plugin_init()
{
    
register_plugin("OciXCrom's Rank System"PLUGIN_VERSION"OciXCrom")
    
register_cvar("CRXRankSystem"PLUGIN_VERSIONFCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
    
register_event("DeathMsg""OnPlayerKilled""a")
    
    
#if defined USE_CSTRIKE
    
register_dictionary("RankSystem.txt")
    
#else
    
register_dictionary("RankSystemNoColors.txt")
    
#endif
    
    
register_clcmd("say /xplist""Cmd_XPList"ADMIN_BAN)
    
register_clcmd("say_team /xplist""Cmd_XPList"ADMIN_BAN)
    
register_concmd("crxranks_give_xp""Cmd_GiveXP"ADMIN_RCON"<nick|#userid> <amount>")
    
register_concmd("crxranks_reset_xp""Cmd_ResetXP"ADMIN_RCON"<nick|#userid>")
    
    if(
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] || g_eSettings[LEVELDN_SCREEN_FADE_ENABLED])
        
g_iScreenFade get_user_msgid("ScreenFade")

    
g_fwdUserLevelUpdated CreateMultiForward("crxranks_user_level_updated"ET_IGNOREFP_CELLFP_CELLFP_CELL)
    
g_fwdUserReceiveXP CreateMultiForward("crxranks_user_receive_xp"ET_STOPFP_CELLFP_CELLFP_CELL)
}

public 
plugin_precache()
{
    
g_aLevels ArrayCreate(16)
    
ArrayPushCell(g_aLevels0)
    
g_aRankNames ArrayCreate(32)
    
ArrayPushString(g_aRankNames"")
    
g_tXPRewards TrieCreate()
    
g_tXPRewardsVIP TrieCreate()
    
ReadFile()
}

public 
plugin_end()
{
    
ArrayDestroy(g_aLevels)
    
ArrayDestroy(g_aRankNames)
    
TrieDestroy(g_tXPRewards)
    
TrieDestroy(g_tXPRewardsVIP)
    
DestroyForward(g_fwdUserLevelUpdated)
    
nvault_close(g_iVault)
}

ReadFile()
{
    new 
szConfigsName[256], szFilename[256]
    
get_configsdir(szConfigsNamecharsmax(szConfigsName))
    
formatex(szFilenamecharsmax(szFilename), "%s/RankSystem.ini"szConfigsName)
    
    new 
iFilePointer fopen(szFilename"rt")
    
    if(
iFilePointer)
    {
        new 
szData[192], szValue[96], szMap[32], szKey[32], szTemp[4][5], bool:bRead trueiiSizeiSection SECTION_NONE
        get_mapname
(szMapcharsmax(szMap))
        
        while(!
feof(iFilePointer))
        {
            
fgets(iFilePointerszDatacharsmax(szData))
            
trim(szData)
            
            switch(
szData[0])
            {
                case 
EOS'#'';': continue
                case 
'-':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == '-')
                    {
                        
szData[0] = ' '
                        
szData[iSize 1] = ' '
                        
trim(szData)
                        
                        if(
contain(szData"*") != -1)
                        {
                            
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '*')
                            
copy(szValuestrlen(szKey), szMap)
                            
bRead equal(szValueszKey) ? true false
                        
}
                        else
                        {
                            static const 
szAll[] = "#all"
                            
bRead equal(szDataszAll) || equali(szDataszMap)
                        }
                    }
                    else continue
                }
                case 
'[':
                {
                    
iSize strlen(szData)
                    
                    if(
szData[iSize 1] == ']')
                    {
                        switch(
szData[1])
                        {
                            case 
'S''s'iSection SECTION_SETTINGS
                            
case 'R''r'iSection SECTION_RANKS
                            
case 'X''x'iSection SECTION_XP_REWARDS
                            
default: iSection SECTION_NONE
                        
}
                    }
                    else continue
                }
                default:
                {
                    if(!
bRead || iSection == SECTION_NONE)
                        continue
                        
                    
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '=')
                    
trim(szKey); trim(szValue)
                            
                    if(!
szValue[0])
                        continue
                        
                    switch(
iSection)
                    {
                        case 
SECTION_SETTINGS:
                        {
                            if(
equal(szKey"CHAT_PREFIX"))
                            {
                                
#if defined USE_CSTRIKE
                                
CC_SetPrefix(szValue)
                                
#else
                                
copy(CC_PREFIXcharsmax(CC_PREFIX), szValue)
                                
#endif
                            
}
                            else if(
equal(szKey"SAVE_TYPE"))
                                
g_eSettings[SAVE_TYPE] = clamp(str_to_num(szValue), SAVE_NICKNAMESAVE_STEAMID)
                            else if(
equal(szKey"XP_COMMANDS"))
                            {
                                while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                                {
                                    
trim(szKey); trim(szValue)
                                    
register_clcmd(szKey"Cmd_XP")
                                }
                            }
                            else if(
equal(szKey"LEVELUP_MESSAGE_TYPE"))
                                
g_eSettings[LEVELUP_MESSAGE_TYPE] = clamp(str_to_num(szValue), 02)
                            else if(
equal(szKey"LEVELUP_SOUND"))
                            {
                                
copy(g_eSettings[LEVELUP_SOUND], charsmax(g_eSettings[LEVELUP_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELUP_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELUP_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"LEVELDN_SOUND"))
                            {
                                
copy(g_eSettings[LEVELDN_SOUND], charsmax(g_eSettings[LEVELDN_SOUND]), szValue)
                                
                                if(
szValue[0])
                                    
precache_sound(szValue)
                            }
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_ENABLED"))
                                
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"LEVELDN_SCREEN_FADE_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]), szTemp[3], charsmax(szTemp[]))
                                
                                for(
04i++)
                                    
g_eSettings[LEVELDN_SCREEN_FADE_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"FINAL_LEVEL_FLAGS"))
                            {
                                
copy(g_eSettings[FINAL_LEVEL_FLAGS], charsmax(g_eSettings[FINAL_LEVEL_FLAGS]), szValue)
                                
g_eSettings[FINAL_LEVEL_FLAGS_BIT] = read_flags(szValue)
                                
g_iFlagZ read_flags("z")
                            }
                            else if(
equal(szKey"VIP_FLAGS"))
                            {
                                
copy(g_eSettings[VIP_FLAGS], charsmax(g_eSettings[VIP_FLAGS]), szValue)
                                
g_eSettings[VIP_FLAGS_BIT] = read_flags(szValue)
                            }
                            else if(
equal(szKey"VAULT_NAME"))
                            {
                                
g_iVault nvault_open(szValue)
                                
copy(g_eSettings[VAULT_NAME], charsmax(g_eSettings[VAULT_NAME]), szValue)
                            }
                            else if(
equal(szKey"TEAM_LOCK"))
                                
g_eSettings[TEAM_LOCK] = str_to_num(szValue)
                            else if(
equal(szKey"MINIMUM_PLAYERS"))
                                
g_eSettings[MINIMUM_PLAYERS] = clamp(str_to_num(szValue), 032)
                            else if(
equal(szKey"USE_COMBINED_EVENTS"))
                                
g_eSettings[USE_COMBINED_EVENTS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ENABLED"))
                                
g_eSettings[HUDINFO_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_ALIVE_ONLY"))
                                
g_eSettings[HUDINFO_ALIVE_ONLY] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_TEAM_LOCK"))
                                
g_eSettings[HUDINFO_TEAM_LOCK] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_OTHER_PLAYERS"))
                                
g_eSettings[HUDINFO_OTHER_PLAYERS] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"HUDINFO_COLOR"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[HUDINFO_COLOR][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"HUDINFO_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[HUDINFO_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"HUDINFO_USE_DHUD"))
                            {
                                
g_eSettings[HUDINFO_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[HUDINFO_USE_DHUD])
                                    
g_iObject[OBJ_HUDINFO] = CreateHudSyncObj()
                            }
                            else if(
equal(szKey"HUDINFO_FORMAT"))
                                
copy(g_eSettings[HUDINFO_FORMAT], charsmax(g_eSettings[HUDINFO_FORMAT]), szValue)
                            else if(
equal(szKey"HUDINFO_FORMAT_FINAL"))
                                
copy(g_eSettings[HUDINFO_FORMAT_FINAL], charsmax(g_eSettings[HUDINFO_FORMAT_FINAL]), szValue)
                            else if(
equal(szKey"HUDINFO_INVALID_TEXT"))
                                
copy(g_eSettings[HUDINFO_INVALID_TEXT], charsmax(g_eSettings[HUDINFO_INVALID_TEXT]), szValue)
                            else if(
equal(szKey"XP_NOTIFIER_ENABLED"))
                                
g_eSettings[XP_NOTIFIER_ENABLED] = _:clamp(str_to_num(szValue), falsetrue)
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_GET"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_GET][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_COLOR_LOSE"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]), szTemp[2], charsmax(szTemp[]))
                                
                                for(
03i++)
                                    
g_eSettings[XP_NOTIFIER_COLOR_LOSE][i] = clamp(str_to_num(szTemp[i]), -1255)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_POSITION"))
                            {
                                
parse(szValueszTemp[0], charsmax(szTemp[]), szTemp[1], charsmax(szTemp[]))
                                
                                for(
02i++)
                                    
g_eSettings[XP_NOTIFIER_POSITION][i] = _:floatclamp(str_to_float(szTemp[i]), -1.01.0)
                            }
                            else if(
equal(szKey"XP_NOTIFIER_DURATION"))
                                
g_eSettings[XP_NOTIFIER_DURATION] = _:floatclamp(str_to_float(szValue), 0.0float(cellmax))
                            else if(
equal(szKey"XP_NOTIFIER_USE_DHUD"))
                            {
                                
g_eSettings[XP_NOTIFIER_USE_DHUD] = _:clamp(str_to_num(szValue), falsetrue)
                                
                                if(!
g_eSettings[XP_NOTIFIER_USE_DHUD])
                                    
g_iObject[OBJ_XP_NOTIFIER] = CreateHudSyncObj()
                            }
                        }
                        case 
SECTION_RANKS:
                        {
                            
ArrayPushCell(g_aLevelsclamp(str_to_num(szValue), 0))
                            
ArrayPushString(g_aRankNamesszKey)
                            
g_iMaxLevels++
                        }
                        case 
SECTION_XP_REWARDS:
                        {
                            static 
szReward[2][16]
                            
szReward[1][0] = EOS
                            
                            parse
(szValueszReward[0], charsmax(szReward[]), szReward[1], charsmax(szReward[]))
                            
TrieSetCell(g_tXPRewardsszKeystr_to_num(szReward[0]))
                            
                            if(
szReward[1][0])
                                
TrieSetCell(g_tXPRewardsVIPszKeystr_to_num(szReward[1]))
                        }
                    }
                }
            }
        }
        
        
num_to_str(g_iMaxLevelsg_szMaxLevelscharsmax(g_szMaxLevels))
        
fclose(iFilePointer)
    }
}

public 
client_connect(id)
{
    
reset_stats(id)
    
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_READ)
    
set_task(DELAY_ON_CONNECT"update_vip_status"id)
    
    if(
g_eSettings[HUDINFO_ENABLED])
        
set_task(HUD_REFRESH_FREQ"DisplayHUD"id TASK_HUD, .flags "b")
}

public 
client_disconnect(id)
{
    new 
szInfo[MAX_PLAYER_INFO_LENGTH]
    
get_user_saveinfo(idszInfocharsmax(szInfo))
    
use_vault(idszInfoVAULT_WRITE)
    
remove_task(id TASK_HUD)
}

public 
client_infochanged(id)
{
    if(!
is_user_connected(id))
        return
        
    static const 
szKey[] = "name"
    
static szNewName[MAX_NAME_LENGTH], szOldName[MAX_NAME_LENGTH]
    
get_user_info(idszKeyszNewNamecharsmax(szNewName))
    
get_user_name(idszOldNamecharsmax(szOldName))
    
    if(!
equal(szNewNameszOldName))
    {        
        if(
g_eSettings[SAVE_TYPE] == SAVE_NICKNAME)
        {
            
use_vault(idszOldNameVAULT_WRITE)
            
use_vault(idszNewNameVAULT_READ)
            
update_hudinfo(id)
        }
        
        
set_task(DELAY_ON_CHANGE"update_vip_status"id)
    }
}

public 
DisplayHUD(id)
{
    
id -= TASK_HUD
    
    
static iTarget
    iTarget 
id
    
    
if(!is_user_alive(id))
    {        
        if(
g_eSettings[HUDINFO_ALIVE_ONLY])
            return
            
        if(
g_eSettings[HUDINFO_OTHER_PLAYERS])
            
iTarget pev(idpev_iuser2)
    }
    
    if(!
iTarget)
        return

    if(
g_eSettings[TEAM_LOCK] && g_eSettings[HUDINFO_TEAM_LOCK] && get_user_team(iTarget) != g_eSettings[TEAM_LOCK])
        return
    
    if(
g_eSettings[HUDINFO_USE_DHUD])
    {
        
set_dhudmessage(HUDINFO_PARAMS)
        
show_dhudmessage(idg_ePlayerData[iTarget][HUDInfo])
    }
    else
    {
        
set_hudmessage(HUDINFO_PARAMS)
        
ShowSyncHudMsg(idg_iObject[OBJ_HUDINFO], g_ePlayerData[iTarget][HUDInfo])
    }
}

#if defined USE_CSTRIKE
public bomb_planted(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_PLANTED), CRXRANKS_XPS_REWARD)
    
public 
bomb_defused(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_DEFUSED), CRXRANKS_XPS_REWARD)
    
public 
bomb_explode(id)
    
give_user_xp(idget_xp_reward(idXPREWARD_BOMB_EXPLODED), CRXRANKS_XPS_REWARD)
#endif

public Cmd_XP(id)
{    
    if(
g_ePlayerData[id][Level] == g_iMaxLevels)
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_FINAL"g_ePlayerData[id][XP], g_ePlayerData[id][Level], g_ePlayerData[id][Rank])
    else
    {
        
send_message(idfalse"%L"id"CRXRANKS_RANKINFO_NORMAL"g_ePlayerData[id][XP], g_ePlayerData[id][NextXP],\
        
g_ePlayerData[id][Level], g_ePlayerData[id][Rank], g_ePlayerData[id][NextRank])
    }
    
    return 
PLUGIN_HANDLED
}

public 
Cmd_XPList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED
        
    
new szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L"id"CRXRANKS_MENU_TITLE")
    
    new 
iPlayers[32], iPnumiMenu menu_create(szTitle"XPList_Handler")
    
get_players(iPlayersiPnum); SortCustom1D(iPlayersiPnum"sort_players_by_xp")
    
    for(new 
szItem[128], szName[32], iPlayeriiPnumi++)
    {
        
iPlayer iPlayers[i]
        
get_user_name(iPlayerszNamecharsmax(szName))
        
formatex(szItemcharsmax(szItem), "%L"id"CRXRANKS_ITEM_FORMAT"g_ePlayerData[iPlayer][XP], szNameg_ePlayerData[iPlayer][Level], g_ePlayerData[iPlayer][Rank])
        
menu_additem(iMenuszItem)
    }
    
    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
XPList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
Cmd_GiveXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid3))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayer0)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH], szAmount[MAX_XP_LENGTH]
    
read_argv(2szAmountcharsmax(szAmount))
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
    new 
szKey[32], iXP str_to_num(szAmount)
    
give_user_xp(iPlayeriXPCRXRANKS_XPS_ADMIN)
    
    if(
iXP >= 0)
        
copy(szKeycharsmax(szKey), "CRXRANKS_GIVE_XP")
    else
    {
        
copy(szKeycharsmax(szKey), "CRXRANKS_TAKE_XP")
        
iXP *= -1
    
}
    
    
send_message(0true"%L"idszKeyszName[0], iXPszName[1])
    return 
PLUGIN_HANDLED
}

public 
Cmd_ResetXP(idiLeveliCid)
{    
    if(!
cmd_access(idiLeveliCid2))
        return 
PLUGIN_HANDLED
    
    
new szPlayer[MAX_NAME_LENGTH]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayerCMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
        
    
new szName[2][MAX_NAME_LENGTH]
    
get_user_name(idszName[0], charsmax(szName[]))
    
get_user_name(iPlayerszName[1], charsmax(szName[]))
    
g_ePlayerData[iPlayer][XP] = 0
    check_level
(iPlayertrue)
    
send_message(0true"%L"id"CRXRANKS_RESET_XP"szName[0], szName[1])
    return 
PLUGIN_HANDLED
}

public 
OnPlayerKilled()
{
    new 
iAttacker read_data(1), iVictim read_data(2)
    
    if(!
is_user_connected(iAttacker) || !is_user_connected(iVictim))
        return
        
    new 
iRewardiTemp
    
    
if(iAttacker == iVictim)
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_SUICIDE)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else if(
get_user_team(iAttacker) == get_user_team(iVictim))
    {
        
iTemp get_xp_reward(iAttackerXPREWARD_TEAMKILL)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
    
}
    else
    {
        new 
szWeapon[16]
        
read_data(4szWeaponcharsmax(szWeapon))
        
        
iTemp get_xp_reward(iAttackerszWeapon)
        
iReward += iTemp
        
        
if(should_skip(iTemp))
            goto @
GIVE_REWARD
            
        
if(read_data(3))
        {
            
iTemp get_xp_reward(iAttackerXPREWARD_HEADSHOT)
            
iReward += iTemp
            
            
if(should_skip(iTemp))
                goto @
GIVE_REWARD
        
}
        
        
iReward += get_xp_reward(iAttackerXPREWARD_KILL)
    }
    
    @
GIVE_REWARD:
    
give_user_xp(iAttackeriRewardCRXRANKS_XPS_REWARD)
}

public 
sort_players_by_xp(id1id2)
{
    if(
g_ePlayerData[id1][XP] > g_ePlayerData[id2][XP])
        return -
1
    
else if(g_ePlayerData[id1][XP] < g_ePlayerData[id2][XP])
        return 
1
    
    
return 0
}

use_vault(const id, const szInfo[], const iType)
{
    if(!
szInfo[0])
        return
        
    switch(
iType)
    {
        case 
VAULT_WRITE:
        {
            static 
szData[MAX_XP_LENGTH]
            
num_to_str(g_ePlayerData[id][XP], szDatacharsmax(szData))
            
nvault_set(g_iVaultszInfoszData)
        }
        case 
VAULT_READ:
        {
            static 
iData
            iData 
nvault_get(g_iVaultszInfo)
            
g_ePlayerData[id][XP] = iData clamp(iData0) : 0
            check_level
(idfalse)
        }
    }
}

get_xp_reward(const id, const szKey[])
{
    static 
iReward
    
    
if(g_ePlayerData[id][IsVIP])
    {
        if(
TrieKeyExists(g_tXPRewardsVIPszKey))
        {
            
TrieGetCell(g_tXPRewardsVIPszKeyiReward)
            return 
iReward
        
}
    }
    
    if(
TrieKeyExists(g_tXPRewardsszKey))
    {
        
TrieGetCell(g_tXPRewardsszKeyiReward)
        return 
iReward
    
}
    
    return 
0
}

give_user_xp(const idiXPCRXRanks_XPSources:iSource CRXRANKS_XPS_PLUGIN)
{
    if(!
iXP)
        return

    if(
iSource == CRXRANKS_XPS_REWARD)
    {
        if(
g_eSettings[MINIMUM_PLAYERS] && get_playersnum() < g_eSettings[MINIMUM_PLAYERS])
            return;

        if(
g_eSettings[TEAM_LOCK] && get_user_team(id) != g_eSettings[TEAM_LOCK])
            return
    }
        
    static 
iReturn
    ExecuteForward
(g_fwdUserReceiveXPiReturnidiXPiSource)
    
    switch(
iReturn)
    {
        case 
CRXRANKS_HANDLED: return
        case 
CRXRANKS_CONTINUE: { }
        default:
        {
            if(
iReturn != 0)
                
iXP iReturn
        
}
    }
        
    
g_ePlayerData[id][XP] += iXP
    
    
if(g_ePlayerData[id][XP] < 0)
        
g_ePlayerData[id][XP] = 0
    
    
if(!check_level(idtrue))
        
update_hudinfo(id)
        
    if(
g_eSettings[XP_NOTIFIER_ENABLED])
    {
        static 
szKey[32], bool:bPositive
        bPositive 
iXP >= 0
        
        
if(bPositive)
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_GET")
        else
        {
            
copy(szKeycharsmax(szKey), "CRXRANKS_XP_NOTIFIER_LOSE")
            
iXP *= -1
        
}
            
        if(
g_eSettings[XP_NOTIFIER_USE_DHUD])
        {
            if(
bPositiveset_dhudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_dhudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
show_dhudmessage(id"%L"idszKeyiXP)
        }
        else
        {
            if(
bPositiveset_hudmessage(XP_NOTIFIER_PARAMS_GET)
            else 
set_hudmessage(XP_NOTIFIER_PARAMS_LOSE)                
            
ShowSyncHudMsg(idg_iObject[OBJ_XP_NOTIFIER], "%L"idszKeyiXP)
        }
    }            
}

get_user_saveinfo(const idszInfo[MAX_PLAYER_INFO_LENGTH], const iLen)
{
    switch(
g_eSettings[SAVE_TYPE])
    {
        case 
SAVE_NICKNAME:    get_user_name(idszInfoiLen)
        case 
SAVE_IPget_user_ip(idszInfoiLen1)
        case 
SAVE_STEAMIDget_user_authid(idszInfoiLen)
    }
}

reset_stats(const id)
{
    
g_ePlayerData[id][XP] = 0
    g_ePlayerData
[id][Level] = 0
    g_ePlayerData
[id][NextXP] = 0
    g_ePlayerData
[id][Rank][0] = EOS
    g_ePlayerData
[id][NextRank][0] = EOS
    g_ePlayerData
[id][HUDInfo][0] = EOS
    g_ePlayerData
[id][IsOnFinalLevel] = false
    g_ePlayerData
[id][IsVIP] = false
}

bool:has_argument(const szMessage[], const szArg[])
    return 
contain(szMessageszArg) != -1
    
bool
:should_skip(const iNum)
    return (
iNum != && !g_eSettings[USE_COMBINED_EVENTS])
    
send_message(const id, const bool:bLog, const szInput[], any:...)
{
    static 
szMessage[192]
    
vformat(szMessagecharsmax(szMessage), szInput4)
    
    
#if defined USE_CSTRIKE
    
bLog CC_LogMessage(id_szMessage) : CC_SendMessage(idszMessage)
    
#else
    
format(szMessagecharsmax(szMessage), "%s %s"CC_PREFIXszMessage)
    
client_print(idprint_chatszMessage)
    
    if(
bLog)
        
log_amx(szMessage)
    
#endif
}

update_hudinfo(const id)
{
    if(!
g_eSettings[HUDINFO_ENABLED])
        return
        
    static 
szMessage[MAX_HUDINFO_LENGTH], szPlaceHolder[32], bool:bIsOnFinal
    bIsOnFinal 
g_ePlayerData[id][IsOnFinalLevel]
    
copy(szMessagecharsmax(szMessage), g_eSettings[bIsOnFinal HUDINFO_FORMAT_FINAL HUDINFO_FORMAT])
    
    if(
has_argument(szMessageARG_CURRENT_XP))
    {
        
num_to_str(g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_CURRENT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_XP))
    {
        
num_to_str(g_ePlayerData[id][NextXP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_XPszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_XP_NEEDED))
    {
        
num_to_str(g_ePlayerData[id][NextXP] - g_ePlayerData[id][XP], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_XP_NEEDEDszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][Level], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_NEXT_LEVEL))
    {
        
num_to_str(g_ePlayerData[id][bIsOnFinal Level Level 1], szPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_LEVELszPlaceHolder)
    }
    
    if(
has_argument(szMessageARG_MAX_LEVELS))
        
replace_all(szMessagecharsmax(szMessage), ARG_MAX_LEVELSg_szMaxLevels)

    if(
has_argument(szMessageARG_NAME))
    {
        
get_user_name(idszPlaceHoldercharsmax(szPlaceHolder))
        
replace_all(szMessagecharsmax(szMessage), ARG_NAMEszPlaceHolder)
    }

    if(
has_argument(szMessageARG_CITY))
        
replace_all(szMessagecharsmax(szMessage), ARG_CITYszPlaceHolder)
    
    
replace_all(szMessagecharsmax(szMessage), ARG_RANKg_ePlayerData[id][Rank])
    
replace_all(szMessagecharsmax(szMessage), ARG_NEXT_RANKg_ePlayerData[id][NextRank])
    
replace_all(szMessagecharsmax(szMessage), ARG_LINE_BREAK"^n")
    
    
copy(g_ePlayerData[id][HUDInfo], charsmax(g_ePlayerData[][HUDInfo]), szMessage)
}

bool:check_level(const id, const bool:bNotify)
{
    static 
iLeveli
    iLevel 
0
    
    
for(1g_iMaxLevels 1i++)
    {
        if(
g_ePlayerData[id][XP] >= ArrayGetCell(g_aLevelsi))
            
iLevel++
    }
    
    if(
iLevel != g_ePlayerData[id][Level])
    {
        static 
bool:bLevelUpiReturn
        bLevelUp 
iLevel g_ePlayerData[id][Level]
        
g_ePlayerData[id][Level] = iLevel
        
        ExecuteForward
(g_fwdUserLevelUpdatediReturnidiLevelbLevelUp)
        
ArrayGetString(g_aRankNamesiLevelg_ePlayerData[id][Rank], charsmax(g_ePlayerData[][Rank]))
        
        if(
iLevel g_iMaxLevels)
        {
            
g_ePlayerData[id][IsOnFinalLevel] = false
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel 1)
            
ArrayGetString(g_aRankNamesiLevel 1g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]))
        }
        else
        {
            
g_ePlayerData[id][IsOnFinalLevel] = true
            g_ePlayerData
[id][NextXP] = ArrayGetCell(g_aLevelsiLevel)
            
copy(g_ePlayerData[id][NextRank], charsmax(g_ePlayerData[][NextRank]), g_eSettings[HUDINFO_INVALID_TEXT])
            
            if(
g_eSettings[FINAL_LEVEL_FLAGS])
            {
                
set_user_flags(idg_eSettings[FINAL_LEVEL_FLAGS])
                
remove_user_flags(idg_iFlagZ)
            }
        }
            
        if(
bNotify && g_eSettings[LEVELUP_MESSAGE_TYPE])
        {
            static 
szMessage[128], szName[32], bool:bGlobalMsg
            get_user_name
(idszNamecharsmax(szName))
            
bGlobalMsg g_eSettings[LEVELUP_MESSAGE_TYPE] == 2
            
            formatex
(szMessagecharsmax(szMessage), "%L"bGlobalMsg LANG_PLAYER id,\
            
bLevelUp "CRXRANKS_LEVEL_REACHED" "CRXRANKS_LEVEL_LOST"szNameg_ePlayerData[id][Level], g_ePlayerData[id][Rank])
            
send_message(bGlobalMsg idfalseszMessage)
            
            if(
bLevelUp && g_eSettings[LEVELUP_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELUP_SOUND], 1.0ATTN_NORM0PITCH_NORM)
            else if(!
bLevelUp && g_eSettings[LEVELDN_SOUND][0])
                
emit_sound(idCHAN_AUTOg_eSettings[LEVELDN_SOUND], 1.0ATTN_NORM0PITCH_NORM)
                
            if(
g_eSettings[bLevelUp LEVELUP_SCREEN_FADE_ENABLED LEVELDN_SCREEN_FADE_ENABLED])
            {
                
message_begin(MSG_ONEg_iScreenFade, {000}, id)
                
write_short(1<<10)
                
write_short(1<<10)
                
write_short(0x0000)
                
                if(
bLevelUp)
                {
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELUP_SCREEN_FADE_COLOR][3]))
                }
                else
                {
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][0]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][1]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][2]))
                    
write_byte(clr(g_eSettings[LEVELDN_SCREEN_FADE_COLOR][3]))
                }
                
                
message_end()
            }
        }
        
        
update_hudinfo(id)
        return 
true
    
}
    
    return 
false
}

public 
update_vip_status(id)
{
    if(
is_user_connected(id))
    {
        new 
szIP[16]
        
geoip_city(szIPg_ePlayerData[id][City], charsmax(g_ePlayerData[][City]))

        if(
g_eSettings[VIP_FLAGS_BIT] != ADMIN_ALL)
            
g_ePlayerData[id][IsVIP] = bool:((get_user_flags(id) & g_eSettings[VIP_FLAGS_BIT]) == g_eSettings[VIP_FLAGS_BIT])
    }
}

public 
plugin_natives()
{
    
register_library("crxranks")
    
register_native("crxranks_get_chat_prefix",         "_crxranks_get_chat_prefix")
    
register_native("crxranks_get_final_flags",         "_crxranks_get_final_flags")
    
register_native("crxranks_get_hudinfo_format",         "_crxranks_get_hudinfo_format")
    
register_native("crxranks_get_max_levels",             "_crxranks_get_max_levels")
    
register_native("crxranks_get_rank_by_level",         "_crxranks_get_rank_by_level")
    
register_native("crxranks_get_save_type",             "_crxranks_get_save_type")
    
register_native("crxranks_get_user_hudinfo",         "_crxranks_get_user_hudinfo")
    
register_native("crxranks_get_user_level",             "_crxranks_get_user_level")
    
register_native("crxranks_get_user_next_rank",         "_crxranks_get_user_next_rank")
    
register_native("crxranks_get_user_next_xp",         "_crxranks_get_user_next_xp")
    
register_native("crxranks_get_user_rank",             "_crxranks_get_user_rank")
    
register_native("crxranks_get_user_xp",             "_crxranks_get_user_xp")
    
register_native("crxranks_get_vault_name",             "_crxranks_get_vault_name")
    
register_native("crxranks_get_vip_flags",             "_crxranks_get_vip_flags")
    
register_native("crxranks_get_xp_for_level",         "_crxranks_get_xp_for_level")
    
register_native("crxranks_get_xp_reward",             "_crxranks_get_xp_reward")
    
register_native("crxranks_give_user_xp",             "_crxranks_give_user_xp")
    
register_native("crxranks_hi_is_using_dhud",        "_crxranks_hi_is_using_dhud")
    
register_native("crxranks_is_hud_enabled",             "_crxranks_is_hud_enabled")
    
register_native("crxranks_is_sfdn_enabled",         "_crxranks_is_sfdn_enabled")
    
register_native("crxranks_is_sfup_enabled",         "_crxranks_is_sfup_enabled")
    
register_native("crxranks_is_user_on_final",         "_crxranks_is_user_on_final")
    
register_native("crxranks_is_user_vip",                "_crxranks_is_user_vip")
    
register_native("crxranks_is_xpn_enabled",             "_crxranks_is_xpn_enabled")
    
register_native("crxranks_using_comb_events",        "_crxranks_using_comb_events")
    
register_native("crxranks_xpn_is_using_dhud",        "_crxranks_xpn_is_using_dhud")
}

public 
_crxranks_get_chat_prefix(iPluginiParams)
    
set_string(1CC_PREFIXget_param(2))

public 
_crxranks_get_final_flags(iPluginiParams)
{
    
set_string(1g_eSettings[FINAL_LEVEL_FLAGS], get_param(2))
    return 
g_eSettings[FINAL_LEVEL_FLAGS_BIT]
}

public 
_crxranks_get_hudinfo_format(iPluginiParams)
    
set_string(2g_eSettings[get_param(1) ? HUDINFO_FORMAT_FINAL HUDINFO_FORMAT], get_param(3))
    
public 
_crxranks_get_max_levels(iPluginiParams)
    return 
g_iMaxLevels
    
public _crxranks_get_rank_by_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return 
0
        
    
static szRank[MAX_RANK_LENGTH]
    
ArrayGetString(g_aRankNamesiLevelszRankcharsmax(szRank))
    
set_string(2szRankget_param(3))
    return 
1
}

public 
_crxranks_get_save_type(iPluginiParams)
    return 
g_eSettings[SAVE_TYPE]

public 
_crxranks_get_user_hudinfo(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][HUDInfo], get_param(3))
    
public 
_crxranks_get_user_level(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][Level]
    
public 
_crxranks_get_user_next_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][NextRank], get_param(3))
    
public 
_crxranks_get_user_next_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][NextXP]    
    
public 
_crxranks_get_user_rank(iPluginiParams)
    
set_string(2g_ePlayerData[get_param(1)][Rank], get_param(3))
    
public 
_crxranks_get_user_xp(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][XP]
    
public 
_crxranks_get_vault_name(iPluginiParams)
    
set_string(1g_eSettings[VAULT_NAME], get_param(2))
    
public 
_crxranks_get_vip_flags(iPluginiParams)
{
    
set_string(1g_eSettings[VIP_FLAGS], get_param(2))
    return 
g_eSettings[VIP_FLAGS_BIT]
}
    
public 
_crxranks_get_xp_for_level(iPluginiParams)
{
    static 
iLevel
    iLevel 
get_param(1)
    
    if(
iLevel || iLevel g_iMaxLevels)
        return -
1
        
    
return ArrayGetCell(g_aLevelsiLevel)
}

public 
_crxranks_get_xp_reward(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH]
    
get_string(2szRewardcharsmax(szReward))
    return 
get_xp_reward(get_param(1), szReward)
}
    
public 
_crxranks_give_user_xp(iPluginiParams)
{
    static 
szReward[MAX_XP_REWARD_LENGTH], iRewardid
    szReward
[0] = EOS
    get_string
(3szRewardcharsmax(szReward))
    
id get_param(1)
    
    if(
szReward[0])
    {
        
iReward get_xp_reward(idszReward)
        
        if(
iReward)
            
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
            
        return 
iReward
    
}
    
    
iReward get_param(2)
    
give_user_xp(idiRewardCRXRanks_XPSources:get_param(3))
    return 
iReward
}

public 
bool:_crxranks_hi_is_using_dhud(iPluginiParams)
    return 
g_eSettings[HUDINFO_USE_DHUD]

public 
bool:_crxranks_is_hud_enabled(iPluginiParams)
    return 
g_eSettings[HUDINFO_ENABLED]
    
public 
bool:_crxranks_is_sfdn_enabled(iPluginiParams)
    return 
g_eSettings[LEVELDN_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_sfup_enabled(iPluginiParams)
    return 
g_eSettings[LEVELUP_SCREEN_FADE_ENABLED]

public 
bool:_crxranks_is_user_on_final(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsOnFinalLevel]
    
public 
bool:_crxranks_is_user_vip(iPluginiParams)
    return 
g_ePlayerData[get_param(1)][IsVIP]
    
public 
bool:_crxranks_is_xpn_enabled(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_ENABLED]
    
public 
bool:_crxranks_using_comb_events(iPluginiParams)
    return 
g_eSettings[USE_COMBINED_EVENTS]
    
public 
bool:_crxranks_xpn_is_using_dhud(iPluginiParams)
    return 
g_eSettings[XP_NOTIFIER_USE_DHUD
What do you mean by "HUD of online players"?
so, i tried your modification, added on config:
PHP Code:
HUDINFO_FORMAT = [ XP$current_xp$/$next_xp$ | Level $level$/$max_levels$: $rank$ | City$city$ ] 
and City: is showing as numbers: 1, 2, 3 ,4 5 and so on

strange because i'm using this other plugin on player connect and it's working fine

PHP Code:
#include amxmodx
#include geoip

public client_putinserver(id)
{
    new 
name[32], ip[32], country[32], city[32];
    
    
get_user_name(idnamecharsmax(name));
    
get_user_ip(idipcharsmax(ip), 1);
    
    
geoip_country_ex(ipcountrycharsmax (country))
    
geoip_city(ipcitycharsmax(city))
    
    
client_print_color(0print_team_default"^3%s^4 conectou de ^1[^3%s^1] [^4%s^1]"namecountrycity);
    

would be great if we could separate HUD info between alive and dead, show more details when spectating like
HUDINFO_FORMAT = [ XP: $current_xp$/$next_xp$ | Level $level$ | Rank: $rank$ ]
HUDINFO_FORMAT_DEAD = [ XP: $current_xp$/$next_xp$ | Level $level$/$max_levels$:$br$ Rank: $rank$ | Next: $next_rank$ | City: $city$ ]
tarsisd2 is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 08-15-2018 , 11:25   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #64

My bad, I forgot one line in the code. I fixed it in the post above.

About showing all the ranks - I'll add a command to show all the rank names in a menu. Not sure if I'll add it in the main plugin or release it as a sub-plugin.

I don't think there's need to overcomplicate the plugin by adding separate HUD infos for dead and alive players. I doubt that many people will find a use for this, it will rather be a downside having to change 2 separate settings if you want them to be the same all the time. I won't do this. If you want it only on spawn time, better make it show only for dead players - those 2/3 seconds of buytime won't make a huge difference.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 08-15-2018 , 11:49   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #65

Here's a plugin for showing all the ranks. The command is /ranklist

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <crxranks>

new g_iTotalRanks

public plugin_init()
{
    
register_plugin("CRXRanks: Rank List""1.0""OciXCrom")
    
register_clcmd("say /ranklist""Cmd_RankList"ADMIN_ALL)
    
register_clcmd("say_team /ranklist""Cmd_RankList"ADMIN_ALL)
    
g_iTotalRanks crxranks_get_max_levels()
}

public 
Cmd_RankList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED

    
new iMenu menu_create("\rOciXCrom's \yRank System: \rRank List""RankList_Handler")

    for(new 
szItem[64], iXP1g_iTotalRanksi++)
    {
        
iXP crxranks_get_xp_for_level(i)
        
crxranks_get_rank_by_level(iszItemcharsmax(szItem))
        
format(szItemcharsmax(szItem), "\y#%i \w%s \r[%i XP]"iszItemiXP)
        
menu_additem(iMenuszItem)
    }

    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
RankList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED

__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
tarsisd2
Veteran Member
Join Date: Feb 2016
Location: brazil
Old 08-15-2018 , 12:50   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #66

Quote:
Originally Posted by OciXCrom View Post
Here's a plugin for showing all the ranks. The command is /ranklist

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <crxranks>

new g_iTotalRanks

public plugin_init()
{
    
register_plugin("CRXRanks: Rank List""1.0""OciXCrom")
    
register_clcmd("say /ranklist""Cmd_RankList"ADMIN_ALL)
    
register_clcmd("say_team /ranklist""Cmd_RankList"ADMIN_ALL)
    
g_iTotalRanks crxranks_get_max_levels()
}

public 
Cmd_RankList(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED

    
new iMenu menu_create("\rOciXCrom's \yRank System: \rRank List""RankList_Handler")

    for(new 
szItem[64], iXP1g_iTotalRanksi++)
    {
        
iXP crxranks_get_xp_for_level(i)
        
crxranks_get_rank_by_level(iszItemcharsmax(szItem))
        
format(szItemcharsmax(szItem), "\y#%i \w%s \r[%i XP]"iszItemiXP)
        
menu_additem(iMenuszItem)
    }

    
menu_display(idiMenu)
    return 
PLUGIN_HANDLED
}

public 
RankList_Handler(idiMenuiItem)
{
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED

thanks very much

Quote:
If you want it only on spawn time, better make it show only for dead players - those 2/3 seconds of buytime won't make a huge difference.
i understand your point of view, i didn't have this idea, i saw in some server and liked, per example, in my server i have 25 seconds of buy time, so the players can see the xp and levels or rank, then he can play with clear screen the rest of the round!
tarsisd2 is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 08-15-2018 , 13:42   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #67

What you can do is disable the HUD info for alive players and use a separate plugin that will show it only during buytime. I can make such a sub-plugin if you need it.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
tarsisd2
Veteran Member
Join Date: Feb 2016
Location: brazil
Old 08-15-2018 , 14:16   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #68

Quote:
Originally Posted by OciXCrom View Post
What you can do is disable the HUD info for alive players and use a separate plugin that will show it only during buytime. I can make such a sub-plugin if you need it.
this would be great, thanks
tarsisd2 is offline
tarsisd2
Veteran Member
Join Date: Feb 2016
Location: brazil
Old 08-15-2018 , 19:57   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #69

PHP Code:
[PHP]My badI forgot one line in the codeI fixed it in the post above
[/PHP]

i updated the code, compiled but still showing city as numbers
tarsisd2 is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 08-16-2018 , 13:28   Re: OciXCrom's Rank System [XP|Levels|Ranks]
Reply With Quote #70

My bad x2, another line was messed up. It should work now.

PS: editing the main plugin is bad idea since you will lose all the changes when I release an update for the plugin (which I already did, a small bugfix). I'll probably add a way to add custom placeholders via sub-plugins in the next update so you won't need to do this again.

PS #2: The guy who requested showing info when aiming at a player, you can find the sub-plugin here.
__________________

Last edited by OciXCrom; 08-16-2018 at 13:28.
OciXCrom is offline
Send a message via Skype™ to OciXCrom
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 23:57.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode