#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <zombieplague>
#include <nvault>
#define PLUGIN "[ZP]Level System"
#define VERSION "2.2"
#define AUTHOR "heka / di.alyabev"
new const Level_Exp[50] = {0, 8, 20, 32, 45, 57, 69, 80, 90, 115, 128, 136, 147,169, 190, 230, 264, 292, 326, 364, 395, 426, 464, 540, 610, 799, 915, 1024, 1256, 1411, 1592, 1701, 1810, 1900, 2100, 2350, 2460, 2620, 2800, 3100, 3390, 3500, 3700, 3900, 4100, 4400, 4800, 5300, 6000, 8000}
new const Float:Level_Dmg[50] = {1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5}
new g_level[33]
new g_exp[33]
new g_vault, g_save_type
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
g_vault = nvault_open("zp_level_system")
g_save_type = register_cvar("zp_level_save_by", "1")
}
public plugin_natives()
{
register_native("zp_level", "native_level", 1)
register_native("zp_exp", "native_exp", 1)
register_native("zp_next_level_exp", "native_zp_next_level_exp", 1)
}
public client_connect(id)
{
if ( is_user_bot(id) )
return
g_level[id] = 1
LoadData(id)
}
public client_disconnect(id)
{
SaveData(id)
g_exp[id] = 0
g_level[id] = 0
}
public plugin_end()
{
nvault_close(g_vault)
}
public SaveData(id)
{
new AuthID[35]
if ( get_pcvar_num(g_save_type) )
{
get_user_name(id, AuthID, 32)
replace_all(AuthID, 255, "#", "[r]")
}
else
get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%s",AuthID)
format(vaultdata,255,"%i#%i#",g_exp[id],g_level[id])
nvault_set(g_vault,vaultkey,vaultdata)
return PLUGIN_CONTINUE
}
public LoadData(id)
{
new AuthID[35]
if ( get_pcvar_num(g_save_type) )
{
get_user_name(id, AuthID, 32)
replace_all(AuthID, 255, "#", "[r]")
}
else
get_user_authid(id,AuthID,34)
new vaultkey[64],vaultdata[256]
format(vaultkey,63,"%s",AuthID)
format(vaultdata,255,"%i#%i#",g_exp[id],g_level[id])
nvault_get(g_vault,vaultkey,vaultdata,255)
replace_all(vaultdata, 255, "#", " ")
new playerxp[32], playerlevel[32]
parse(vaultdata, playerxp, 31, playerlevel, 31)
g_exp[id] = str_to_num(playerxp)
g_level[id] = str_to_num(playerlevel)
return PLUGIN_CONTINUE
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if(is_user_connected(attacker))
{
if(Level_Exp[g_level[attacker]])
SetHamParamFloat(4, damage * Level_Dmg[g_level[attacker]])
}
return HAM_IGNORED
}
public fw_PlayerKilled(victim, attacker)
{
if(is_user_connected(attacker))
{
g_exp[attacker]+= 1
check_level(attacker)
}
}
public check_level(id)
{
new MAX_LVL = sizeof Level_Exp - 1;
if (g_exp[id] > Level_Exp[MAX_LVL] - 1 )
return PLUGIN_HANDLED;
if( g_exp[id] >= Level_Exp[ g_level[id]])
{
if ( g_level[id] < MAX_LVL )
{
g_level[id]++
ChatColor(id, "!g[ZP]!yТы качнул !g%d !yлвл и получил !g30 !yаммо! Урон повышен еще на !g0.5%!y!", g_level[id])
zp_set_user_ammo_packs(id , zp_get_user_ammo_packs(id) + 30)
}
g_exp[id] = 0
}
return PLUGIN_HANDLED;
}
public native_level(id) return g_level[id]
public native_exp(id) return g_exp[id]
public native_zp_next_level_exp(id)
{
new progress = 100
if (g_level[id] == (sizeof Level_Exp - 1))
return progress
progress = (Level_Exp[g_level[id]+1]/100)
progress = progress > 0 ? (g_exp[id]/progress) : 0
return progress
}
stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!r", "^3")
replace_all(msg, 190, "!b", "^0")
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), {0,0,0}, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}