Right way to set Max-XPs in Level-System

Helping Topics
Post Reply
User avatar
Mark
VIP
VIP
United States of America
Posts: 283
Joined: 5 years ago
Location: Des Moines/USA
Contact:

#11

Post by Mark » 5 years ago

czirimbolo wrote: 5 years ago Raheem, can you help me? Here is my level system

Code: Select all

#include <zombie_escape>
 
// Defines
#define MAX_LEVEL 50
#define MAX_XP 5000000
#define TASK_SHOWHUD 2020
#define TASK_DOUBLE 1133
#define REPEAT_TIME 60.0
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/ze_levelup.wav"
 
// Constants
new const g_szLevelsVault[] = "Levels"
new const g_szRanksVault[] = "Ranks"
 
// Messages
const Float:HUD_SPECT_X = -1.0
const Float:HUD_SPECT_Y = 0.70
const Float:HUD_STATS_X = -1.0
const Float:HUD_STATS_Y = 0.90
 
const HUD_STATS_ZOMBIE_R = 200
const HUD_STATS_ZOMBIE_G = 220
const HUD_STATS_ZOMBIE_B = 0
 
const HUD_STATS_HUMAN_R = 0
const HUD_STATS_HUMAN_G = 200
const HUD_STATS_HUMAN_B = 210
 
const HUD_STATS_SPEC_R = 100
const HUD_STATS_SPEC_G = 100
const HUD_STATS_SPEC_B = 100
 
// Variables
new g_iLevel[33],
    g_iXP[33],
    g_iMaxXP[33],
    Float:g_fDamage[33],
    g_MsgSync,
    g_iLevelsVaultHandle,
    g_iRanksVaultHandle,
    bool:g_bIsDoubleHours
 
// Cvars
new g_pCvarZombieInfect,
    g_pCvarEscapeSuccess,
    g_pCvarEnableDamage,
    g_pCvarRequiredDamage,
    g_pCvarDamageAward,
    g_pCvarStartXP,
    g_pCvarMaxXPFirstLevel,
    g_pCvarPercentageStyle,
    g_pCvarStartFromZero,
    g_pCvarAddCommas,
    g_pCvarLevelEffects,
    g_pCvarDoubleXP
 
public plugin_natives()
{
    register_native("ze_get_user_xp", "native_ze_get_user_xp", 1)
    register_native("ze_set_user_xp", "native_ze_set_user_xp", 1)
    register_native("ze_get_user_level", "native_ze_get_user_level", 1)
    register_native("ze_set_user_level", "native_ze_set_user_level", 1)
    register_native("ze_get_user_max_xp", "native_ze_get_user_max_xp", 1)
    register_native("ze_set_user_max_xp", "native_ze_set_user_max_xp", 1)
}
 
public plugin_precache()
{
    precache_sound(LEVELUP)
}
 
public plugin_init()
{
    register_plugin("[ZE] Level-XP System", "1.8", "Raheem/JaCk")
   
    // Hook Chains
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
   
    // Cvars
    g_pCvarZombieInfect = register_cvar("ze_zombie_infect", "3")
    g_pCvarEscapeSuccess = register_cvar("ze_escape_success", "5")
    g_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
    g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
    g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
    g_pCvarStartXP = register_cvar("ze_start_xp", "50")
    g_pCvarMaxXPFirstLevel = register_cvar("ze_max_xp_first_level", "100")
    g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "1")
    g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
    g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "1")
    g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "1")
    g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12")
   
    // Messages
    g_MsgSync = CreateHudSyncObj()
}
 
public client_putinserver(id)
{
    if(is_user_hltv(id) || is_user_bot(id))
        return
   
    // Just 1 second delay
    set_task(1.0, "DelayLoad", id)
 
    // Other tasks
    set_task(1.0, "Show_Hud", id+TASK_SHOWHUD, _, _, "b")
    set_task(0.1, "Check_MaxXP", id, _, _, "b")
   
    // Message task
    DoubleHours()
   
    if (g_bIsDoubleHours)
    {
        set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b")
    }
}
 
public HappyHours(taskid)
{
    new id = taskid - TASK_DOUBLE
   
    DoubleHours()
   
    if (!g_bIsDoubleHours)
        remove_task(taskid)
   
    new szDoubleHours[32]
   
    get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
   
    set_dhudmessage(0, 255, 0, -1.0, 0.5, 0, 0.0, 10.0)
    show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours)
}
 
public DelayLoad(id)
{
    // Load his data
    LoadData(id)
}
 
public client_disconnected(id)
{
    if(is_user_hltv(id) || is_user_bot(id))
        return
       
    remove_task(id+TASK_SHOWHUD)
    remove_task(id)
}
 
public Check_MaxXP(id)
{
    new iCurrentMaxXP = g_iMaxXP[id]
   
    new iMaxXP = get_pcvar_num(g_pCvarMaxXPFirstLevel)
   
    if (g_iLevel[id] >= 0 && g_iLevel[id] < 10)
    {
        for (new i = 1; i <= g_iLevel[id]; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.55)
        }
    }
   
    if (g_iLevel[id] >= 10 && g_iLevel[id] < 25)
    {
        for (new i = 1; i < 10; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.55)
        }
       
        for (new i = 10; i <= g_iLevel[id]; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.28)
        }
    }
   
    if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50)
    {
        for (new i = 1; i < 40; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.28)
        }
       
        for (new i = 20; i < g_iLevel[id]; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.04)
        }
       
        for (new i = 40; i <= g_iLevel[id]; i++)
        {
            iMaxXP = floatround(float(iMaxXP) * 1.04)
        }
    }
   
    if (iCurrentMaxXP != iMaxXP)
    {
        g_iMaxXP[id] = iMaxXP
    }
}
 
public Show_Hud(taskid)
{  
    new iPlayer = ID_SHOWHUD
   
    if (!is_user_alive(iPlayer))
    {
        iPlayer = pev(iPlayer, pev_iuser2)
       
        if (!is_user_alive(iPlayer))
            return
    }
   
    if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
    {
        if(iPlayer != ID_SHOWHUD)
        {
            set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
            ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
        }
        else if (ze_is_user_zombie(iPlayer))
        {
            set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
            ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
        }
        else
        {
            set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
            ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
        }
    }
    else
    {
        if(iPlayer != ID_SHOWHUD)
        {
            if (get_pcvar_num(g_pCvarAddCommas) == 1)
            {
                new szSpecXP[15], szSpecMaxXP[15]
               
                AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
                AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
               
                set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
            }
            else
            {
                set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
            }  
        }
        else if (ze_is_user_zombie(iPlayer))
        {
            if (get_pcvar_num(g_pCvarAddCommas) == 1)
            {
                new szZombieXP[15], szZombieMaxXP[15]
               
                AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
                AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
               
                set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
            }
            else
            {
                set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
            }
        }
        else
        {
            if (get_pcvar_num(g_pCvarAddCommas) == 1)
            {
                new szHumanXP[15], szHumanMaxXP[15]
               
                AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
                AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
               
                set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
            }
            else
            {
                set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
                ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
            }
        }
    }
}
 
public ze_roundend(WinTeam)
{
    if (WinTeam == ZE_TEAM_HUMAN)
    {
        for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
        {
            if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST)
                continue
           
            g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
            SaveData(id)
            Check_User_Level(id)
        }
    }
   
    remove_task(TASK_SHOWHUD)
}
 
public Check_User_Level(id)
{
    if(!is_user_connected(id))
        return
 
    if(g_iXP[id] >= g_iMaxXP[id])
    {
        if (get_pcvar_num(g_pCvarStartFromZero) == 1)
        {
            g_iXP[id] = 0
        }
       
        new szName[32]
        g_iLevel[id] ++
       
        if (g_iLevel[id] >= 0 && g_iLevel[id] < 10)
        {
            g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.55)
        }
        else if (g_iLevel[id] >= 10 && g_iLevel[id] < 25)
        {
            g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.28)
        }
		else if (g_iLevel[id] >= 25 && g_iLevel[id] < 40)
        {
            g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.04)
        }
        else if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50) // 50 is our max
        {
            g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.02)
        }
       
        get_user_name(id, szName, charsmax(szName))
        ze_colored_print(0, "!g%s !tNow in Level %i!y!", szName, g_iLevel[id])
       
        SaveData(id)
       
        PlaySound(id, LEVELUP)
       
        if (get_pcvar_num(g_pCvarLevelEffects) != 0)
        {
            // Screen Fade
            message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
            write_short(4096*2)
            write_short(4096*5)
            write_short(0x0001)
            write_byte(random(256))
            write_byte(random(256))
            write_byte(random(256))
            write_byte(150)
            message_end()
           
            // Screen Shake
            message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, id)
            write_short(255<<14)
            write_short(10<<14)
            write_short(255<<14)
            message_end()
        }
    }
}
 
public ze_user_infected(iVictim, iInfector)
{
    if (iInfector == 0)
        return
   
    g_iXP[iInfector] += get_pcvar_num(g_pCvarZombieInfect)
    SaveData(iInfector)
    Check_User_Level(iInfector)
}
 
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
    // Player Damage Himself
    if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_user_zombie(iAttacker) || !get_pcvar_num(g_pCvarEnableDamage))
        return HC_CONTINUE
   
    // Same Team?
    if (get_member(iAttacker, m_iTeam) == get_member(iVictim, m_iTeam))
        return HC_CONTINUE
   
    // Store Damage For every Player
    g_fDamage[iAttacker] += fDamage
   
    // Damage Calculator Equal or Higher than needed damage
    if (g_fDamage[iAttacker] >= get_pcvar_float(g_pCvarRequiredDamage))
    {
        // Give Player The Coins
        g_iXP[iAttacker] += get_pcvar_num(g_pCvarDamageAward)
        SaveData(iAttacker)
        Check_User_Level(iAttacker)
       
        // Rest The Damage Calculator
        g_fDamage[iAttacker] = 0.0
    }
    return HC_CONTINUE
}
 
public SaveData(id)
{
    new szAuthID[35], szName[32]
    get_user_authid(id, szAuthID, charsmax(szAuthID))
    get_user_name(id, szName, charsmax(szName))
   
    // Set Him to max if he Higher than Max Value
    if(g_iLevel[id] > MAX_LEVEL)
    {
        g_iLevel[id] = MAX_LEVEL
    }
   
    if(g_iXP[id] > MAX_XP)
    {
        g_iXP[id] = MAX_XP
    }
   
    new szData[256]
    formatex(szData , charsmax(szData), "%i %i %i", g_iLevel[id], g_iXP[id], g_iMaxXP[id])
   
    // Open the Vaults
    g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
    g_iRanksVaultHandle = nvault_open(g_szRanksVault)
 
    // Saves His Data
    nvault_set(g_iLevelsVaultHandle, szAuthID, szData)
    nvault_set(g_iRanksVaultHandle, szAuthID, szName)
   
    // Close Vaults
    nvault_close(g_iLevelsVaultHandle)
    nvault_close(g_iRanksVaultHandle)
}
 
public LoadData(id)
{
    new szData[256], szAuthID[35], szName[32]
   
    get_user_authid(id, szAuthID, charsmax(szAuthID))
    get_user_name(id, szName, charsmax(szName))
   
    // Useless Variable
    new iTimestamp, iExists
   
    // Open the Vault
    g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
   
    iExists = nvault_lookup(g_iLevelsVaultHandle, szAuthID, szData, charsmax(szData), iTimestamp)
   
    // Close Vault
    nvault_close(g_iLevelsVaultHandle)
   
    if (!iExists)
    {
        g_iLevel[id] = 0
        g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
        g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
        SaveData(id)
    }
    else
    {
        new iLevel[32], iXP[32], iMaxLevel[32]
        parse(szData, iLevel, 31, iXP, 31, iMaxLevel, 31)
       
        g_iLevel[id] = str_to_num(iLevel)
        g_iXP[id] = str_to_num(iXP)
        g_iMaxXP[id] = str_to_num(iMaxLevel)
    }
}
 
public native_ze_get_user_xp(id)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    return g_iXP[id]
}
 
public native_ze_set_user_xp(id, amount)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    DoubleHours()
   
    new iAddedAmount = amount - g_iXP[id]
   
    if (g_bIsDoubleHours)
    {
        g_iXP[id] = g_iXP[id] + (iAddedAmount * 2)
    }
    else
    {
        g_iXP[id] = amount
    }
   
    Check_User_Level(id)
    SaveData(id)
    return true;
}
 
public native_ze_get_user_level(id)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    return g_iLevel[id]
}
 
public native_ze_set_user_level(id, amount)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    g_iLevel[id] = amount
   
    if (get_pcvar_num(g_pCvarStartFromZero) == 1)
    {
        g_iXP[id] = 0
    }
   
    SaveData(id)
   
    return true;
}
 
public native_ze_get_user_max_xp(id)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    return g_iMaxXP[id]
}
 
public native_ze_set_user_max_xp(id, amount)
{
    if(!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
        return false;
    }
   
    g_iMaxXP[id] = amount
   
    SaveData(id)
   
    return true;
}
 
stock DoubleHours()
{
    new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32]
    get_time("%H", szTime, charsmax(szTime))
   
    get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
   
    for (new ch = 0; ch <= charsmax(szDoubleHours); ch++)
    {
        if (szDoubleHours[ch] == '-')
            szDoubleHours[ch] = ' '
    }
   
    parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End))
   
    new iTime, iDoubleHourStart, iDoubleHourEnd
   
    iTime = str_to_num(szTime)
    iDoubleHourStart = str_to_num(szDoubleHours_Start)
    iDoubleHourEnd = str_to_num(szDoubleHours_End)
   
    if(iDoubleHourEnd > iTime >= iDoubleHourStart)
    {
        g_bIsDoubleHours = true
    }
    else
    {
        g_bIsDoubleHours = false
    }
}
I would like this:

Code: Select all

1,55 factor  1 to 10 level
1,28 factor  10 to 25 level
1,04 factor 25 to 40
1,02  facotr  40 to 50
I messed up public Check_MaxXP(id)
++++++>>>>>
  1. #include <zombie_escape>
  2.  
  3. // Defines
  4. #define MAX_LEVEL 50
  5. #define MAX_XP 5000000
  6. #define TASK_SHOWHUD 2020
  7. #define TASK_DOUBLE 1133
  8. #define REPEAT_TIME 60.0
  9. #define ID_SHOWHUD (taskid - TASK_SHOWHUD)
  10. #define LEVELUP "levelup_ZE/ze_levelup.wav"
  11.  
  12. // Constants
  13. new const g_szLevelsVault[] = "Levels"
  14. new const g_szRanksVault[] = "Ranks"
  15.  
  16. // Messages
  17. const Float:HUD_SPECT_X = -1.0
  18. const Float:HUD_SPECT_Y = 0.70
  19. const Float:HUD_STATS_X = -1.0
  20. const Float:HUD_STATS_Y = 0.90
  21.  
  22. const HUD_STATS_ZOMBIE_R = 200
  23. const HUD_STATS_ZOMBIE_G = 220
  24. const HUD_STATS_ZOMBIE_B = 0
  25.  
  26. const HUD_STATS_HUMAN_R = 0
  27. const HUD_STATS_HUMAN_G = 200
  28. const HUD_STATS_HUMAN_B = 210
  29.  
  30. const HUD_STATS_SPEC_R = 100
  31. const HUD_STATS_SPEC_G = 100
  32. const HUD_STATS_SPEC_B = 100
  33.  
  34. // Variables
  35. new g_iLevel[33],
  36.     g_iXP[33],
  37.     g_iMaxXP[33],
  38.     Float:g_fDamage[33],
  39.     g_MsgSync,
  40.     g_iLevelsVaultHandle,
  41.     g_iRanksVaultHandle,
  42.     bool:g_bIsDoubleHours
  43.  
  44. // Cvars
  45. new g_pCvarZombieInfect,
  46.     g_pCvarEscapeSuccess,
  47.     g_pCvarEnableDamage,
  48.     g_pCvarRequiredDamage,
  49.     g_pCvarDamageAward,
  50.     g_pCvarStartXP,
  51.     g_pCvarMaxXPFirstLevel,
  52.     g_pCvarPercentageStyle,
  53.     g_pCvarStartFromZero,
  54.     g_pCvarAddCommas,
  55.     g_pCvarLevelEffects,
  56.     g_pCvarDoubleXP
  57.  
  58. public plugin_natives()
  59. {
  60.     register_native("ze_get_user_xp", "native_ze_get_user_xp", 1)
  61.     register_native("ze_set_user_xp", "native_ze_set_user_xp", 1)
  62.     register_native("ze_get_user_level", "native_ze_get_user_level", 1)
  63.     register_native("ze_set_user_level", "native_ze_set_user_level", 1)
  64.     register_native("ze_get_user_max_xp", "native_ze_get_user_max_xp", 1)
  65.     register_native("ze_set_user_max_xp", "native_ze_set_user_max_xp", 1)
  66. }
  67.  
  68. public plugin_precache()
  69. {
  70.     precache_sound(LEVELUP)
  71. }
  72.  
  73. public plugin_init()
  74. {
  75.     register_plugin("[ZE] Level-XP System", "1.8", "Raheem/JaCk")
  76.    
  77.     // Hook Chains
  78.     RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
  79.    
  80.     // Cvars
  81.     g_pCvarZombieInfect = register_cvar("ze_zombie_infect", "3")
  82.     g_pCvarEscapeSuccess = register_cvar("ze_escape_success", "5")
  83.     g_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
  84.     g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
  85.     g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
  86.     g_pCvarStartXP = register_cvar("ze_start_xp", "50")
  87.     g_pCvarMaxXPFirstLevel = register_cvar("ze_max_xp_first_level", "100")
  88.     g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "1")
  89.     g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
  90.     g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "1")
  91.     g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "1")
  92.     g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12")
  93.    
  94.     // Messages
  95.     g_MsgSync = CreateHudSyncObj()
  96. }
  97.  
  98. public client_putinserver(id)
  99. {
  100.     if(is_user_hltv(id) || is_user_bot(id))
  101.         return
  102.    
  103.     // Just 1 second delay
  104.     set_task(1.0, "DelayLoad", id)
  105.  
  106.     // Other tasks
  107.     set_task(1.0, "Show_Hud", id+TASK_SHOWHUD, _, _, "b")
  108.     set_task(0.1, "Check_MaxXP", id, _, _, "b")
  109.    
  110.     // Message task
  111.     DoubleHours()
  112.    
  113.     if (g_bIsDoubleHours)
  114.     {
  115.         set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b")
  116.     }
  117. }
  118.  
  119. public HappyHours(taskid)
  120. {
  121.     new id = taskid - TASK_DOUBLE
  122.    
  123.     DoubleHours()
  124.    
  125.     if (!g_bIsDoubleHours)
  126.         remove_task(taskid)
  127.    
  128.     new szDoubleHours[32]
  129.    
  130.     get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
  131.    
  132.     set_dhudmessage(0, 255, 0, -1.0, 0.5, 0, 0.0, 10.0)
  133.     show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours)
  134. }
  135.  
  136. public DelayLoad(id)
  137. {
  138.     // Load his data
  139.     LoadData(id)
  140. }
  141.  
  142. public client_disconnected(id)
  143. {
  144.     if(is_user_hltv(id) || is_user_bot(id))
  145.         return
  146.        
  147.     remove_task(id+TASK_SHOWHUD)
  148.     remove_task(id)
  149. }
  150.  
  151. public Check_MaxXP(id)
  152. {
  153.     new iCurrentMaxXP = g_iMaxXP[id]
  154.    
  155.     new iMaxXP = get_pcvar_num(g_pCvarMaxXPFirstLevel)
  156.    
  157.     if (g_iLevel[id] >= 0 && g_iLevel[id] < 10)
  158.     {
  159.         for (new i = 1; i <= g_iLevel[id]; i++)
  160.         {
  161.             iMaxXP = floatround(float(iMaxXP) * 1.55)
  162.         }
  163.     }
  164.    
  165.     if (g_iLevel[id] >= 10 && g_iLevel[id] < 25)
  166.     {
  167.         for (new i = 1; i <= g_iLevel[id]; i++)
  168.         {
  169.             iMaxXP = floatround(float(iMaxXP) * 1.28)
  170.         }
  171.     }
  172.    
  173.     if (g_iLevel[id] >= 25 && g_iLevel[id] <= 40)
  174.     {
  175.         for (new i = 1; i <= g_iLevel[id]; i++)
  176.         {
  177.             iMaxXP = floatround(float(iMaxXP) * 1.04)
  178.         }
  179.     }
  180.  
  181.     if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50)
  182.     {
  183.         for (new i = 1; i <= g_iLevel[id]; i++)
  184.         {
  185.             iMaxXP = floatround(float(iMaxXP) * 1.02)
  186.         }
  187.     }
  188.    
  189.     if (iCurrentMaxXP != iMaxXP)
  190.     {
  191.         g_iMaxXP[id] = iMaxXP
  192.     }
  193. }
  194.  
  195. public Show_Hud(taskid)
  196. {  
  197.     new iPlayer = ID_SHOWHUD
  198.    
  199.     if (!is_user_alive(iPlayer))
  200.     {
  201.         iPlayer = pev(iPlayer, pev_iuser2)
  202.        
  203.         if (!is_user_alive(iPlayer))
  204.             return
  205.     }
  206.    
  207.     if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
  208.     {
  209.         if(iPlayer != ID_SHOWHUD)
  210.         {
  211.             set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  212.             ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
  213.         }
  214.         else if (ze_is_user_zombie(iPlayer))
  215.         {
  216.             set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  217.             ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
  218.         }
  219.         else
  220.         {
  221.             set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  222.             ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
  223.         }
  224.     }
  225.     else
  226.     {
  227.         if(iPlayer != ID_SHOWHUD)
  228.         {
  229.             if (get_pcvar_num(g_pCvarAddCommas) == 1)
  230.             {
  231.                 new szSpecXP[15], szSpecMaxXP[15]
  232.                
  233.                 AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
  234.                 AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
  235.                
  236.                 set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  237.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
  238.             }
  239.             else
  240.             {
  241.                 set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  242.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
  243.             }  
  244.         }
  245.         else if (ze_is_user_zombie(iPlayer))
  246.         {
  247.             if (get_pcvar_num(g_pCvarAddCommas) == 1)
  248.             {
  249.                 new szZombieXP[15], szZombieMaxXP[15]
  250.                
  251.                 AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
  252.                 AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
  253.                
  254.                 set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  255.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
  256.             }
  257.             else
  258.             {
  259.                 set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  260.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
  261.             }
  262.         }
  263.         else
  264.         {
  265.             if (get_pcvar_num(g_pCvarAddCommas) == 1)
  266.             {
  267.                 new szHumanXP[15], szHumanMaxXP[15]
  268.                
  269.                 AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
  270.                 AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
  271.                
  272.                 set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  273.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
  274.             }
  275.             else
  276.             {
  277.                 set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
  278.                 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
  279.             }
  280.         }
  281.     }
  282. }
  283.  
  284. public ze_roundend(WinTeam)
  285. {
  286.     if (WinTeam == ZE_TEAM_HUMAN)
  287.     {
  288.         for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
  289.         {
  290.             if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST)
  291.                 continue
  292.            
  293.             g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
  294.             SaveData(id)
  295.             Check_User_Level(id)
  296.         }
  297.     }
  298.    
  299.     remove_task(TASK_SHOWHUD)
  300. }
  301.  
  302. public Check_User_Level(id)
  303. {
  304.     if(!is_user_connected(id))
  305.         return
  306.  
  307.     if(g_iXP[id] >= g_iMaxXP[id])
  308.     {
  309.         if (get_pcvar_num(g_pCvarStartFromZero) == 1)
  310.         {
  311.             g_iXP[id] = 0
  312.         }
  313.        
  314.         new szName[32]
  315.         g_iLevel[id] ++
  316.        
  317.         if (g_iLevel[id] >= 0 && g_iLevel[id] < 10)
  318.         {
  319.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.55)
  320.         }
  321.         else if (g_iLevel[id] >= 10 && g_iLevel[id] < 25)
  322.         {
  323.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.28)
  324.         }
  325.         else if (g_iLevel[id] >= 25 && g_iLevel[id] < 40)
  326.         {
  327.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.04)
  328.         }
  329.         else if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50) // 50 is our max
  330.         {
  331.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.02)
  332.         }
  333.        
  334.         get_user_name(id, szName, charsmax(szName))
  335.         ze_colored_print(0, "!g%s !tNow in Level %i!y!", szName, g_iLevel[id])
  336.        
  337.         SaveData(id)
  338.        
  339.         PlaySound(id, LEVELUP)
  340.        
  341.         if (get_pcvar_num(g_pCvarLevelEffects) != 0)
  342.         {
  343.             // Screen Fade
  344.             message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
  345.             write_short(4096*2)
  346.             write_short(4096*5)
  347.             write_short(0x0001)
  348.             write_byte(random(256))
  349.             write_byte(random(256))
  350.             write_byte(random(256))
  351.             write_byte(150)
  352.             message_end()
  353.            
  354.             // Screen Shake
  355.             message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, id)
  356.             write_short(255<<14)
  357.             write_short(10<<14)
  358.             write_short(255<<14)
  359.             message_end()
  360.         }
  361.     }
  362. }
  363.  
  364. public ze_user_infected(iVictim, iInfector)
  365. {
  366.     if (iInfector == 0)
  367.         return
  368.    
  369.     g_iXP[iInfector] += get_pcvar_num(g_pCvarZombieInfect)
  370.     SaveData(iInfector)
  371.     Check_User_Level(iInfector)
  372. }
  373.  
  374. public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
  375. {
  376.     // Player Damage Himself
  377.     if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_user_zombie(iAttacker) || !get_pcvar_num(g_pCvarEnableDamage))
  378.         return HC_CONTINUE
  379.    
  380.     // Same Team?
  381.     if (get_member(iAttacker, m_iTeam) == get_member(iVictim, m_iTeam))
  382.         return HC_CONTINUE
  383.    
  384.     // Store Damage For every Player
  385.     g_fDamage[iAttacker] += fDamage
  386.    
  387.     // Damage Calculator Equal or Higher than needed damage
  388.     if (g_fDamage[iAttacker] >= get_pcvar_float(g_pCvarRequiredDamage))
  389.     {
  390.         // Give Player The Coins
  391.         g_iXP[iAttacker] += get_pcvar_num(g_pCvarDamageAward)
  392.         SaveData(iAttacker)
  393.         Check_User_Level(iAttacker)
  394.        
  395.         // Rest The Damage Calculator
  396.         g_fDamage[iAttacker] = 0.0
  397.     }
  398.     return HC_CONTINUE
  399. }
  400.  
  401. public SaveData(id)
  402. {
  403.     new szAuthID[35], szName[32]
  404.     get_user_authid(id, szAuthID, charsmax(szAuthID))
  405.     get_user_name(id, szName, charsmax(szName))
  406.    
  407.     // Set Him to max if he Higher than Max Value
  408.     if(g_iLevel[id] > MAX_LEVEL)
  409.     {
  410.         g_iLevel[id] = MAX_LEVEL
  411.     }
  412.    
  413.     if(g_iXP[id] > MAX_XP)
  414.     {
  415.         g_iXP[id] = MAX_XP
  416.     }
  417.    
  418.     new szData[256]
  419.     formatex(szData , charsmax(szData), "%i %i %i", g_iLevel[id], g_iXP[id], g_iMaxXP[id])
  420.    
  421.     // Open the Vaults
  422.     g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
  423.     g_iRanksVaultHandle = nvault_open(g_szRanksVault)
  424.  
  425.     // Saves His Data
  426.     nvault_set(g_iLevelsVaultHandle, szAuthID, szData)
  427.     nvault_set(g_iRanksVaultHandle, szAuthID, szName)
  428.    
  429.     // Close Vaults
  430.     nvault_close(g_iLevelsVaultHandle)
  431.     nvault_close(g_iRanksVaultHandle)
  432. }
  433.  
  434. public LoadData(id)
  435. {
  436.     new szData[256], szAuthID[35], szName[32]
  437.    
  438.     get_user_authid(id, szAuthID, charsmax(szAuthID))
  439.     get_user_name(id, szName, charsmax(szName))
  440.    
  441.     // Useless Variable
  442.     new iTimestamp, iExists
  443.    
  444.     // Open the Vault
  445.     g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
  446.    
  447.     iExists = nvault_lookup(g_iLevelsVaultHandle, szAuthID, szData, charsmax(szData), iTimestamp)
  448.    
  449.     // Close Vault
  450.     nvault_close(g_iLevelsVaultHandle)
  451.    
  452.     if (!iExists)
  453.     {
  454.         g_iLevel[id] = 0
  455.         g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
  456.         g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
  457.         SaveData(id)
  458.     }
  459.     else
  460.     {
  461.         new iLevel[32], iXP[32], iMaxLevel[32]
  462.         parse(szData, iLevel, 31, iXP, 31, iMaxLevel, 31)
  463.        
  464.         g_iLevel[id] = str_to_num(iLevel)
  465.         g_iXP[id] = str_to_num(iXP)
  466.         g_iMaxXP[id] = str_to_num(iMaxLevel)
  467.     }
  468. }
  469.  
  470. public native_ze_get_user_xp(id)
  471. {
  472.     if(!is_user_connected(id))
  473.     {
  474.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  475.         return false;
  476.     }
  477.    
  478.     return g_iXP[id]
  479. }
  480.  
  481. public native_ze_set_user_xp(id, amount)
  482. {
  483.     if(!is_user_connected(id))
  484.     {
  485.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  486.         return false;
  487.     }
  488.    
  489.     DoubleHours()
  490.    
  491.     new iAddedAmount = amount - g_iXP[id]
  492.    
  493.     if (g_bIsDoubleHours)
  494.     {
  495.         g_iXP[id] = g_iXP[id] + (iAddedAmount * 2)
  496.     }
  497.     else
  498.     {
  499.         g_iXP[id] = amount
  500.     }
  501.    
  502.     Check_User_Level(id)
  503.     SaveData(id)
  504.     return true;
  505. }
  506.  
  507. public native_ze_get_user_level(id)
  508. {
  509.     if(!is_user_connected(id))
  510.     {
  511.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  512.         return false;
  513.     }
  514.    
  515.     return g_iLevel[id]
  516. }
  517.  
  518. public native_ze_set_user_level(id, amount)
  519. {
  520.     if(!is_user_connected(id))
  521.     {
  522.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  523.         return false;
  524.     }
  525.    
  526.     g_iLevel[id] = amount
  527.    
  528.     if (get_pcvar_num(g_pCvarStartFromZero) == 1)
  529.     {
  530.         g_iXP[id] = 0
  531.     }
  532.    
  533.     SaveData(id)
  534.    
  535.     return true;
  536. }
  537.  
  538. public native_ze_get_user_max_xp(id)
  539. {
  540.     if(!is_user_connected(id))
  541.     {
  542.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  543.         return false;
  544.     }
  545.    
  546.     return g_iMaxXP[id]
  547. }
  548.  
  549. public native_ze_set_user_max_xp(id, amount)
  550. {
  551.     if(!is_user_connected(id))
  552.     {
  553.         log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  554.         return false;
  555.     }
  556.    
  557.     g_iMaxXP[id] = amount
  558.    
  559.     SaveData(id)
  560.    
  561.     return true;
  562. }
  563.  
  564. stock DoubleHours()
  565. {
  566.     new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32]
  567.     get_time("%H", szTime, charsmax(szTime))
  568.    
  569.     get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
  570.    
  571.     for (new ch = 0; ch <= charsmax(szDoubleHours); ch++)
  572.     {
  573.         if (szDoubleHours[ch] == '-')
  574.             szDoubleHours[ch] = ' '
  575.     }
  576.    
  577.     parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End))
  578.    
  579.     new iTime, iDoubleHourStart, iDoubleHourEnd
  580.    
  581.     iTime = str_to_num(szTime)
  582.     iDoubleHourStart = str_to_num(szDoubleHours_Start)
  583.     iDoubleHourEnd = str_to_num(szDoubleHours_End)
  584.    
  585.     if(iDoubleHourEnd > iTime >= iDoubleHourStart)
  586.     {
  587.         g_bIsDoubleHours = true
  588.     }
  589.     else
  590.     {
  591.         g_bIsDoubleHours = false
  592.     }
  593. }

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#12

Post by czirimbolo » 5 years ago

Something is wrong, when I reach 10level, my XP is counting from 0, not from (for example) 12 000 exp. Is it right?
Image

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 5 guests