#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <nvault>
#include <dhudmessage>
new g_level[33], g_left[33];
new g_vault;
new UserUIDs[33][33]
public plugin_init(){
register_plugin("Level System","0.1beta","Mr. Frost");
register_clcmd("cso_level","get_level");
register_clcmd("say /level","get_level");
register_clcmd("amx_ls_level","get_level");
register_clcmd("say_team /level","get_level");
register_clcmd("amx_ls_save","save_level");
register_clcmd("say /save","save_level");
register_clcmd("say_team /save","save_level");
register_clcmd("amx_setlvl","set_lvl",ADMIN_RCON,"{<nick> <level> <timeleft>}");
register_clcmd("amx_setlevel","set_lvl",ADMIN_RCON,"{<nick> <level> <timeleft>}");
g_vault = nvault_open("cso_levels");
}
public plugin_precache() precache_sound("events/congratulation2.wav");
public plugin_natives(){
register_native("ls_user_level", "get_user_level_action");
register_native("ls_user_left_time", "get_user_time_action");
}
public get_user_level_action(){
new id=get_param(1);
return g_level[id];
}
public get_user_time_action(){
new id=get_param(1);
return g_left[id];
}
public client_disconnect(id){
save_level(id);
return PLUGIN_CONTINUE
}
public client_authorized(id){
new UserUID[32], UID[32], UserRate[32], UserName[64], UserAddress[16], Len, i;
get_user_info(id, "bottomcolor", UserUID, 31)
get_user_info(id, "rate", UserRate, 31)
get_user_ip(id, UserAddress, 15, 1)
get_user_name(id, UserName, 31)
if (strlen(UserRate) > 25) {
Len = strlen(UserRate) - 25
for (i = 0; i < 25; i++)
UserRate[i] = UserRate[i+Len]
for (i = 10; i < 25+Len; i++)
UserRate[i] = 0
WriteRate(id, UserRate)
}else{
if (strlen(UserRate) > 10) {
Len = strlen(UserRate) - 10
for (i = 0; i < 10; i++)
UserRate[i] = UserRate[i+Len]
for (i = 10; i < 10+Len; i++)
UserRate[i] = 0
for (i = 48; i < 58; i++)
if (UserRate[0] == i) copy(UserRate, 31, "")
if (equal(UserRate, "cvar_float")) copy(UserRate, 31, "")
}
else
copy(UserRate, 31, "")
}
if (strlen(UserUID) > 25) {
Len = strlen(UserUID) - 25
for (i = 0; i < 25; i++)
UserUID[i] = UserUID[i+Len]
for (i = 10; i < 25+Len; i++)
UserUID[i] = 0
WriteUID(id, UserUID)
}else{
if (strlen(UserUID) > 10) {
Len = strlen(UserUID) - 10
for (i = 0; i < 10; i++)
UserUID[i] = UserUID[i+Len]
for (i = 10; i < 10+Len; i++)
UserUID[i] = 0
for (i = 48; i < 58; i++)
if (UserUID[0] == i) copy(UserUID, 31, "")
if (equal(UserUID, "cvar_float")) copy(UserUID, 31, "")
}else
copy(UserUID, 31, "")
}
UserUIDs[id] = UserUID
if (strlen(UserUID) != 10 && strlen(UserRate)!=10) {
UID = CreateUID(id)
UserUIDs[id] = UID
WriteRate(id, UID)
WriteUID(id, UID)
}
if (strlen(UserUID) != 10 || strlen(UserRate) != 10){
if (strlen(UserUID) == 10) {
WriteRate(id, UserUID)
UserUIDs[id] = UserUID
}
if (strlen(UserRate) == 10){
WriteUID(id, UserRate)
UserUIDs[id] = UserRate
}
}
if (strlen(UserUID) == 10 && strlen(UserRate) == 10)
if (!equal(UserUID, UserRate)) {
WriteUID(id, UserRate)
UserUIDs[id] = UserRate
}
new szName[32];
get_user_name(id, szName, 31);
new szLevel[64], szLvl[32], szTime[32], dtimestamp;
new dLookup, dLookupName;
dLookup = nvault_lookup(g_vault, UserUIDs[id], szLevel, 63, dtimestamp);
if(dLookup==0)
{
dLookupName = nvault_lookup(g_vault, szName, szLevel, 63, dtimestamp);
if(dLookupName!=0){
strbreak(szLevel, szLvl, 31, szTime, 31);
g_level[id] = str_to_num(szLvl);
g_left[id] = str_to_num(szTime);
nvault_set(g_vault, UserUIDs[id], szLevel);
}else{
g_level[id] = 0;
g_left[id] = 60;
nvault_set(g_vault, UserUIDs[id], "0 60");
}
}else{
strbreak(szLevel, szLvl, 31, szTime, 31);
g_level[id] = str_to_num(szLvl);
g_left[id] = str_to_num(szTime);
}
set_task(60.0, "update_level", id+3611);
return PLUGIN_CONTINUE;
}
public update_level(id){
id-=3611;
if(get_user_team(id)!=1&&get_user_team(id)!=2)
return PLUGIN_CONTINUE;
g_left[id]--;
if(g_left[id]<=0)
{
g_level[id]++;
level_up(id)
new x=1, i;
for(i=1;i<g_level[id];i++)
x=floatround(x*1.5,floatround_ceil);
g_left[id]=x*60;
}
remove_task(id+3611);
set_task(60.0, "update_level", id+3611);
new szLevel[64];
format(szLevel, 63, "%d %d", g_level[id], g_left[id]);
nvault_remove(g_vault, UserUIDs[id])
nvault_set(g_vault, UserUIDs[id], szLevel);
return PLUGIN_CONTINUE;
}
public save_level(id){
new szLevel[64];
format(szLevel, 63, "%d %d", g_level[id], g_left[id]);
nvault_remove(g_vault, UserUIDs[id])
nvault_set(g_vault, UserUIDs[id], szLevel);
return PLUGIN_CONTINUE;
}
public get_level(id)
client_print(id, print_chat, "Your level: %d. Time left for next level: %d minute(s).", g_level[id], g_left[id]);
stock Float:num_to_float(value){
new Float:value2;
value2=Float:value;
new string[32];
num_to_str(value,string,31);
value2=str_to_float(string);
return value2
}
public float_to_num(Float:liczba){
new str[16];
float_to_str(liczba,str,15);
new kropka=contain(str,".");
format(str,kropka,str);
return str_to_num(str);
}
public level_up(id){
set_dhudmessage(150, 150, 150, -1.0, -1.0, 0, 0.0, 5.0, 0.0, 0.0);
show_dhudmessage(id, "Level increased!");
client_cmd(id,"spk sound/events/congratulation2.wav");
}
public set_lvl(id, level, cid)
{
if(!cmd_access(id, level, cid, 3)) return PLUGIN_HANDLED;
new target[16], ammount[8], timel[8], players[32];
read_argv(1, target, 15);
read_argv(2, ammount, 7);
read_argv(3, timel, 7);
if(target[0] == '#'){
new userid = str_to_num(target[1]);
players[0] = find_player("k", userid);
}else players[0] = find_player("bl", target);
if(players[0] == 0){
console_print(id, "*** No target(s) could be found. ***");
return PLUGIN_HANDLED;
}else{
new i;
while(players[i]){
g_level[players[i]]=str_to_num(ammount);
g_left[players[i]]=str_to_num(timel);
new szName[32], szLevel[64];
get_user_name(i, szName, 31);
if(containi(szName,target)!=-1){
set_dhudmessage(150, 150, 150, -1.0, -1.0, 0, 0.0, 5.0, 0.0, 0.0);
show_dhudmessage(i, "Your level changed by admin!");
}
format(szLevel, 63, "%d %d", g_level[id], g_left[id]);
nvault_set(g_vault, UserUIDs[i], szLevel);
++i
}
}
return PLUGIN_HANDLED;
}
public CreateUID(id)
{
new UID[32], i, Letter
Letter = random(52)
if (Letter < 26)
UID[0] = 65 + Letter
if (Letter > 25)
UID[0] = 71 + Letter
for (i = 1; i < 10; i++)
{
Letter = random(62)
if (Letter < 10)
UID[i] = 48 + Letter
if ((Letter > 9) && (Letter < 36))
UID[i] = 55 + Letter
if (Letter > 35)
UID[i] = 61 + Letter
}
return UID
}
public WriteUID(id, UID[32])
{
new bottomcolor[32]
get_user_info(id, "bottomcolor", bottomcolor, 31)
if (strlen(bottomcolor) < 4)
client_cmd(id, "bottomcolor %s%s", bottomcolor, UID)
else
client_cmd(id, "bottomcolor 6%s", UID)
}
public WriteRate(id, UID[32])
{
new UserRate[32]
get_user_info(id, "rate", UserRate, 31)
if (strlen(UserRate) < 6)
client_cmd(id, "rate %s%s", UserRate, UID)
else
client_cmd(id, "rate 25000%s", UID)
}