Raised This Month: $ Target: $400
 0% 

Function that cause lag


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
egbertjan
Senior Member
Join Date: Mar 2007
Location: The Netherlands
Old 05-16-2014 , 16:07   Function that cause lag
Reply With Quote #1

Hello again!

I'm working on a plugin and I got lag issues and I'm wondering what could cause it! Upon roundstart I got issues (spikes) and when shooting / spraying it's also a bit lagging.

What are functions to check out what could cause the lag / what should I be aware off?

Thanks in advance!

Code:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta> 
#include <cstrike>
#include <hamsandwich>
#include <fun>
#include <sqlx>



#define MAX 32			 //Max number of valid player entities
#define CS_PLAYER_HEIGHT 72.0
#define GLOBAL_COOLDOWN 0.5
#define TASK_HUD 120
#define task_revive 4985  
#define MAX_PLAYERS 32
#define BASE_SPEED 	245.0
#define GLUTON 95841
#define x 0
#define y 1
#define z 2
#define TASK_CHARGE 100
#define TASK_FLASH_LIGHT 81184
#define pev_zorigin	pev_fuser4
#define seconds(%1) ((1<<12) * (%1))
#define MAX_FLASH 15

stock get_loguser_index() {
    new loguser[80], name[32]
    read_logargv(0, loguser, 79)
    parse_loguser(loguser, name, 31)
    return get_user_index(name)
} 

stock const maxClip[31] = { -1, 13, -1, 10,  1,  7,  1,  30, 30,  1,  30,  20,  25, 30, 35, 25,  12,  20, 10,  30, 100,  8, 30,  30, 20,  2,  7, 30, 30, -1,  50 };
stock const maxAmmo[31] = { -1, 52, -1, 90, -1, 32, -1, 100, 90, -1, 120, 100, 100, 90, 90, 90, 100, 100, 30, 120, 200, 32, 90, 120, 60, -1, 35, 90, 90, -1, 100 };

new g_szPrefix[ ] = "DiabloMod"
new Basepath[128]	
new gmsgSayText
new gmsgDeathMsg
new gmsgStatusText
new g_msg_screenfade

new flashlight[33]
new flashbattery[33]
new flashlight_r
new flashlight_g
new flashlight_b
new Float:agi=BASE_SPEED

new DemageTake[33]

new planter
new defuser
new map_end = 0
new gmsgBartimer
new gmsgScoreInfo
new gmsgHealth
new bool:freeze_ended
new sprite_blood_drop = 0
new sprite_blood_spray = 0
new sprite_white = 0
new sprite_line = 0
new player_xp[33] = 0		//Holds players experience
new player_lvl[33] = 1			//Holds players level
new player_point[33] = 0		//Holds players level points
new player_intelligence[33]
new player_strength[33]
new player_agility[33]
new player_power[33]
new player_vampyric[33]
new Float:player_damreduction[33]
new player_dextery[33]
new player_class[33]		
new Float:player_huddelay[33]

new player_b_gravity[33] = 1	//Gravity bonus : 1 = best

new player_sorc_heal[33] = 0

new player_ultra_armor[33]
new player_ultra_armor_left[33]
new bool:new_class[33]
new bool:paladin_bullet[33]
new bool:HunterUlt_active[33]
new bool:NinjaUlt_active[33]
new NecroRevive[33]
new bool:BarbUlt[33] 
new bool:BarbUlt_used[33] 
new jumpnum[33] = 0
new bool:dojump[33] = false

new bool:autobuyxp[33] 

new KNIFE_VIEW[] 	= "models/v_knife.mdl"
new KNIFE_PLAYER[] 	= "models/p_knife.mdl"
new Ninja_katana[]	="models/diablomod/dbo/ninja_katana.mdl"
new Deagle_view[]	="models/diablomod/dbo/v_paladin_deagle.mdl"
new Deagle_player[]	="models/diablomod/dbo/p_paladin_deagle.mdl"
new C4_VIEW[] 		= "models/v_c4.mdl"
new C4_PLAYER[] 	= "models/p_c4.mdl"
new HE_VIEW[] = "models/v_hegrenade.mdl"
new HE_PLAYER[] = "models/p_hegrenade.mdl"
new FL_VIEW[] = "models/v_flashbang.mdl"
new FL_PLAYER[] = "models/p_flashbang.mdl"
new SE_VIEW[] = "models/v_smokegrenade.mdl"
new SE_PLAYER[] = "models/p_smokegrenade.mdl"
new cbow_VIEW[]  = "models/diablomod/dbo/v_hunter.mdl" 
new cvow_PLAYER[]= "models/diablomod/dbo/p_hunter.mdl" 
new cbow_bolt[]  = "models/diablomod/Crossbow_bolt.mdl"
new Barb_Rage[] 	= "dbmod/Barbarian_Rage.wav"

enum { NONE = 0, Mag, Paladin, Assassin, Necromancer, Barbarian, Ninja, Hunter, Bot }
new Race[][18] = { "None","Sorcerer","Paladin","Assassin","Necromancer","Barbarian", "Ninja", "Hunter", "Bot Class" }
new race_heal[9] = { 100,80,50,100,70,50,170,120, 150 }

new LevelXP[152] = { 0,50,125,225,350,500,675,875,1100,1350,1625,1925,2250,2600,2975,3375,3800,4250,4725,5225,5750,6300,6875,7475,8100,8750, //26
9450,10200,11000,11850,12750,13700,14700,15750,16850,18000,19200,20450,21750,23100,24500,25950,27450,29000,30600,32250,33950,35700,37500,39350,41250,43200, //51
45200,47300,49500,51800,54200,56700,59300,62000,62800,65700,68700,71800,75000,78300,81700,85200,88800,92400,96100,99900,103800,107800,111900,116100,120400, //76
125000,130000,135000,140000,145000,150000,156000,162000,168000,174000,180000,187000,194000,201000,208000,216000,224000,232000,240000,250000,260000,270000,280000,290000,300000,310000, //101
330000,350000,370000,390000,410000,430000,450000,470000,490000,510000,530000,550000,570000,590000,610000,630000,650000,670000,690000,710000,730000,750000,770000,790000,810000,830000, //126
850000,900000,950000,1000000,1050000,1100000,1150000,1200000,1250000,1300000,1350000,1400000,1450000,1500000,1550000,1600000,1650000,1700000,1750000,1800000,1850000,1900000,99909999/*151*/}


#define TARACE_TASK 91203
#define NADE_VELOCITY	EV_INT_iuser1
#define NADE_ACTIVE	EV_INT_iuser2	
#define NADE_TEAM	EV_INT_iuser3	
#define NADE_PAUSE	EV_INT_iuser4


new LeaderCT = -1
new LeaderT = -1
new GodLeft[33]

new AssassinUlt[33]
new HunterUlt[33]
new NecroUlt[33]
new NinjaUlt[33]
new loaded_xp[33]
new sqlstart = 30 
new asked_sql[33]
new asked_klass[33]
new olny_one_time=0
new player_class_lvl[33][8]
new player_class_lvl_save[33]
new player_xp_old[33]
new database_user_created[33]
new srv_avg[8] = {1,1,1,1,1,1,1,1}


new last_update_xp[33]
new Float:last_update_perc[33]


new max_knife[33]
new player_knife[33]
new Float:tossdelay[33]
new Float:bowdelay[33]
new bow[33]
new button[33]
new trace_bool[33]
new cvar_throw_vel = 90 // def: 90
new cvar_activate_dis = 175 // def 190
new cvar_nade_vel = 280 //def 280

new g_TrapMode[33]
new g_GrenadeTrap[33] = {0, ... }
new Float:g_PreThinkDelay[33]
new casting[33]
new Float:cast_end[33]
new Float:HunterUlt_end[33]
new on_knife[33]
new golden_bulet[33]
new ultra_armor[33]
new after_bullet[33]
new invisible_cast[33]
new player_dmg[33]
new Handle:g_SqlTuple
new g_sqlTable[64] = "dbmod_tables"
new g_boolsqlOK=0

public plugin_init() {

	register_cvar("diablo_sql_host","127.0.0.1",FCVAR_PROTECTED)
	register_cvar("diablo_sql_user","root",FCVAR_PROTECTED)
	register_cvar("diablo_sql_pass","pi3141592654",FCVAR_PROTECTED)
	register_cvar("diablo_sql_database","dbmod",FCVAR_PROTECTED)
	register_cvar("diablo_sql_table","dbmod_tablet",FCVAR_PROTECTED)
	register_cvar("diablo_sql_save","2",FCVAR_PROTECTED)
	register_cvar("diablo_classes", "abcdefgh")
	register_cvar("diablo_avg", "1")	
	register_cvar("diablomod_version","6.0",FCVAR_SERVER)
	register_cvar("flashlight_custom","1");
	register_cvar("flashlight_drain","1.0");
	register_cvar("flashlight_charge","0.5");
	register_cvar("flashlight_radius","8");
	register_cvar("flashlight_decay","90"); 		
	register_cvar("diablo_dmg_exp","20",0)
	register_cvar("diablo_xpbonus","5",0) //bomb planted / bomb defused
	register_cvar("diablo_xpbonus2","20",0) //planted / defused 
	register_cvar("diablo_knife","20")
	register_cvar("diablo_knife_speed","1000")
	register_cvar("diablo_arrow","80.0") //dmg
	register_cvar("diablo_arrow_multi","4.0")
	register_cvar("diablo_arrow_speed","1500")
	register_cvar("diablo_klass_delay","0.5")	
	register_cvar("diablo_dir", "addons/amxmodx/diablo/")
	register_cvar("diablo_show_health","1")	
	
	g_msg_screenfade= get_user_msgid("ScreenFade")
	register_forward(FM_Touch, 		"fwd_touch")
	register_plugin("DiabloMod","6.0","Dbo version") 

	register_event("Flashlight","event_flashlight","b");
	register_event("CurWeapon","CurWeapon","be") 
	register_event("ResetHUD", "ResetHUD", "abe")
	register_event("DeathMsg","DeathMsg","ade") 
	register_event("Damage", "Damage", "b", "2!0")
	register_event("SendAudio","freeze_over","b","2=%!MRAD_GO","2=%!MRAD_MOVEOUT","2=%!MRAD_LETSGO","2=%!MRAD_LOCKNLOAD")
	register_event("SendAudio","freeze_begin","a","2=%!MRAD_terwin","2=%!MRAD_ctwin","2=%!MRAD_rounddraw") 
	register_event( "SendAudio", "eT_win" , "a", "2&%!MRAD_terwin" )
	register_event( "SendAudio", "eCT_win", "a", "2&%!MRAD_ctwin" )
	register_event("SendAudio", "award_defuse", "a", "2&%!MRAD_BOMBDEF")  	
	register_event("BarTime", "bomb_defusing", "be", "1=10", "1=5")
	register_event("StatusIcon", "got_bomb", "be", "1=1", "1=2", "2=c4")
	register_event("TextMsg", "award_hostageALL", "a", "2&#All_Hostages_R" )
	register_event("TextMsg","host_killed","b","2&#Killed_Hostage") 
	register_event("TextMsg", "freeze_begin", "a", "2=#Game_will_restart_in")
	register_event("SendAudio","freeze_over1","b","2=%!MRAD_GO","2=%!MRAD_MOVEOUT","2=%!MRAD_LETSGO","2=%!MRAD_LOCKNLOAD")
	register_event("Health", "Health", "be", "1!255")
	
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_deagle", "Paladin_deagle", 1 )
	
	register_clcmd( "ultimate", "cmd_Ultimate")
	register_clcmd("say","on_Chat");
	register_clcmd("say_team","on_Chat");
	
	register_logevent("award_plant", 3, "2=Planted_The_Bomb");	
	register_logevent("award_rescuehostage", 3, "1=triggered", "2=Rescued_A_Hostage");
	register_logevent("RoundStart", 2, "0=World triggered", "1=Round_Start")
	
	register_concmd("db_givexp", "CmdGiveXp", ADMIN_KICK, "<name/userid/steamid> <Amount>")
	
	gmsgSayText = get_user_msgid("SayText")
	gmsgDeathMsg = get_user_msgid("DeathMsg")
	gmsgStatusText = get_user_msgid("StatusText")
	gmsgBartimer = get_user_msgid("BarTime") 
	gmsgScoreInfo = get_user_msgid("ScoreInfo") 
	set_msg_block ( gmsgDeathMsg, BLOCK_SET ) 
	gmsgHealth = get_user_msgid("Health") 
	
	set_task(2.0, "UpdateHUD",0,"",0,"b")
	register_think("PowerUp","Think_PowerUp")
	register_think("Effect_Healing_Totem","Effect_Healing_Totem_Think")
	register_think("grenade", "think_Grenade")
	register_think("think_bot", "think_Bot")	
	
	register_forward(FM_WriteString, "FW_WriteString")
	register_forward(FM_AddToFullPack, "client_AddToFullPack")
	register_forward(FM_TraceLine,"fw_traceline")
		
	get_cvar_string("diablo_dir",Basepath,127)
	
	register_touch("throwing_knife", "player", "touchKnife")
	register_touch("throwing_knife", "worldspawn",		"touchWorld")
	register_touch("throwing_knife", "func_wall",		"touchWorld")
	register_touch("throwing_knife", "func_door",		"touchWorld")
	register_touch("throwing_knife", "func_door_rotating",	"touchWorld")
	register_touch("throwing_knife", "func_wall_toggle",	"touchWorld")
	register_touch("throwing_knife", "dbmod_shild",		"touchWorld")
	register_touch("throwing_knife", "func_breakable",	"touchbreakable")
	register_touch("func_breakable", "throwing_knife",	"touchbreakable")
	register_touch("xbow_arrow", "player", 			"toucharrow")
	register_touch("xbow_arrow", "worldspawn",		"touchWorld2")
	register_touch("xbow_arrow", "func_wall",		"touchWorld2")
	register_touch("xbow_arrow", "func_door",		"touchWorld2")
	register_touch("xbow_arrow", "func_door_rotating",	"touchWorld2")
	register_touch("xbow_arrow", "func_wall_toggle",	"touchWorld2")
	register_touch("xbow_arrow", "dbmod_shild",		"touchWorld2")
	register_touch("xbow_arrow", "func_breakable",		"touchbreakable")
	register_touch("func_breakable", "xbow_arrow",		"touchbreakable")

	_create_ThinkBot()
	
	return PLUGIN_CONTINUE  
}



public on_Chat(id) {
	
	new szSaid[32]
	read_args(szSaid, 31) 

	if (equali(szSaid,"^"/class^"") || equali(szSaid,"^"/changerace^"") || equali(szSaid,"^"/changeclass^"") ) {
		changerace(id)
	}
	
	if (equali(szSaid,"^"/speed^"")) {
		speed(id)
	}
	if (equali(szSaid,"^"/players^"")) {
		cmd_who(id)
	}
	if (equali(szSaid,"^"/reset^"") || equali(szSaid,"^"/resetskills^"")) {
		reset_skill(id)
	}
	if (equali(szSaid,"^"/showskills^"") || equali(szSaid,"^"/skills^"")) {
		skills(id)
	}	
	if (equali(szSaid,"^"/help^"")  || equali(szSaid,"^"/helpme^"") || equali(szSaid,"^"/commands^"") ) {
		Commands_menu(id)
	}	
	
	if (equali(szSaid,"^"/savexp^"")  || equali(szSaid,"^"savexp^"")) {
		savexpcom(id)
	}
	if (equali(szSaid,"^"/buyxp^"")  || equali(szSaid,"^"buyxp^"")) {
		BuyXP(id)
	}
	if (equali(szSaid,"^"/classinfo^"")  || equali(szSaid,"^"classinfo^"")) {
		Classinfo_menu(id)
	}
	if (equali(szSaid,"^"/autobuyxp^"")  || equali(szSaid,"^"autobuyxp^"")) {
		Autobuyxp(id)
	}			
	if (equali(szSaid,"^"/classattribs^"")  || equali(szSaid,"^"classattribs^"") || equali(szSaid,"^"/classattributes^"") || equali(szSaid,"^"classattribs^"")) {
		ClassAttribs(id)
	}	
			
}

public sql_start() {
	if(sqlstart<0) return
	if(g_boolsqlOK) return
	
	new host[128]
	new user[64]
	new pass[64]
	new database[64]
	
	get_cvar_string("diablo_sql_database",database,63)
	get_cvar_string("diablo_sql_host",host,127)
	get_cvar_string("diablo_sql_user",user,63)
	get_cvar_string("diablo_sql_pass",pass,63)
	
	g_SqlTuple = SQL_MakeDbTuple(host,user,pass,database)
		
	get_cvar_string("diablo_sql_table",g_sqlTable,63)
	
	new q_command[512]
	format(q_command,511,"CREATE TABLE IF NOT EXISTS `%s` ( `nick` VARCHAR( 64 ),`ip` VARCHAR( 64 ),`sid` VARCHAR( 64 ), `klasa` integer( 2 ) , `lvl` integer( 3 ) DEFAULT 1, `exp` integer( 9 ) DEFAULT 0,  `str` integer( 3 ) DEFAULT 0, `int` integer( 3 ) DEFAULT 0, `dex` integer( 3 ) DEFAULT 0, `agi` integer( 3 ) DEFAULT 0,  `pow` integer( 3 ) DEFAULT 0,  `vamp` integer( 3 ) DEFAULT 0 ) ",g_sqlTable)
	
	SQL_ThreadQuery(g_SqlTuple,"TableHandle",q_command)
}

public TableHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	g_boolsqlOK=1
	if(Errcode) {
		g_boolsqlOK=0
		log_to_file("addons/amxmodx/logs/diablo.log","Error on Table query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		g_boolsqlOK=0
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Table Query failed.")
		g_boolsqlOK=0
		return PLUGIN_CONTINUE
	}
	 	
	LoadAVG()
	return PLUGIN_CONTINUE
}

public create_klass(id) {
	if(g_boolsqlOK) {	
		if(!is_user_bot(id) && database_user_created[id]==0) {
			new name[64]
			new ip[64]
			new sid[64]
			
			get_user_name(id,name,63)
			replace_all ( name, 63, "'", "Q" )
			replace_all ( name, 63, "`", "Q" )
			
			get_user_ip ( id, ip, 63, 1 )
			get_user_authid(id, sid ,63)
			
			log_to_file("addons/amxmodx/logs/test_log.log","*** %s %s *** Create Class ***",name,sid)
			
			for(new i=1;i<8;i++) {
				new q_command[512]
				format(q_command,511,"INSERT INTO `%s` (`nick`,`ip`,`sid`,`klasa`,`lvl`,`exp`) VALUES ('%s','%s','%s',%i,%i,%i ) ",g_sqlTable,name,ip,sid,i,srv_avg[i],LevelXP[srv_avg[i]-1])
				SQL_ThreadQuery(g_SqlTuple,"create_klass_Handle",q_command)
			}
			database_user_created[id]=1
		}
	}
	else sql_start()
}

public create_klass_Handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	if(Errcode) {
		log_to_file("addons/amxmodx/logs/diablo.log","Error on create klass query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","create klass Query failed.")
		return PLUGIN_CONTINUE
	}
	   
	return PLUGIN_CONTINUE
}

public load_xp(id) {
	if(g_boolsqlOK) {
		if(!is_user_bot(id)) {
			new name[64]
			new data[1]
			data[0]=id
			
			if(get_cvar_num("diablo_sql_save")==2) {
				get_user_authid(id, name ,63)
				new q_command[512]
				format(q_command,511,"SELECT `klasa` FROM `%s` WHERE `sid`='%s' ",g_sqlTable,name)
				SQL_ThreadQuery(g_SqlTuple,"SelectHandle",q_command,data,1)
			}
			loaded_xp[id]=1
		}
	}
	else sql_start()
}

public SelectHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	if(Errcode)	{
		log_to_file("addons/amxmodx/logs/diablo.log","Error on load_xp query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","load_xp Query failed.")
		return PLUGIN_CONTINUE
	}
	
	if(SQL_MoreResults(Query)) return PLUGIN_CONTINUE
	else create_klass(Data[0])		
   
	return PLUGIN_CONTINUE
}

public Health(id) { 
	if(get_cvar_num("diablo_show_health")==1) {
		new health = read_data(1) 
		if(health>255) {
			message_begin( MSG_ONE, gmsgHealth, {0,0,0}, id ) 
			write_byte( 255 ) 
			message_end() 
		} 
	}
}

public speed(id) {
	new Float:spd = get_user_maxspeed(id)
	ColorChat(id, "Max Speed: %f", spd)
	
	new Float:vect[3]
	entity_get_vector(id,EV_VEC_velocity,vect)
	new Float: sped= floatsqroot(vect[0]*vect[0]+vect[1]*vect[1]+vect[2]*vect[2])
	
	ColorChat(id, "Current Speed: %f", sped)
}

public plugin_precache() { 

	precache_model("addons/amxmodx/diablo/totem_heal.mdl")
	precache_model(KNIFE_VIEW)     
	precache_model(KNIFE_PLAYER)
	precache_model(Deagle_view)
	precache_model(Ninja_katana)	
	precache_model(Deagle_player)
	precache_model(C4_VIEW)     
	precache_model(C4_PLAYER)
	precache_model(HE_VIEW)     
	precache_model(HE_PLAYER)
	precache_model(FL_VIEW)     
	precache_model(FL_PLAYER)
	precache_model(SE_VIEW)     
	precache_model(SE_PLAYER)	
	precache_sound("weapons/xbow_hit2.wav")
	precache_sound("weapons/xbow_fire1.wav")
	sprite_blood_drop = precache_model("sprites/blood.spr")
	sprite_blood_spray = precache_model("sprites/bloodspray.spr")
	sprite_line = precache_model("sprites/dot.spr")
	sprite_white = precache_model("sprites/white.spr") 
	precache_sound(Barb_Rage)
	precache_sound("weapons/knife_hitwall1.wav")
	precache_sound("weapons/knife_hit4.wav")
	precache_sound("weapons/knife_deploy1.wav")
	precache_model("models/diablomod/w_throwingknife.mdl")
	precache_model(cbow_VIEW)
	precache_model(cvow_PLAYER)
	precache_model(cbow_bolt)
}

public savexpcom(id) {
	if(!is_user_bot(id)) {
		if(player_class[id]!=0 && player_class_lvl[id][player_class[id]]==player_lvl[id] ) {
			SaveXP(id)
		}
	}
}

public SaveXP(id) {
	if(g_boolsqlOK) {
		if(!is_user_bot(id) && player_xp[id]!=player_xp_old[id]) {
			new name[64]
			new ip[64]
			new sid[64]
			
			get_user_name(id,name,63)
			replace_all ( name, 63, "'", "Q" )
			replace_all ( name, 63, "`", "Q" )
			
			get_user_ip(id, ip ,63,1)
			get_user_authid(id, sid ,63)
			
			if(get_cvar_num("diablo_sql_save")==2) {
				new q_command[512]
				format(q_command,511,"UPDATE `%s` SET `nick`='%s',`ip`='%s',`lvl`='%i',`exp`='%i',`str`='%i',`int`='%i',`dex`='%i',`agi`='%i',`pow`='%i',`vamp`='%i' WHERE `sid`='%s' AND `klasa`='%i' ",g_sqlTable,name,ip,player_lvl[id],player_xp[id],player_strength[id],player_intelligence[id],player_dextery[id],player_agility[id],player_power[id],player_vampyric[id],sid,player_class[id])
				SQL_ThreadQuery(g_SqlTuple,"Save_xp_handle",q_command)
			}
			player_xp_old[id]=player_xp[id]
				
		}
	}
	else sql_start()
	
	return PLUGIN_HANDLED
} 

public Save_xp_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	if(Errcode) {
		log_to_file("addons/amxmodx/logs/diablo.log","Error on Save_xp query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Save_xp Query failed.")
		return PLUGIN_CONTINUE
	}
	
	return PLUGIN_CONTINUE
}

public LoadXP(id, klasa){	
	if(is_user_bot(id) || asked_sql[id]==1) return PLUGIN_HANDLED
	
	if(player_class[id]==0)load_xp(id)
	
	if(g_boolsqlOK ) {
		new name[64]
		new data[2]
		data[0]=id
		data[1]=klasa
		
		if(get_cvar_num("diablo_sql_save")==2) {
			get_user_authid(id, name ,63)
			new q_command[512]
			format(q_command,511,"SELECT * FROM `%s` WHERE `sid`='%s' AND `klasa`='%i'", g_sqlTable, name, player_class[id])  
			
			SQL_ThreadQuery(g_SqlTuple,"Load_xp_handle",q_command,data,2)
			asked_sql[id]=1
		}
	}
	else sql_start()
	return PLUGIN_HANDLED
} 

public Load_xp_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	new id = Data[0]
	asked_sql[id]=0
	
	if(Errcode) {
		log_to_file("addons/amxmodx/logs/diablo.log","Error on Load_xp query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Load_xp Query failed.")
		return PLUGIN_CONTINUE
	}
	   
	if(SQL_MoreResults(Query)) {
		
		player_class[id] = Data[1]
		player_lvl[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"lvl"))	
		player_xp[id] =	SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"exp"))	
		player_xp_old[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"exp"))
		
		player_intelligence[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"int"))
		player_strength[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"str")) 
		player_agility[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"agi")) 
		player_dextery[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"dex")) 
		player_power[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"pow")) 
		player_vampyric[id] = SQL_ReadResult(Query,SQL_FieldNameToNum(Query,"vamp")) 
		
		
		player_point[id]=(player_lvl[id]-1)*2-player_intelligence[id]-player_strength[id]-player_dextery[id]-player_agility[id]	-player_power[id]-player_vampyric[id]
		if(player_point[id]<0) player_point[id]=0
		player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)		
	}
	return PLUGIN_CONTINUE
}

public LoadAVG() {
	if(g_boolsqlOK) {
		new data[2]
		data[0]= get_cvar_num("diablo_avg")
		
		if(data[0]) {
			for(new i=1;i<8;i++) {
				new q_command[512]
				data[1]=i
				format(q_command,511,"SELECT `klasa`,AVG(`lvl`) AS `AVG` FROM `%s` WHERE `lvl` > '%d' GROUP BY `klasa`", g_sqlTable, data[0]-1)
				SQL_ThreadQuery(g_SqlTuple,"Load_AVG_handle",q_command,data,2)
			}
		}
	}
	else sql_start()
	return PLUGIN_HANDLED
} 

public Load_AVG_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	if(Errcode)	{
		log_to_file("addons/amxmodx/logs/diablo.log","Error on Load_AVG query: %s",Error)
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		return PLUGIN_CONTINUE
	}
	else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Load_AVG Query failed.")
		return PLUGIN_CONTINUE
	}
	
	while(SQL_MoreResults(Query)) {
		new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
		srv_avg[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "AVG"))
		SQL_NextRow(Query)
	}
	if(olny_one_time==0) {
		olny_one_time=1
		look_for_none()
	}
	return PLUGIN_CONTINUE
}

public look_for_none() {
	for(new i=1;i<33;i++) {
		if(is_user_alive(i)) {
			if(player_class[i]==0) {
				select_class_query(i)
			}
		}
	}
}

public reset_skill(id) {
	ColorChat(id, "Reseting Skills...");
	player_point[id] = player_lvl[id]*2-2
	player_intelligence[id] = 0
	player_strength[id] = 0 
	player_agility[id] = 0
	player_dextery[id] = 0 
	player_power[id] = 0 
	player_vampyric[id] = 0 
	skilltree(id)
	set_speedchange(id)
	player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)
}


public freeze_over() {
	set_task(get_cvar_float("diablo_klass_delay"), "freezeover", 3659, "", 0, "")
}

public freezeover() {
	freeze_ended = true
}

public freeze_begin() {
	freeze_ended = false
	for (new i=1; i <= get_maxplayers(); i++){
		if (new_class[i] == true) {
		changerace(i)
		
		}
	}
}

public RoundStart() {
	for (new i=1; i <= get_maxplayers(); i++){
	if(!is_user_bot(i) && is_user_alive(i)) {
		Check_Ults(i)
		invisible_cast[i]=0
		set_renderchange(i)
		RoundExperience(i)
		if (autobuyxp[i] == true) peformautobuy(i)
	}
	
	kill_all_entity("throwing_knife")
	
	}
}

public RoundExperience(id) {
	if (player_lvl[id] < 51) {
		Give_Xp(id,20)  
		client_print(id, print_chat, "You have been given 20 experience points!") 
	}	
}

public Check_Ults(id) {

	if (player_class[id] == Mag) {
		player_sorc_heal[id] = 1 + (player_intelligence[id]/25)
	}	
	
	if( player_class[id]== Paladin ) {
		if (player_intelligence[id] == 50) {
			golden_bulet[id]=2 + (player_intelligence[id]/10)
		} else {
			golden_bulet[id]=1 + (player_intelligence[id]/10)
		}	
		GodLeft[id]=1 + (player_intelligence[id]/25)
	}
	
	if (player_class[id] == Assassin) {
		AssassinUlt[id] = 1 + (player_intelligence[id]/10)
	}
	
	if (player_class[id] == Necromancer) {
		NecroRevive[id] = 1 + (player_intelligence[id] / 25)
		NecroUlt[id] = 0
	}
	
	if (player_class[id] == Barbarian) {
		if (player_intelligence[id] > 24 && player_intelligence[id] < 50) {
			ultra_armor[id]=2 + (player_intelligence[id]/10)
		} else if (player_intelligence[id] == 50) {
			ultra_armor[id]=3 + (player_intelligence[id]/10)
		} else {
			ultra_armor[id]=1 + (player_intelligence[id]/10)
		}
		BarbUlt_used[id] = false
	}
	
	if (player_class[id] == Ninja) {
		jumpnum[id] = 30
		give_knife(id)
		set_user_armor(id,100)
		set_gravitychange(id)
		NinjaUlt[id] = 1 + (player_intelligence[id]/16)
	}
	
	if (player_class[id] == Hunter) {
			HunterUlt[id] = 1 + (player_intelligence[id] / 25)
	}	
}

public csw_c44(id) {
	client_cmd(id,"weapon_knife")
	engclient_cmd(id,"weapon_knife")
	on_knife[id]=1
}

public CurWeapon(id) {	

	after_bullet[id]=1
	
	new clip,ammo
	new weapon=get_user_weapon(id,clip,ammo)
	invisible_cast[id]=0
	
	if(weapon == CSW_KNIFE) on_knife[id]=1
	else on_knife[id]=0
	
	if ((weapon != CSW_C4 ) && !on_knife[id] && (player_class[id] == Ninja)) {
		client_cmd(id,"weapon_knife")
		engclient_cmd(id,"weapon_knife")
		on_knife[id]=1
	}

	if (is_user_connected(id)) {

		
		if(on_knife[id]) {
			entity_set_string(id, EV_SZ_viewmodel, KNIFE_VIEW)  
			entity_set_string(id, EV_SZ_weaponmodel, KNIFE_PLAYER)  
		}
		if(weapon == CSW_C4){
			entity_set_string(id, EV_SZ_viewmodel, C4_VIEW)  
			entity_set_string(id, EV_SZ_weaponmodel, C4_PLAYER)  
		}
		if(weapon == CSW_HEGRENADE){
			entity_set_string(id, EV_SZ_viewmodel, HE_VIEW)  
			entity_set_string(id, EV_SZ_weaponmodel, HE_PLAYER)  
		}
		if(weapon == CSW_FLASHBANG){
			entity_set_string(id, EV_SZ_viewmodel, FL_VIEW)  
			entity_set_string(id, EV_SZ_weaponmodel, FL_PLAYER)  
		}
		if(weapon == CSW_SMOKEGRENADE){
			entity_set_string(id, EV_SZ_viewmodel, SE_VIEW)  
			entity_set_string(id, EV_SZ_weaponmodel, SE_PLAYER)  
		}			
		
		if(bow[id]==1) {
			bow[id]=0
			if(on_knife[id]) {
				entity_set_string(id, EV_SZ_viewmodel, KNIFE_VIEW)  
				entity_set_string(id, EV_SZ_weaponmodel, KNIFE_PLAYER)  
			}
		}
		
		if (player_class[id] == Ninja) {
			entity_set_string(id, EV_SZ_viewmodel, Ninja_katana)  
		}
		
		if (player_class[id] == Paladin && weapon == CSW_DEAGLE) {
		
			paladin_bullet[id] = true
			entity_set_string(id, EV_SZ_viewmodel, Deagle_view)  
			entity_set_string(id, EV_SZ_weaponmodel, Deagle_player)  
		} else {
			paladin_bullet[id] = false
		}

		set_gravitychange(id)
		set_speedchange(id)
		set_renderchange(id)
		write_hud(id)
	}	
	
}

public ResetHUD(id) {
	if (!is_user_bot(id)) {
		if (is_user_connected(id)) {	
			remove_task(id+GLUTON)
			change_health(id,999,0,"")
		
			if ((player_intelligence[id]+player_strength[id]+player_agility[id]+player_dextery[id]+player_power[id]+player_vampyric[id])>(player_lvl[id]*2)) reset_skill(id)
	
			player_ultra_armor_left[id]=player_ultra_armor[id]
			if (player_point[id] > 0 ) skilltree(id)
			if (player_class[id] == 0) select_class_query(id)
			client_cmd(id,"hud_centerid 0")  
			set_gravitychange(id)
			set_renderchange(id)
		}
	} else { 
		if (player_class[id] == 0) 	player_class[id] = Bot
	}
}

public DeathMsg(id) {
	new weaponname[20]
	new kid = read_data(1)
	new vid = read_data(2)
	new headshot = read_data(3)
	read_data(4,weaponname,19)
	new players[32], num

	static Float:minsize[3]
	pev(vid, pev_mins, minsize)
	
	flashbattery[vid] = MAX_FLASH;
	flashlight[vid] = 0;
	
	if(cs_get_user_team(vid) == CS_TEAM_CT) get_players(players, num, "ae", "CT") 
	if(cs_get_user_team(vid) == CS_TEAM_T) get_players(players, num, "ae", "TERRORIST") 
	
	if(num > 0) {
		new id 
		for(new i = 0; i < num; i++) { 
			id = players[i] 
			if(player_class[id] == Necromancer && NecroRevive[id] > 0) { 
				new param[1]  
				param[0] = id // save the necromancer  
				NecroRevive[id] --
				set_task(1.0, "necro_spawn", vid+task_revive, param, 1) // little delay to respawn  
				break // already found a necromancer, so let's break loop  
			}     
		} 
	}
	if (headshot && is_user_connected(kid) && is_user_connected(vid) && get_user_team(kid) != get_user_team(vid)) Give_Xp(kid, 5)
		
	if(!is_user_bot(id)) {
	if (is_user_connected(kid) && is_user_connected(vid) && get_user_team(kid) != get_user_team(vid)) {
		show_deadmessage(kid,vid,headshot,weaponname)
		award_kill(kid,vid)
		if (player_class[kid] == Barbarian) change_health(kid,20,0,"")
		change_health(kid,player_vampyric[kid],0,"")
		if (player_class[kid] == Barbarian) refill_ammo(kid)
		set_renderchange(kid)
		savexpcom(vid)
		}
	}
}
public necro_spawn(params[], id) {  
	id -= task_revive  
	new necro = params[0]  
    
	if(is_user_alive(id))    //already revived ?  
		return PLUGIN_HANDLED 

	ExecuteHamB(Ham_CS_RoundRespawn, id) 
	new name[32] 
	get_user_name(necro, name, 31) 
	change_health(id,player_intelligence[necro],0,"")
	Give_Xp(necro, 10)
	client_print(id, print_chat, "You're alive now, thanks to %s", name) 
      
	return PLUGIN_HANDLED  
}  

public Damage(id) {
	if(!is_user_bot(id)) {
	if (is_user_connected(id)) {
		new weapon
		new bodypart
		new attacker_id = get_user_attacker(id,weapon,bodypart)
		if(attacker_id!=0 && attacker_id != id) {
			new damage = read_data(2)
			if (is_user_connected(attacker_id)) {	
				if(get_user_team(id) != get_user_team(attacker_id)) {                               
					if(damage>175) player_dmg[attacker_id]+=damage/2
					else {
						player_dmg[attacker_id]+=damage 
						dmg_exp(attacker_id)
					}
                             

        			
					if (damage > 0 && player_agility[id] > 0) {       
						new heal = floatround(player_damreduction[id]*damage)
						if (is_user_alive(id)) change_health(id,heal,0,"")
					}       
		
					if(weapon == CSW_GLOCK18 || weapon == CSW_USP || weapon == CSW_P228 || weapon == CSW_DEAGLE || weapon == CSW_ELITE || weapon == CSW_FIVESEVEN) {
						switch(player_class[attacker_id]) {
							case Hunter:
							{
								new ori[3]
								trace_bool[attacker_id]=id
								get_user_origin(id,ori)	
                                                                
								new parms[5];
                                                                
								for(new i=0;i<3;i++) {
									parms[i] = ori[i]
								}
								parms[3]=attacker_id
								parms[4]=id
								set_task(0.5,"charge_hunter",attacker_id,parms,5)
							}
						}
					}
				}
			}
		}
	}
	}
}

public un_rander(task_id) {
	new id = task_id - TASK_FLASH_LIGHT
	if(is_user_connected(id)) set_renderchange(id)
}
public client_PreThink ( id ) {	
	new button2 = get_user_button(id);
	
	if(flashlight[id] && flashbattery[id] && (get_cvar_num("flashlight_custom")) && (player_class[id] == Mag)) {
		new num1, num2, num3
		num1=random_num(0,2)
		num2=random_num(-1,1)
		num3=random_num(-1,1)
		flashlight_r+=1+num1
		if (flashlight_r>250) flashlight_r-=245
		flashlight_g+=1+num2
		if (flashlight_g>250) flashlight_g-=245
		flashlight_b+=-1+num3
		if (flashlight_b<5) flashlight_b+=240		
		new origin[3];
		get_user_origin(id,origin,3);
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
		write_byte(27); // TE_DLIGHT
		write_coord(origin[0]); // X
		write_coord(origin[1]); // Y
		write_coord(origin[2]); // Z
		write_byte(get_cvar_num("flashlight_radius")); // radius
		write_byte(flashlight_r); // R
		write_byte(flashlight_g); // G
		write_byte(flashlight_b); // B
		write_byte(1); // life
		write_byte(get_cvar_num("flashlight_decay")); // decay rate
		message_end();
		
		new index1, bodypart1
		get_user_aiming(id,index1,bodypart1) 
		if ((get_user_team(id)!=get_user_team(index1)) && (index1!=0)) {
			if ((index1!=54) && (is_user_connected(index1))) set_user_rendering(index1,kRenderFxGlowShell,flashlight_r,flashlight_g,flashlight_b,kRenderNormal,4)	
			remove_task(TASK_FLASH_LIGHT+index1);
			set_task(7.5, "un_rander",TASK_FLASH_LIGHT+index1)
		}
	}
	
	if (((player_class[id] == Assassin)) && is_user_alive(id)) 
		entity_set_int(id, EV_INT_flTimeStepSound, 300)
		
	new Float:vect[3]
	entity_get_vector(id,EV_VEC_velocity,vect)
	
	if (button2 & IN_RELOAD && on_knife[id] && button[id]==0 && player_class[id]==Hunter){
		bow[id]++
		button[id] = 1;
		command_bow(id)
	}
	
	if ((!(button2 & IN_RELOAD)) && on_knife[id] && button[id]==1) button[id]=0
	
	if (!freeze_ended)
		return PLUGIN_CONTINUE

	if (player_class[id] == Barbarian && BarbUlt[id] == true) {
		set_pev(id,pev_punchangle,{ 0.0,0.0,0.0 });
	}	
	
	if (player_class[id] == Ninja && NinjaUlt_active[id] == true) {
	new nbut = get_user_button(id)
	
	if((nbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(get_user_oldbutton(id) & IN_JUMP)) {
		if(jumpnum[id] < 30) {
			dojump[id] = true
			jumpnum[id]++
			return PLUGIN_CONTINUE
		}
	}
	if((nbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND)) {
		jumpnum[id] = 0
		return PLUGIN_CONTINUE
		}
	}

	if (get_entity_flags(id) & FL_ONGROUND && (!(button2 & (IN_FORWARD+IN_BACK+IN_MOVELEFT+IN_MOVERIGHT))) && is_user_alive(id) && on_knife[id] && player_class[id]==Assassin  && invisible_cast[id]==0 || player_class[id] == Hunter && is_user_alive(id) && !bow[id] && on_knife[id] && cs_get_user_bpammo(id, CSW_FLASHBANG) != 2) {
		if(casting[id]==1 && halflife_time()>cast_end[id]) {
			message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id ) 
			write_byte( 0 ) 
			write_byte( 0 ) 
			message_end() 
			casting[id]=0
			
			
			if (player_class[id] == Assassin) { 
				invisible_cast[id]=1
				set_renderchange(id)
			}
			if (player_class[id] == Hunter) give_item(id, "weapon_flashbang")
				
		
			
		} else if(casting[id]==0) {
			new Float: time_delay = 5.0-(player_intelligence[id]/25.0)

			if(player_class[id] == Assassin) time_delay*=2.0

			cast_end[id]=halflife_time()+time_delay
			new bar_delay = floatround(time_delay,floatround_ceil)
			casting[id]=1
			message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id ) 
			write_byte( bar_delay ) 
			write_byte( 0 ) 
			message_end() 
		}
	} else {	
		if(casting[id]==1) {
			message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id ) 
			write_byte( 0 ) 
			write_byte( 0 ) 
			message_end() 	
		}
		casting[id]=0			
	}
		
	if(player_class[id]==Ninja && (pev(id,pev_button) & IN_RELOAD)) command_knife(id) 
	else if (pev(id,pev_button) & IN_RELOAD && on_knife[id] && max_knife[id]>0) command_knife(id) 

	if(player_class[id]==Hunter) {
		new clip,ammo
		new weapon = get_user_weapon(id,clip,ammo)	
		
		if(bow[id] == 1) {
			if((bowdelay[id] + 4.25 - float(player_intelligence[id]/19))< get_gametime() && button2 & IN_ATTACK) {
				bowdelay[id] = get_gametime()
				command_arrow(id) 
			}
			entity_set_int(id, EV_INT_button, (button2 & ~IN_ATTACK) & ~IN_ATTACK2)
		}
		
		if(g_GrenadeTrap[id] && button2 & IN_ATTACK2) {
			switch(weapon) {
				case CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
				{
					if((g_PreThinkDelay[id] + 0.28) < get_gametime()) {
						switch(g_TrapMode[id]) {
							case 0: g_TrapMode[id] = 1
							case 1: g_TrapMode[id] = 0
						}
						client_print(id, print_center, "Grenade Trap %s", g_TrapMode[id] ? "[ON]" : "[OFF]")
						g_PreThinkDelay[id] = get_gametime()
					}
				}
				default: g_TrapMode[id] = 0
			}
		}
	}
	
	return PLUGIN_CONTINUE		
}

public client_PostThink(id) {
	if(!is_user_alive(id)) return PLUGIN_CONTINUE
	
	if(dojump[id] == true) {
		new Float:velocity[3]	
		entity_get_vector(id,EV_VEC_velocity,velocity)
		velocity[2] = random_float(265.0,285.0)
		entity_set_vector(id,EV_VEC_velocity,velocity)
		dojump[id] = false
		return PLUGIN_CONTINUE
	}
	return PLUGIN_CONTINUE
}	

public client_AddToFullPack(ent_state,e,edict_t_ent,edict_t_host,hostflags,player,pSet) {
	
	if (!pev_valid(e)|| !pev_valid(edict_t_ent) || !pev_valid(edict_t_host))
		return FMRES_HANDLED
			
	new classname[32]
	pev(e,pev_classname,classname,31)
	
	new hostclassname[32]
	pev(edict_t_host,pev_classname,hostclassname,31)
		
	if (is_user_alive(e) && is_user_alive(edict_t_host) && e != edict_t_host) {
		
	}		
	return FMRES_HANDLED
}

public skilltree(id) {
	new szText[ 555 char ];
	
	formatex( szText, charsmax( szText ), "Select Stats - \rPoints: %i", player_point[ id ] );
	new skillzMenu = menu_create( szText , "skill_menu" );
	
	formatex( szText, charsmax( szText ), "Intelligence [%i] [Improve your class's unique ability]", player_intelligence[id] );
	menu_additem( skillzMenu, szText, "1", 0 );
	
	formatex( szText, charsmax( szText ), "Strength [%i] [Increase your maximum health]", player_strength[id] );
	menu_additem( skillzMenu, szText, "2", 0 );
	
	formatex( szText, charsmax( szText ), "Agility [%i]  [Take less physical damage]", player_agility[id] );
	menu_additem( skillzMenu, szText, "3", 0 );
	
	formatex( szText, charsmax( szText ), "Dexterity [%i]  [Increased movement speed and magical damage reduction]", player_dextery[id] );
	menu_additem( skillzMenu, szText, "4", 0 );

	formatex( szText, charsmax( szText ), "Power [%i]  [Deal additional physical damage]", player_power[id] );
	menu_additem( skillzMenu, szText, "5", 0 );

	formatex( szText, charsmax( szText ), "Vampyrism [%i]  [Restore health upon kill]", player_vampyric[id] );
	menu_additem( skillzMenu, szText, "6", 0 );

	
	menu_setprop( skillzMenu, MPROP_NUMBER_COLOR, "\w" );
	menu_setprop( skillzMenu , MPROP_EXIT , MEXIT_NEVER );
	menu_display( id , skillzMenu , 0 );
	return PLUGIN_HANDLED;
} 
	
public skill_menu(id , skillzMenu , iItem) { 
	if( iItem == MENU_EXIT ) {
        menu_destroy( skillzMenu );
        return PLUGIN_HANDLED;
    }

	new data[ 6 ] , szName[ 64 ];
	new access, callback;
	menu_item_getinfo( skillzMenu, iItem, access, data, charsmax( data ), szName, charsmax( szName ), callback );
	
	new key = str_to_num( data );
	switch( key ) {
		case 1:
		{
			if (player_intelligence[id]<50){
				player_point[id]-=1
				player_intelligence[id]+=1
			}
			else client_print(id,print_center,"You have reached the Maximum level of Intelligence!")
		}
		
		case 2:
		{
			if (player_strength[id]<50){
				player_point[id]-=1	
				player_strength[id]+=1
			}
			else client_print(id,print_center,"You have reached the Maximum level of Strength!")
		}
		
		case 3:
		{
			if (player_agility[id]<50){
				player_point[id]-=1
				player_agility[id]+=1
				player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)
			}
			else client_print(id,print_center,"You have reached the Maximum level of Agility!")
		}
		
		case 4: 
		{	
			if (player_dextery[id]<50){
				player_point[id]-=1
				player_dextery[id]+=1
				set_speedchange(id)
			}
			else client_print(id,print_center,"You have reached the Maximum level of Dexterity!")
		}
		
		case 5: 
		{	
			if (player_power[id]<50){
				player_point[id]-=1
				player_power[id]+=1
			}
			else client_print(id,print_center,"You have reached the Maximum level of Power!")
		}
		
		case 6: 
		{	
			if (player_vampyric[id]<50){
				player_point[id]-=1
				player_vampyric[id]+=1
			}
			else client_print(id,print_center,"You have reached the Maximum level of Vampyrism!")
		}
	}
	
	if (player_point[id] > 0) 
	skilltree(id)
	
	menu_destroy( skillzMenu ); 
	return PLUGIN_CONTINUE 
}

public show_deadmessage(killer_id,victim_id,headshot,weaponname[]) {
	if (!(killer_id==victim_id && !headshot && equal(weaponname,"world"))) {
		message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0)
		write_byte(killer_id)
		write_byte(victim_id)
		write_byte(headshot)
		write_string(weaponname)
		message_end()
	}
}

public got_bomb(id) { 
    planter = id; 
    return PLUGIN_CONTINUE 
} 

public award_plant() {
	new Players[32], playerCount, id
	get_players(Players, playerCount, "aeh", "TERRORIST") 
		
	for (new i=0; i<playerCount; i++) {
		id = Players[i]
		Give_Xp(id,get_cvar_num("diablo_xpbonus"))	
		ColorChat(id, "^x04You have earned *%i* Experience for the team bomb plant event!", get_cvar_num("diablo_xpbonus"));
	}	
	Give_Xp(planter,get_cvar_num("diablo_xpbonus2"))
	ColorChat(planter,"^x04You have earned *%i* Experience for planting the bomb!",get_cvar_num("diablo_xpbonus2"))
}

public bomb_defusing(id) { 
    defuser = id; 
    return PLUGIN_CONTINUE 
} 

public award_defuse() {
	new Players[32], playerCount, id
	get_players(Players, playerCount, "aeh", "CT") 
		
	for (new i=0; i<playerCount; i++) {
		id = Players[i] 
		Give_Xp(id,get_cvar_num("diablo_xpbonus"))
		ColorChat(id, "^x04You have earned *%i* Experience for the team bomb defuse event!", get_cvar_num("diablo_xpbonus"))
	}
	Give_Xp(defuser,get_cvar_num("diablo_xpbonus2"))
	ColorChat(defuser,"^x04You have earned *%i* Experience for defusing the bomb!",get_cvar_num("diablo_xpbonus2"))
}

public award_hostageALL(id) {
	if (is_user_connected(id) == 1)
		Give_Xp(id,get_cvar_num("diablo_xpbonus2")/2)	
}

public award_rescuehostage() { 
	new id = get_loguser_index(); 
	Give_Xp(id,5)
	ColorChat(id,"^x04You have earned 5 Experience for rescuing a hostage!")
} 

public award_kill(killer_id,victim_id) {
	if (!is_user_connected(killer_id) || !is_user_connected(victim_id))
		return PLUGIN_CONTINUE
		
	new xp_award = get_cvar_num("diablo_xpbonus")
		
	new Team[32]
	get_user_team(killer_id,Team,31)
	
	if (LeaderCT > 0 && equal(Team,"CT") && !is_user_alive(LeaderCT))
		xp_award-= get_cvar_num("diablo_xpbonus")/4
	
	if (LeaderT > 0 && equal(Team,"TERRORIST") && !is_user_alive(LeaderT))
		xp_award-= get_cvar_num("diablo_xpbonus")/4
		
	if (player_xp[killer_id]<player_xp[victim_id]) 
		xp_award+=get_cvar_num("diablo_xpbonus")/4
		
	new more_lvl=player_lvl[victim_id]-player_lvl[killer_id]
	
	if(more_lvl>0) xp_award += floatround((get_cvar_num("diablo_xpbonus")/7)*(more_lvl*((2.0-more_lvl/40.0)/3.0)))
	else if(more_lvl<-50)xp_award -= get_cvar_num("diablo_xpbonus")*(2/3)
	else if(more_lvl<-40)xp_award -= get_cvar_num("diablo_xpbonus")/2
	else if(more_lvl<-30)xp_award -= get_cvar_num("diablo_xpbonus")/3
	else if(more_lvl<-20)xp_award -= get_cvar_num("diablo_xpbonus")/4
	else if(more_lvl<-10)xp_award -= get_cvar_num("diablo_xpbonus")/7
	
	Give_Xp(killer_id,xp_award)

	return PLUGIN_CONTINUE
}

public Give_Xp(id,amount) {	
	if(!is_user_bot(id)) {
		if(player_class_lvl[id][player_class[id]]==player_lvl[id]) {
			if(player_xp[id]+amount!=0 && get_playersnum()>1) {
				player_xp[id]+=amount
				if (player_xp[id] > LevelXP[player_lvl[id]]) {
					player_lvl[id]+=1
					player_point[id]+=2
					set_hudmessage(60, 200, 25, -1.0, 0.25, 0, 1.0, 2.0, 0.1, 0.2, 2)
					show_hudmessage(id, "You have advanced to level %i!", player_lvl[id]) 
					savexpcom(id)
					player_class_lvl[id][player_class[id]]=player_lvl[id]
				}
			
				if (player_xp[id] < LevelXP[player_lvl[id]-1]) {
					player_lvl[id]-=1
					player_point[id]-=2
					set_hudmessage(60, 200, 25, -1.0, 0.25, 0, 1.0, 2.0, 0.1, 0.2, 2)
					show_hudmessage(id, "You have dropped to level %i!", player_lvl[id]) 
					savexpcom(id)
					player_class_lvl[id][player_class[id]]=player_lvl[id]
				}
				write_hud(id)
			}
		}
	}
}

public client_connect(id) {
	asked_sql[id]=0
	flashbattery[id] = MAX_FLASH
	player_xp[id] = 0		
	player_lvl[id] = 1		
	player_point[id] = 0	
	player_agility[id] = 0
	player_strength[id] = 0
	player_intelligence[id] = 0
	player_dextery[id] = 0
	player_power[id] = 0
	player_vampyric[id] = 0
	player_class[id] = 0
	player_damreduction[id] = 0.0
	last_update_xp[id] = -1
	DemageTake[id]=0
	g_GrenadeTrap[id] = 0
	g_TrapMode[id] = 0
	select_class_query(id)
}

public client_putinserver(id) {
	loaded_xp[id]=0
	player_class_lvl_save[id]=0
	database_user_created[id]=0
	select_class_query(id)
	jumpnum[id] = 0
	dojump[id] = false
}

public client_disconnect(id) {
	jumpnum[id] = 0
	dojump[id] = false	
	savexpcom(id)
	remove_task(TASK_CHARGE+id)     
	player_class_lvl_save[id]=0
	loaded_xp[id]=0
}

public write_hud(id) {

	if (!is_user_bot(id)) {
	set_hudmessage(60, 200, 25, 0.0, 0.9, 0, 1.0, 2.0, 0.1, 0.2, 2)

	if (player_lvl[id] == 0)
		player_lvl[id] = 1
			
	new tpstring[1024] 
	
	new Float:xp_now
	new Float:xp_need
	new Float:perc
	
	if (last_update_xp[id] == player_xp[id]) {
		perc = last_update_perc[id]
	} else {
		if (player_lvl[id] == 1) {
			xp_now = float(player_xp[id])
			xp_need = float(LevelXP[player_lvl[id]])
			perc = xp_now*100.0/xp_need
		} else {
			xp_now = float(player_xp[id])-float( LevelXP[player_lvl[id]-1])
			xp_need = float(LevelXP[player_lvl[id]])-float(LevelXP[player_lvl[id]-1])
			perc = xp_now*100.0/xp_need
		}
	}
	
	last_update_xp[id] = player_xp[id]
	last_update_perc[id] = perc
	
	if(player_class[id]==Paladin) {
		show_hudmessage(id, "    Godmode Charges: %i   Magic deagle bullets: %i" ,GodLeft[id], golden_bulet[id]) 
	} else if(player_class[id]==Assassin) {
		show_hudmessage(id, "    Blink Charges: %i    Status: %s  " ,AssassinUlt[id], invisible_cast[id] ? "[Invisible]" : "[Visible]") 
	} else if(player_class[id]==Barbarian) {
		show_hudmessage(id, "    Armor Charges: %i    " ,ultra_armor[id]) 
	} else if(player_class[id]==Ninja) {
		show_hudmessage(id, "    Knife Charges: %i   Max Speed: %f  Hyper charges %i" ,player_knife[id], get_user_maxspeed(id), NinjaUlt[id]) 
	} else if(player_class[id]==Hunter) {
		show_hudmessage(id, "    Hunter invisible stacks: %i   " ,HunterUlt[id]) 
	} else if(player_class[id]==Necromancer) {
		show_hudmessage(id, "    Team revive stacks: %i   " ,NecroRevive[id]) 	
	}
	
	if (player_lvl[id] == 151) {
		format(tpstring,1023,"%s Level: %i (Max) ", Race[player_class[id]], player_lvl[id])
	} else {
		format(tpstring,1023,"%s Level: %i XP: %i/%i (%0.0f%s)", Race[player_class[id]], player_lvl[id], player_xp[id], LevelXP[player_lvl[id]], perc,"%%")
	}
	message_begin(MSG_ONE,gmsgStatusText,{0,0,0}, id) 
	write_byte(0) 
	write_string(tpstring) 
	message_end() 
	}
}

public UpdateHUD() {  
	
	for (new id=1; id <= get_maxplayers(); id++){
		if (!is_user_bot(id)) {
		
		if (!is_user_connected(id))
			continue
			
		set_renderchange(id)	
		if (!is_user_bot(id)) {

			set_gravitychange(id)
			set_speedchange(id)
			set_renderchange(id)
		
			if (is_user_alive(id)) write_hud(id)
			else {
				new index,bodypart 
				get_user_aiming(id,index,bodypart)  
			
				if(index >= 0 && index < MAX && is_user_connected(index) && is_user_alive(index)) {
					new pname[32]
					get_user_name(index,pname,31)
				
					new Msg[512]
					set_hudmessage(255, 255, 255, 0.78, 0.65, 0, 6.0, 3.0)
					format(Msg,511,"Name: %s^nLevel: %i^nClass: %s^nIntelligence: %i^nStrength: %i^nAgility: %i^nDexterity: %i^nPower: %i^nVampyric: %i    ",pname,player_lvl[index],Race[player_class[index]], player_intelligence[index],player_strength[index],player_agility[index],player_dextery[index],player_power[index],player_vampyric[index])		
					show_hudmessage(id, Msg)
					}
				}
			}
		}	
	}
}

public Create_Line(id,origin1[3],origin2[3],bool:draw) {
	if (draw) {
		message_begin(MSG_ONE,SVC_TEMPENTITY,{0,0,0},id)
		write_byte(0)
		write_coord(origin1[0])	// starting pos
		write_coord(origin1[1])
		write_coord(origin1[2])
		write_coord(origin2[0])	// ending pos
		write_coord(origin2[1])
		write_coord(origin2[2])
		write_short(sprite_line)	// sprite index
		write_byte(1)		// starting frame
		write_byte(5)		// frame rate
		write_byte(2)		// life
		write_byte(3)		// line width
		write_byte(0)		// noise
		write_byte(255)	// RED
		write_byte(50)	// GREEN
		write_byte(50)	// BLUE					
		write_byte(155)		// brightness
		write_byte(5)		// scroll speed
		message_end()
	}
	
	new Float:ret[3],Float:fOrigin1[3],Float:fOrigin2[3]
	origin1[2]+=50
	IVecFVec(origin1,fOrigin1)
	IVecFVec(origin2,fOrigin2)
	new hit = trace_line ( 0, fOrigin1, fOrigin2, ret )
	return hit
}

public host_killed(id) {
	if (player_lvl[id] > 1)	{
		hudmsg(id,2.0,"You lost some experience for killing hostages!")
		Give_Xp(id,-floatround(3*player_lvl[id]/(1.65-player_lvl[id]/60)))
	}
}

public select_class_query(id) {
	if(is_user_bot(id) || asked_klass[id]!=0) return PLUGIN_HANDLED
	if(loaded_xp[id]==0) {
		load_xp(id)
		return PLUGIN_HANDLED
	}
	
	if(g_boolsqlOK) {
		asked_klass[id]=1
		new name[64]
		new data[1]
		data[0]=id
		new lx[8]
		if(player_class_lvl_save[id]==0) {
			if(get_cvar_num("diablo_sql_save")==2) {
				get_user_authid(id, name ,63)
				new q_command[512]
				format(q_command,511,"SELECT `klasa`,`lvl` FROM `%s` WHERE `sid`='%s' ",g_sqlTable,name)
				SQL_ThreadQuery(g_SqlTuple,"select_class_handle",q_command,data,1)
			}
		} else {
			for(new i=1;i<8;i++) lx[i]=player_class_lvl[id][i]
			select_class(id,lx)
		}
	} else sql_start()
	
	return PLUGIN_HANDLED  
} 

public select_class_handle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
	new id=Data[0]
	if(Errcode) {
		log_to_file("addons/amxmodx/logs/diablo.log","Error on select_class_handle query: %s",Error)
		asked_klass[id]=0
	}
	if(FailState == TQUERY_CONNECT_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.")
		asked_klass[id]=0
		return PLUGIN_CONTINUE
	} else if(FailState == TQUERY_QUERY_FAILED) {
		log_to_file("addons/amxmodx/logs/diablo.log","select_class_handle Query failed.")
		asked_klass[id]=0
		return PLUGIN_CONTINUE
	}	 	
	
	if(SQL_MoreResults(Query)) {
		new lx[8]
		
		while(SQL_MoreResults(Query)) {
			new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
			lx[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "lvl"))
			player_class_lvl[id][i] = lx[i]
			SQL_NextRow(Query)
		}
		
		if(asked_klass[id]==1) {
			asked_klass[id]=2
			select_class(id,lx)
		}
		
	}
	return PLUGIN_CONTINUE
}

public select_class(id,lx[]) {
		    
	asked_klass[id]=0
    
	new szText[555 char]
	
	new ClassMenu = menu_create("Select Class", "select_class_menu")
        
	formatex(szText, charsmax(szText), "Sorcerer^t^tLevel: %d", lx[1])
	menu_additem(ClassMenu, szText, "1", 0)
    
	formatex(szText, charsmax(szText), "Paladin^t^tLevel: %d", lx[2])
	menu_additem(ClassMenu, szText, "2", 0)
    
	formatex(szText, charsmax(szText), "Assassin^t^tLevel: %d", lx[3])
	menu_additem(ClassMenu, szText, "3", 0)
    
	formatex(szText, charsmax(szText), "Necromancer^t^tLevel: %d", lx[4])
	menu_additem(ClassMenu, szText, "4", 0)
    
	formatex(szText, charsmax(szText), "Barbarian^t^tLevel: %d", lx[5])
	menu_additem(ClassMenu, szText, "5", 0)

	formatex(szText, charsmax(szText), "Ninja^t^tLevel: %d", lx[6])
	menu_additem(ClassMenu, szText, "6", 0)
    
	formatex(szText, charsmax(szText), "Hunter^t^tLevel: %d", lx[7])
	menu_additem(ClassMenu, szText, "7", 0)

	menu_setprop(ClassMenu, MPROP_EXIT , MEXIT_NEVER);
	menu_display(id, ClassMenu, 0);
} 

public select_class_menu(id, ClassMenu, item) {
    if(item == MENU_EXIT) {
        menu_destroy(ClassMenu);
        return PLUGIN_HANDLED;
    }
    
    new Data[7], Name[64];
    new Access, Callback;
    menu_item_getinfo(ClassMenu, item, Access, Data,5, Name, 63, Callback);
    
    new Key = str_to_num(Data);
    
    switch(Key) { 
        case 1:
            player_class[id] = Mag
        case 2: 
        {    
            player_class[id] = Paladin
                       
        }
        case 3: 
            player_class[id] = Assassin

        case 4: 
		{
            player_class[id] = Necromancer
            
        }
        case 5: 
        {    
            player_class[id] = Barbarian
        }
        case 6:
            player_class[id] = Ninja
        case 7:
        {
            player_class[id] = Hunter
            g_GrenadeTrap[id] = 1
        }
    }
	
    LoadXP(id, player_class[id])
    CurWeapon(id)
    Check_Ults(id)
    new_class[id] = false
    return PLUGIN_HANDLED
}  

public UTIL_Teleport(id,distance) {	
	Set_Origin_Forward(id,distance)
	new origin[3]
	get_user_origin(id,origin)
	message_begin(MSG_BROADCAST ,SVC_TEMPENTITY) //message begin
	write_byte(TE_PARTICLEBURST )
	write_coord(origin[0]) // origin
	write_coord(origin[1]) // origin
	write_coord(origin[2]) // origin
	write_short(20) // radius
	write_byte(1) // particle color
	write_byte(4) // duration * 10 will be randomized a bit
	message_end()
}

stock Set_Origin_Forward(id, distance) {
	new Float:origin[3]
	new Float:angles[3]
	new Float:teleport[3]
	new Float:heightplus = 10.0
	new Float:playerheight = 64.0
	new bool:recalculate = false
	new bool:foundheight = false
	pev(id,pev_origin,origin)
	pev(id,pev_angles,angles)
	
	teleport[0] = origin[0] + distance * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
	teleport[1] = origin[1] + distance * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
	teleport[2] = origin[2]+heightplus
	
	while (!Can_Trace_Line_Origin(origin,teleport) || Is_Point_Stuck(teleport,48.0)) {	
		if (distance < 10)
			break;
			
		for (new i=1; i < playerheight+20.0; i++) {
			teleport[2]+=i
			if (Can_Trace_Line_Origin(origin,teleport) && !Is_Point_Stuck(teleport,48.0)){
				foundheight = true
				heightplus += i
				break
			}
			teleport[2]-=i
		}
	
		if (foundheight)
			break
		
		recalculate = true
		distance-=10
		teleport[0] = origin[0] + (distance+32) * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
		teleport[1] = origin[1] + (distance+32) * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
		teleport[2] = origin[2]+heightplus
	}
	
	if (!recalculate) {
		set_pev(id,pev_origin,teleport)
		return PLUGIN_CONTINUE
	}
	
	teleport[0] = origin[0] + distance * floatcos(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
	teleport[1] = origin[1] + distance * floatsin(angles[1],degrees) * floatabs(floatcos(angles[0],degrees));
	teleport[2] = origin[2]+heightplus
	set_pev(id,pev_origin,teleport)
	
	return PLUGIN_CONTINUE
}

stock bool:Can_Trace_Line_Origin(Float:origin1[3], Float:origin2[3]) {	
	new Float:Origin_Return[3]	
	new Float:temp1[3]
	new Float:temp2[3]
	temp1[x] = origin1[x]
	temp1[y] = origin1[y]
	temp1[z] = origin1[z]-30
	temp2[x] = origin2[x]
	temp2[y] = origin2[y]
	temp2[z] = origin2[z]-30
	
	trace_line(-1, temp1, temp2, Origin_Return) 
	
	if (get_distance_f(Origin_Return,temp2) < 1.0)
		return true
	
	return false
}

stock bool:Is_Point_Stuck(Float:Origin[3], Float:hullsize) {
	new Float:temp[3]
	new Float:iterator = hullsize/3
	
	temp[2] = Origin[2]
	
	for (new Float:i=Origin[0]-hullsize; i < Origin[0]+hullsize; i+=iterator) {
		for (new Float:j=Origin[1]-hullsize; j < Origin[1]+hullsize; j+=iterator) {
			for (new Float:k=Origin[2]-CS_PLAYER_HEIGHT; k < Origin[2]+CS_PLAYER_HEIGHT; k+=6) {
				temp[0] = i
				temp[1] = j
				temp[2] = k
				
				if (point_contents(temp) != -1)
					return true
			}
		}
	}
	return false
}

stock Effect_Bleed(id,color) {
	new origin[3]
	get_user_origin(id,origin)
	
	new dx, dy, dz
	
	for(new i = 0; i < 3; i++)  {
		dx = random_num(-15,15)
		dy = random_num(-15,15)
		dz = random_num(-20,25)
		
		for(new j = 0; j < 2; j++)  {
			message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
			write_byte(TE_BLOODSPRITE)
			write_coord(origin[0]+(dx*j))
			write_coord(origin[1]+(dy*j))
			write_coord(origin[2]+(dz*j))
			write_short(sprite_blood_spray)
			write_short(sprite_blood_drop)
			write_byte(color) // color index
			write_byte(8) // size
			message_end()
		}
	}
}

public changerace(id) {
	if(freeze_ended && player_class[id]!=NONE && is_user_alive(id)) { 
		new_class[id] = true
		client_print(id,print_center,"[Diablo Mod] Please wait for the next round to change your class!")
	} else {
		savexpcom(id)
		player_class[id]=NONE
		client_connect(id) 
		select_class_query(id)
	}
}

public FW_WriteString(string[]) {
	if (equal(string,""))
		return FMRES_IGNORED
		
	if (equal(string,"#Hint_press_buy_to_purchase") || equal(string,"#Hint_press_buy_to_purchase ")) {
		write_string( "" );
		return FMRES_SUPERCEDE
	}
	
	if (equal(string, "#Hint_spotted_a_friend") || equal(string, "#Hint_you_have_the_bomb")) {
		write_string( "" );
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

stock hudmsg(id,Float:display_time,const fmt[], {Float,Sql,Result,_}:...) {	
	if (player_huddelay[id] >= 0.03*4)
		return PLUGIN_CONTINUE
	
	new buffer[512]
	vformat(buffer, 511, fmt, 4)
	
	set_hudmessage ( 255, 0, 0, -1.0, 0.4 + player_huddelay[id], 0, display_time/2, display_time, 0.1, 0.2, -1 ) 	
	show_hudmessage(id, buffer)
	
	player_huddelay[id]+=0.03
	
	remove_task(id+TASK_HUD)
	set_task(display_time, "hudmsg_clear", id+TASK_HUD, "", 0, "a", 3)
	
	return PLUGIN_CONTINUE
}

public hudmsg_clear(id) {
	new pid = id-TASK_HUD
	player_huddelay[pid]=0.0
}

stock Spawn_Ent(const classname[]) {
	new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, classname))
	set_pev(ent, pev_origin, {0.0, 0.0, 0.0})    
	dllfunc(DLLFunc_Spawn, ent)
	return ent
}

stock bool:Can_Trace_Line(id, target) {	
	for (new i=-35; i < 60; i+=35) {		
		new Float:Origin_Id[3]
		new Float:Origin_Target[3]
		new Float:Origin_Return[3]
		
		pev(id,pev_origin,Origin_Id)
		pev(target,pev_origin,Origin_Target)
		
		Origin_Id[z] = Origin_Id[z] + i
		Origin_Target[z] = Origin_Target[z] + i
		
		trace_line(-1, Origin_Id, Origin_Target, Origin_Return) 
		
		if (get_distance_f(Origin_Return,Origin_Target) < 25.0)
			return true
	}
	return false
}

public item_totemheal(id) {

	new origin[3]
	pev(id,pev_origin,origin)
		
	new ent = Spawn_Ent("info_target")
	set_pev(ent,pev_classname,"Effect_Healing_Totem")
	set_pev(ent,pev_owner,id)
	set_pev(ent,pev_solid,SOLID_TRIGGER)
	set_pev(ent,pev_origin,origin)
	set_pev(ent,pev_ltime, halflife_time() + 7 + 0.1)
	
	engfunc(EngFunc_SetModel, ent, "addons/amxmodx/diablo/totem_heal.mdl")  	
	set_rendering ( ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255 ) 	
	engfunc(EngFunc_DropToFloor,ent)
	
	set_pev(ent,pev_nextthink, halflife_time() + 0.1)
	
	return PLUGIN_CONTINUE	
}

public Effect_Healing_Totem_Think(ent) {
	new id = pev(ent,pev_owner)
	new totem_dist = 300
	

	if (pev(ent,pev_euser2) == 1) {		
		new Float:forigin[3], origin[3]
		pev(ent,pev_origin,forigin)	
		FVecIVec(forigin,origin)

		new entlist[513]
		new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist,512,forigin)
		
		for (new i=0; i < numfound; i++) {		
			new pid = entlist[i]
			
			if (get_user_team(pid) != get_user_team(id))
				continue
								
			if (is_user_alive(pid) && player_class[pid] == Mag) change_health(pid,5+player_intelligence[id],0,"")			
		}
		
		set_pev(ent,pev_euser2,0)
		set_pev(ent,pev_nextthink, halflife_time() + 1.5)
		
		return PLUGIN_CONTINUE
	}

	if (pev(ent,pev_ltime) < halflife_time() || !is_user_alive(id)) {
		remove_entity(ent)
		return PLUGIN_CONTINUE
	}

	if (pev(ent,pev_ltime)-2.0 < halflife_time())
		set_rendering ( ent, kRenderFxNone, 255,255,255, kRenderTransAlpha, 100 ) 
		
	new Float:forigin[3], origin[3]
	pev(ent,pev_origin,forigin)	
	FVecIVec(forigin,origin)

	message_begin( MSG_BROADCAST, SVC_TEMPENTITY, origin );
	write_byte( TE_BEAMCYLINDER );
	write_coord( origin[0] );
	write_coord( origin[1] );
	write_coord( origin[2] );
	write_coord( origin[0] );
	write_coord( origin[1] + totem_dist );
	write_coord( origin[2] + totem_dist );
	write_short( sprite_white );
	write_byte( 0 ); // startframe
	write_byte( 0 ); // framerate
	write_byte( 10 ); // life
	write_byte( 10 ); // width
	write_byte( 255 ); // noise
	write_byte( 255 ); // r, g, b
	write_byte( 100 ); // r, g, b
	write_byte( 100 ); // r, g, b
	write_byte( 128 ); // brightness
	write_byte( 5 ); // speed
	message_end();
		
	set_pev(ent,pev_euser2,1)
	set_pev(ent,pev_nextthink, halflife_time() + 0.5)
	
	return PLUGIN_CONTINUE
}

public freeze_over1() {
	
	agi = BASE_SPEED;
	new players[32], num
	get_players(players,num,"a")	
	
	for(new i=0 ; i<num ; i++) {
		set_speedchange(players[i])
	
	}
}

public set_speedchange(id) {
	if(DemageTake[id]==1) agi=(BASE_SPEED / 2)
	else agi=BASE_SPEED
	
	if (is_user_connected(id) && freeze_ended) {
		new speeds
		
		if(player_class[id] == Ninja) {
			if (NinjaUlt_active[id] == true) { 
				speeds= (40 + floatround(player_dextery[id]*1.3) + floatround(player_intelligence[id]*1.3)) * 2
			} else {	
				speeds= 40 + floatround(player_dextery[id]*1.3) + floatround(player_intelligence[id]*1.3)
			}	
		}

		else if(player_class[id] == Assassin) speeds= 10 + floatround(player_dextery[id]*1.3)
		else speeds= floatround(player_dextery[id]*1.3)
		set_user_maxspeed(id, agi + speeds)
	}
}

public set_renderchange(id) {

	if(is_user_connected(id) && is_user_alive(id)) {	
		if(!task_exists(id+TASK_FLASH_LIGHT)) {
			if (player_class[id] == Ninja || player_class[id] == Hunter && HunterUlt_active[id] == true)
				set_user_rendering(id,kRenderFxNone, 0,0,0, kRenderTransTexture,9)
			else if(invisible_cast[id]==1) {
				 set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 10)
				 
				 Display_Fade(id,1<<14,1<<14 ,1<<16,192,192,192,20)		
			} else
				set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255)
		}	
		else set_user_rendering(id,kRenderFxGlowShell,flashlight_r,flashlight_g,flashlight_b,kRenderNormal,4)
	}
}

public set_gravitychange(id) {
	if(is_user_alive(id) && is_user_connected(id)) {
		if(player_class[id] == Ninja) {
			if(player_b_gravity[id]>6) set_user_gravity(id, 0.17)
			else if(player_b_gravity[id]>3) set_user_gravity(id, 0.2)
			else set_user_gravity(id, 0.25)
		} else
			set_user_gravity(id,1.0*(1.0-player_b_gravity[id]/12.0))
		}
}

public cmd_who(id) {
	static motd[1000], header[100], name[32], len, i
	len = 0
	new team[32]
	static players[32], numplayers;
	get_players(players, numplayers, "")
	new playerid;
	len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000>")
	len += formatex(motd[len],sizeof motd - 1 - len,"<center><table width=700 border=1 cellpadding=4 cellspacing=4>")
	len += formatex(motd[len],sizeof motd - 1 - len,"<tr><td>Name</td><td>Class</td><td>Level</td><td>Team</td></tr>")
	formatex( header, sizeof header - 1, "Diablo Mod")
	
	for(i=0; i < numplayers; i++) {
		playerid = players[i]
		if ( get_user_team(playerid) == 1 ) team = "Terrorist"
		else if ( get_user_team(playerid) == 2 ) team = "CT"
		else team = "Spectator"
		get_user_name( playerid, name, 31 )
		get_user_name( playerid, name, 31 )
		
		len += formatex(motd[len],sizeof motd - 1 - len,"<tr><td>%s</td><td>%s</td><td>%d</td><td>%s</td></tr>",name,Race[player_class[playerid]], player_lvl[playerid],team)
	}
	len += formatex(motd[len],sizeof motd - 1 - len,"</table></center>")
	show_motd(id, motd, header)
}

 
stock refill_ammo(id) {	
	new wpnid
	if(!is_user_alive(id) || pev(id,pev_iuser1)) return;

	cs_set_user_armor(id,200,CS_ARMOR_VESTHELM);
	
	new wpn[32],clip,ammo
	wpnid = get_user_weapon(id, clip, ammo)
	get_weaponname(wpnid,wpn,31)

	new wEnt;

	wpnid = get_weaponid(wpn)
	wEnt = get_weapon_ent(id,wpnid);
	cs_set_weapon_ammo(wEnt,maxClip[wpnid]);

}

stock get_weapon_ent(id,wpnid=0,wpnName[]="") {
	static newName[32];

	if(wpnid) get_weaponname(wpnid,newName,31);

	else formatex(newName,31,"%s",wpnName);

	if(!equal(newName,"weapon_",7))
		format(newName,31,"weapon_%s",newName);

	new ent;
	while((ent = engfunc(EngFunc_FindEntityByString,ent,"classname",newName)) && pev(ent,pev_owner) != id) {}

	return ent;
}
 
public event_flashlight(id) {
	if(!get_cvar_num("flashlight_custom")) {
		return;
	}

	if(flashlight[id]) {
		flashlight[id] = 0;
	} else {
		if(flashbattery[id] > 0) {
			flashlight[id] = 1;
		}
	}

	if(!task_exists(TASK_CHARGE+id)) {
		new parms[1];
		parms[0] = id;
		set_task((flashlight[id]) ? get_cvar_float("flashlight_drain") : get_cvar_float("flashlight_charge"),"charge",TASK_CHARGE+id,parms,1);
	}

	message_begin(MSG_ONE,get_user_msgid("Flashlight"),{0,0,0},id);
	write_byte(flashlight[id]);
	write_byte(flashbattery[id]);
	message_end();

	entity_set_int(id,EV_INT_effects,entity_get_int(id,EV_INT_effects) & ~EF_DIMLIGHT);
}

public charge(parms[]) {
	if(!get_cvar_num("flashlight_custom")) {
		return;
	}

	new id = parms[0];

	if(flashlight[id])
		flashbattery[id] -= 1;
	else
		flashbattery[id] += 1;

	message_begin(MSG_ONE,get_user_msgid("FlashBat"),{0,0,0},id);
	write_byte(flashbattery[id]);
	message_end();

	if(flashbattery[id] <= 0) {
		flashbattery[id] = 0;
		flashlight[id] = 0;

		message_begin(MSG_ONE,get_user_msgid("Flashlight"),{0,0,0},id);
		write_byte(flashlight[id]);
		write_byte(flashbattery[id]);
		message_end();
	} else if(flashbattery[id] >= MAX_FLASH)  {
		flashbattery[id] = MAX_FLASH
		return; // return because we don't need to charge anymore
	}

	set_task((flashlight[id]) ? get_cvar_float("flashlight_drain") : get_cvar_float("flashlight_charge"),"charge",TASK_CHARGE+id,parms,1)
}

public give_knife(id) {
	new knifes = 0
	if(player_class[id] == Ninja) knifes = 5 + floatround ( player_intelligence[id]/10.0 , floatround_floor )
	
	max_knife[id] = knifes
	player_knife[id] = knifes
}

public command_knife(id) {
	if(!is_user_alive(id)) return PLUGIN_HANDLED
	
	if(!player_knife[id]) {
		client_print(id,print_center,"You have no more throwing knives!")
		return PLUGIN_HANDLED
	}

	if(tossdelay[id] > get_gametime() - 0.9) return PLUGIN_HANDLED
	else tossdelay[id] = get_gametime()

	player_knife[id]--

	if (player_knife[id] == 1) {
		client_print(id,print_center,"You have one throwing knife left!")
	}

	new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent

	entity_get_vector(id, EV_VEC_origin , Origin)
	entity_get_vector(id, EV_VEC_v_angle, vAngle)

	Ent = create_entity("info_target")

	if (!Ent) return PLUGIN_HANDLED

	entity_set_string(Ent, EV_SZ_classname, "throwing_knife")
	entity_set_model(Ent, "models/diablomod/w_throwingknife.mdl")

	new Float:MinBox[3] = {-1.0, -7.0, -1.0}
	new Float:MaxBox[3] = {1.0, 7.0, 1.0}
	entity_set_vector(Ent, EV_VEC_mins, MinBox)
	entity_set_vector(Ent, EV_VEC_maxs, MaxBox)

	vAngle[0] -= 90

	entity_set_origin(Ent, Origin)
	entity_set_vector(Ent, EV_VEC_angles, vAngle)

	entity_set_int(Ent, EV_INT_effects, 2)
	entity_set_int(Ent, EV_INT_solid, 1)
	entity_set_int(Ent, EV_INT_movetype, 6)
	entity_set_edict(Ent, EV_ENT_owner, id)

	VelocityByAim(id, get_cvar_num("diablo_knife_speed") , Velocity)
	entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
	
	return PLUGIN_HANDLED
}

public touchKnife(knife, id) {	
	new kid = entity_get_edict(knife, EV_ENT_owner)
	
	if(is_user_alive(id)) {
		new movetype = entity_get_int(knife, EV_INT_movetype)
		
		if(movetype == 0) {
			if( player_knife[id] < max_knife[id]) {
				player_knife[id] += 1
				client_print(id,print_center,"You have %i throwing knives left!",player_knife[id])
			}
			emit_sound(knife, CHAN_ITEM, "weapons/knife_deploy1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			remove_entity(knife)
		} else if (movetype != 0) {
			if(kid == id) return

			remove_entity(knife)

			if(get_cvar_num("mp_friendlyfire") == 0 && get_user_team(id) == get_user_team(kid)) return

			entity_set_float(id, EV_FL_dmg_take, get_cvar_num("diablo_knife") * 1.0)

			change_health(id,-get_cvar_num("diablo_knife"),kid,"knife")
			message_begin(MSG_ONE,get_user_msgid("ScreenShake"),{0,0,0},id)
			write_short(7<<14)
			write_short(1<<13)
			write_short(1<<14)
			message_end()		

			if(get_user_team(id) == get_user_team(kid)) {
				new name[33]
				get_user_name(kid,name,32)
				client_print(0,print_chat,"%s attacked a teammate",name)
			}

			emit_sound(id, CHAN_ITEM, "weapons/knife_hit4.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
		}
	}
}

public touchWorld(knife, world) {
	entity_set_int(knife, EV_INT_movetype, 0)
	emit_sound(knife, CHAN_ITEM, "weapons/knife_hitwall1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public touchbreakable(ent1, ent2) {
	new name[32],breakable,ent
	entity_get_string(ent1,EV_SZ_classname,name,31)
	if(equali(name,"func_breakable")) {
		breakable=ent1
		ent=ent2
	} else {
		breakable=ent2
		ent=ent1
	}
	new Float: b_hp = entity_get_float(breakable,EV_FL_health)
	if(b_hp>80) entity_set_float(breakable,EV_FL_health,b_hp-50.0)
	else dllfunc(DLLFunc_Use,breakable,ent)
	
	entity_get_string(ent,EV_SZ_classname,name,31)
	if(equali(name,"throwing_knife")) {
		emit_sound(ent, CHAN_ITEM, "weapons/knife_hitwall1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else remove_entity(ent)
}
	
public kill_all_entity(classname[]) {
	new iEnt = find_ent_by_class(-1, classname)
	while(iEnt > 0) {
		remove_entity(iEnt)
		iEnt = find_ent_by_class(iEnt, classname)		
	}
}

public command_arrow(id) {
	if(!is_user_alive(id)) return PLUGIN_HANDLED

	new Float: Origin[3], Float: Velocity[3], Float: vAngle[3], Ent

	entity_get_vector(id, EV_VEC_origin , Origin)
	entity_get_vector(id, EV_VEC_v_angle, vAngle)

	Ent = create_entity("info_target")

	if (!Ent) return PLUGIN_HANDLED

	entity_set_string(Ent, EV_SZ_classname, "xbow_arrow")
	entity_set_model(Ent, cbow_bolt)

	new Float:MinBox[3] = {-2.8, -2.8, -0.8}
	new Float:MaxBox[3] = {2.8, 2.8, 2.0}
	entity_set_vector(Ent, EV_VEC_mins, MinBox)
	entity_set_vector(Ent, EV_VEC_maxs, MaxBox)

	vAngle[0]*= -1
	Origin[2]+=10
	
	entity_set_origin(Ent, Origin)
	entity_set_vector(Ent, EV_VEC_angles, vAngle)

	entity_set_int(Ent, EV_INT_effects, 2)
	entity_set_int(Ent, EV_INT_solid, 1)
	entity_set_int(Ent, EV_INT_movetype, 5)
	entity_set_edict(Ent, EV_ENT_owner, id)
	new Float:dmg = get_cvar_float("diablo_arrow") + player_intelligence[id] * get_cvar_float("diablo_arrow_multi")
	entity_set_float(Ent, EV_FL_dmg,dmg)

	VelocityByAim(id, get_cvar_num("diablo_arrow_speed") , Velocity)
	set_rendering (Ent,kRenderFxGlowShell, 255,0,0, kRenderNormal,56)
	entity_set_vector(Ent, EV_VEC_velocity ,Velocity)
	
	return PLUGIN_HANDLED
}

public command_bow(id) {
	if(!is_user_alive(id)) return PLUGIN_HANDLED
	if(bow[id] == 1) {
		entity_set_string(id,EV_SZ_viewmodel,cbow_VIEW)
		entity_set_string(id,EV_SZ_weaponmodel,cvow_PLAYER)
		bowdelay[id] = get_gametime()
	} else {
		entity_set_string(id,EV_SZ_viewmodel,KNIFE_VIEW)
		entity_set_string(id,EV_SZ_weaponmodel,KNIFE_PLAYER)
		bow[id]=0
	}
	return PLUGIN_CONTINUE
}

public toucharrow(arrow, id) {	
	new kid = entity_get_edict(arrow, EV_ENT_owner)
	new lid = entity_get_edict(arrow, EV_ENT_enemy)
	
	if(is_user_alive(id)) {
		if(kid == id || lid == id) return
		
		entity_set_edict(arrow, EV_ENT_enemy,id)
	
		new Float:dmg = entity_get_float(arrow,EV_FL_dmg)
		entity_set_float(arrow,EV_FL_dmg,(dmg*3.0)/5.0)
		
		if(get_cvar_num("mp_friendlyfire") == 0 && get_user_team(id) == get_user_team(kid)) return
		
		Effect_Bleed(id,248)

		//bowdelay[kid] -=  0.5 - floatround(player_intelligence[kid]/5.0)
	
		change_health(id,floatround(-dmg-(player_dextery[id]*2)),kid,"knife")
				
		message_begin(MSG_ONE,get_user_msgid("ScreenShake"),{0,0,0},id); 
		write_short(7<<14); 
		write_short(1<<13); 
		write_short(1<<14); 
		message_end();

		if(get_user_team(id) == get_user_team(kid)) {
			new name[33]
			get_user_name(kid,name,32)
			client_print(0,print_chat,"%s attacked a teammate",name)
		}

		emit_sound(id, CHAN_ITEM, "weapons/knife_hit4.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
		if(dmg<30) remove_entity(arrow)
	}
}

public touchWorld2(arrow, world) {
	remove_entity(arrow)
}

public hunter_Line(id,vid,end[3]) {
	if(is_user_alive(id) && is_user_alive(vid) && trace_bool[id]) {
		new start[3]
		get_user_origin(vid,start)
		
		message_begin(MSG_ONE,SVC_TEMPENTITY,{0,0,0},id)
		write_byte(0)
		write_coord(start[0])	// starting pos
		write_coord(start[1])
		write_coord(start[2])
		write_coord(end[0])	// ending pos
		write_coord(end[1])
		write_coord(end[2])
		write_short(sprite_line)	// sprite index
		write_byte(1)		// starting frame
		write_byte(5)		// frame rate
		write_byte(100)		// life
		write_byte(1)		// line width
		write_byte(1)		// noise
		write_byte(255)	// RED
		write_byte(255)	// GREEN
		write_byte(100)	// BLUE					
		write_byte(150)		// brightness
		write_byte(5)		// scroll speed
		message_end()
		
		new parms[5];
		
		for(new i=0;i<3;i++) {
			parms[i] = start[i] 
		}
		parms[3]=id
		parms[4]=vid
		
		set_task(0.20,"charge_hunter",id+TARACE_TASK+vid*100,parms,5)
	}
}

public charge_hunter(parms[]) {
	new stop[3]
	
	for(new i=0;i<3;i++) {
		stop[i] =parms[i]
	}
	hunter_Line(parms[3],parms[4],stop)
}

public grenade_throw(id, ent, wID) {	
	if(!g_TrapMode[id] || !is_valid_ent(ent))
		return PLUGIN_CONTINUE
		
	new Float:fVelocity[3]
	VelocityByAim(id, cvar_throw_vel, fVelocity)
	entity_set_vector(ent, EV_VEC_velocity, fVelocity)
	
	new Float: angle[3]
	entity_get_vector(ent,EV_VEC_angles,angle)
	angle[0]=0.00
	entity_set_vector(ent,EV_VEC_angles,angle)
	
	entity_set_float(ent,EV_FL_dmgtime,get_gametime()+3.5)
	
	entity_set_int(ent, NADE_PAUSE, 0)
	entity_set_int(ent, NADE_ACTIVE, 0)
	entity_set_int(ent, NADE_VELOCITY, 0)
	entity_set_int(ent, NADE_TEAM, get_user_team(id))
	
	new param[1]
	param[0] = ent
	set_task(3.0, "task_ActivateTrap", 0, param, 1)
	
	return PLUGIN_CONTINUE
}

public task_ActivateTrap(param[]) {
	new ent = param[0]
	if(!is_valid_ent(ent)) 
		return PLUGIN_CONTINUE
	
	entity_set_int(ent, NADE_PAUSE, 1)
	entity_set_int(ent, NADE_ACTIVE, 1)
	
	new Float:fOrigin[3]
	entity_get_vector(ent, EV_VEC_origin, fOrigin)
	fOrigin[2] -= 8.1*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[entity_get_edict(ent,EV_ENT_owner)])))
	entity_set_vector(ent, EV_VEC_origin, fOrigin)
	
	return PLUGIN_CONTINUE
}

public think_Grenade(ent) {
	new entModel[33]
	entity_get_string(ent, EV_SZ_model, entModel, 32)
	
	if(!is_valid_ent(ent) || equal(entModel, "models/w_c4.mdl"))
		return PLUGIN_CONTINUE
	
	if(entity_get_int(ent, NADE_PAUSE))
		return PLUGIN_HANDLED
	
	return PLUGIN_CONTINUE
}

public think_Bot(bot) {
	new ent = -1
	while((ent = find_ent_by_class(ent, "grenade"))) {
		new entModel[33]
		entity_get_string(ent, EV_SZ_model, entModel, 32)
			
		if(equal(entModel, "models/w_c4.mdl"))
			continue

		if(!entity_get_int(ent, NADE_ACTIVE))
			continue
				 
		new Players[32], iNum
		get_players(Players, iNum, "a")
						
		for(new i = 0; i < iNum; ++i) {
			new id = Players[i]
			if(entity_get_int(ent, NADE_TEAM) == get_user_team(id)) 
				continue
				
			if(get_entity_distance(id, ent) > cvar_activate_dis || player_speed(id) <200.0) 
				continue
			
			if(entity_get_int(ent, NADE_VELOCITY)) continue
			
			new Float:fOrigin[3]
			entity_get_vector(ent, EV_VEC_origin, fOrigin)
			while(PointContents(fOrigin) == CONTENTS_SOLID)
				fOrigin[2] += 100.0
		
			entity_set_vector(ent, EV_VEC_origin, fOrigin)
			drop_to_floor(ent)
				
			new Float:fVelocity[3]
			entity_get_vector(ent, EV_VEC_velocity, fVelocity)
			fVelocity[2] += float(cvar_nade_vel)
			entity_set_vector(ent, EV_VEC_velocity, fVelocity)
			entity_set_int(ent, NADE_VELOCITY, 1)
		
			new param[1]
			param[0] = ent 
			entity_set_float(param[0], EV_FL_nextthink, halflife_time())
			entity_set_int(param[0], NADE_PAUSE, 0)
		}
	}
	if(get_timeleft()<2 && map_end<2)
		map_end=2
	else if(get_timeleft()<6 && map_end<1) {
		new play[32],num

		get_players(play,num)
		
		for(new i=0;i<num;i++) {
			savexpcom(play[i])
		}
		map_end=1
	}
	
	entity_set_float(bot, EV_FL_nextthink, halflife_time() + 0.1)
}

stock Float:player_speed(index) {
	new Float:vec[3]
	
	pev(index,pev_velocity,vec)
	vec[2]=0.0
	
	return floatsqroot ( vec[0]*vec[0]+vec[1]*vec[1] )
}

public _create_ThinkBot() {
	new think_bot = create_entity("info_target")
	if(!is_valid_ent(think_bot))
		log_amx("For some reason, the universe imploded, reload your server")
	else {
		entity_set_string(think_bot, EV_SZ_classname, "think_bot")
		entity_set_float(think_bot, EV_FL_nextthink, halflife_time() + 1.0)
	}
}

public change_health(id,hp,attacker,weapon[]) {

	new m_health
	if (player_strength[id] < 25) {
		m_health = race_heal[player_class[id]]+player_strength[id]*2
	} 
	if (player_strength[id] > 24 && player_strength[id] < 50) {
		m_health = race_heal[player_class[id]] + 10 + player_strength[id]*2
	}	
	if (player_strength[id] == 50) {
		m_health = race_heal[player_class[id]] + 20 + player_strength[id]*2
	}	
	if(is_user_alive(id) && is_user_connected(id)) {
		new health = get_user_health(id)
		if(hp>0) {
			if (hp+health>m_health) set_user_health(id,m_health)
			else set_user_health(id,get_user_health(id)+hp)
		} else {
			if(health+hp<1)
				UTIL_Kill(attacker,id,weapon)
			else set_user_health(id,get_user_health(id)+hp)
		}
	
		if(id!=attacker && hp<0) {
			player_dmg[attacker]-=hp
			dmg_exp(attacker)
		}
	}
}

public UTIL_Kill(attacker,id,weapon[]) {
	if( is_user_alive(id)){
		if(get_user_team(attacker)!=get_user_team(id))
			set_user_frags(attacker,get_user_frags(attacker) +1);
	
		if (cs_get_user_money(attacker) + 150 <= 16000)
			cs_set_user_money(attacker,cs_get_user_money(attacker)+150)
		else
			cs_set_user_money(attacker,16000)
	
		cs_set_user_deaths(id, cs_get_user_deaths(id)+1)
		user_kill(id,1) 
		
		if(is_user_connected(attacker) && attacker!=id) {
			award_kill(attacker,id)
		}
				
		message_begin( MSG_ALL, gmsgDeathMsg,{0,0,0},0) 
		write_byte(attacker) 
		write_byte(id) 
		write_byte(0) 
		write_string(weapon) 
		message_end() 
	
		message_begin(MSG_ALL,gmsgScoreInfo) 
		write_byte(attacker) 
		write_short(get_user_frags(attacker)) 
		write_short(get_user_deaths(attacker)) 
		write_short(0) 
		write_short(get_user_team(attacker)) 
		message_end() 
	
		message_begin(MSG_ALL,gmsgScoreInfo) 
		write_byte(id) 
		write_short(get_user_frags(id)) 
		write_short(get_user_deaths(id)) 
		write_short(0) 
		write_short(get_user_team(id)) 
		message_end() 
	
		new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
	
		get_user_name(attacker, kname, 31);
		get_user_team(attacker, kteam, 9);
		get_user_authid(attacker, kauthid, 31);
	
		get_user_name(id, vname, 31);
		get_user_team(id, vteam, 9);
		get_user_authid(id, vauthid, 31);
	
		log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"", 
		kname, get_user_userid(attacker), kauthid, kteam, 
		vname, get_user_userid(id), vauthid, vteam, weapon);
	}
}

stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha) {
	message_begin( MSG_ONE, g_msg_screenfade,{0,0,0},id )
	write_short( duration )	// Duration of fadeout
	write_short( holdtime )	// Hold time of color
	write_short( fadetype )	// Fade type
	write_byte ( red )		// Red
	write_byte ( green )		// Green
	write_byte ( blue )		// Blue
	write_byte ( alpha )	// Alpha
	message_end()
}

public fw_traceline(Float:vecStart[3],Float:vecEnd[3],ignoreM,id,trace) {
 	
	if(!is_user_connected(id))
		return FMRES_IGNORED;

	if(!is_user_alive(id))
		return FMRES_IGNORED;

	new hit = get_tr2(trace, TR_pHit)	

	if(!(pev(id,pev_button) & IN_ATTACK))
		return FMRES_IGNORED;
		
	new h_bulet=0
	
	if(golden_bulet[id]>0 && paladin_bullet[id] && player_class[id] == Paladin) {
		
		h_bulet=1
	}
		
	if(is_valid_ent(hit)) {
		new name[64]
		entity_get_string(hit,EV_SZ_classname,name,63)
		
		if(equal(name,"dbmod_shild")) {
			new Float: ori[3]
			entity_get_vector(hit,EV_VEC_origin,ori)
			set_tr2(trace,TR_vecEndPos,vecEnd)
			if(after_bullet[id]>0) {			
				new Float: health=entity_get_float(hit,EV_FL_health)
				entity_set_float(hit,EV_FL_health,health-3.0)
				if(health-1.0<0.0) remove_entity(hit)
				after_bullet[id]--
			}
			set_tr2(trace,TR_iHitgroup,8);
			set_tr2(trace,TR_flFraction,1.0);
			return FMRES_SUPERCEDE;
		}
	}	
		
	if(is_user_alive(hit)) {
		if(h_bulet) {
			set_tr2(trace, TR_iHitgroup, HIT_HEAD)
			static hit, Float:head_origin[3], Float:angles[3]
			
			hit = get_tr2(trace, TR_pHit)
			engfunc(EngFunc_GetBonePosition, hit, 8, head_origin, angles)
			
			set_tr2(trace, TR_vecEndPos, head_origin) // Blood now comes out of the head!
			
		}
		
		if(ultra_armor[hit]>0 ) {
			if(after_bullet[id]>0) {
				if(ultra_armor[hit]>0) { ultra_armor[hit]--
				} else if(player_ultra_armor_left[hit]>0) {
				player_ultra_armor_left[hit]--
				after_bullet[id]--
				}
			}
			set_tr2(trace, TR_iHitgroup, 8)
		}
		return FMRES_IGNORED
	}
		
	return FMRES_IGNORED;
}

public dmg_exp(id) {
	if(!is_user_bot(id)) {
	new min=get_cvar_num("diablo_dmg_exp")
	if(min<1) return
	new exp=0
	while(player_dmg[id]>min)
	{
		player_dmg[id]-=min
		exp++
	}
	Give_Xp(id,exp)
	}
}

ColorChat( index, const Msg[], any:... ) {
	new Buffer[ 190 ], Buffer2[ 192 ];
	formatex( Buffer2, charsmax( Buffer2 ), "^x04[%s]^x01 %s", g_szPrefix, Msg );
	vformat( Buffer, charsmax( Buffer ), Buffer2, 3 );

	if( !index ) {
		for( new i = 1; i <= MAX; i++ ) {
			if( !is_user_connected( i ) )
				continue;

			message_begin( MSG_ONE_UNRELIABLE, gmsgSayText,_, i );
			write_byte( i );
			write_string( Buffer );
			message_end( );
		}
	} else {
		if( !is_user_connected( index ) )
			return;

		message_begin( MSG_ONE, gmsgSayText,_, index );
		write_byte( index );
		write_string( Buffer );
		message_end( );
	}
}

BuyXP(id) {
	new xpp, xpcost, money
	new numbuys
	new name[33], authid[33]
	new cvar_xp, cvar_xpcost
	
	cvar_xp = 1
	cvar_xpcost = (500 - player_lvl[id])

	xpcost	= cvar_xpcost
	xpp	= 0

	money = cs_get_user_money(id)
	get_user_authid(id,authid,32)
	get_user_name(id,name,32)
	
	if( money < cvar_xpcost ){
		client_print(id,print_chat,"[Diablo Mod] Sorry, %s. You need at least $%d to buy experience!", name, cvar_xpcost )
		return PLUGIN_CONTINUE
	}

	numbuys = money / cvar_xpcost		//calculate the max number of transactions (originally used in for loop)
	xpp = numbuys * cvar_xp			//calculate how much exp they can buy using numbuys
	xpcost = numbuys * cvar_xpcost		//calculate the cost of the above amount of exp
	
	console_print(0, "[Diablo Mod] %s PURCHASED %d XP : COST %d", name, xpp, xpcost)

	cs_set_user_money(  id, (money - xpcost) ,1 )				//subtract money from buys
	server_cmd("db_givexp ^"%s^" %d", authid, xpp)			//add exp for buys
	
	
	if( cs_get_user_money(id) < 0 ){
		cs_set_user_money( id, 0, 1 )
	}
	return PLUGIN_CONTINUE
	
}

public CmdGiveXp(id, iCid, iLvl) {
    if(!cmd_access(id, iLvl, iCid, 3))
        return PLUGIN_HANDLED;
    
    if (get_user_flags(id) & ADMIN_LEVEL_A) {     
    new szPlayer[32], szAmount[10];
    read_argv(1, szPlayer, charsmax(szPlayer));
    read_argv(2, szAmount, charsmax(szAmount));
    
    new iPlayer = cmd_target(id, szPlayer, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS);
    new iAmount = str_to_num(szAmount);
    
    if(iAmount < 0 || !iPlayer)
        return PLUGIN_HANDLED;
    
    Give_Xp(iPlayer, iAmount);
    
    new szName[32];
    get_user_name(iPlayer, szName, charsmax(szName));
    
    console_print(id, "* Gave %i xp to %s", iAmount, szName);
    }
    return PLUGIN_HANDLED;
	
}

public cmd_Ultimate(id) {

	new Float: paladin_ult = 1.5+(player_intelligence[id]/50.0)
	if (freeze_ended && is_user_alive(id)) {
	
	if (player_class[id] == Mag) {
		if (player_sorc_heal[id] > 0) {
			item_totemheal(id)
			player_sorc_heal[id] --
		} else {
			client_print(id,print_center,"[Diablo Mod] You have already placed a healing totem!")
		}
	}	
	
	if (player_class[id] == Paladin ) {
		new Float: time_delay = 2.0
		HunterUlt_end[id]=halflife_time()+time_delay
		new bar_delay = floatround(time_delay,floatround_ceil)
	
	
		if (GodLeft[id]>0) {
			if (halflife_time()>cast_end[id]) {
				message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id ) 
				write_byte( bar_delay ) 
				write_byte( 0 ) 
				message_end()
				GodLeft[id]--
				Display_Fade(id,8192,0 ,1<<16,255,255,0,20)		
				set_user_godmode(id, 1)
				set_user_rendering(id, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 50)
			}
			set_task(paladin_ult, "paladin_godmodeoff",id)
		} else {
			client_print(id,print_center,"[Diablo Mod] You have already used all your god mode stacks!")
		}
	}
	
	if (player_class[id] == Assassin) { 
		if (AssassinUlt[id] > 0 && on_knife[id]) {
			UTIL_Teleport(id,300+15*player_intelligence[id])
			AssassinUlt[id] --		
		} else {
			client_print(id,print_center,"[Diablo Mod] You cannot blink right now!")
		}
	}
	
	if (player_class[id] == Hunter) {
		new Float: time_delay = 2.0
		HunterUlt_end[id]=halflife_time()+time_delay
		new bar_delay = floatround(time_delay,floatround_ceil)
		
		if(bow[id]) {
			if (HunterUlt[id] > 0) {
				if (halflife_time()>cast_end[id]) {
					message_begin( MSG_ONE, gmsgBartimer, {0,0,0}, id ) 
					write_byte( bar_delay ) 
					write_byte( 0 ) 
					message_end()
					HunterUlt[id] -- 
					HunterUlt_active[id] = true
					set_renderchange(id)
					client_print(id,print_center,"[Diablo Mod] You are now invisible!")
					set_task(2.0, "Hunter_UltOff",id)
				} else {
					client_print(id,print_center,"[Diablo Mod] You are already invisible!")
				}
			} else {
				client_print(id,print_center,"[Diablo Mod] You don't have enough stacks to become invisible!")
			}
		} else {
			client_print(id,print_center,"[Diablo Mod] You need to equip your bow!")
		}
	}
		
	if (player_class[id] == Necromancer) {
		if (NecroUlt[id] == 0) {
			spawn(id)
			spawn(id)
			NecroUlt[id] = 1
		} else {
			client_print(id,print_center,"[Diablo Mod] You have already used your ultimate for this round!")
		}
	}
	
	if (player_class[id] == Ninja) {
		if (NinjaUlt[id] > 0) {
			NinjaUlt[id] --
			NinjaUlt_active[id] = true
			Display_Fade(id,1<<11,1<<14 ,1<<16,255,0,0,20)		
			set_speedchange(id)
			set_task(5.0, "Ninja_ultOff",id)
		} else {
			client_print(id,print_center,"[Diablo Mod] You don't have enough stacks to power up!")
		}
	}	
	
	if (player_class[id] == Barbarian) {
		if (BarbUlt_used[id] == false) {
			BarbUlt_used[id] = true
			BarbUlt[id] = true
			change_health(id,50+player_intelligence[id] ,0,"")
			refill_ammo(id)
			Display_Fade(id,40960,0 ,1<<16,255,0,0,30)		
			emit_sound(id, CHAN_ITEM, "dbmod/Barbarian_Rage.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			client_print(id,print_center,"[Diablo Mod] No recoil recoil + health, armor and ammo refill!")
			set_task(10.0, "Barb_Ultoff",id)
		} else {	
			client_print(id,print_center,"[Diablo Mod] You have already used your power up!")
		}		
	}
	
	}
}	

public Ninja_ultOff(id) {
	NinjaUlt_active[id] = false
}

public paladin_godmodeoff(id) {
	set_user_godmode(id, 0)
	set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 50)
}

public Hunter_UltOff(id) {
	HunterUlt_active[id] = false
}

public Barb_Ultoff(id) {
	BarbUlt[id] = false 
}
	
public Paladin_deagle( ent_Deagle ) {

	new id = pev( ent_Deagle, pev_owner ) // Find the owner
	if (is_user_alive(id) && player_class[id] == Paladin) {
		if (golden_bulet[id] > 0) golden_bulet[id]-- 
		return HAM_HANDLED
	}	
	return HAM_IGNORED
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage) {
	if ( is_user_connected(victim) && is_user_connected(attacker) && player_power[attacker] > 0 ) {
		SetHamParamFloat(4, damage * (1.0 + player_power[attacker]*0.01))
		return HAM_HANDLED
	}
	return HAM_IGNORED
}  

public Commands_menu(id) {
	new menu = menu_create( "\rCommands menu:", "Commands_handler" );
	menu_additem( menu, "\w/class or /changerace-- Change your class!", "", 0 );
	menu_additem( menu, "\w/classinfo -- Get all the information about a class!", "", 0 );
	menu_additem( menu, "\w/speed -- Check your max speed!", "", 0 );
	menu_additem( menu, "\w/reset -- Reset your skills!", "", 0 );
	menu_additem( menu, "\w/players -- See all players their class!", "", 0 );
	menu_additem( menu, "\w/buyxp -- Buy experience based on your current money!", "", 0 );
	menu_additem( menu, "\w/skills -- Get information about your skills!", "", 0 );
	menu_additem( menu, "\w/classattribs -- Get more information about what class skills do!", "", 0 );
	menu_additem( menu, "\w/autobuyxp -- Automaticly buys experience [Donator only]", "", 0 );
	menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
   	menu_display( id, menu, 0 );
}
 
public Commands_handler(id, menu, item) {
    
	switch( item ) {
		case 0:
		{
			changerace(id)
			
		}
		case 1:
		{
			Classinfo_menu(id)
		}
		case 2:
		{
			speed(id)
		}
		case 3:
		{
			reset_skill(id)
		}
		case 4:
		{
			cmd_who(id)
		}
		case 5:
		{
			BuyXP(id)
		}		
			case 6:
		{
			skills(id)
		}
			case 7:
		{
			ClassAttribs(id)
		}
		case 8:
		{
			Autobuyxp(id)
		}		
		case MENU_EXIT:
		{
			client_print( id, print_chat, "I hope your knowledge has been increased!" );
		}
		}

	menu_destroy( menu );
	return PLUGIN_HANDLED;
}

public Classinfo_menu(id) {
	new menu = menu_create( "\rClass information:", "Classinfo_handler" );
	menu_additem( menu, "\w Sorcerer", "", 0 );
	menu_additem( menu, "\w Paladin", "", 0 );
	menu_additem( menu, "\w Assassin", "", 0 );
	menu_additem( menu, "\w Necromancer", "", 0 );
	menu_additem( menu, "\w Barbarian", "", 0 );
	menu_additem( menu, "\w Ninja", "", 0 );
	menu_additem( menu, "\w Hunter", "", 0 );
	menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
	menu_display( id, menu, 0 ); 
}
 
public skills(id) {
	static motd[1000], header[100], len
	len = 0    
		
	formatex( header, sizeof header - 1, "Skills information")
	len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=4><center><br><br><br><br><br><br>")
	len += formatex(motd[len],sizeof motd - 1 - len,"Your current intelligence is: %i. This is used to increase your class skills! <br><br>", player_intelligence[id])
	len += formatex(motd[len],sizeof motd - 1 - len,"Your current strength is: %i. For every strength you gain 2 HP and on 25/50 you gain 10/20 extra HP.<br><br>", player_strength[id])
	len += formatex(motd[len],sizeof motd - 1 - len,"Your current agility is: %i. This will give you %0.0f%% damage reduction.<br><br>",player_agility[id],player_damreduction[id]*100)
	len += formatex(motd[len],sizeof motd - 1 - len,"Your current power is %i This will give you %i%% total damage<br><br>", player_power[id], 100 + player_power[id] )
	len += formatex(motd[len],sizeof motd - 1 - len,"Your current vampyric power is %i. This will heal you with %i HP upon kill!<br><br>",player_vampyric[id],player_vampyric[id])
	len += formatex(motd[len],sizeof motd - 1 - len,"You currently have %i Dextery. This will make you run with %0.0f% extra speed!<br><br>", player_dextery[id], player_dextery[id]*1.3)
	
	len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
	show_motd(id, motd, header)	
} 
 
public Classinfo_handler(id, menu, item) {
	static motd[1000], header[100], len
	len = 0    
		
	switch( item ) {
		case 0:
		{
			formatex( header, sizeof header - 1, "Class information: Sorcerer")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 80hp.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your flashlight to make invisible enemy's visible by aiming on them!<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len," Use your ultimate to create a healing totem to heal all your allies close to your totem! <br>This will heal you up for 20 HP, and 4 more for every point you have in INT!")
			len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
			show_motd(id, motd, header)
		}
		case 1:
		{
			formatex( header, sizeof header - 1, "Class information: Paladin")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 50 hp.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Your deagle will have magic bullets(headshot no matter where you hit the enemy) Max 7 depending on your INT!<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become invulnerable for a small period ( increase this with higher INT).")
			len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
			show_motd(id, motd, header)
		}
		case 2:
		{
			formatex( header, sizeof header - 1, "Class information: Assassin")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 100hp. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"You will walk around silently! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Stand still with your knife to become invisible! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to blink around the map, every 5 int will give you a new charge! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}
		case 3:
		{
			formatex( header, sizeof header - 1, "Class information: Necromancer")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 70 hp. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to return to spawn with your current hp! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Get the ability to revive your team members (increase the amount of stacks with higher INT)! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}
		case 4:
		{
			formatex( header, sizeof header - 1, "Class information: Barbarian")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 50hp. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"You will have 1 charge of armor, which will deflect the first hit you take, the more int you get, the more charges! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate for a boost! You will get 50 hp(+1 per int) 200 armor, an ammo refill and no recoil for 10 seconds! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}
		case 5:
		{
			formatex( header, sizeof header - 1, "Class information: Ninja")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 170hp. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"You cannot use a gun, but you are invisible and have increased gravity. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Throw a knife with R, the more INT you have, the more throwing knives you have. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"INT will also boost your speed! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become a superninja for a short period! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}
		case 6:
		{
			formatex( header, sizeof header - 1, "Class information: Hunter")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=6><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Start with 120hp. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Press R on your knife to gain a bow! The more int, the faster you can shoot and the more damage you deal. <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Load up with your knife to gain a flashbang. Press use to make any grenade into a trap, then throw it! <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Use your ultimate to become invisible temporarily(with bow equipped) <br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}	
	}

	menu_destroy( menu );
	return PLUGIN_HANDLED;
}

public eT_win() {
	new Players[32], playerCount, id
	get_players(Players, playerCount, "eh", "TERRORIST") 
		
	for (new i=0; i<playerCount; i++) {
		id = Players[i]
		Give_Xp(id, 20)
		client_print(id, print_chat, "You have been given 20 experience points for winning the round!") 
	}	
}

public eCT_win() {
	new Players[32], playerCount, id
	get_players(Players, playerCount, "eh", "CT") 
		
	for (new i=0; i<playerCount; i++) {
		id = Players[i]
		Give_Xp(id, 20)
		client_print(id, print_chat, "You have been given 20 experience points for winning the round!") 
	}	
}

public Autobuyxp(id) {
	if(get_user_flags(id) & ADMIN_LEVEL_A)	{
		if (autobuyxp[id] == false) {
			autobuyxp[id] = true
			client_print(id, print_chat, "You have enabled autobuyxp, to disable write /autobuyxp again!") 
		} else {
			autobuyxp[id] = false
			client_print(id, print_chat, "You have disabled autobuyxp, to enable write /autobuyxp again!") 	
		}
	} else {
		client_print(id, print_chat, "Sorry, this function is only possible for admins and donators!") 
	}

} 

public peformautobuy(id) {
	if(is_user_alive(id) && get_user_flags(id) & ADMIN_LEVEL_A && autobuyxp[id] == true && cs_get_user_money(id) > 15000) {
		BuyXP(id)
		client_print(id, print_chat, "You automaticly purchased experience because /autobuyxp is enabled!") 
	}
}

public ClassAttribs(id) {

	static motd[1000], header[100], len
	len = 0    
		
	if (player_class[id] == Mag) {
			formatex( header, sizeof header - 1, "Class information: Sorcerer")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Get a total of 90 seconds flashlight per round to reveal invisible enemies.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Your healing wards will heal for 5 HP + 1 HP per int per wave. In total there are 4 waves.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Paladin) {
			formatex( header, sizeof header - 1, "Class information: Paladin")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: For each 10 points in intelligence you will gain an extra magic deagle bullet!<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Gained 1.5 seconds + 0.02 second per intelligence of god mode, Each 25 intelligence you will gain another godmode stack!<br><br>")			
			len += formatex(motd[len],sizeof motd - 1 - len,"</center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Assassin) {
			formatex( header, sizeof header - 1, "Class information: Assassin")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Silent run + Become invisible when holding your knife for 10 seconds - 0.04 second per intelligence.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Peform a teleport with a base distance of 300 units. Per intelligence you will gain another 15 units!<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Necromancer) {
			formatex( header, sizeof header - 1, "Class information: Necromancer")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Revive a team member. Per 25 intelligence you will gain another stack.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Use your ultimate to respawn with full health! This can only be done once per round.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Barbarian) {
			formatex( header, sizeof header - 1, "Class information: Barbarian")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Regain full ammo and 20 HP upon kill, On roundstart you will gain 200 armor and bullet blocking armor stacks. Per 10 intelligence you will gain another stack.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Gain instant ammo refill, 200 armor and no recoil for 10 seconds.<br><br>")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Ninja) {
			formatex( header, sizeof header - 1, "Class information: Ninja")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Run with 40 extra speed, for every dextery or intelligence you will gain an extra 1.3 speed!<br><br>   ")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Become a super ninja! This will give you double your passive speed and allows you to peform jumps in the air for a small duration!<br><br>   ")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		} else if (player_class[id] == Hunter) {
			formatex( header, sizeof header - 1, "Class information: Hunter")
			len += formatex(motd[len], sizeof motd - 1 - len, "<body bgcolor=#000000 text=#FFB000><font size=5><center>")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive: Equip your knife to load for a flashbang. It will take 5 seconds - 0.02 per intelligence to get a new flashbang.<br><br>  ")
			len += formatex(motd[len],sizeof motd - 1 - len,"Passive Bow: Deal 80 damage + 4 damage per intelligence with your arrows! However the damage is reduced if the enemy has dextery, every points reduces 2 damage! The arrow delay is 4.25 seconds - 0.05 seconds per intelligence.<br><br>  ")
			len += formatex(motd[len],sizeof motd - 1 - len,"Ultimate: Get 1 stack + 1 per 25 intelligence to become invisible for 2 seconds.   ")
			len += formatex(motd[len],sizeof motd - 1 - len,"</font></center>")
			show_motd(id, motd, header)
		}	
}
egbertjan is offline
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 09:36.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode