/*==================================================
 
Plugin: Deathrun XP
Version: 2.0
Author: KronoS 
 
*****************
*** Changelog ***
*****************
 
#Version 2.0 | 03 October 2011
 
-Ham_Spawn instead of ResetHud
-removed the respawn system because it wasn't working (it will be added in the next version)
-minor changes in the code
-fixed the "index out of bounds" error
 
***************
*** Credits ***
***************
 
XunTric - xp based tutorial
Il3gal - for his idea
Vechta - admin commands
 
==================================================*/
 
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <hamsandwich>
#include <nvault>
 
new const PLUGIN_NAME[] = "Deathrun XP";
 
new const drxp_version[] = "2.0";
 
new const LEVELS[10] = {
 	50, 
 	100, 
 	150, 
 	200,
 	250,
 	300,
	350,
	400,
	450,
	500
}
 
new drxp_playerxp[33], drxp_playerlevel[33];
new drxp_kill, drxp_knife, drxp_grenade, drxp_hs, drxp_savexp, g_drxp_vault;
 
public plugin_init()
{
	register_plugin(PLUGIN_NAME, drxp_version, "KronoS");
 
	RegisterHam(Ham_Spawn, "player", "drxp_spawn", 1);
 	register_event("DeathMsg", "drxp_death", "a");
 
 	drxp_savexp = register_cvar("drxp_savexp","1");
 	drxp_kill = register_cvar("drxp_kill", "10");
 	drxp_knife = register_cvar("drxp_knife","5");
	drxp_grenade = register_cvar("drxp_grenade","15");
 	drxp_hs = register_cvar("drxp_hs","10");
 
 	g_drxp_vault = nvault_open("deathrun_xp");
 
    	register_concmd("amx_takexp", "cmd_take_exp", ADMIN_BAN, "<target> <amount>");  
    	register_concmd("amx_givexp", "cmd_give_exp", ADMIN_BAN, "<target> <amount>"); 
}
 
public drxp_spawn(id)
{
	if((drxp_playerlevel[id] < 10) && (drxp_playerxp[id] >= LEVELS[drxp_playerlevel[id]]))
	{
		client_print(id,print_chat,"[%s] Gratulalok!Szintet leptel!", PLUGIN_NAME);
		while(drxp_playerxp[id] >= LEVELS[drxp_playerlevel[id]])
		{
  			drxp_playerlevel[id] += 1;
		}
	}
 
	if(drxp_playerlevel[id] > 0)
		set_user_health(id, get_user_health(id) + 5*drxp_playerlevel[id]);
}
 
public drxp_death() 
{
 	new iVictim = read_data(2);
 	new weapon, hitplace, attacker = get_user_attacker(iVictim,weapon,hitplace);
 
	new victimname[32], wvar[32];
   	get_user_name(iVictim,victimname,31);
   	read_data(4, wvar, 31);
 
   	if(equal(wvar, "world", 5))
   		return;
 
	if(attacker < 1 || attacker > 32)
		return;
 
 	drxp_playerxp[attacker] += get_pcvar_num(drxp_kill);
	client_print(attacker,print_chat,"[%s] Kaptal %i XPt olesert, megolted: %s-t!", PLUGIN_NAME, get_pcvar_num(drxp_grenade), victimname);
 
 	if(hitplace == HIT_HEAD)
	{
 		drxp_playerxp[attacker] += get_pcvar_num(drxp_hs);
		client_print(attacker,print_chat,"[%s] Kaptal %i XPt olesert, megolted: %s-t fejessel!", PLUGIN_NAME, get_pcvar_num(drxp_hs), victimname);
	}
 
 	if(weapon == CSW_KNIFE)
	{
  		drxp_playerxp[attacker] += get_pcvar_num(drxp_knife);
		client_print(attacker,print_chat,"[%s] Kaptal %i XPt olesert, megolted: %s-t kessel!", PLUGIN_NAME, get_pcvar_num(drxp_knife), victimname);
	}
 	else if(weapon == CSW_HEGRENADE)
	{
  		drxp_playerxp[attacker] += get_pcvar_num(drxp_grenade);
		client_print(attacker,print_chat,"[%s] Kaptal %i XPt olesert, megolted: %s-t Granattal!", PLUGIN_NAME, get_pcvar_num(drxp_grenade), victimname);
	}
 
	drxp_hudinfo(attacker);
}
 
public drxp_hudinfo(id)
{
	set_hudmessage(255, 255, 255, 0.01, 0.2, 0, 3.0, 3.0);
	if(drxp_playerlevel[id] < 10)
 		show_hudmessage(id, "Szint: %i^nXP: %i / %i", drxp_playerlevel[id], drxp_playerxp[id], LEVELS[drxp_playerlevel[id] + 1]);
	else
 		show_hudmessage(id, "Szint: %i^nElerted a maximum szintet!", drxp_playerlevel[id]);
 
	set_task(2.0, "drxp_hudinfo", id);
}
 
public client_putinserver(id)
{
 	if(get_pcvar_num(drxp_savexp) == 1)
  		LoadData(id);
 
	set_task(10.0, "drxp_hudinfo", id);
}
 
public client_disconnect(id)
{
 	if(get_pcvar_num(drxp_savexp) == 1)
  		SaveData(id);
 
 	drxp_playerxp[id] = 0;
 	drxp_playerlevel[id] = 0;
}
 
public SaveData(id)
{
 	new PlayerName[35];
 	get_user_name(id,PlayerName,34);
 
 	new vaultkey[64],vaultdata[256];
 	format(vaultkey,63,"%s",PlayerName);
 	format(vaultdata,255,"%i#%i#",drxp_playerxp[id],drxp_playerlevel[id]);
 	nvault_set(g_drxp_vault,vaultkey,vaultdata);
 	return PLUGIN_CONTINUE;
}
 
public LoadData(id)
{
 	new PlayerName[35];
 	get_user_name(id,PlayerName,34);
 
 	new vaultkey[64],vaultdata[256];
 	format(vaultkey,63,"%s",PlayerName);
 	format(vaultdata,255,"%i#%i#",drxp_playerxp[id],drxp_playerlevel[id]);
 	nvault_get(g_drxp_vault,vaultkey,vaultdata,255);
 
 	replace_all(vaultdata, 255, "#", " ");
 
 	new playerxp[32], playerlevel[32];
 
 	parse(vaultdata, playerxp, 31, playerlevel, 31);
 
 	drxp_playerxp[id] = str_to_num(playerxp);
 	drxp_playerlevel[id] = str_to_num(playerlevel);
 
 	return PLUGIN_CONTINUE;
}  
 
public cmd_give_exp(id, level, cid) 
{ 
    	if(!cmd_access(id, level, cid, 3)) 
       		 return PLUGIN_HANDLED
 
    	new target[32], amount[21], reason[21]
 
    	read_argv(1, target, 31)
    	read_argv(2, amount, 20)
    	read_argv(3, reason, 20)
 
    	new player = cmd_target(id, target, 8)
 
    	if(!player)  
        	return PLUGIN_HANDLED
 
    	new admin_name[32], player_name[32]
    	get_user_name(id, admin_name, 31)
    	get_user_name(player, player_name, 31)
 
    	new expnum = str_to_num(amount)
	client_print(0, print_chat, "ADMIN %s: addot %s xpt, neki: %s", admin_name, amount, player_name)
 
    	drxp_playerxp[player] += expnum
    	SaveData(id)
 
    	return PLUGIN_CONTINUE
} 
 
public cmd_take_exp(id, level, cid) 
{ 
    	if(!cmd_access(id, level, cid, 3)) 
    		return PLUGIN_HANDLED
 
    	new target[32], amount[21], reason[21]
 
    	read_argv(1, target, 31)
    	read_argv(2, amount, 20)
    	read_argv(3, reason, 20)
 
    	new player = cmd_target(id, target, 8) 
 
    	if(!player)  
       		 return PLUGIN_HANDLED
 
    	new admin_name[32], player_name[32]
 
    	get_user_name(id, admin_name, 31)
    	get_user_name(player, player_name, 31)
 
    	new expnum = str_to_num(amount)
	client_print(0, print_chat, "ADMIN %s: elvett %s xpt, tole: %s", admin_name, amount, player_name)
 
    	drxp_playerxp[player] -= expnum
    	SaveData(id) 
 
    	return PLUGIN_CONTINUE
}  
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
*/