Right way to set Max-XPs in Level-System

Helping Topics
User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

Right way to set Max-XPs in Level-System

#1

Post by Raheem » 2 Months Ago

Hello,

How are you? Hope you are fine :). In this topic we will learn how we can set right cvars for our levels system.

OK, first you may notice that in our levels system you can't control the xp value needed for next level. So first term you should get is when i say:

Max-XP for level 1
  • Means how much xp i must get so i go to level 1? PlayerXP/NextLevelNeededXP
Our levels system, works like when a player enter server he get 50/100 and his level is 0. This means he need to get 100 xp to go to level 1.

In cvars, you need to define the max-xp for level 1:
  • ze_max_xp_first_level 100
And need to define also the increment rate that max-xp for next levels will be multiplied by:
  • ze_maxlevels_increment 2
How to know XP needed for level 50? maybe it's very high so we need to set right values :idea:

First there is equation, how next level needed xp calculated:
  • nextLevelNeededXP = previousLevelNeededXP * IncrementFactor
Example:
  • One player have 1200 xp and xp needed for next level is 1800. 1200/1800 So if he got the 1800 xp he will go to new level. 1800/UnknownValue and this unknown value is = 1800 * IncrementFactor
    That's how it's calculated.
Seems it's hard to know level 40 will require how much xp so player get. And also you need to set right increment factor. For this reason i wrote a javafx program that will help in calculating max-xp needed for all levels.

Also i'll explain how to set some more increment factors like:
  • From level 0 to level 20 - Increment factor 1.4
    From level 21 to level 40 - Increment factor 1.1
You should also know about: These definations can be changed from source then compile the plugin.

Let's see the software that will help in this: NOTE: You will need installing JVM so this program working, download from here.

How to use it?
  1. Write the starting level number.
  2. Write Max-XP needed so player can reach this starting level.
  3. Write the end level number.
  4. Write the increment factor.
Then you can press any button:
  1. Calculate all max-xp - Will show you list of all levels and max xp needed to reach them.
  2. Calculate end level max-xp - will only calculate the max xp needed to reach the end level.
Some screenshots:
  • ImageImageImageImage
Example(Screenshot2): Player to reach level 2 he should get 110 xp like: hisXP/110 and so on.

Now you can edit code in levels system to add more factors for ranges (You will edit public Check_User_Level(id)):
    1. public Check_User_Level(id)
    2. {
    3.     if(!is_user_connected(id))
    4.         return
    5.  
    6.     if(g_iXP[id] >= g_iMaxXP[id])
    7.     {
    8.         if (get_pcvar_num(g_pCvarStartFromZero) == 1)
    9.         {
    10.             g_iXP[id] = 0
    11.         }
    12.        
    13.         new szName[32]
    14.         g_iLevel[id] ++
    15.        
    16.         if (g_iLevel[id] >= 0 && g_iLevel[id] < 20)
    17.         {
    18.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.4)
    19.         }
    20.         else if (g_iLevel[id] >= 20 && g_iLevel[id] < 40)
    21.         {
    22.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.2)
    23.         }
    24.         else if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50) // 50 is our max
    25.         {
    26.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.08)
    27.         }
    28.        
    29.         get_user_name(id, szName, charsmax(szName))
    30.         ze_colored_print(0, "!g%s !tNow in Level %i!y!", szName, g_iLevel[id])
    31.        
    32.         SaveData(id)
    33.        
    34.         PlaySound(id, LEVELUP)
    35.        
    36.         if (get_pcvar_num(g_pCvarLevelEffects) != 0)
    37.         {
    38.             // Screen Fade
    39.             message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
    40.             write_short(4096*2)
    41.             write_short(4096*5)
    42.             write_short(0x0001)
    43.             write_byte(random(256))
    44.             write_byte(random(256))
    45.             write_byte(random(256))
    46.             write_byte(150)
    47.             message_end()
    48.            
    49.             // Screen Shake
    50.             message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, id)
    51.             write_short(255<<14)
    52.             write_short(10<<14)
    53.             write_short(255<<14)
    54.             message_end()
    55.         }
    56.     }
    57. }
And edit public Check_MaxXP(id):
    1. public Check_MaxXP(id)
    2. {
    3.     new iCurrentMaxXP = g_iMaxXP[id]
    4.    
    5.     new iMaxXP = get_pcvar_num(g_pCvarMaxXPFirstLevel)
    6.    
    7.     if (g_iLevel[id] >= 0 && g_iLevel[id] < 20)
    8.     {
    9.         for (new i = 1; i <= g_iLevel[id]; i++)
    10.         {
    11.             iMaxXP = floatround(float(iMaxXP) * 1.4)
    12.         }
    13.     }
    14.    
    15.     if (g_iLevel[id] >= 20 && g_iLevel[id] < 40)
    16.     {
    17.         for (new i = 1; i < 20; i++)
    18.         {
    19.             iMaxXP = floatround(float(iMaxXP) * 1.4)
    20.         }
    21.        
    22.         for (new i = 20; i <= g_iLevel[id]; i++)
    23.         {
    24.             iMaxXP = floatround(float(iMaxXP) * 1.2)
    25.         }
    26.     }
    27.    
    28.     if (g_iLevel[id] >= 40 && g_iLevel[id] <= 50)
    29.     {
    30.         for (new i = 1; i < 20; i++)
    31.         {
    32.             iMaxXP = floatround(float(iMaxXP) * 1.4)
    33.         }
    34.        
    35.         for (new i = 20; i < g_iLevel[id]; i++)
    36.         {
    37.             iMaxXP = floatround(float(iMaxXP) * 1.2)
    38.         }
    39.        
    40.         for (new i = 40; i <= g_iLevel[id]; i++)
    41.         {
    42.             iMaxXP = floatround(float(iMaxXP) * 1.08)
    43.         }
    44.     }
    45.    
    46.     if (iCurrentMaxXP != iMaxXP)
    47.     {
    48.         g_iMaxXP[id] = iMaxXP
    49.     }
    50. }
Any problem, please post down.
Last edited by Raheem on 16 Sep 2018, 22:35, edited 1 time in total.
Reason: Fixed check max-xp
You don't know? Learn and you will know.

User avatar
Jack GamePlay
Mod Developer
Mod Developer
Egypt
Posts: 501
Joined: 1 Year Ago
Location: Egypt
Has thanked: 31 times
Been thanked: 39 times
Age: 18
Contact:

#2

Post by Jack GamePlay » 2 Months Ago

To get max xp to level 50 for example:
IncrementFactor * 50 * current level max xp

[ Post made via Android ]
Image

User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

#3

Post by Raheem » 2 Months Ago

Jack GamePlay wrote:
2 Months Ago
To get max xp to level 50 for example:
IncrementFactor * 50 * current level max xp
No, not right.
You don't know? Learn and you will know.

User avatar
Mark
Senior Member
Senior Member
United States of America
Posts: 257
Joined: 2 Months Ago
Location: Des Moines/USA
Donation: 1x donated in total €10.00
Has thanked: 6 times
Been thanked: 19 times
Age: 33
Contact:

#4

Post by Mark » 2 Months Ago

Raheem wrote:
2 Months Ago
Jack GamePlay wrote:
2 Months Ago
To get max xp to level 50 for example:
IncrementFactor * 50 * current level max xp
No, not right.
so would this work?
  1.         if (get_pcvar_num(g_pCvarStartFromZero) == 1)
  2.         {
  3.             g_iXP[id] = 0
  4.         }
  5.        
  6.         new szName[32]
  7.         g_iLevel[id] ++
  8.        
  9.         if (g_iLevel[id] >= 0 && g_iLevel[id] < 10)
  10.         {
  11.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.3)
  12.         }
  13.         else if (g_iLevel[id] >= 10 && g_iLevel[id] < 20)
  14.         {
  15.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.4)
  16.         }
  17.         else if (g_iLevel[id] >= 20 && g_iLevel[id] <= 30)
  18.         {
  19.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.5)
  20.         }
  21.         else if (g_iLevel[id] >= 30 && g_iLevel[id] < 50)
  22.         {
  23.             g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * 1.6)
  24.         }
  1. 2  -  130
  2. 3  -  169
  3. 4  -  220
  4. 5  -  286
  5. 6  -  371
  6. 7  -  483
  7. 8  -  627
  8. 9  -  816
  9. 10  -  1060
  10. 11  -  1378
  11. 12  -  1791
  12. 13  -  2329
  13. 14  -  3027
  14. 15  -  3936
  15. 16  -  5116
  16. 17  -  6651
  17. 18  -  8647
  18. 19  -  11241
  19. 20  -  14613
  20. 21  -  21920
  21. 22  -  32879
  22. 23  -  49319
  23. 24  -  73978
  24. 25  -  110967
  25. 26  -  166451
  26. 27  -  249677
  27. 28  -  374515
  28. 29  -  561773
  29. 30  -  842659
  30. 31  -  1348254
  31. 32  -  2157207
  32. 33  -  3451531
  33. 34  -  5522450
  34. 35  -  8835920
  35. 36  -  14137472
  36. 37  -  22619955
  37. 38  -  36191928
  38. 39  -  57907086
  39. 40  -  92651337
  40. 41  -  148242139
  41. 42  -  237187422
  42. 43  -  379499876
  43. 44  -  607199801
  44. 45  -  971519682
  45. 46  -  1554431491
  46. 47  -  2487090386
  47. 48  -  3979344618
  48. 49  -  6366951389
  49. 50  -  10187122222

User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

#5

Post by Raheem » 2 Months Ago

Will work but 10187122222 is incredible number :lol:, should when level high you low the factor.
You don't know? Learn and you will know.

User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

#6

Post by Raheem » 2 Months Ago

I forget set ranges in public Check_MaxXP(id), please see update.
You don't know? Learn and you will know.

User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

#7

Post by Raheem » 1 Month Ago

Updated, re-read.
You don't know? Learn and you will know.

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 431
Joined: 1 Year Ago
Has thanked: 15 times
Been thanked: 1 time
Contact:

#8

Post by czirimbolo » 1 Month Ago

Ok what about cvar ze_maxlevels_increment ? It work only for level 0 to level 20 in this example?
Image

User avatar
Raheem
Mod Developer
Mod Developer
Egypt
Posts: 1703
Joined: 1 Year Ago
Location: Egypt
Has thanked: 28 times
Been thanked: 75 times
Age: 20
Contact:

#9

Post by Raheem » 1 Month Ago

Not needed with code i posted, you can remove it even from the code.
You don't know? Learn and you will know.

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 431
Joined: 1 Year Ago
Has thanked: 15 times
Been thanked: 1 time
Contact:

#10

Post by czirimbolo » 1 Month 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)
Image

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest