/* Plugin generated by AMXX-Studio */

// uncomment this line for top15 sql database saving
//#define USING_SQL

// uncomment this line for recieving grenades on cmd /weapons
//#define GIVE_GRENADES

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <fun>

//#if defined USING_SQL
//#include <sqlx>
//#endif

#define PLUGIN "ProKreedz Ultimativ"
#define VERSION "v2.4"
#define AUTHOR "vato loco [GE-S]"
#define PLUGIN_CVAR "prokreedz_ultimativ"

#define PLUGIN_HOOK    "PK_Hook_v2.4.amxx"
#define PLUGIN_JETPACK "PK_Jetpack_v2.4.amxx"
#define KZ_HOOK        "kz_prize_hook"
#define KZ_JETPACK     "kz_prize_jetpack"
#define KZ_HOOK_OFF    "HookOff"
#define KZ_JET_OFF     "JetPackOff"

#define KZ_ACCESS         ADMIN_KICK
#define KZ_ADMIN_MENU     ADMIN_RCON
#define CP_MAX_PRO        get_pcvar_num(g_kz_maxpro_cp)
#define CP_DISTANCE       35.0
#define DISTANCE          120
#define M_RADIOS_LEFT     192 

#define TASK_INFO         12222
#define TASK_RESPAWN      13333
#define TASK_AUTOJOIN     14444
#define TASK_ADMINGLOW    15555
#define TASK_CREATEBOT    16666
#define TASK_FUNCTIONS    17777 
#define TASK_NVG          18888

#define MENU_KEYS MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_0
#define MENU_KEYS_ADMIN MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

// Kz ColorChat          
enum color {
	normal = 1, // clients scr_concolor cvar color
	green,      // Green Color
	team        // Red, grey, blue
}

#if !defined USING_SQL
new const g_iTopColors[][] = {
	"#ff0000",
	"#07fcff",
	"#fff007"
}
#endif

#if !defined GIVE_GRENADES
new const SKIP_WEAPONS = (1<<CSW_HEGRENADE) | (1<<CSW_FLASHBANG) | (1<<CSW_SMOKEGRENADE)
#endif

new const SayCmdsClient[][64] = {
	"menu","KzPlayerMenu","usp", "cmd_usp","scout", "cmd_scout","spawn","cmd_restart",
	"respawn","cmd_restart","start","cmd_restart","restart","cmd_restart","reset","cmd_reset",
	"checkpoint","cmd_checkpoint","cp","cmd_checkpoint","check","cmd_checkpoint",
	"gocheck","cmd_gocheck","gc","cmd_gocheck","tp","cmd_gocheck",
	"stuck","cmd_stuck","unstuck","cmd_stuck","showkeys", "cmd_showplayerkeys",
	"spec","cmd_spec","unspec","cmd_spec","pause","cmd_pause","unpause","cmd_pause","help", "cmd_help",
	"top10","cmd_top15","top15","cmd_top15","nub10","show_nub15","nub15","show_nub15",
	"pro10","show_pro15","pro15","show_pro15","weapons", "cmd_weapons", "drop", "cmd_drop"
}

new const SayCmdsAdmin[][64] = { 
	"amenu","KzAdminMenuShow", "adminmenu","KzAdminMenuShow", 
	"setstart","cmd_admin_setstart", "delstart","cmd_admin_delstart" 
}

new const g_start_sounds[][] = {
	"barney/beertopside",
	"scientist/c3a2_sci_portopen",
	"barney/c1a2_ba_climb"
}

new const g_block_commands[][] = {
	"chooseteam", "buy", "buyammo1", "buyammo2", "buyequip",
	"cl_autobuy", "cl_rebuy", "cl_setautobuy", "cl_setrebuy"
}

new const g_radio_commands[][] = {"radio1", "radio2", "radio3"}

new const KZ_PROKREEDZ_DIR[] = "addons/amxmodx/configs/prokreedz"
new const KZ_TOP15_DIR[] = "addons/amxmodx/configs/prokreedz/kz_top15"
new const KZ_START_DIR[] = "addons/amxmodx/configs/prokreedz/kz_start"
new const KZ_CONFIG[] = "prokreedz/ProKreedz.cfg"

new const Float:VEC_DUCK_HULL_MIN[3] = {-16.0, -16.0, -18.0}
new const Float:VEC_DUCK_HULL_MAX[3] = {16.0, 16.0, 18.0}

#if defined USING_SQL
new Handle:g_hSqlTuple
#else
new pro15_names[24][32], pro15_authid[24][32], Float:pro15_times[24], pro15_cp[24], pro15_gocp[24]
new nub15_names[24][32], nub15_authid[24][32], Float:nub15_times[24], nub15_cp[24], nub15_gocp[24]
#endif

new Float:g_fStartPosition[3]
new bool:g_bStartPos
new g_StartFile[128]

new Float:g_fPlayerStartPosition[33][3]
new bool:g_bStartPosition[33] 

new Float:g_fCheckpoints[33][3]  
new Float: g_fCheckStuck[33][3]
new bool:g_bPlayerUsedStuck[33]
new g_iCheckpointNum[33]
new g_iGoCheckNum[33]

new is_plr_alive[33]
new is_plr_bot[33]
new is_plr_connected[33]

new bool:g_bFirstSpawn[33]
new bool:g_bHasScout[33]
new bool:g_bShowTimer[33]
new bool:g_bNoclip[33]
new g_iBunnyHop[33]
new g_iPlayerKeys[33]
new bool:g_bShowKeys[33]
new Float:fShowKeyTime
new plr_key[33][64]
new bool:g_bPlayerNvgUse[33]
new bool:g_bWeapons[33]
new g_iPlayerName[33][32]
new g_iTarget[33]

new Float:g_iPlayerTime[33]
new bool:g_bPlayerStart[33] 
new Float:g_iPlayerPauseTime[33]
new g_bPlayerPaused[33]
new g_bPlayerSpec[33]
new Float:g_fSpecPosition[33][3]
new Float:g_iPlayerHealth[33]

new g_iPlayerModel[33][32]
new g_iEntPlayerModel[33]                       
new g_iEntWeaponModel[33]
new g_bPlayerIsAdmin[33]

new g_szMapName[64]

new g_kz_modname_enable
new g_kz_checkpoints
new g_kz_semiclip
new g_kz_transparency
new g_kz_scout
new g_kz_pause
new g_kz_spec
new g_kz_sounds
new g_kz_vip
new g_kz_adminglow
new g_kz_money
new g_kz_autojoin
new g_kz_bhop
new g_kz_cheatdetect
new g_kz_godmode 
new g_kz_nokill
new g_kz_help
new g_kz_bot
new g_kz_prize
new g_kz_doorsound 
new g_kz_painsound
new g_kz_watersound
new g_kz_botname
new g_kz_tag
new g_kz_advert_time
new g_kz_autoheal
new g_kz_autoheal_hp
new g_kz_weaponspeed
new g_kz_weaponspeed_color
new g_kz_weaponspeed_xypos
new g_kz_showkeys
new g_kz_showkeys_color
new g_kz_showkeys_xypos
new g_kz_nvg_enabled
new g_kz_nvg_radius 
new g_kz_nvg_color  
new g_kz_time_color
new g_kz_status_color
new g_kz_showhealth_color
new g_kz_showhealth_xypos
new g_kz_maxpro_cp
new g_kz_weapons
new g_kz_autostart
new g_kz_statustext
new g_kz_statustext_color
new g_kz_statustext_xypos
#if defined USING_SQL
new g_kz_sql_host
new g_kz_sql_user
new g_kz_sql_pass
new g_kz_sql_db
new g_kz_weburl
#endif

new g_mp_fiendlyfire
new g_mp_autoteambalance
new g_mp_limitteams
new g_mp_freezetime
new g_mp_autokick
new g_mp_flashlight
new g_sv_airaccelerate
new g_sv_gravity

new g_SyncTimer
new g_SyncWeapon
new g_SyncShowKeys
new g_SyncShowHealth
new g_SyncStatusText

new g_SayText
new g_ScoreAttrib
new g_TeamInfo
new g_StatusValue
new g_StatusText
new g_Money
new g_ClCorpse
new g_ShowMenu
new g_VguiMenu
new g_RoundTime
new g_ScreenFade
new g_NVGToggle
new g_Health
new g_StatusIcon

new Trie:g_tStartTargets
new Trie:g_tFinishTargets
new Trie:g_tRemoveEntities
new Trie:g_tWeaponCommands
new Trie:g_tdoorSnd
new Trie:g_tpainSnd
new Trie:g_twaterSnd

new g_iMaxPlayers

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_cvar(PLUGIN_CVAR, VERSION, FCVAR_SERVER|FCVAR_SPONLY, 0.0)
	register_dictionary("prokreedz_v2.4.txt")
	register_menucmd(register_menuid("ProKreedz Ultimativ v2.4 - Adminmenu"),MENU_KEYS_ADMIN,"AdminMenuHandler")
	register_menucmd(register_menuid("ProKreedz v2.4 - Playermenu"),MENU_KEYS,"PlayerMenuHandler")
	
	RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled", 1)
	RegisterHam(Ham_Player_PreThink, "player", "fw_PreThink_Post", 1)
	RegisterHam(Ham_Use, "func_button", "fw_UseButton", 0)
	RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox", 1)
	RegisterHam(Ham_Player_Jump, "player", "fw_PlayerJump")
	
	register_forward(FM_Think,"fw_ThinkEntity")
	register_forward(FM_EmitSound, "fw_EmitSound")
	register_forward(FM_ClientKill,"fw_ClientKill")
	register_forward(FM_StartFrame, "fw_StartFrame")
	register_forward(FM_AddToFullPack, "fw_AddToFullPack_Post", 1)
	
	register_event("CurWeapon", "ev_CheckWeapon", "be", "1=1")
	register_event("Health", "ev_Health", "be", "1>0")
	
	register_clcmd("nightvision","cmd_toggle_nvg")
	register_clcmd("kz_noclip","cmd_admin_noclip", KZ_ACCESS, "<name|#userid|steamid|@ALL> <on/off>")
	register_clcmd("kz_gravity", "cmd_admin_gravity", KZ_ACCESS, "<name|#userid|steamid|@ALL> <gravity>")
	
	new i
	kz_register_saycmd("noclip", "cmd_admin_noclip", KZ_ACCESS)
	for(i = 0; i < sizeof(SayCmdsAdmin); i = i+2)
		kz_register_saycmd(SayCmdsAdmin[i], SayCmdsAdmin[i+1], KZ_ADMIN_MENU)
	
	for(i = 0; i < sizeof(SayCmdsClient); i = i+2)
		kz_register_saycmd(SayCmdsClient[i], SayCmdsClient[i+1], 0)
	
	g_kz_modname_enable = register_cvar("kz_modname_enable","1")
	g_kz_checkpoints = register_cvar("kz_checkpoints","1")
	g_kz_semiclip = register_cvar("kz_semiclip","1")
	g_kz_transparency = register_cvar("kz_transparency","1")
	g_kz_scout = register_cvar("kz_scout","1")
	g_kz_pause = register_cvar("kz_pause","1")
	g_kz_spec = register_cvar("kz_spec","1")
	g_kz_sounds = register_cvar("kz_sounds","1")
	g_kz_vip = register_cvar("kz_vip","1") 
	g_kz_adminglow = register_cvar("kz_adminglow","1")
	g_kz_money = register_cvar("kz_money","1337")
	g_kz_autojoin = register_cvar("kz_autojoin","1")
	g_kz_bhop = register_cvar("kz_bhop","1")
	g_kz_cheatdetect = register_cvar("kz_cheatdetect","1")
	g_kz_godmode = register_cvar("kz_godmode","1")
	g_kz_nokill = register_cvar("kz_nokill","1")
	g_kz_help = register_cvar("kz_help","1")
	g_kz_bot = register_cvar("kz_bot","1")
	g_kz_prize = register_cvar("kz_prize","1")
	g_kz_doorsound = register_cvar("kz_doorsound","1")
	g_kz_painsound = register_cvar("kz_painsound","1")
	g_kz_watersound = register_cvar("kz_watersound","1")
	g_kz_botname = register_cvar("kz_botname", "ProKreedz Ultimativ v2.4")
	g_kz_tag = register_cvar("kz_tag", "[ProKreedz]")
	g_kz_advert_time = register_cvar("kz_advert_time","60")
	g_kz_autoheal = register_cvar("kz_autoheal", "1")
	g_kz_autoheal_hp = register_cvar("kz_autoheal_hp", "50")
	g_kz_weapons = register_cvar("kz_weapons","1") 
	g_kz_weaponspeed = register_cvar("kz_weaponspeed","1")
	g_kz_weaponspeed_color = register_cvar("kz_weaponspeed_color","0 255 255")
	g_kz_weaponspeed_xypos = register_cvar("kz_weaponspeed_xypos","0.35 0.75")
	g_kz_showkeys = register_cvar("kz_showkeys","1")
	g_kz_showkeys_color = register_cvar("kz_showkeys_color","0 255 255")
	g_kz_showkeys_xypos = register_cvar("kz_showkeys_xypos","-1.0 -0.40")
	g_kz_nvg_enabled = register_cvar("kz_nvg_enabled","1")
	g_kz_nvg_radius = register_cvar("kz_nvg_radius","70")
	g_kz_nvg_color = register_cvar("kz_nvg_color","0 255 255")
	g_kz_time_color = register_cvar("kz_time_color","0 255 255")
	g_kz_status_color = register_cvar("kz_status_color","255 0 0")
	g_kz_showhealth_color = register_cvar("kz_showhealth_color", "255 50 0")
	g_kz_showhealth_xypos = register_cvar("kz_showhealth_xypos ", "-1.0 0.9")
	g_kz_maxpro_cp = register_cvar("kz_maxpro_cp","10000")
	g_kz_autostart = register_cvar("kz_autostart","1")
	g_kz_statustext = register_cvar("kz_statustext","1")
	g_kz_statustext_color = register_cvar("kz_statustext_color","255 255 0")
	g_kz_statustext_xypos = register_cvar("kz_statustext_xypos","-1.0 0.52")
#if defined USING_SQL
	g_kz_sql_host = register_cvar("kz_sql_host", "")
	g_kz_sql_user = register_cvar("kz_sql_user", "")
	g_kz_sql_pass = register_cvar("kz_sql_pass", "", FCVAR_PROTECTED)
	g_kz_sql_db = register_cvar("kz_sql_db", "")
	g_kz_weburl = register_cvar("kz_weburl", "http://your.domain.com/path/to/top15.php")
#else
	register_cvar("kz_sql_host", "")
	register_cvar("kz_sql_user", "")
	register_cvar("kz_sql_pass", "", FCVAR_PROTECTED)
	register_cvar("kz_sql_db", "")
	register_cvar("kz_weburl", "")
#endif
	
	g_mp_fiendlyfire = get_cvar_pointer("mp_friendlyfire")
	g_mp_autoteambalance = get_cvar_pointer("mp_autoteambalance")
	g_mp_limitteams = get_cvar_pointer("mp_limitteams")
	g_mp_freezetime = get_cvar_pointer("mp_freezetime")
	g_mp_autokick = get_cvar_pointer("mp_autokick")
	g_mp_flashlight = get_cvar_pointer("mp_flashlight")
	g_sv_airaccelerate = get_cvar_pointer("sv_airaccelerate")
	g_sv_gravity = get_cvar_pointer("sv_gravity")
	
	set_pcvar_num(g_mp_fiendlyfire, 0)
	set_pcvar_num(g_mp_autoteambalance, 0)
	set_pcvar_num(g_mp_limitteams, 0)
	set_pcvar_num(g_mp_freezetime, 0)
	set_pcvar_num(g_mp_autokick, 0)
	set_pcvar_num(g_mp_flashlight, 1)
	set_pcvar_num(g_sv_airaccelerate, 10)
	
	g_Health = get_user_msgid("Health")
	g_ScreenFade = get_user_msgid("ScreenFade")
	g_NVGToggle = get_user_msgid("NVGToggle")
	g_SayText = get_user_msgid("SayText")
	g_ScoreAttrib = get_user_msgid("ScoreAttrib")
	g_TeamInfo = get_user_msgid("TeamInfo")
	g_StatusValue = get_user_msgid("StatusValue")
	g_StatusText = get_user_msgid("StatusText")
	g_Money = get_user_msgid("Money")
	g_ClCorpse = get_user_msgid("ClCorpse")
	g_ShowMenu = get_user_msgid("ShowMenu")
	g_VguiMenu = get_user_msgid("VGUIMenu")
	g_RoundTime = get_user_msgid("RoundTime")
	g_StatusIcon = get_user_msgid("StatusIcon")
	register_message(g_Health, "MsgHealth")
	register_message(g_Money, "MsgMoney")
	register_message(g_ClCorpse, "MsgClCorpse")
	register_message(g_ShowMenu, "MsgShowMenu")
	register_message(g_VguiMenu, "MsgVguiMenu")
	register_message(g_RoundTime,"MsgRoundTime")
	register_message(g_StatusIcon , "MsgStatusIcon")
	register_message(g_StatusValue , "MsgStatusValue")
	set_msg_block(g_ClCorpse, BLOCK_SET)
	set_msg_block(g_StatusText, BLOCK_SET)
	
	new iEnt
	iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString , "info_target"))
	set_pev(iEnt, pev_classname, "kz_time_think")
	set_pev(iEnt, pev_nextthink, get_gametime() + 1.0)
	
	iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString , "info_target"))
	set_pev(iEnt, pev_classname, "kz_player_statustext")
	set_pev(iEnt, pev_nextthink, get_gametime() + 1.0)
	
	set_task(5.0, "kz_CreateBot", TASK_CREATEBOT, _, _, "b")
	set_task(1.0, "kz_Functions", TASK_FUNCTIONS, _, _, "b")
	
	g_SyncTimer = CreateHudSyncObj()
	g_SyncWeapon = CreateHudSyncObj()
	g_SyncShowKeys = CreateHudSyncObj()
	g_SyncShowHealth = CreateHudSyncObj()
	g_SyncStatusText = CreateHudSyncObj()
	
	new const g_iStartTargets[][] = {
		"counter_start","clockstartbutton",
		"firsttimerelay","but_start",
		"counter_start_button","multi_start",
		"timer_startbutton","start_timer_emi",
		"gogogo" 
	}
	g_tStartTargets = TrieCreate()
	for(i = 0; i < sizeof(g_iStartTargets); i++)
	{
		TrieSetCell(g_tStartTargets, g_iStartTargets[i], i)
	}
	new const g_iFinishTargets[][] = {
		"counter_off","clockstopbutton",
		"clockstop","but_stop",
		"counter_stop_button","multi_stop",
		"stop_counter","m_counter_end_emi" 
	}
	g_tFinishTargets = TrieCreate()
	for(i = 0; i < sizeof(g_iFinishTargets); i++)
	{
		TrieSetCell(g_tFinishTargets, g_iFinishTargets[i], i)
	}
	new const g_iWeaponCommands[][] = {
		"usp", "glock", "deagle", "p228", "elites",
		"fn57", "m3", "xm1014", "mp5", "tmp", "p90",
		"mac10", "ump45", "ak47", "galil", "famas",
		"sg552", "m4a1", "aug", "scout", "awp", "g3sg1",
		"sg550", "m249", "vest", "vesthelm", "flash",
		"hegren", "sgren", "defuser", "nvgs", "shield",
		"primammo", "secammo", "km45", "9x19mm", "nighthawk",
		"228compact", "fiveseven", "12gauge", "autoshotgun",
		"mp", "c90", "cv47", "defender", "clarion", "krieg552",
		"bullpup", "magnum", "d3au1", "krieg550"
	}
	g_tWeaponCommands = TrieCreate()
	for(i = 0; i < sizeof(g_iWeaponCommands); i++)
	{
		TrieSetCell(g_tWeaponCommands, g_iWeaponCommands[i], i)
	}
	new const g_doorSnd[][] = {
		"doors/doorstop1.wav",
		"doors/doorstop2.wav",
		"doors/doorstop3.wav"
	}
	g_tdoorSnd = TrieCreate()
	for(i = 0; i < sizeof(g_doorSnd); i++)
	{
		TrieSetCell(g_tdoorSnd, g_doorSnd[i], i)
	}
	new const g_painSnd[][] = {
		"player/pl_pain2.wav", "player/pl_pain3.wav", 
		"player/pl_pain4.wav", "player/pl_pain5.wav",
		"player/pl_pain6.wav", "player/pl_pain7.wav", 
		"player/bhit_kevlar-1.wav", "player/bhit_flesh-1.wav",
		"player/bhit_flesh-2.wav", "player/bhit_flesh-3.wav"
	}
	g_tpainSnd = TrieCreate()
	for(i = 0; i < sizeof(g_painSnd); i++)
	{
		TrieSetCell(g_tpainSnd, g_painSnd[i], i)
	}
	new const g_waterSnd[][] = {
		"player/pl_swim1.wav", "player/pl_swim2.wav",
		"player/pl_swim3.wav", "player/pl_swim4.wav",
		"player/waterrun.wav"
	}
	g_twaterSnd = TrieCreate()
	for(i = 0; i < sizeof(g_waterSnd); i++)
	{
		TrieSetCell(g_twaterSnd, g_waterSnd[i], i)
	}
	get_mapname(g_szMapName, charsmax(g_szMapName))
	strtolower(g_szMapName)
	
	g_iMaxPlayers = get_maxplayers()
}

public plugin_cfg()
{
	new KzConfig[64], KzCfg[128]
	get_configsdir(KzConfig, 63)
	format(KzCfg, 127, "%s/%s", KzConfig, KZ_CONFIG)
	
	if(file_exists(KzCfg))
	{
		server_cmd("exec %s", KzCfg)
		server_exec()
	}
	else
	{
		kz_make_config(KzCfg)
	}
	
	if(!dir_exists(KZ_START_DIR))
	{
		mkdir(KZ_START_DIR)
	}
	format(g_StartFile, 127, "%s/%s.txt", KZ_START_DIR, g_szMapName)
	
	if(file_exists(g_StartFile))
	{
		g_bStartPos = true
		
		new Data[64], x[13], y[13], z[13]
		new f = fopen(g_StartFile, "rt")
		
		while(!feof(f))
		{
			fgets(f, Data, 63)
			parse(Data, x, 12, y, 12, z, 12)
			
			g_fStartPosition[0] = str_to_float(x)
			g_fStartPosition[1] = str_to_float(y)
			g_fStartPosition[2] = str_to_float(z)
		}
		fclose(f)
	}
	else
	{
		g_bStartPos = false
	}
	if(get_pcvar_num(g_kz_prize))
		set_task(get_pcvar_float(g_kz_advert_time),"Hook")
	
	if(get_pcvar_num(g_kz_autoheal))
		kz_create_healer()	
	
	if(get_pcvar_num(g_kz_modname_enable))
		register_forward(FM_GetGameDescription, "fw_GameDescription")
	
	for(new i = 0; i < sizeof(g_radio_commands); i++)
		register_clcmd(g_radio_commands[i], "BlockCommands")
	
	for(new i = 0; i < sizeof(g_block_commands) ; i++) 
		register_clcmd(g_block_commands[i], "BlockCommands")
	
#if defined USING_SQL
	new szHost[64], szUser[64], szPass[64], szDb[64]
	get_pcvar_string(g_kz_sql_host, szHost, charsmax(szHost))
	get_pcvar_string(g_kz_sql_user, szUser, charsmax(szUser))
	get_pcvar_string(g_kz_sql_pass, szPass, charsmax(szPass))
	get_pcvar_string(g_kz_sql_db, szDb, charsmax(szDb))
	
	g_hSqlTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDb)
	
	if(g_hSqlTuple == Empty_Handle)
	{
		log_amx("Failed to connect to SQL database. Please check login info.")
	}
	else
	{
		SQL_ThreadQuery(g_hSqlTuple, "QueryCreateTable", "CREATE TABLE IF NOT EXISTS kz_pro15 (name VARCHAR(32) NOT NULL, steamid VARCHAR(35) NOT NULL, map VARCHAR(64) NOT NULL, time DOUBLE NOT NULL, cp INT NOT NULL, gc INT NOT NULL, PRIMARY KEY (steamid, map));");
		SQL_ThreadQuery(g_hSqlTuple, "QueryCreateTable", "CREATE TABLE IF NOT EXISTS kz_nub15 (name VARCHAR(32) NOT NULL, steamid VARCHAR(35) NOT NULL, map VARCHAR(64) NOT NULL, time DOUBLE NOT NULL, cp INT NOT NULL, gc INT NOT NULL, PRIMARY KEY (steamid, map));");
	}
#else
	for(new i = 0 ; i < 15; ++i)
	{
		pro15_times[i] = 999999999.00000
		nub15_times[i] = 999999999.00000
	}
	read_pro15()
	read_nub15()
#endif
}

#if defined USING_SQL
public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, iData[], iDataSize, Float:flQueueTime)
{
	switch(iFailState)
	{
		case TQUERY_CONNECT_FAILED:
		{
			log_amx("Failed to connect to database (%i): %s", iError, szError)
		}
		case TQUERY_QUERY_FAILED:
		{
			log_amx("Error on query for QueryCreateTable() (%i): %s", iError, szError)
		}
		default: {
			// successfully created tables
		}
	}
}
#endif

public plugin_precache() 
{
	register_forward(FM_Spawn, "fw_Spawn", 0)
	set_pev(0, pev_speed, 8192.0)
	
	new const g_iRemoveEntities[][] = {
		"func_bomb_target", "info_bomb_target", 
		"hostage_entity", "monster_scientist", 
		"func_hostage_rescue", "info_hostage_rescue",
		"info_vip_start", "func_vip_safetyzone", 
		"func_escapezone","armoury_entity", 
		"game_player_equip", "player_weaponstrip",
		"info_deathmatch_start" 
	}
	g_tRemoveEntities = TrieCreate()
	for(new i = 0; i < sizeof(g_iRemoveEntities); i++)
	{
		TrieSetCell(g_tRemoveEntities, g_iRemoveEntities[i], i)
	}
	if(!dir_exists(KZ_PROKREEDZ_DIR))
		mkdir(KZ_PROKREEDZ_DIR)
	
	if(!dir_exists(KZ_TOP15_DIR))
		mkdir(KZ_TOP15_DIR)
}

public plugin_end()
{
	TrieDestroy(g_tStartTargets)
	TrieDestroy(g_tFinishTargets)
	TrieDestroy(g_tWeaponCommands)
}

public client_connect(id) 
{
	g_iCheckpointNum[id] = 0
	g_iGoCheckNum[id] = 0
	g_bPlayerSpec[id] = false
	g_bPlayerPaused[id] = false
	g_iPlayerPauseTime[id] = 0.0
	g_iPlayerTime[id] = 0.0
	g_bPlayerStart[id] = false
	g_bFirstSpawn[id] = true
	g_bHasScout[id] = false
	g_iBunnyHop[id] = 0
	g_bShowTimer[id] = true
	g_bPlayerIsAdmin[id] = false
	g_bStartPosition[id] = false 
	g_iTarget[id] = 0
	get_user_name(id, g_iPlayerName[id], 31)
}

public client_putinserver(id)
{
	is_plr_connected[id] = true
	
	if(!is_user_bot(id))
	{
		if(get_user_flags(id) & KZ_ACCESS) 
		{	
			g_bPlayerIsAdmin[id] = true
		}
	}
	else
	{
		is_plr_bot[id] = true
	}
}

public client_disconnect(id)
{
	if(g_bPlayerIsAdmin[id])
		fm_remove_model_ents(id)
	g_bPlayerSpec[id] = false
	is_plr_alive[id] = false
	is_plr_bot[id] = false
	is_plr_connected[id] = false
}

public client_infochanged(id)
{ 
	get_user_info(id, "name", g_iPlayerName[id], 31)
}

public ev_CheckWeapon(id) 
{
	static weapon_used[33]             
	
	static weapon_active, weapon_num
	weapon_active = read_data(1)      
	weapon_num = read_data(2)       
	
	if(!g_bHasScout[id] && !g_bWeapons[id] && is_plr_alive[id]) 
	{
		if(weapon_num == CSW_SCOUT) 
		{
			ham_strip_weapon(id, "weapon_scout")
		}
	}
	if((weapon_num != weapon_used[id]) && weapon_active && get_pcvar_num(g_kz_weaponspeed)) 
	{
		weapon_used[id] = weapon_num
		
		static Float:maxspeed, r, g, b, Float:x, Float:y
		pev(id, pev_maxspeed, maxspeed)
		
		if(maxspeed < 0.0)
			maxspeed = 250.0
		
		GetCvarPosition(g_kz_weaponspeed_xypos, x, y)
		GetCvarColor(g_kz_weaponspeed_color, r, g, b)
		set_hudmessage(r, g, b, x, y, _, _, 1.0, _, _, 2)
		ShowSyncHudMsg(id, g_SyncWeapon, "%L", id, "PKU_WEAPON_SPEED", floatround( maxspeed, floatround_floor))
	}
	if(g_bPlayerIsAdmin[id]) 
	{
		fm_set_admin_weaponmodel(id)
	}
}

public ev_Health(id)
{
	if(!get_pcvar_num(g_kz_godmode))
	{
		new Float:fHealth
		pev(id, pev_health, fHealth)
		if(fHealth > 255.0)
		{
			static r, g, b, Float:x, Float:y
			GetCvarPosition(g_kz_showhealth_xypos, x, y)
			GetCvarColor(g_kz_showhealth_color, r, g, b)
			set_hudmessage(r, g, b, x, y, 0, _, 2.0, _, _, 2)
			ShowSyncHudMsg(id, g_SyncShowHealth, "HP: %d", floatround(fHealth))
		}
	}
}

public cmd_help(id)
{
	if(get_pcvar_num(g_kz_help))
	{
		static MOTD[2048], MLTITEL[24], Pos
		
		formatex(MLTITEL,23,"%L", id, "PKU_IMOTD_HELP_TITEL")
		
		Pos = formatex(MOTD,sizeof MOTD - 1,"<style type=^"text/css^"><!--.h1 { color:#228B22;font-weight:bold;};.h2 { color:#FFFFFF; font-weight:bold; };font-family: Times New Roman}--></style><body bgcolor=^"#000000^"><table width=^"100%%^" border=^"0^">")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_HELP_MENU")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /menu")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_SCOUT")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /scout")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_USP")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /usp")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_TOP15")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /nub15")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /pro15")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_CHECKPOINT")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /checkpoint")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /cp")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_GOCHECK")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /gocheck")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /tp")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_STUCK")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /stuck")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /unstuck")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_START")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /start")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /respawn")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_RESET")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /reset")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_PAUSE")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /pause")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_SPEC")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /spec")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_SHOWKEYS") 
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /showkeys")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"%L", id, "PKU_IMOTD_WEAPONS") 
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /weapons")
		Pos += formatex(MOTD[Pos],sizeof MOTD - 1 - Pos,"<tr><td class=h2>say /drop")
		
		show_motd(id,MOTD,MLTITEL)
	}
	return PLUGIN_CONTINUE
}

public cmd_top15(id)
{
	kz_colorchat(id, green,"^x03Top15: ^x01'^x04/pro15^x01'^x03 - ^x01'^x04/nub15^x01'")
}

public cmd_showplayerkeys(id)
{
	g_bShowKeys[id] = !g_bShowKeys[id]
}

public cmd_toggle_nvg(id) 
{ 
	g_bPlayerNvgUse[id] = !g_bPlayerNvgUse[id]
	
	if(get_pcvar_num(g_kz_nvg_enabled))
	{
		kz_set_nvg_msg(id, false)
		
		if(g_bPlayerNvgUse[id])
			kz_make_nvg(id)
		else 
			kz_remove_nvg(id)
	}
	else
	{
		kz_set_nvg_msg(id, g_bPlayerNvgUse[id])
	}
	if(g_bPlayerNvgUse[id])
		emit_sound(id, CHAN_ITEM, "items/nvg_on.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	else 
		emit_sound(id, CHAN_ITEM, "items/nvg_off.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	return PLUGIN_HANDLED
} 

public cmd_restart(id) 
{
	if(g_bPlayerPaused[id] || !is_plr_alive[id])
		return PLUGIN_HANDLED
	
	cmd_reset(id)
	if(g_bStartPos)
	{
		PlayerSpawnPost(id)
		set_pev(id, pev_velocity, Float:{0.0, 0.0, 0.0})
		engfunc(EngFunc_SetOrigin, id, g_fStartPosition)
	}
	else
	{
		if(g_bStartPosition[id])
		{
			PlayerSpawnPost(id)
			set_pev(id, pev_velocity, Float:{0.0, 0.0, 0.0})
			engfunc(EngFunc_SetOrigin, id, g_fPlayerStartPosition[id])
		}
		else
			ExecuteHamB(Ham_CS_RoundRespawn, id)
	}
	return PLUGIN_HANDLED
}

public cmd_reset(id)
{
	if(g_bPlayerPaused[id] || !is_plr_alive[id])
		return PLUGIN_HANDLED
	
	if(g_bPlayerStart[id])
		kz_colorchat(id, green,"%L", id, "PKU_CMD_RESET")
	
	g_iCheckpointNum[id] = 0
	g_iGoCheckNum[id] = 0
	g_iPlayerPauseTime[id] = 0.0
	g_iPlayerTime[id] = 0.0
	g_bPlayerStart[id] = false
	set_pev(id, pev_frags, 0.0)
	cs_set_user_deaths(id, 0)
	return PLUGIN_HANDLED
}

public cmd_drop(id)
{
	if(is_plr_alive[id] && g_bWeapons[id] && !g_bPlayerPaused[id])
		kz_set_weapons(id)
}

public cmd_weapons(id)
{
	if(!get_pcvar_num(g_kz_weapons))
		return PLUGIN_HANDLED
	
	if(is_plr_alive[id] && !g_bPlayerPaused[id])
	{
		new szWeaponName[20]
		for(new iCswId = CSW_P228; iCswId <= CSW_P90; iCswId++)
		{
#if !defined GIVE_GRENADES			
			if(SKIP_WEAPONS & (1<<iCswId))
				continue
#endif
			if(!user_has_weapon(id, iCswId) && get_weaponname(iCswId, szWeaponName, 19))
			{
				give_item(id, szWeaponName)
				g_bWeapons[id] = true
				DetectCheat(id,"Weapons")
			}
		}
	}
	return PLUGIN_HANDLED_MAIN
}

public cmd_scout(id) 
{
	if(!get_pcvar_num(g_kz_scout)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_SCOUT_OFF")
		return PLUGIN_HANDLED
	}
	if(!is_plr_alive[id])
		return PLUGIN_HANDLED
	
	if(!g_bHasScout[id])
	{
		if(g_iCheckpointNum[id] > CP_MAX_PRO || !g_bPlayerStart[id])
		{	
			give_item(id,"weapon_scout")
			g_bHasScout[id] = true
		}
		else 
		{
			give_item(id,"weapon_scout")
			g_bHasScout[id] = true
			kz_colorchat(id, green,"%L", id, "PKU_PRO_OFF")
		}
	}
	else 
	{
		if(user_has_weapon(id, CSW_SCOUT)) 
		{
			g_bHasScout[id] = true
			kz_colorchat(id, green,"%L", id, "PKU_SCOUT_HAS")
		}
		else 
		{
			give_item(id,"weapon_scout")
			g_bHasScout[id] = true
		}
	}
	return PLUGIN_CONTINUE
}

public cmd_usp(id)
{ 
	if(!is_plr_alive[id])
		return PLUGIN_HANDLED
	
	if(user_has_weapon(id, CSW_USP)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_USP_HAS")
	}
	else 
	{
		give_item(id,"weapon_usp")
	}
	return PLUGIN_CONTINUE
}

public cmd_pause(id) 
{
	if(!get_pcvar_num(g_kz_pause)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_PAUSE_OFF")
		return PLUGIN_HANDLED
	}
	if(g_bPlayerStart[id] && is_plr_alive[id]) 
	{
		if(!g_bPlayerPaused[id]) 
		{
			g_iPlayerPauseTime[id] += (get_gametime() - g_iPlayerTime[id])
			g_bPlayerPaused[id] = true
			g_iPlayerTime[id] = 0.0
			
			set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
			if(!get_pcvar_num(g_kz_semiclip))
			{
				set_pev(id, pev_solid, SOLID_NOT)
			}
			if(g_bPlayerIsAdmin[id])
			{
				set_pev(id, pev_rendermode, kRenderTransTexture)
				set_pev(id, pev_renderamt, 0.0)
				set_rendering(g_iEntPlayerModel[id], kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 40)
				set_rendering(g_iEntWeaponModel[id], kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 40)
			}
			else
			{
				set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 40)
			}
		}
		else
		{
			g_bPlayerPaused[id] = false
			g_iPlayerTime[id] = get_gametime()
			
			set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
			
			if(!get_pcvar_num(g_kz_semiclip))
			{
				set_pev(id, pev_solid, SOLID_SLIDEBOX)
			}
			if(g_bPlayerIsAdmin[id])
			{
				set_rendering(g_iEntPlayerModel[id])
				set_rendering(g_iEntWeaponModel[id])
				if(get_pcvar_num(g_kz_adminglow))
					set_task(1.5,"AdminGlow", id + TASK_ADMINGLOW)
			}
			else
			{
				set_rendering(id)
			}
		}
	}
	else
	{
		kz_colorchat(id, green,"%L", id, "PKU_PAUSE_USE")
	}
	return PLUGIN_CONTINUE
}

public cmd_spec(id) 
{
	if(!get_pcvar_num(g_kz_spec)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_SPEC_OFF")
		return PLUGIN_HANDLED
	}
	if(is_plr_alive[id]) 
	{
		if (g_bPlayerStart[id]) 
		{			
			if(!g_bPlayerPaused[id]) 
			{
				g_iPlayerPauseTime[id] += (get_gametime() - g_iPlayerTime[id])
				g_bPlayerPaused[id] = true
				g_iPlayerTime[id] = 0.0
			}
		}
		pev(id, pev_health, g_iPlayerHealth[id])  
		pev(id, pev_origin, g_fSpecPosition[id])
		cs_set_user_team(id, CS_TEAM_SPECTATOR)
		set_pev(id, pev_solid, SOLID_NOT)
		set_pev(id, pev_movetype, MOVETYPE_FLY)
		set_pev(id, pev_effects, EF_NODRAW)
		set_pev(id, pev_deadflag, DEAD_DEAD)
		set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
		set_user_teaminfo(id, "SPECTATOR")
		is_plr_alive[id] = false
		g_bPlayerSpec[id] = true
	}
	else
	{
		if(g_bPlayerStart[id]) 
		{
			if(g_bPlayerPaused[id]) 
			{
				g_bPlayerPaused[id] = false
				g_iPlayerTime[id] = get_gametime()
			}
		}
		cs_set_user_team(id, CS_TEAM_CT)
		set_user_teaminfo(id, "CT")
		fw_PlayerKilled(id)
	}
	return PLUGIN_CONTINUE
}

public cmd_checkpoint(id) 
{
	if (!get_pcvar_num(g_kz_checkpoints)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_CP_OFF")
		return PLUGIN_HANDLED
	}
	if(!is_plr_alive[id] || g_bPlayerPaused[id]) 
		return PLUGIN_HANDLED
	
	new Float:vVelocity[3]
	pev(id, pev_velocity, vVelocity)
	
	if(vVelocity[2] != 0) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_CP_FALL")
		return PLUGIN_HANDLED
	}
	if(g_iCheckpointNum[id] == 0) 
	{
		pev(id,pev_origin,g_fCheckpoints[id])
	}
	else 
	{
		g_fCheckStuck[id] = g_fCheckpoints[id]
		pev(id,pev_origin,g_fCheckpoints[id])
	}
	g_iCheckpointNum[id]++
	kz_colorchat(id, green,"%L", id, "PKU_CP_CREATE")
	
	if(g_bPlayerUsedStuck[id])
		g_bPlayerUsedStuck[id] = false
	if(g_iCheckpointNum[id] == CP_MAX_PRO + 1 && g_bPlayerStart[id] && !g_bHasScout[id]) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_PRO_OFF")
		kz_colorchat(id, green,"%L", id, "PKU_CP_TO_MUCH")
	}	
	return PLUGIN_HANDLED
}

public cmd_gocheck(id) 
{
	if (!get_pcvar_num(g_kz_checkpoints)) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_CP_OFF")
		return PLUGIN_HANDLED
	}
	if(!is_plr_alive[id] || g_bPlayerPaused[id]) 
		return PLUGIN_HANDLED
	
	if(g_iCheckpointNum[id] == 0) 
	{
		kz_colorchat(id, green,"%L", id, "PKU_CP_NULL")
		return PLUGIN_HANDLED
	}
	if(!get_pcvar_num(g_kz_semiclip)) 
	{
		new Float:origin[3]
		for(new i = 1 ; i <= g_iMaxPlayers ; i++) 
		{
			if(id != i && is_plr_connected[i] && is_plr_alive[id]) 
			{
				pev(i,pev_origin,origin)
				if(get_distance_f(g_fCheckpoints[id],origin) <= CP_DISTANCE) 
				{
					kz_colorchat(id, green,"%L", id, "PKU_CP_BUSY")
					return PLUGIN_HANDLED
				}
			}
		}
	}
	engfunc(EngFunc_SetOrigin,id,g_fCheckpoints[id])
	set_pev(id,pev_velocity,Float:{0.0,0.0,0.0})
	set_user_duck(id)
	set_pev(id,pev_gravity,1.0)
	g_iGoCheckNum[id]++
	
	return PLUGIN_HANDLED
}

public cmd_stuck(id) 
{
	if (!get_pcvar_num(g_kz_checkpoints) || !is_plr_alive[id] || g_bPlayerPaused[id]) 
		return PLUGIN_HANDLED
	
	if(g_iCheckpointNum[id] > 1 && !g_bPlayerUsedStuck[id]) 
	{
		if(!get_pcvar_num(g_kz_semiclip)) 
		{
			new Float:origin[3]
			for(new i = 1 ; i <= g_iMaxPlayers ; i++) 
			{
				if(id != i && is_plr_connected[i] && is_plr_alive[id]) 
				{
					pev(i,pev_origin,origin)
					if(get_distance_f(g_fCheckStuck[id],origin) <= CP_DISTANCE) 
					{
						kz_colorchat(id, green,"%L", id, "PKU_CP_SOMEONE")
						return PLUGIN_HANDLED
					}
				}
			}
		}
		engfunc(EngFunc_SetOrigin,id,g_fCheckStuck[id])
		set_pev(id,pev_velocity,Float:{0.0,0.0,0.0})
		set_user_duck(id)
		set_pev(id,pev_gravity,1.0)
		g_iGoCheckNum[id]++
		
		g_fCheckpoints[id] = g_fCheckStuck[id] 
		g_bPlayerUsedStuck[id] = true
	}
	return PLUGIN_HANDLED
}

public cmd_admin_setstart(id, lvl, cid)
{
	if(!cmd_access(id, lvl, cid, 1))
		return PLUGIN_HANDLED
	
	if(is_plr_alive[id])
	{
		if(file_exists(g_StartFile))
		{
			delete_file(g_StartFile)
		}
		pev(id, pev_origin, g_fStartPosition)
		g_bStartPos = true
		kz_colorchat(id, green, "%L", id, "PKU_SET_START")
		
		new Data[128]
		formatex(Data, 127, "%f %f %f", g_fStartPosition[0], g_fStartPosition[1], g_fStartPosition[2])
		write_file(g_StartFile, Data, 0)
	}
	else
	{
		kz_colorchat(id, green, "%L", id, "PKU_BE_ALIVE")
	}
	return PLUGIN_HANDLED
}

public cmd_admin_delstart(id, lvl, cid)
{
	if(!cmd_access(id, lvl, cid, 1))
		return PLUGIN_HANDLED
	
	if(file_exists(g_StartFile))
	{
		delete_file(g_StartFile)
	}
	g_bStartPos = false
	kz_colorchat(id, green, "%L", id, "PKU_DEL_START")
	
	return PLUGIN_HANDLED
}

public cmd_admin_noclip(id, lvl, cid) 
{
	if(read_argc() == 1 || read_argc() == 2) 
	{
		if(!cmd_access(id, lvl, cid, 1)) 
		{
			set_pev(id, pev_movetype, MOVETYPE_WALK)
			g_bNoclip[id] = false
			return PLUGIN_HANDLED
		}
		g_bNoclip[id] = !g_bNoclip[id]
		set_pev(id, pev_movetype, g_bNoclip[id] ? MOVETYPE_NOCLIP : MOVETYPE_WALK)
		if(g_bNoclip[id])
			DetectCheat(id,"Noclip")
	}
	else if(read_argc() == 3) 
	{
		if(!cmd_access(id, lvl, cid, 3))
			return PLUGIN_HANDLED
		
		new name[32], PkGiveNoclip[192]
		get_user_name(id,name,31)
		
		new szarg1[32], szarg2[8], bool:mode
		read_argv(1,szarg1,31)
		read_argv(2,szarg2,7)
		if(equal(szarg2,"on"))
			mode = true
		
		if(equal(szarg1,"@ALL")) 
		{
			for(new i = 1; i <= g_iMaxPlayers; i++) 
			{
				if(is_plr_alive[i]) 
				{
					g_bNoclip[i] = mode
					set_pev(i, pev_movetype, g_bNoclip[i] ? MOVETYPE_NOCLIP : MOVETYPE_WALK )
					formatex(PkGiveNoclip,191,"%L", i, g_bNoclip[i] ? "PKU_NOCLIP_AT_ALL" : "PKU_NOCLIP_TAKE_ALL")
					kz_colorchat(i, green,"%L", i, "PKU_NOCLIP_GIVE", name, PkGiveNoclip)
					if(g_bNoclip[i])
					{
						DetectCheat(i,"Noclip")
						kz_colorchat(i, green,"%L", i, "PKU_NOCLIP_REMOVE") 
					}
				}
			}
		}
		else 
		{
			new pid = cmd_target(id,szarg1,2)
			if(pid > 0) 
			{
				g_bNoclip[pid] = mode
				set_pev(pid, pev_movetype, g_bNoclip[pid] ? MOVETYPE_NOCLIP : MOVETYPE_WALK )
				formatex(PkGiveNoclip,191,"%L", pid, g_bNoclip[pid] ? "PKU_NOCLIP_AT_TARGET" : "PKU_NOCLIP_TAKE_TARGET")
				kz_colorchat(pid, green,"%L", pid, "PKU_NOCLIP_GIVE", name, PkGiveNoclip)
				if(g_bNoclip[pid])
				{
					DetectCheat(pid,"Noclip")
					kz_colorchat(pid, green,"%L", pid, "PKU_NOCLIP_REMOVE")
				}
			}
		}
	}
	return PLUGIN_HANDLED
}

public cmd_admin_gravity(id, lvl, cid) 
{
	if(!cmd_access(id, lvl, cid, 3))
		return PLUGIN_HANDLED
	
	new name[32]
	get_user_name(id,name,31)
	
	new szarg1[32], szarg2[8], gravity, Float:fgravity
	read_argv(1,szarg1,31)
	read_argv(2,szarg2,7)
	gravity = str_to_num(szarg2)
	fgravity = gravity / float(get_pcvar_num(g_sv_gravity))
	
	if(equal(szarg1,"@ALL")) 
	{
		for(new i = 1; i <= g_iMaxPlayers; i++) 
		{
			if(is_plr_connected[i]) 
			{
				set_pev(i, pev_gravity, fgravity)
				kz_colorchat(i, green,"%L", i, "PKU_GRAVITY_ALL", name, gravity)
				if(fgravity != 1.0)
					DetectCheat(i,"Gravity")
			}
		}
	}
	else 
	{
		new pid = cmd_target(0, szarg1, 2)
		if(pid > 0) 
		{
			set_pev(pid, pev_gravity, fgravity)
			kz_colorchat(pid, green,"%L", pid, "PKU_GRAVITY_TARGET", name, gravity)
			if(fgravity != 1.0)
				DetectCheat(pid,"Gravity")
		}
	}
	return PLUGIN_HANDLED
}

public fw_PlayerKilled(id)
{
	if(pev_valid(g_iEntWeaponModel[id])) 
	{
		engfunc(EngFunc_RemoveEntity, g_iEntWeaponModel[id])
		g_iEntWeaponModel[id] = 0
	}
	is_plr_alive[id] = false
	set_task(0.5,"PlayerRespawn", id + TASK_RESPAWN)
}

public PlayerRespawn(id) 
{
	id -= TASK_RESPAWN
	ExecuteHamB(Ham_CS_RoundRespawn, id)
}

public fw_PlayerSpawn(id)
{
	if(!is_user_alive(id)) 
		return
	
	is_plr_alive[id] = true
	PlayerSpawnPost(id)
	cs_set_user_nvg(id)
	set_pdata_int(id, M_RADIOS_LEFT, 0, 5)
	
	if(!g_bPlayerSpec[id])
	{
		if(g_iCheckpointNum[id] > 0)
		{
			cmd_gocheck(id)
		}
	}
	else
	{
		set_pev(id, pev_origin, g_fSpecPosition[id])
		set_pev(id, pev_health, g_iPlayerHealth[id])
		set_user_duck(id)
		g_bPlayerSpec[id] = false
	}
	if(g_bPlayerIsAdmin[id])
	{
		new g_vip = get_pcvar_num(g_kz_vip)
		switch(g_vip)
		{
			case 0: fm_set_plr_model(id, "sas")
				
			case 1:
			{
				fm_set_plr_model(id, "vip")
				set_user_scoreattrib(id, 4)
			}     
			case 2:
			{
				fm_set_plr_model(id, "arctic")
				set_user_scoreattrib(id, 4)
			}
		}
		AdminGlow(id)
	}
	if(get_pcvar_num(g_kz_godmode)) 
	{
		set_pev(id, pev_takedamage, 0.0)
	}
	else 
	{
		set_pev(id, pev_takedamage, 2.0)
	}
	if(g_bFirstSpawn[id]) 
	{
		if(get_pcvar_num(g_kz_help))
			set_task(10.0,"PlayerInfo",id + TASK_INFO)
	}
	g_bFirstSpawn[id] = false
} 

public PlayerSpawnPost(id)
{
	kz_set_weapons(id)
	kz_set_health(id)
	
	if(get_pcvar_num(g_kz_nvg_enabled) && g_bPlayerNvgUse[id])
	{
		kz_remove_nvg(id)
	}
}

public fw_UseButton(iEnt, id)
{
	if(!iEnt || id > 32)
		return HAM_IGNORED
	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	new target[32]
	pev(iEnt, pev_target, target, 31)
	
	if(TrieKeyExists(g_tStartTargets, target))
	{
		if((pev(id, pev_movetype) == MOVETYPE_NOCLIP)) 
		{
			kz_colorchat(id, green,"%L", id, "PKU_NOCLIP_ON")
			kz_colorchat(id, green,"%L", id, "PKU_NOCLIP_REMOVE") 
			return HAM_SUPERCEDE
		}
		g_bStartPosition[id] = false
		if(get_pcvar_num(g_kz_autostart) && !g_bStartPos)
		{
			pev(id, pev_origin, g_fPlayerStartPosition[id])
			g_bStartPosition[id] = true
		}
		cmd_reset(id)
		if(g_bWeapons[id])
			kz_set_weapons(id)
		set_pev(id, pev_gravity, 1.0)
		kz_set_health(id)
		
		if(!g_bPlayerIsAdmin[id])
		{
			kz_callfunc(id, KZ_HOOK , PLUGIN_HOOK, "0")
			kz_callfunc(id, KZ_JETPACK , PLUGIN_JETPACK, "0")
		}
		kz_callfunc(id, KZ_HOOK_OFF , PLUGIN_HOOK, "")
		kz_callfunc(id, KZ_JET_OFF , PLUGIN_JETPACK, "")
		
		if(user_has_weapon(id, CSW_SCOUT)) 
		{
			g_bHasScout[id] = true
			kz_colorchat(id, green,"%L", id, "PKU_START_AGAIN")
		} 
		else 
		{
			g_bHasScout[id] = false
		}
		g_bPlayerStart[id] = true
		g_iPlayerTime[id] = get_gametime()
		kz_colorchat(id, green,"%L", id, "PKU_TIMER_STARTED")
		
		if(get_pcvar_num(g_kz_sounds) == 1 || get_pcvar_num(g_kz_sounds) == 2) 
			client_cmd(id,"spk %s", g_start_sounds[random(sizeof(g_start_sounds))])
	}
	else if(TrieKeyExists(g_tFinishTargets, target))
	{
		if(g_bPlayerStart[id])
		{
			g_bPlayerStart[id] = false
			new Float:kreedztime, imin, Float:isec 
			kreedztime = get_gametime() - g_iPlayerTime[id] + g_iPlayerPauseTime[id]
			imin = floatround(kreedztime , floatround_floor)/60
			isec = kreedztime - (60*imin)
			
			new name[32]
			get_user_name(id, name, 31)
			kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_FINISH", name, imin, isec < 10 ? "0" : "", isec, g_iCheckpointNum[id], g_iCheckpointNum[id] == 1 ? "" : "s", g_iGoCheckNum[id], g_iGoCheckNum[id] == 1 ? "" : "s")
			
			if(get_pcvar_num(g_kz_sounds) == 1 || get_pcvar_num(g_kz_sounds) == 3)
				client_cmd(0, "spk vox/doop")
			
			if(get_pcvar_num(g_kz_prize) && !g_bPlayerIsAdmin[id]) 
			{
				kz_callfunc(id, KZ_HOOK , PLUGIN_HOOK, "1")
				if(g_iCheckpointNum[id] == 0)
					kz_callfunc(id, KZ_JETPACK , PLUGIN_JETPACK, "1")
			}
			if(g_iCheckpointNum[id] > CP_MAX_PRO || g_bHasScout[id])
			{
				check_nub15(id)
			}
			else 
			{
				check_pro15(id)
			}
		}
	}
	return HAM_IGNORED
}

public fw_ThinkEntity(iEnt)
{
	if(pev_valid(iEnt)) 
	{ 
		static ClassName[32]
		pev(iEnt, pev_classname, ClassName, 31)
		
		if(equal(ClassName, "kz_time_think"))
		{
			fw_TimeThink() 
			set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
		}
		if(equal(ClassName, "kz_player_statustext"))
		{
			kz_PlayerStausText() 
			set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
		}
	}
}

public fw_TimeThink() 
{
	static id, r, g, b
	for(id = 1; id <= g_iMaxPlayers; id++)
	{	
		if(is_plr_connected[id] && is_plr_alive[id] && g_bPlayerStart[id] && !g_bPlayerPaused[id] && g_bShowTimer[id]) 
		{
			new Float:kreedztime, imin, Float:isec 
			kreedztime = get_gametime() - g_iPlayerTime[id] + g_iPlayerPauseTime[id] 
			imin = floatround(kreedztime , floatround_floor)/60
			isec = kreedztime - (60*imin)
			GetCvarColor(g_kz_time_color, r, g, b)
			set_hudmessage(r, g, b, 0.3, 0.0, _, _, 0.4, _, _, 1)
			ShowSyncHudMsg(id, g_SyncTimer, "%L", id, "PKU_TIMER",imin, isec < 10 ? "0" : "", isec, g_iCheckpointNum[id], g_iGoCheckNum[id])
		}
	}
	return PLUGIN_CONTINUE
}

public kz_Functions()
{
	static id, r, g, b
	for(id = 1; id <= g_iMaxPlayers; id++)
	{
		if(is_plr_connected[id] && g_bPlayerStart[id] &&  g_bPlayerPaused[id])
		{
			GetCvarColor(g_kz_status_color, r, g, b)
			if(!g_bPlayerSpec[id])
			{
				set_hudmessage(r, g, b, -1.0, 0.40, _, _, 1.0, _, _, 1)
				ShowSyncHudMsg(id, g_SyncTimer, "%L", id, "PKU_PAUSE")
			}
			else 
			{
				set_hudmessage(r, g, b, -1.0, 0.8, _, _, 1.0, _, _, 1)
				ShowSyncHudMsg(id, g_SyncTimer, "%L", id, "PKU_SPECTATOR_START")
			}
		}
		else if(is_plr_connected[id] && !g_bPlayerStart[id] && g_bPlayerSpec[id])
		{
			GetCvarColor(g_kz_status_color, r, g, b)
			set_hudmessage(r, g, b, -1.0, 0.8, _, _, 1.0, _, _, 1)
			ShowSyncHudMsg(id, g_SyncTimer, "%L", id, "PKU_SPECTATOR")
		}
		if(g_bPlayerIsAdmin[id] && is_plr_alive[id] && get_pcvar_num(g_kz_vip) != 0) 
		{
			set_user_scoreattrib(id, 4)
		}
	}
	return PLUGIN_CONTINUE
}

public kz_PlayerStausText() 
{
	static id, target, iCvar
	iCvar = get_pcvar_num(g_kz_statustext)
	
	for(id = 1; id <= g_iMaxPlayers; id++)
	{
		if(is_plr_alive[id] || g_iTarget[id] != 0)
		{
			target = g_iTarget[id]
			
			switch(iCvar)
			{
				case 0:
				{
					static r, g, b, Float:x, Float:y
					GetCvarPosition(g_kz_statustext_xypos, x, y)			
					GetCvarColor(g_kz_statustext_color, r, g, b)
					set_hudmessage(r, g, b, x, y, _, _, 5.0, _, _, -1)
					ShowSyncHudMsg(id, g_SyncStatusText, "%s", g_iPlayerName[target])	
				}
				case 1:
				{
					static const szStatusText[] = "1 %p2"
					message_begin(MSG_ONE_UNRELIABLE, g_StatusText, _, id)
					write_byte(0)
					write_string(szStatusText)
					message_end()
				}
			}
		}
		else
		{
			if(!iCvar)
				ClearSyncHud(id, g_SyncStatusText)
		}
	}
}

public kz_CreateBot() 
{
	if(get_pcvar_num(g_kz_bot))
	{
		new players[32],cl
		get_players(players,cl,"ach")
		new id = find_player("i")
		
		if(get_playersnum() < g_iMaxPlayers - 2 && !id) 
		{
			new BotName[32] 
			get_pcvar_string(g_kz_botname, BotName, 31)
			id = engfunc(EngFunc_CreateFakeClient, BotName)
			
			if(pev_valid(id)) 
			{
				engfunc(EngFunc_FreeEntPrivateData, id)
				dllfunc(MetaFunc_CallGameEntity, "player", id)
				set_user_info(id, "rate", "3500")
				set_user_info(id, "cl_updaterate", "25")
				set_user_info(id, "cl_lw", "1")
				set_user_info(id, "cl_lc", "1")
				set_user_info(id, "cl_dlmax", "128")
				set_user_info(id, "cl_righthand", "1")
				set_user_info(id, "_vgui_menus", "0")
				set_user_info(id, "_ah", "0")
				set_user_info(id, "dm", "0")
				set_user_info(id, "tracker", "0")
				set_user_info(id, "friends", "0")
				set_user_info(id, "*bot", "1")
				set_pev(id, pev_flags, pev(id, pev_flags) | FL_FAKECLIENT)
				set_pev(id, pev_colormap, id)
				
				new MsgBot[128]
				dllfunc(DLLFunc_ClientConnect, id, BotName, "127.0.0.1", MsgBot)
				dllfunc(DLLFunc_ClientPutInServer, id)
				cs_set_user_team(id, CS_TEAM_CT)
				dllfunc(DLLFunc_Spawn,id)
			}
		}
		else if(get_playersnum() == g_iMaxPlayers - 1 && id) 
		{
			set_pev(id, pev_effects, (pev(id, pev_effects) | 1))
			server_cmd("kick #%d",get_user_userid(id))
		}
		else if(is_plr_bot[id] && id) 
		{
			set_pev(id, pev_effects, (pev(id, pev_effects) | 128))    
			set_pev(id, pev_solid, SOLID_NOT) 
			set_pev(id, pev_takedamage, 0.0)
			engfunc(EngFunc_SetOrigin, id, Float:{999999,999999,999999})
			set_user_teaminfo(id, "SPECTATOR")
		}
	}
}

public fw_PlayerJump(id) 
{
	if(is_plr_alive[id])
	{	
		if(get_pcvar_num(g_kz_bhop) != 0 && g_iBunnyHop[id] != 0)
		{
			set_pev(id, pev_fuser2, 0.0)
			DetectCheat(id,"BunnyHop")
		}
		if(get_pcvar_num(g_kz_bhop) == 2 && g_iBunnyHop[id] == 2)
		{
			static OldButtons 
			OldButtons = pev(id, pev_oldbuttons)
			if(OldButtons & IN_JUMP)
			{
				static Flags 
				Flags = pev(id, pev_flags)
				if(Flags & FL_ONGROUND && !(Flags & FL_WATERJUMP) && pev(id, pev_waterlevel) < 2)
				{
					static Float:vVelocity[3]
					pev(id, pev_velocity, vVelocity)
					vVelocity[2] += 250.0
					set_pev(id, pev_velocity, vVelocity)
					set_pev(id, pev_oldbuttons, OldButtons & ~IN_JUMP)
					set_pev(id, pev_gaitsequence, 6)
				}
			}
		}
	}
}

public fw_Weaponbox(iEnt) 
{
	set_pev(iEnt, pev_flags, FL_KILLME)
	dllfunc(DLLFunc_Think, iEnt)
	return HAM_IGNORED
}

public fw_ClientKill(id) 
{
	if(get_pcvar_num(g_kz_nokill)) 
	{
		console_print(id,"%L", id, "PKU_KILL_OFF")
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fw_PreThink_Post(id)
{
	if(get_pcvar_num(g_kz_semiclip))
	{
		if(!is_plr_alive[id])
			return
		
		static i
		for(i = 1; i <= g_iMaxPlayers; i++)
		{
			if(id != i)
			{
				if(is_plr_alive[i])
					set_pev(i, pev_solid, SOLID_NOT)
			}
		}
	}
}

public client_PostThink(id)
{
	if(get_pcvar_num(g_kz_semiclip))
	{
		if(!is_plr_alive[id])
			return
		
		static i
		for(i = 1; i <= g_iMaxPlayers; i++)
		{
			if(id != i)
			{	
				if(is_plr_alive[i])
					set_pev(i, pev_solid, SOLID_SLIDEBOX)
			}
		}
	}
}

public fw_AddToFullPack_Post(es, e, ent, host, hostflags, player, pSet)
{
	if(!get_orig_retval() || !is_plr_alive[host] && !g_bPlayerSpec[host] || !get_pcvar_num(g_kz_semiclip))
	{
		return FMRES_IGNORED
	}
	
	if(player)
	{
		if(host != ent)
		{
			set_es(es, ES_Solid, SOLID_NOT)
			
			if(get_pcvar_num(g_kz_transparency) && is_plr_connected[ent])   
			{    
				if(g_bPlayerIsAdmin[ent] || is_plr_bot[ent])
				{
					set_es(es, ES_RenderMode, kRenderTransTexture)
					set_es(es, ES_RenderAmt, 0)
					return FMRES_IGNORED
				}
				if(g_bPlayerPaused[ent])
					return FMRES_IGNORED
				
				static Float:flDistance
				flDistance = entity_range(host, ent)
				if(flDistance < 512.0) 
				{
					set_es(es, ES_RenderMode, kRenderTransAlpha)
					set_es(es, ES_RenderAmt, floatround(flDistance)/2)
				}
			}
		}
	}
	else
	{
		static owner ; owner = pev(ent, pev_owner)
		if((1 <= owner <= g_iMaxPlayers) && (ent == g_iEntPlayerModel[owner] || ent == g_iEntWeaponModel[owner]))
		{    
			set_es(es, ES_Solid, SOLID_NOT)
			
			if(get_pcvar_num(g_kz_transparency) && is_plr_connected[owner])  
			{    
				if(g_bPlayerPaused[owner])
					return FMRES_IGNORED
				
				static Float:flDistance
				flDistance = entity_range(host, owner)
				if(flDistance < 512.0)
				{
					set_es(es, ES_RenderMode, kRenderTransAlpha)
					set_es(es, ES_RenderAmt, floatround(flDistance)/2)
				}
			}
		}
	}
	return FMRES_IGNORED
} 

public client_command(id) 
{ 
	new sArg[13]
	read_argv(0, sArg, 12) 
	strtolower(sArg)
	
	if(TrieKeyExists(g_tWeaponCommands, sArg))
	{
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public fw_EmitSound(iEnt, channel, const sound[]) 
{
	if(TrieKeyExists(g_tdoorSnd, sound))
	{
		if(get_pcvar_num(g_kz_doorsound)) 
			return FMRES_SUPERCEDE
	}
	else if(TrieKeyExists(g_tpainSnd, sound))
	{
		if(get_pcvar_num(g_kz_painsound)) 
			return FMRES_SUPERCEDE
	}
	else if(TrieKeyExists(g_twaterSnd, sound))
	{
		if(get_pcvar_num(g_kz_watersound))
			return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fw_Spawn(iEnt)
{
	if(!pev_valid(iEnt))
	{
		return FMRES_IGNORED
	}
	new ClassName[32]
	pev(iEnt, pev_classname, ClassName, 31)
	
	if(TrieKeyExists(g_tRemoveEntities, ClassName))
	{
		engfunc(EngFunc_RemoveEntity, iEnt)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fw_GameDescription()
{
	forward_return(FMV_STRING, "ProKreedz Ultimativ v2.4")
	return FMRES_SUPERCEDE
}

public fw_StartFrame()
{
	if(!get_pcvar_num(g_kz_showkeys))
		return FMRES_IGNORED
	
	static Float:fGameTime, Float:fDelay
	fGameTime = get_gametime()
	fDelay = 0.1
	
	if((fShowKeyTime + fDelay) <= fGameTime)
	{
		kz_keyinfo()
		fShowKeyTime = fGameTime
	}
	static id
	for(id = 1; id <= g_iMaxPlayers; id++)
	{
		if(is_plr_alive[id])
		{
			new Button = pev(id, pev_button)
			if(Button & IN_FORWARD)
				g_iPlayerKeys[id] |= IN_FORWARD
			if(Button & IN_BACK)
				g_iPlayerKeys[id] |= IN_BACK
			if(Button & IN_MOVELEFT)
				g_iPlayerKeys[id] |= IN_MOVELEFT
			if(Button & IN_MOVERIGHT)
				g_iPlayerKeys[id] |= IN_MOVERIGHT
			if(Button & IN_DUCK)
				g_iPlayerKeys[id] |= IN_DUCK
			if(Button & IN_JUMP )
				g_iPlayerKeys[id] |= IN_JUMP
		}
	}
	return FMRES_IGNORED
}

public kz_keyinfo() 
{
	static id
	for(id = 1; id <= g_iMaxPlayers; id++)
	{
		if(is_plr_alive[id])
		{
			formatex(plr_key[id], 63, "%s^n            %s   %s   %s   %s ^n %s", 
			g_iPlayerKeys[id] & IN_FORWARD ? "W" : " .", 
			g_iPlayerKeys[id] & IN_MOVELEFT ? "A" : ".", 
			g_iPlayerKeys[id] & IN_BACK ? "S" : ".", 
			g_iPlayerKeys[id] & IN_MOVERIGHT ? "D" : ".", 
			g_iPlayerKeys[id] & IN_DUCK ? "DUCK" : "-      ", 
			g_iPlayerKeys[id] & IN_JUMP ? "JUMP" : "  .  ")
			
			g_iPlayerKeys[id] = 0
		}
	}
	static i, target
	for(i = 1; i <= g_iMaxPlayers; i++)
	{
		if(is_plr_alive[i])
		{
			if(g_bShowKeys[i])
				kz_showkeysmsg(i)
		}
		else
		{
			new specmode = pev(i, pev_iuser1)
			if(specmode == 2 || specmode == 4) 
			{
				target = pev(i, pev_iuser2)
				if(target && target != i)
					kz_showkeysmsg(i)
				
			}
		}
	}
	return PLUGIN_CONTINUE
}

public kz_showkeysmsg(id)
{
	if(!id) return
	
	new bool:g_bShowOwnKeys = false
	
	if(is_plr_alive[id] && g_bShowKeys[id]) 
		g_bShowOwnKeys = true
	
	new target
	if(g_bShowOwnKeys)
		target = id
	else
	{
		new specmode = pev(id, pev_iuser1)
		if(specmode == 2 || specmode == 4) 
		{
			target = pev(id, pev_iuser2)
		}
	}
	if(!target) 
		return
	
	new Msg[256]
	formatex(Msg, 255, "%s", plr_key[target][0])
	static r, g, b, Float:x, Float:y
	GetCvarPosition(g_kz_showkeys_xypos, x, y)
	GetCvarColor(g_kz_showkeys_color, r, g, b)
	set_hudmessage(r, g, b, x, y, 0, _, 0.1, _, _, 3)
	ShowSyncHudMsg(id, g_SyncShowKeys, Msg)
}

public DetectCheat(id, reason[]) 
{ 
	if(get_pcvar_num(g_kz_cheatdetect) && g_bPlayerStart[id]) 
	{
		kz_colorchat(id, green, "%L", id, "PKU_CHEAT_DETECTED", reason)
		g_bPlayerStart[id] = false
	}
}

public AdminGlow(id) 
{
	new pid = id < TASK_ADMINGLOW ? id : id - TASK_ADMINGLOW
	if(get_pcvar_num(g_kz_adminglow)) 
	{
		set_rendering(g_iEntPlayerModel[pid], kRenderFxGlowShell, random_num(0,255), random_num(0,255), random_num(0,255), kRenderNormal, 25)	
	}
	else 
	{
		set_rendering(g_iEntPlayerModel[pid])
	}
}

public kz_set_nvg(id) 
{ 
	id -= TASK_NVG
	
	if(get_pcvar_num(g_kz_nvg_enabled))
	{
		if(!is_plr_alive[id])
		{
			kz_remove_nvg(id)
			return
		}
		static Float:fOrigin[3], r, g, b 
		
		pev(id, pev_origin, fOrigin)
		GetCvarColor(g_kz_nvg_color, r, g, b)
		kz_make_lgt(id, fOrigin, r, g, b)
	}
	else
	{
		kz_remove_nvg(id)
	}
} 

public GetCvarColor(cvar, &r, &g, &b)
{
	static colors[16], piece[5]
	get_pcvar_string(cvar, colors, 15)
	
	strbreak(colors, piece, 4, colors, 15)
	r = str_to_num(piece)
	
	strbreak(colors, piece, 4, colors, 15)
	g = str_to_num(piece)
	b = str_to_num(colors)
}

public GetCvarPosition(cvar, &Float:x, &Float:y)
{
	static coords[16], piece[10]
	get_pcvar_string(cvar, coords, 15)
	
	strbreak(coords, piece, 9, coords, 15)
	x = str_to_float(piece)
	y = str_to_float(coords)
}

public PlayerInfo(id) 
{
	id -= TASK_INFO
	kz_colorchat(id, green, "%L", id, "PKU_HELP")
}

public BlockCommands(id)
{
	return PLUGIN_HANDLED
}

public Hook()
{
	kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_BEAT_MAP_A") 
	set_task(get_pcvar_float(g_kz_advert_time),"JetPack")
}

public JetPack()
{
	kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_BEAT_MAP_B")
	set_task(get_pcvar_float(g_kz_advert_time),"Hook")
}

public MsgHealth(Msgid, Dest, id)
{
	if(get_msg_arg_int(1) >= 255)
	{
		set_msg_arg_int(1, ARG_BYTE, 255)
	}
}

public MsgStatusIcon(Msgid, Dest, id)
{
	new szBuyzoneIcon[8]
	get_msg_arg_string(2, szBuyzoneIcon, 7)
	
	if(equal(szBuyzoneIcon, "buyzone"))
	{
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public MsgStatusValue(Msgid, Dest, id)
{
	if(get_msg_arg_int(1) == 2)
	{
		g_iTarget[id] = get_msg_arg_int(2)
	}
}

public MsgClCorpse() 
{
	static id ; id = get_msg_arg_int(12)
	
	if(g_bPlayerIsAdmin[id] && is_plr_alive[id]) 
	{
		set_msg_arg_string(1, g_iPlayerModel[id])
	}
}

public MsgRoundTime(Msgid, Dest, id)
{
	set_msg_arg_int(1, ARG_SHORT, 0)
}

public MsgMoney(Msgid, Dest, id)
{
	new iMoney = get_pcvar_num(g_kz_money)
	set_msg_arg_int(1, ARG_LONG, iMoney) 
	set_pdata_int(id, 115, 0)
}

public MsgShowMenu(Msgid, Dest, id) 
{
	static iTeamSelect[] = "#Team_Select"
	static sMenuCode[sizeof iTeamSelect]
	get_msg_arg_string(4, sMenuCode, sizeof sMenuCode - 1)
	
	if(equal(sMenuCode, iTeamSelect))
	{
		if(ShouldAutoJoin(id))
		{	
			kz_set_autojoin_task(id, Msgid)
			return PLUGIN_HANDLED
		}
	}
	return PLUGIN_CONTINUE 
}

public MsgVguiMenu(Msgid, Dest, id) 
{
	if (get_msg_arg_int(1) != 2 || !ShouldAutoJoin(id))
		return PLUGIN_CONTINUE
	
	kz_set_autojoin_task(id, Msgid)
	return PLUGIN_HANDLED
}

public PlayerTeamJoin(MenuMsgid[], id) 
{
	id -= TASK_AUTOJOIN
	
	if(get_user_team(id))
		return
	
	static g_autojoin ; g_autojoin = get_pcvar_num(g_kz_autojoin)
	switch(g_autojoin)
	{
		case 0: 
		{
			static Team[] = "2", Class[] = "0"
			kz_team_join(id, MenuMsgid[0], Team, Class)
		}
		case 1: 
		{
			static Team[] = "2", Class[] = "5"
			kz_team_join(id, MenuMsgid[0], Team, Class)
		}
	}
}

public KzPlayerMenu(id) 
{
	new menu[512], szbhop[64], sznoblock[64], szscout[64], szshowtime[64]
	
	new g_smiclip = get_pcvar_num(g_kz_semiclip)
	switch(g_smiclip)
	{
		case 0: formatex(sznoblock,63,"%L", id, "PKU_PM_SEMI_OFF")
			
		case 1: formatex(sznoblock,63,"%L", id, "PKU_PM_SEMI_ON")
			
	}
	new g_bhop = get_pcvar_num(g_kz_bhop)
	new g_bunny = g_iBunnyHop[id]
	switch(g_bhop)
	{
		case 0: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP_OFF")
			
		case 1:
		{
			switch(g_bunny)
			{
				case 0: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP")
					
				case 1: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP_NOSLOW")
					
			}
		}
		case 2:
		{
			switch(g_bunny)
			{
				case 0: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP")
					
				case 1: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP_NOSLOW")
					
				case 2: formatex(szbhop,63,"%L", id, "PKU_PM_BHOP_AUTO")
					
			}
		}
	}
	new g_showtime = g_bShowTimer[id]
	switch(g_showtime)
	{
		case false: formatex(szshowtime,63,"%L", id, "PKU_PM_SHOWTIMER_OFF")
			
		case true: formatex(szshowtime,63,"%L", id, "PKU_PM_SHOWTIMER_ON")
			
	}
	new g_scout = get_pcvar_num(g_kz_scout)
	switch(g_scout)
	{
		case 0: formatex(szscout,63,"%L", id, "PKU_PM_SCOUT_OFF")
			
		case 1: formatex(szscout,63,"%L", id, "PKU_PM_SCOUT_ON")
			
	}
	formatex(menu,512,"%L", id, "PKU_PM_MENU",sznoblock, szbhop, szshowtime, szscout)
	show_menu(id,MENU_KEYS,menu, -1, "ProKreedz v2.4 - Playermenu")
}

public PlayerMenuHandler(id,key) 
{
	switch(key) 
	{
		case 0: KzPlayerMenu(id)
			
		case 1:
		{
			new g_bhop = get_pcvar_num(g_kz_bhop)
			new g_bunny = g_iBunnyHop[id]
			switch(g_bhop)
			{
				case 1:
				{
					switch(g_bunny)
					{
						case 0: g_iBunnyHop[id] = 1
							
						case 1: g_iBunnyHop[id] = 0
							
					}
				}
				case 2:
				{
					switch(g_bunny)
					{
						case 0: g_iBunnyHop[id] = 1
							
						case 1: g_iBunnyHop[id] = 2
							
						case 2: g_iBunnyHop[id] = 0
							
					}
				}
			}
			KzPlayerMenu(id)
		}
		case 2:
		{
			g_bShowTimer[id] = !g_bShowTimer[id] 
			KzPlayerMenu(id)
		}
		case 3: cmd_scout(id)
			
		case 4: cmd_usp(id)
			
		case 5: cmd_restart(id)
			
		case 6: cmd_reset(id)
			
		case 9: show_menu(id,0,"")
			
	}
}

public KzAdminMenuShow(id, lvl, cid) 
{
	if(cmd_access(id, lvl, cid, 1)) 
		KzAdminMenu(id) 
	return PLUGIN_HANDLED
}

public KzAdminMenu(id) 
{
	new menu[512], szcheckpoints[32], szgodmode[32], szautojoin[32], szscout[32], szadminglow[32], sznoblock[32], sztransparency[32], szcheatdetect[32], szbhop[32]
	
	new g_checkpoints = get_pcvar_num(g_kz_checkpoints)
	switch(g_checkpoints)
	{
		case 0: formatex(szcheckpoints,31,"%L", id, "PKU_AM_CP_OFF")
			
		case 1: formatex(szcheckpoints,31,"%L", id, "PKU_AM_CP_ON")
			
	}
	new g_godmode = get_pcvar_num(g_kz_godmode)
	switch(g_godmode)
	{
		case 0: formatex(szgodmode,31,"%L", id, "PKU_AM_GODMODE_OFF")
			
		case 1: formatex(szgodmode,31,"%L", id, "PKU_AM_GODMODE_ON")
			
	}
	new g_autojoin = get_pcvar_num(g_kz_autojoin)
	switch(g_autojoin)
	{
		case 0: formatex(szautojoin,31,"%L", id, "PKU_AM_AUTOJOIN_OFF")
			
		case 1: formatex(szautojoin,31,"%L", id, "PKU_AM_AUTOJOIN_ON")
			
	}
	new g_scout = get_pcvar_num(g_kz_scout)
	switch(g_scout)
	{
		case 0: formatex(szscout,31,"%L", id, "PKU_AM_SCOUT_OFF")
			
		case 1: formatex(szscout,31,"%L", id, "PKU_AM_SCOUT_ON")
			
	}
	new g_adminglow = get_pcvar_num(g_kz_adminglow)
	switch(g_adminglow)
	{
		case 0: formatex(szadminglow,31,"%L", id, "PKU_AM_GLOW_OFF")
			
		case 1: formatex(szadminglow,31,"%L", id, "PKU_AM_GLOW_ON")
			
	}
	new g_semiclip = get_pcvar_num(g_kz_semiclip)
	switch(g_semiclip)
	{
		case 0: formatex(sznoblock,31,"%L", id, "PKU_AM_SEMI_OFF")
			
		case 1: formatex(sznoblock,31,"%L", id, "PKU_AM_SEMI_ON")
			
	}
	new g_bhop = get_pcvar_num(g_kz_bhop)
	switch(g_bhop)
	{
		case 0: formatex(szbhop,31,"%L", id, "PKU_AM_BHOP")
			
		case 1: formatex(szbhop,31,"%L", id, "PKU_AM_BHOP_NOSLOW")
			
		case 2: formatex(szbhop,31,"%L", id, "PKU_AM_BHOP_AUTO")
			
	}
	new g_transparency = get_pcvar_num(g_kz_transparency)
	switch(g_transparency)
	{
		case 0: formatex(sztransparency,31,"%L", id, "PKU_AM_TRANS_OFF")
			
		case 1: formatex(sztransparency,31,"%L", id, "PKU_AM_TRANS_ON")
			
	}
	new g_cheatdetect = get_pcvar_num(g_kz_cheatdetect)
	switch(g_cheatdetect)
	{
		case 0: formatex(szcheatdetect,31,"%L", id, "PKU_AM_CHEATD_OFF")
			
		case 1: formatex(szcheatdetect,31,"%L", id, "PKU_AM_CHEATD_ON")
			
	}
	formatex(menu,512,"%L", id, "PKU_AM_MENU",szcheckpoints,szgodmode,szautojoin,szscout,szadminglow,sznoblock,szbhop,sztransparency,szcheatdetect)
	show_menu(id,MENU_KEYS_ADMIN,menu, -1, "ProKreedz Ultimativ v2.4 - Adminmenu")
}

public AdminMenuHandler(id,key) 
{
	switch(key) 
	{
		case 0:
		{
			new g_checkpoints = get_pcvar_num(g_kz_checkpoints)
			switch(g_checkpoints)
			{
				case 0: 
				{
					set_pcvar_num(g_kz_checkpoints, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CP_ENABLED")
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CP_INFO")
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CP_GO_INFO")
				}
				case 1: 
				{
					set_pcvar_num(g_kz_checkpoints, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CP_DISABLED")
				}
			}
			KzAdminMenu(id) 
		}
		case 1:
		{
			new g_godmode = get_pcvar_num(g_kz_godmode)
			switch(g_godmode)
			{
				case 0:
				{
					set_pcvar_num(g_kz_godmode, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_GODMODE_ENABLED")
					
					for(new i = 1; i <= g_iMaxPlayers; i++) 
					{
						if(is_plr_connected[i] && !is_plr_bot[i])
							set_pev(i, pev_takedamage, 0.0)
					}
				}
				case 1: 
				{
					set_pcvar_num(g_kz_godmode, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_GODMODE_DISABLED")
					
					for(new i = 1; i <= g_iMaxPlayers; i++) 
					{
						if(is_plr_connected[i] && !is_plr_bot[i])
							set_pev(i, pev_takedamage, 2.0)
					}
				}
			}
			KzAdminMenu(id) 
		}
		case 2:
		{
			new g_autojoin = get_pcvar_num(g_kz_autojoin) 
			switch(g_autojoin)
			{
				case 0:
				{
					set_pcvar_num(g_kz_autojoin, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_AUTOJOIN_ENABLED") 
				}
				case 1: 
				{
					set_pcvar_num(g_kz_autojoin, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_AUTOJOIN_DISABLED")  
				}
			}
			KzAdminMenu(id) 
		}
		case 3:
		{
			new g_scout = get_pcvar_num(g_kz_scout) 
			switch(g_scout) 
			{
				case 0:
				{
					set_pcvar_num(g_kz_scout, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_SCOUT_ENABLED") 
				}
				case 1:
				{
					set_pcvar_num(g_kz_scout, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_SCOUT_DISABLED") 
				}
			}
			KzAdminMenu(id) 
		}
		case 4:
		{
			new g_adminglow = get_pcvar_num(g_kz_adminglow) 
			switch(g_adminglow) 
			{
				case 0:
				{
					set_pcvar_num(g_kz_adminglow, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_ADMINGLOW_ENABLED") 
					
					for(new i = 1; i <= g_iMaxPlayers; i++) 
					{
						if(is_plr_connected[i] && g_bPlayerIsAdmin[i])
							AdminGlow(i)
					}
				}
				case 1:
				{
					set_pcvar_num(g_kz_adminglow, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_ADMINGLOW_DISABLED") 
					
					for(new i = 1; i <= g_iMaxPlayers; i++) 
					{
						if(is_plr_connected[i] && g_bPlayerIsAdmin[i])
							AdminGlow(i)
					}
				}
			}
			KzAdminMenu(id) 
		}
		case 5:
		{
			new g_semiclip = get_pcvar_num(g_kz_semiclip) 
			switch(g_semiclip) 
			{
				case 0:
				{
					set_pcvar_num(g_kz_semiclip, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_SEMICLIP_ENABLED")  
				}
				case 1:
				{
					set_pcvar_num(g_kz_semiclip, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_SEMICLIP_DISABLED") 
				}
			}
			KzAdminMenu(id) 
		}
		case 6:
		{
			new g_bhop = get_pcvar_num(g_kz_bhop) 
			switch(g_bhop)
			{
				case 0:
				{
					set_pcvar_num(g_kz_bhop, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_BHOP_NOSLOW_DOWN") 
				}
				case 1: 
				{
					set_pcvar_num(g_kz_bhop, 2)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_BHOP_AUTOMATIC") 
				}
				case 2: 
				{
					set_pcvar_num(g_kz_bhop, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_BHOP_DISABLED") 
				}
			}
			KzAdminMenu(id) 
		}
		case 7:
		{
			new g_transparency = get_pcvar_num(g_kz_transparency) 
			switch(g_transparency)
			{
				case 0:
				{
					set_pcvar_num(g_kz_transparency, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_TRANSPARENCY_ENABLED") 
				}
				case 1: 
				{
					set_pcvar_num(g_kz_transparency, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_TRANSPARENCY_DISABLED") 
				}
			}
			KzAdminMenu(id) 
		}
		case 8:
		{
			new g_cheatdetect = get_pcvar_num(g_kz_cheatdetect) 
			switch(g_cheatdetect) 
			{
				case 0:
				{
					set_pcvar_num(g_kz_cheatdetect, 1)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CHEATD_ENABLED") 
				}
				case 1: 
				{
					set_pcvar_num(g_kz_cheatdetect, 0)
					kz_colorchat(0, green, "%L", LANG_PLAYER , "PKU_CHEATD_DISABLED") 
				}
			}
			KzAdminMenu(id) 
		}
		case 9: show_menu(id,0,"")
			
	}
}

#if defined USING_SQL
public check_pro15(iPlayer)
{
	check_top15(iPlayer, true)
}

public show_pro15(iPlayer)
{
	return show_top15(iPlayer, true)
}
#else
public check_pro15(id)
{
	new name[32], authid[32]
	get_user_name(id, name, 31)
	get_user_authid(id, authid ,31)
	
	new bool:is_plr_pro15
	is_plr_pro15 = false
	
	for(new i = 0; i < 15; i++)
	{
		if(equali(pro15_authid[i], authid))
		{
			is_plr_pro15 = true
		}
	}
	new Float:kzTime, Float:FailTime, Float:BestTime, Float:OldTime
	for(new i = 0; i < 15; i++)
	{
		kzTime = get_gametime() - g_iPlayerTime[id] + g_iPlayerPauseTime[id]
		FailTime = kzTime - pro15_times[i]
		BestTime = pro15_times[i] - kzTime
		OldTime = pro15_times[i]
		
		if(kzTime < pro15_times[i])
		{
			new pos = i
			while(!equal(pro15_authid[pos], authid) && pos < 15)
			{
				pos++
			}
			for(new j = pos; j > i; j--)
			{
				formatex(pro15_authid[j], 31, pro15_authid[j-1])
				formatex(pro15_names[j], 31, pro15_names[j-1])
				pro15_times[j] = pro15_times[j-1]
				pro15_cp[j] = pro15_cp[j-1]
				pro15_gocp[j] = pro15_gocp[j-1]
			}
			formatex(pro15_authid[i], 31, authid)
			formatex(pro15_names[i], 31, name)
			pro15_times[i] = kzTime
			pro15_cp[i] = g_iCheckpointNum[id] 
			pro15_gocp[i] = g_iGoCheckNum[id]
			
			save_pro15()
			
			if(is_plr_pro15)
			{           
				if(kzTime < OldTime)
				{
					new imin, Float:isec
					imin = floatround(BestTime, floatround_floor)/60
					isec = BestTime - (60*imin)
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_TOP15_NPBT", name, imin, isec < 10 ? "0" : "", isec)
					
					if((i + 1) == 1)
					{
						client_cmd(0, "spk woop")
						kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_PRO15_LEET", name)
					} 
					else
					{
						kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_PRO15_RANK", name, (i+1))
					}
				}
			}
			else  
			{
				if((i + 1) == 1)
				{
					client_cmd(0, "spk woop")
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_PRO15_LEET", name)
				} 
				else
				{
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_PRO15_RANK", name, (i+1))
				}
			}
			return
		}
		if(equali(pro15_authid[i], authid))
		{
			if(kzTime > OldTime)
			{
				new imin, Float:isec
				imin = floatround(FailTime  , floatround_floor)/60
				isec = FailTime - (60*imin)
				kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_TOP15_FAIL", name, imin, isec < 10 ? "0" : "", isec)	
				return
			}
		}
	}
}

public save_pro15()  
{
	new profile[128]
	formatex(profile, 127, "%s/pro_%s.cfg", KZ_TOP15_DIR, g_szMapName)
	
	if(file_exists(profile))
	{
		delete_file(profile)
	}
	
	new Data[256]
	new f = fopen(profile, "at")
	
	for(new i = 0; i < 15; i++)
	{
		formatex(Data, 255, "^"%.5f^" ^"%s^" ^"%s^" ^"%d^" ^"%d^"^n", pro15_times[i], pro15_authid[i], pro15_names[i], pro15_cp[i], pro15_gocp[i])
		fputs(f, Data)
	}
	fclose(f)
}

public read_pro15()
{
	new profile[128], prodata[256]
	formatex(profile, 127, "%s/pro_%s.cfg", KZ_TOP15_DIR, g_szMapName)
	
	new f = fopen(profile, "rt")
	new i = 0
	while(!feof(f) && i < 16)
	{
		fgets(f, prodata, 255)
		new ReadKzTime[25], ReadChecks[5], ReadGoChecks[5]
		parse(prodata, ReadKzTime, 24, pro15_authid[i], 31, pro15_names[i], 31, ReadChecks, 4, ReadGoChecks, 4)
		pro15_times[i] = str_to_float(ReadKzTime)
		pro15_cp[i] = str_to_num(ReadChecks)
		pro15_gocp[i] = str_to_num(ReadGoChecks)
		i++;
	}
	fclose(f)
}

public show_pro15(id) 
{ 
	new buffer[2048], name[32]
	new len = formatex(buffer, sizeof buffer -1,"<body bgcolor=#94AEC6><table width=100%% cellpadding=2 cellspacing=0 border=0>")
	len += formatex(buffer[len], sizeof buffer -1 -len,"%L", id, "PKU_TOP15_MOTD")
	
	new iMaxColors = sizeof(g_iTopColors)
	
	for(new i = 0; i < 15; ++i) 
	{		
		if(pro15_times[i] > 9999999.0)
			len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center %s><td>%d<td align=left>%s<td>%s<td>%s<td>%s", ((i%2)==0) ? "" : "bgcolor=#B0C4DE", (i + 1), "", "", "", "")
		else
		{
			name = pro15_names[i]
			new Float:kzTime, imin, Float:isec 
			kzTime = pro15_times[i]
			imin = floatround(kzTime  , floatround_floor)/60
			isec = kzTime  - (60*imin)
			
			while (containi(name, "<") != -1)
				replace(name, 63, "<", "&lt;")
			while (containi(name, ">") != -1)
				replace(name, 63, ">", "&gt;")
			
			if( i < iMaxColors )
			{
				len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center bgcolor=%s><td>%d<td align=left>%s<td>%02d:%s%.2f<td>%d<td>%d", g_iTopColors[i], (i + 1), pro15_names[i], imin, isec < 10 ? "0" : "", isec, pro15_cp[i], pro15_gocp[i])
			}
			else
			{
				len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center %s><td>%d<td align=left>%s<td>%02d:%s%.2f<td>%d<td>%d", ((i%2)==0) ? "" : "bgcolor=#B0C4DE", (i + 1), pro15_names[i], imin, isec < 10 ? "0" : "", isec, pro15_cp[i], pro15_gocp[i])
			}
		}
	}
	len += formatex(buffer[len], sizeof buffer -1 -len, "</table></body>")
	
	show_motd(id, buffer, "ProKreedz Pro15")
	return PLUGIN_HANDLED
}
#endif

#if defined USING_SQL
public check_nub15(iPlayer)
{
	check_top15(iPlayer, false)
}

public show_nub15(iPlayer)
{
	return show_top15(iPlayer, false)
}
#else
public check_nub15(id)
{
	new name[32], authid[32]
	get_user_name(id, name, 31)
	get_user_authid(id, authid ,31)
	
	new bool:is_plr_nub15
	is_plr_nub15 = false
	
	for(new i = 0; i < 15; i++)
	{
		if(equali(nub15_authid[i], authid))
		{
			is_plr_nub15 = true
		}
	}
	new Float:kzTime, Float:FailTime, Float:BestTime, Float:OldTime
	for(new i = 0; i < 15; i++)
	{
		kzTime = get_gametime() - g_iPlayerTime[id] + g_iPlayerPauseTime[id]
		FailTime = kzTime - nub15_times[i]
		BestTime = nub15_times[i] - kzTime
		OldTime = nub15_times[i]
		
		if(kzTime < nub15_times[i])
		{
			new pos = i
			while(!equal(nub15_authid[pos], authid) && pos < 15)
			{
				pos++
			}
			for(new j = pos; j > i; j--)
			{
				formatex(nub15_authid[j], 31, nub15_authid[j-1])
				formatex(nub15_names[j], 31, nub15_names[j-1])
				nub15_times[j] = nub15_times[j-1]
				nub15_cp[j] = nub15_cp[j-1]
				nub15_gocp[j] = nub15_gocp[j-1]
			}
			formatex(nub15_authid[i], 31, authid)
			formatex(nub15_names[i], 31, name)
			nub15_times[i] = kzTime
			nub15_cp[i] = g_iCheckpointNum[id] 
			nub15_gocp[i] = g_iGoCheckNum[id]
			
			save_nub15()
			
			if(is_plr_nub15)
			{           
				if(kzTime < OldTime)
				{
					new imin, Float:isec
					imin = floatround(BestTime, floatround_floor)/60
					isec = BestTime - (60*imin)
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_TOP15_NPBT", name, imin, isec < 10 ? "0" : "", isec)
					
					if((i + 1) == 1)
					{
						client_cmd(0, "spk woop")
						kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_NUB15_LEET", name)
					} 
					else
					{
						kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_NUB15_RANK", name, (i+1))
					}
				}
			}
			else  
			{
				if((i + 1) == 1)
				{
					client_cmd(0, "spk woop")
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_NUB15_LEET", name)
				}
				else
				{
					kz_colorchat(0, green, "%L", LANG_PLAYER,"PKU_NUB15_RANK", name, (i+1))
				}
			}
			return
		}
		if(equali(nub15_authid[i], authid))
		{
			if(kzTime > OldTime)
			{
				new imin, Float:isec
				imin = floatround(FailTime  , floatround_floor)/60
				isec = FailTime - (60*imin)
				kz_colorchat(0, green, "%L", LANG_PLAYER,"PKU_TOP15_FAIL", name, imin, isec < 10 ? "0" : "", isec)	
				return
			}
		}
	}
}

public save_nub15()  
{
	new nubfile[128]
	formatex(nubfile, 127, "%s/nub_%s.cfg", KZ_TOP15_DIR, g_szMapName)
	
	if(file_exists(nubfile))
	{
		delete_file(nubfile)
	}
	
	new Data[256]
	new f = fopen(nubfile, "at")
	
	for(new i = 0; i < 15; i++)
	{
		formatex(Data, 255, "^"%.5f^" ^"%s^" ^"%s^" ^"%d^" ^"%d^"^n", nub15_times[i], nub15_authid[i], nub15_names[i], nub15_cp[i], nub15_gocp[i])
		fputs(f, Data)
	}
	fclose(f)
}

public read_nub15()
{
	new nubfile[128], nubdata[256]
	formatex(nubfile, 127, "%s/nub_%s.cfg", KZ_TOP15_DIR, g_szMapName)
	
	new f = fopen(nubfile, "rt")
	new i = 0
	while(!feof(f) && i < 16)
	{
		fgets(f, nubdata, 255)
		new ReadKzTime[25], ReadChecks[5], ReadGoChecks[5]
		parse(nubdata, ReadKzTime, 24, nub15_authid[i], 31, nub15_names[i], 31, ReadChecks, 4, ReadGoChecks, 4)
		nub15_times[i] = str_to_float(ReadKzTime)
		nub15_cp[i] = str_to_num(ReadChecks)
		nub15_gocp[i] = str_to_num(ReadGoChecks)
		i++;
	}
	fclose(f)
}

public show_nub15(id) 
{ 
	new buffer[2048], name[32]
	new len = formatex(buffer, sizeof buffer -1,"<body bgcolor=#94AEC6><table width=100%% cellpadding=2 cellspacing=0 border=0>")
	len += formatex(buffer[len], sizeof buffer -1 -len,"%L", id, "PKU_TOP15_MOTD")
	
	new iMaxColors = sizeof(g_iTopColors)
	
	for(new i = 0; i < 15; ++i) 
	{		
		if(nub15_times[i] > 9999999.0)
			len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center %s><td>%d<td align=left>%s<td>%s<td>%s<td>%s", ((i%2)==0) ? "" : "bgcolor=#B0C4DE", (i + 1), "", "", "", "")
		else
		{
			name = nub15_names[i]
			new Float:kzTime, imin, Float:isec 
			kzTime = nub15_times[i]
			imin = floatround(kzTime , floatround_floor)/60
			isec = kzTime  - (60*imin)
			
			while (containi(name, "<") != -1)
				replace(name, 63, "<", "&lt;")
			while (containi(name, ">") != -1)
				replace(name, 63, ">", "&gt;")
			
			if( i < iMaxColors )
			{
				len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center bgcolor=%s><td>%d<td align=left>%s<td>%02d:%s%.2f<td>%d<td>%d", g_iTopColors[i], (i + 1), nub15_names[i], imin, isec < 10 ? "0" : "", isec, nub15_cp[i], nub15_gocp[i])
			}
			else
			{
				len += formatex(buffer[len], sizeof buffer -1 -len, "<tr align=center %s><td>%d<td align=left>%s<td>%02d:%s%.2f<td>%d<td>%d", ((i%2)==0) ? "" : "bgcolor=#B0C4DE", (i + 1), nub15_names[i], imin, isec < 10 ? "0" : "", isec, nub15_cp[i], nub15_gocp[i])
			}
		}
	}
	len += formatex(buffer[len], sizeof buffer -1 -len, "</table></body>")
	
	show_motd(id, buffer, "ProKreedz Nub15")
	return PLUGIN_HANDLED
}
#endif

#if defined USING_SQL
public check_top15(iPlayer, bool:bPro)
{
	if(g_hSqlTuple == Empty_Handle)
	{
		return
	}
	
	new iError, szError[128]
	new Handle:hDb = SQL_Connect(g_hSqlTuple, iError, szError, charsmax(szError))
	
	if(hDb == Empty_Handle)
	{
		log_amx("Failed connecting to database (%i): %s", iError, szError)
		return
	}
	
	new szName[32], szAuthID[35]
	get_user_name(iPlayer, szName ,charsmax(szName))
	get_user_authid(iPlayer, szAuthID, charsmax(szAuthID))
	
	new Float:flTime = get_gametime() - g_iPlayerTime[iPlayer] + g_iPlayerPauseTime[iPlayer]
	
	new iTopPos = 0;
	
	new Handle:hQuery = SQL_PrepareQuery(hDb, "SELECT * FROM kz_%s15 WHERE map = ^"%s^" ORDER BY time LIMIT 15;", bPro ? "pro" : "nub", g_szMapName)
	
	if(!SQL_Execute(hQuery))
	{
		SQL_QueryError(hQuery, szError, charsmax(szError))
		log_amx("Error on query selecting %s15: %s", bPro ? "pro" : "nub", szError)
	}
	else if(SQL_NumResults(hQuery))
	{
		new iFieldSteamID = SQL_FieldNameToNum(hQuery, "steamid")
		new iPos = 1, szDbAuthID[35]
		
		while(SQL_MoreResults(hQuery))
		{
			SQL_ReadResult(hQuery, iFieldSteamID, szDbAuthID, charsmax(szDbAuthID))
			
			if(equal(szAuthID, szDbAuthID))
			{
				iTopPos = iPos
				break
			}
			
			iPos++;
			
			SQL_NextRow(hQuery)
		}
		
		SQL_Rewind(hQuery)
		
		iPos = 1
		new iFieldTime = SQL_FieldNameToNum(hQuery, "time")
		new Float:flDbTime
		
		while(SQL_MoreResults(hQuery))
		{
			SQL_ReadResult(hQuery, iFieldTime, flDbTime)
			
			if(flTime < flDbTime)
			{
				if(iTopPos)
				{
					new Float:flTimeDiff = flDbTime - flTime
					new iMinutes = floatround(flTimeDiff, floatround_floor) / 60
					flTimeDiff -= (iMinutes * 60)
					
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_TOP15_NPBT", szName, iMinutes, flTimeDiff < 10 ? "0" : "", flTimeDiff)
				}
				
				if(iPos == 1)
				{
					client_cmd(0, "spk woop" )
					kz_colorchat(0, green, "%L", LANG_PLAYER, bPro ? "PKU_PRO15_LEET" : "PKU_NUB15_LEET", szName)
				}
				else
				{
					kz_colorchat(0, green, "%L", LANG_PLAYER, bPro ? "PKU_PRO15_RANK" : "PKU_NUB15_RANK", szName, iPos)
				}
				
				break
			}
			if(iTopPos == iPos)
			{
				if(flTime > flDbTime)
				{
					new Float:flTimeDiff = flTime - flDbTime
					new iMinutes = floatround(flTimeDiff, floatround_floor) / 60
					flTimeDiff -= (iMinutes * 60)
					
					kz_colorchat(0, green, "%L", LANG_PLAYER, "PKU_TOP15_FAIL", szName, iMinutes, flTimeDiff < 10 ? "0" : "", flTimeDiff)
				}
				
				break
			}
			
			iPos++;
			
			SQL_NextRow(hQuery)
		}
	}
	
	SQL_FreeHandle(hQuery)
	
	hQuery = SQL_PrepareQuery(hDb, "SELECT time FROM kz_%s15 WHERE steamid = ^"%s^" AND map = ^"%s^";", bPro ? "pro" : "nub", szAuthID, g_szMapName)
	
	if( !SQL_Execute(hQuery))
	{
		SQL_QueryError(hQuery, szError, charsmax(szError))
		log_amx("Error on query selecting player %s time: %s", bPro ? "pro" : "nub", szError)
	}
	else
	{
		new bool:bUpdate = true
		
		if(SQL_NumResults(hQuery))
		{
			new Float:flDbTime
			SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "time"), flDbTime)
			
			if(flDbTime < flTime)
			{
				bUpdate = false
			}
		}
		
		if(bUpdate)
		{
			SQL_FreeHandle(hQuery)
			
			hQuery = SQL_PrepareQuery(hDb, "REPLACE INTO kz_%s15 (name, steamid, map, time, cp, gc) VALUES (^"%s^", ^"%s^", ^"%s^", %f, %i, %i);",
			bPro ? "pro" : "nub", szName, szAuthID, g_szMapName, flTime, g_iCheckpointNum[iPlayer], g_iGoCheckNum[iPlayer])
			
			if(!SQL_Execute(hQuery))
			{
				SQL_QueryError(hQuery, szError, charsmax( szError))
				log_amx("Error on query saving player %s time: %s", bPro ? "pro" : "nub", szError)
			}
		}
	}
	
	SQL_FreeHandle(hQuery)
	
	SQL_FreeHandle(hDb)
}

public show_top15(iPlayer, bool:bPro)
{
	new szURL[128]
	get_pcvar_string(g_kz_weburl, szURL, charsmax(szURL))
	
	new iLen = strlen(szURL)
	formatex(szURL[iLen], charsmax(szURL) - iLen, "?map=%s&pro=%i&a=%i", g_szMapName, bPro, random(15000))
	
	show_motd(iPlayer, szURL, bPro ? "ProKreedz Pro15" : "ProKreedz Nub15")
	
	return PLUGIN_HANDLED
}
#endif

kz_create_healer() {
	new iEntHealer, Float:fHealthValue = (get_pcvar_float(g_kz_autoheal_hp)*2.0)
	if(fHealthValue < 2.0)
		fHealthValue = 20.0
	iEntHealer = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString , "trigger_hurt"))
	dllfunc(DLLFunc_Spawn, iEntHealer)
	engfunc(EngFunc_SetSize, iEntHealer, Float:{-8192.0, -8192.0, -8192.0} , Float:{8192.0, 8192.0, 8192.0})
	set_pev(iEntHealer, pev_spawnflags, SF_TRIGGER_HURT_CLIENTONLYTOUCH)
	set_pev(iEntHealer, pev_dmg, -1.0 * fHealthValue)
}

kz_colorchat(id, color:type, const msg[], {Float,Sql,Result,_}:...) {
	
	static message[256], pkmsg[180], changed[8], argscount,j
	argscount = numargs()
	
	switch(type) 
	{
		case normal: message[0] = 0x01
			
		case green: message[0] = 0x04
			
		default: message[0] = 0x03
		
	}
	new pktag[32]
	get_pcvar_string(g_kz_tag, pktag, 31)
	
	if(id)
	{
		if(is_plr_connected[id])
		{
			vformat(pkmsg, 179, msg, 4)
			formatex(message[1], 255, "%s %s", pktag, pkmsg)
			message[192] = '^0'
			
			replace_all(message, 191, "!g", "^x04")
			replace_all(message, 191, "!n", "^x01")
			replace_all(message, 191, "!t", "^x03")
			kz_print_msg(id, message)
		}
	} 
	else 
	{
		for(new i = 1; i <= g_iMaxPlayers; i++)
		{
			if(is_plr_connected[i])
			{
				new changedcount = 0
				
				for(j = 2; j < argscount; j++)
				{
					if(getarg(j) == LANG_PLAYER)
					{
						setarg(j, 0, i);
						changed[changedcount++] = j;
					}
				}
				vformat(pkmsg, 179, msg, 4)
				formatex(message[1], 255, "%s %s", pktag, pkmsg)
				message[192] = '^0'
				
				replace_all(message, 191, "!g", "^x04")
				replace_all(message, 191, "!n", "^x01")
				replace_all(message, 191, "!t", "^x03")
				kz_print_msg(i, message)
				
				for(j = 0; j < changedcount; j++)
				{
					setarg(changed[j], 0, LANG_PLAYER)
				}
			}
		}
	}
}

stock kz_print_msg(id, const msg[])
{
	message_begin(MSG_ONE_UNRELIABLE, g_SayText, _, id)
	write_byte(id)		
	write_string(msg)
	message_end()
}

stock set_user_duck(id) 
{
	set_pev(id, pev_flags, pev(id, pev_flags) | FL_DUCKING)
	engfunc( EngFunc_SetSize, id, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX)
}

stock set_user_scoreattrib(id, attrib = 0) 
{
	message_begin(MSG_BROADCAST, g_ScoreAttrib, _, 0)
	write_byte(id)
	write_byte(attrib)
	message_end()
}

stock set_user_teaminfo(id, teamstatus[]) 
{
	emessage_begin(MSG_BROADCAST, g_TeamInfo)
	ewrite_byte(id)
	ewrite_string(teamstatus)
	emessage_end()
} 

stock fm_set_plr_model(id, const Model[])
{
	copy(g_iPlayerModel[id], charsmax(g_iPlayerModel[]), Model)
	fm_set_admin_vipmodel(id, g_iPlayerModel[id])
}

stock fm_set_admin_vipmodel(id, const model[]) 
{
	set_pev(id, pev_rendermode, kRenderTransTexture)
	set_pev(id, pev_renderamt, 1.0)
	
	static modelpath[100]
	formatex(modelpath, 99, "models/player/%s/%s.mdl", model, model)
	
	if(!pev_valid(g_iEntPlayerModel[id])) 
	{
		g_iEntPlayerModel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		
		if (!pev_valid(g_iEntPlayerModel[id])) return
		
		set_pev(g_iEntPlayerModel[id], pev_classname, "ent_playermodel")
		set_pev(g_iEntPlayerModel[id], pev_movetype, MOVETYPE_FOLLOW)
		set_pev(g_iEntPlayerModel[id], pev_aiment, id)
		set_pev(g_iEntPlayerModel[id], pev_owner, id)
	}
	engfunc(EngFunc_SetModel, g_iEntPlayerModel[id], modelpath)
}

stock fm_set_admin_weaponmodel(id) 
{
	static model[100]
	pev(id, pev_weaponmodel2, model, 99)
	
	if(!pev_valid(g_iEntWeaponModel[id])) 
	{
		g_iEntWeaponModel[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		
		if (!pev_valid(g_iEntWeaponModel[id])) return
		
		set_pev(g_iEntWeaponModel[id], pev_classname, "ent_weaponmodel")
		set_pev(g_iEntWeaponModel[id], pev_movetype, MOVETYPE_FOLLOW)
		set_pev(g_iEntWeaponModel[id], pev_aiment, id)
		set_pev(g_iEntWeaponModel[id], pev_owner, id)
	}
	engfunc(EngFunc_SetModel, g_iEntWeaponModel[id], model)
}

stock fm_remove_model_ents(id) 
{
	set_pev(id, pev_rendermode, kRenderNormal)
	
	if(pev_valid(g_iEntPlayerModel[id])) 
	{
		engfunc(EngFunc_RemoveEntity, g_iEntPlayerModel[id])
		g_iEntPlayerModel[id] = 0
	}
	if(pev_valid(g_iEntWeaponModel[id])) 
	{
		engfunc(EngFunc_RemoveEntity, g_iEntWeaponModel[id])
		g_iEntWeaponModel[id] = 0
	}
}

stock ham_strip_weapon(id,weapon[])
{
	if(!equal(weapon,"weapon_",7)) return 0
	
	new wId = get_weaponid(weapon)
	if(!wId) return 0
	
	new wEnt
	while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
	if(!wEnt) return 0
	
	if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt)
	
	if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0
	ExecuteHamB(Ham_Item_Kill,wEnt)
	
	set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId))
	
	return 1
}

stock kz_set_health(id)
{
	new Float:fHealth = 255.0
	if(pev(id, pev_health) < fHealth)
	{
		set_pev(id, pev_health, fHealth)
		set_pev(id, pev_max_health, fHealth)
	}
}

stock kz_set_weapons(id)
{
	if(!is_plr_bot[id])
	{
		strip_user_weapons(id)
		give_item(id, "weapon_knife")
		give_item(id, "weapon_usp")
		if(g_bHasScout[id])
			give_item(id, "weapon_scout")
		g_bWeapons[id] = false
	}
}

stock kz_team_join(id, MenuMsgid, Team[], Class[]) 
{
	static jointeam[] = "jointeam"
	if (Class[0] == '0' ) 
	{
		engclient_cmd(id, jointeam, Team)
		return
	}
	static MsgBlock, joinclass[] = "joinclass"
	MsgBlock = get_msg_block(MenuMsgid)
	set_msg_block(MenuMsgid, BLOCK_SET)
	engclient_cmd(id, jointeam, Team)
	engclient_cmd(id, joinclass, Class)
	set_msg_block(MenuMsgid, MsgBlock)
}

stock kz_set_autojoin_task(id, MenuMsgid) 
{
	static ParamMenuMsgid[2]
	ParamMenuMsgid[0] = MenuMsgid
	set_task(0.1, "PlayerTeamJoin", id + TASK_AUTOJOIN, ParamMenuMsgid, sizeof ParamMenuMsgid)
}

stock bool:ShouldAutoJoin(id)
{
	return (!get_user_team(id) && !task_exists(id + TASK_AUTOJOIN))
}

stock kz_callfunc(id, function[], plugin[], onoff[])
{		
	if(callfunc_begin(function, plugin) == 1) 
	{
		callfunc_push_int(id)
		callfunc_push_str(onoff)
		callfunc_end()
	}
}

stock kz_make_lgt(id, Float:origin[3], Red, Green, Blue)
{
	message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id) 
	write_byte(TE_DLIGHT)  
	engfunc(EngFunc_WriteCoord, origin[0]) 
	engfunc(EngFunc_WriteCoord, origin[1]) 
	engfunc(EngFunc_WriteCoord, origin[2]) 
	write_byte(get_pcvar_num(g_kz_nvg_radius))                
	write_byte(Red)   
	write_byte(Green)   
	write_byte(Blue)   
	write_byte(2)              
	write_byte(0)                
	message_end() 
}

stock kz_make_nvg(id)
{
	new r, g, b 
	GetCvarColor(g_kz_nvg_color, r, g, b)
	
	message_begin( MSG_ONE_UNRELIABLE, g_ScreenFade, _, id) 
	write_short(1<<0) 
	write_short(1<<0) 
	write_short(0x0004) 
	write_byte(r)
	write_byte(g)
	write_byte(b)
	write_byte(50) 
	message_end()
	
	set_task(0.1, "kz_set_nvg", id + TASK_NVG, _, _, "b") 
}

stock kz_remove_nvg(id)
{
	message_begin( MSG_ONE_UNRELIABLE, g_ScreenFade, _, id) 
	write_short(0)
	write_short(0)
	write_short(0x0000)
	write_byte(0)
	write_byte(0)
	write_byte(0)
	write_byte(0) 
	message_end()
	
	remove_task(id + TASK_NVG)
	g_bPlayerNvgUse[id] = false
}

stock kz_set_nvg_msg(id, bool:toggle)
{
	message_begin(MSG_ONE_UNRELIABLE, g_NVGToggle, _, id)
	write_byte(toggle)
	message_end()
}

stock kz_register_saycmd(const saycommand[], const function[], flags) 
{
	new temp[64]
	formatex(temp, 63, "say /%s", saycommand)
	register_clcmd(temp, function, flags)
	formatex(temp, 63, "say .%s", saycommand)
	register_clcmd(temp, function, flags)
	formatex(temp, 63, "say_team /%s", saycommand)
	register_clcmd(temp, function, flags)
	formatex(temp, 63, "say_team .%s", saycommand)
	register_clcmd(temp, function, flags)
}

kz_make_config(const sConfig[]) {
	
	new f = fopen(sConfig, "wt")
	
	new sCvarSrting[32] 
	
	fprintf(f, "// %s %s by %s - Cvars Config ^n^n", PLUGIN, VERSION, AUTHOR)
	
	fprintf(f, "// Game Description^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_modname_enable %i^n^n", get_pcvar_num(g_kz_modname_enable))
	
	fprintf(f, "// Recommend to set this Cvars via Admin Menu^n")
	fprintf(f, "// Type /amenu in chat to open the Admin Menu^n")
	fprintf(f, "// kz_checkpoints %i^n", get_pcvar_num(g_kz_checkpoints))
	fprintf(f, "// kz_godmode %i^n", get_pcvar_num(g_kz_godmode))
	fprintf(f, "// kz_autojoin %i^n", get_pcvar_num(g_kz_autojoin))
	fprintf(f, "// kz_scout %i^n", get_pcvar_num(g_kz_scout))
	fprintf(f, "// kz_adminglow %i^n", get_pcvar_num(g_kz_adminglow))
	fprintf(f, "// kz_semiclip %i^n", get_pcvar_num(g_kz_semiclip))
	fprintf(f, "// kz_bhop %i^n", get_pcvar_num(g_kz_bhop))
	fprintf(f, "// kz_transparency %i^n", get_pcvar_num(g_kz_transparency))
	fprintf(f, "// kz_cheatdetect %i^n^n", get_pcvar_num(g_kz_cheatdetect))
	
	fprintf(f, "// Set how many Checkpoint are allowed to use for^n")
	fprintf(f, "// pro climber to get on Pro15 rank^n")
	fprintf(f, "// 0 - Only climber with No Checks get on Pro15 rank^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 10000^n")
	fprintf(f, "kz_maxpro_cp %i^n^n", get_pcvar_num(g_kz_maxpro_cp))
	
	fprintf(f, "// Set Player Individually Auto-Start-Position^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_autostart %i^n^n", get_pcvar_num(g_kz_autostart))
	
	fprintf(f, "// Allows started Player to pause his time^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_pause %i^n^n", get_pcvar_num(g_kz_pause))
	
	fprintf(f, "// Allows Player to join team Spectator^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_spec %i^n^n", get_pcvar_num(g_kz_spec))
	
	fprintf(f, "// Kz Start and Finish sounds^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Start & Finish sound Enabled^n")
	fprintf(f, "// 2 - Only Start sound Enabled^n")
	fprintf(f, "// 3 - Only Finish sound Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_sounds %i^n^n", get_pcvar_num(g_kz_sounds))
	
	fprintf(f, "// Set Admin Model^n")
	fprintf(f, "// 0 - Sas Model^n")
	fprintf(f, "// 1 - Vip Model and Scoreboard Attribute Vip^n")
	fprintf(f, "// 2 - Arctic Model and Scoreboard Attribute Vip^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_vip %i^n^n", get_pcvar_num(g_kz_vip))
	
	fprintf(f, "// Kz Startmoney^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1337^n")
	fprintf(f, "kz_money %i^n^n", get_pcvar_num(g_kz_money))
	
	fprintf(f, "// Player self kill command^n")
	fprintf(f, "// 0 - Self kill allowed^n")
	fprintf(f, "// 1 - Self kill not allowed^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_nokill %i^n^n", get_pcvar_num(g_kz_nokill))
	
	fprintf(f, "// Help Motd with all kz commands^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_help %i^n^n", get_pcvar_num(g_kz_help))
	
	fprintf(f, "// Create Kz Bot^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_bot %i^n^n", get_pcvar_num(g_kz_bot))
	
	fprintf(f, "// Kz Bot Name^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: ProKreedz Ultimativ v2.4^n")
	get_pcvar_string(g_kz_botname, sCvarSrting, 31)
	fprintf(f, "kz_botname ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Player rewards Hook and Jetpack^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_prize %i^n^n", get_pcvar_num(g_kz_prize))
	
	fprintf(f, "// Info Msgs about receiving rewards^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 60^n")
	fprintf(f, "kz_advert_time %i^n^n", get_pcvar_num(g_kz_advert_time))
	
	fprintf(f, "// Door sounds^n")
	fprintf(f, "// 0 - Enabled^n")
	fprintf(f, "// 1 - Disabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_doorsound %i^n^n", get_pcvar_num(g_kz_doorsound))
	
	fprintf(f, "// Pain sounds^n")
	fprintf(f, "// 0 - Enabled^n")
	fprintf(f, "// 1 - Disabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_painsound %i^n^n", get_pcvar_num(g_kz_painsound))
	
	fprintf(f, "// Water sounds^n")
	fprintf(f, "// 0 - Enabled^n")
	fprintf(f, "// 1 - Disabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_watersound %i^n^n", get_pcvar_num(g_kz_watersound))
	
	fprintf(f, "// Kz chat prefix^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: [ProKreedz]^n")
	get_pcvar_string(g_kz_tag, sCvarSrting, 31)
	fprintf(f, "kz_tag ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Player Autohealing^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_autoheal %i^n^n", get_pcvar_num(g_kz_autoheal))
	
	fprintf(f, "// Set HP Amount for Autohealing^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 50^n")
	fprintf(f, "kz_autoheal_hp %i^n^n", get_pcvar_num(g_kz_autoheal_hp))
	
	fprintf(f, "// Give player all weapons^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_weapons %i^n^n", get_pcvar_num(g_kz_weapons))
	
	fprintf(f, "// Show maxspeed of weapons^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_weaponspeed %i^n^n", get_pcvar_num(g_kz_weaponspeed))
	
	fprintf(f, "// Set the color of weaponspeed Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 0 255 255^n")
	get_pcvar_string(g_kz_weaponspeed_color, sCvarSrting, 31)
	fprintf(f, "kz_weaponspeed_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the position of weaponspeed Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 0.35 0.75^n")
	get_pcvar_string(g_kz_weaponspeed_xypos, sCvarSrting, 31)
	fprintf(f, "kz_weaponspeed_xypos ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Show Player Keys^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_showkeys %i^n^n", get_pcvar_num(g_kz_showkeys))
	
	fprintf(f, "// Set the color of showkeys Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 0 255 255^n")
	get_pcvar_string(g_kz_showkeys_color, sCvarSrting, 31)
	fprintf(f, "kz_showkeys_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the position of showkeys Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: -1.0 -0.40^n")
	get_pcvar_string(g_kz_showkeys_xypos, sCvarSrting, 31)
	fprintf(f, "kz_showkeys_xypos ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Kz Custom Nightvision^n")
	fprintf(f, "// 0 - Disabled^n")
	fprintf(f, "// 1 - Enabled^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_nvg_enabled %i^n^n", get_pcvar_num(g_kz_nvg_enabled))
	
	fprintf(f, "// Kz Custom Nightvision Radius^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 70^n")
	fprintf(f, "kz_nvg_radius %i^n^n", get_pcvar_num(g_kz_nvg_radius))
	
	fprintf(f, "// Set the color of custom Nvg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 0 255 255^n")
	get_pcvar_string(g_kz_nvg_color, sCvarSrting, 31)
	fprintf(f, "kz_nvg_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the color of Palyer time Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 0 255 255^n")
	get_pcvar_string(g_kz_time_color, sCvarSrting, 31)
	fprintf(f, "kz_time_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the color of pause and spec Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 255 0 0^n")
	get_pcvar_string(g_kz_status_color, sCvarSrting, 31)
	fprintf(f, "kz_status_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the color of Health Msg^n")
	fprintf(f, "// Health Msg will be shown when Health is greater 255 HP^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 255 50 0^n")
	get_pcvar_string(g_kz_showhealth_color, sCvarSrting, 31)
	fprintf(f, "kz_showhealth_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the positionof Health Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: -1.0 0.9^n")
	get_pcvar_string(g_kz_showhealth_xypos, sCvarSrting, 31)
	fprintf(f, "kz_showhealth_xypos ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// StatusText Types^n")
	fprintf(f, "// 0 - Show Hud Msg as Staustext - (Show only player name)^n")
	fprintf(f, "// 1 - Show Original Staustext - (Show only player name)^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 1^n")
	fprintf(f, "kz_statustext %i^n^n", get_pcvar_num(g_kz_statustext))
	
	fprintf(f, "// Set the color of Statustext Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: 255 255 0^n")
	get_pcvar_string(g_kz_statustext_color, sCvarSrting, 31)
	fprintf(f, "kz_statustext_color ^"%s^"^n^n", sCvarSrting)
	
	fprintf(f, "// Set the position of Statustext Msg^n")
	fprintf(f, "//^n")
	fprintf(f, "// Default: -1.0 0.52^n")
	get_pcvar_string(g_kz_statustext_xypos, sCvarSrting, 31)
	fprintf(f, "kz_statustext_xypos ^"%s^"^n^n", sCvarSrting)
	
	fclose(f)
	
	server_cmd("exec %s", sConfig)
	server_exec()
}




