#include <amxmodx>
#include <fakemeta>
#include <zombieplague>

new const g_item_name[] = { "Bhop" }

new g_Bhop, g_cvar_bhop_cost

new g_hasBhop[ 33 ]
new pcvar_enabled, pcvar_autojump

new bool:g_restorevel[33]
new Float:g_velocity[33][3]



public plugin_init()
{
        register_plugin("[ZP] Extra Item : Bhop", "1.1", "ѓa†es™")
        g_cvar_bhop_cost = register_cvar("zp_bhop_cost", "8")
	register_event( "DeathMsg", "event_player_death", "a" )
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	pcvar_enabled = register_cvar( "zp_bhop_enabled", "1" )
	pcvar_autojump = register_cvar( "zp_bhop_autojump", "1" )
        register_clcmd("say /bhop", "buy_bannyhop")
	register_forward( FM_PlayerPreThink, "forward_prethink" )

	g_Bhop = zp_register_extra_item(g_item_name, get_pcvar_num(g_cvar_bhop_cost), ZP_TEAM_HUMAN)

	register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
	register_forward(FM_PlayerPreThink, "fw_PlayerPreThink_Post", 1)
}

public zp_extra_item_selected(player, itemid)
{
	if (itemid == g_Bhop)
	{
        g_hasBhop[player] = true
	client_print(player, print_chat, "Вы купили BannyHop!")
        
	pev(player, pev_velocity, g_velocity[player])
	}
}

public client_connect( id )
{
	g_hasBhop[ id ] = false
}

public event_player_death()
{
	g_hasBhop[ read_data( 2 ) ] = false
}


public buy_bannyhop(id)
{
        if( !is_user_alive(id) || zp_get_user_zombie(id) )
        {
	client_print(id, print_chat, "Зомби не может купить BannyHop!")
	return PLUGIN_HANDLED
	}

	new iMoney = zp_get_user_ammo_packs(id)
	new iCost = get_pcvar_num(g_cvar_bhop_cost)
	if(iMoney >= iCost)
	{
	zp_set_user_ammo_packs(id, iMoney - iCost)	
	client_print(id, print_chat, "Вы купили BannyHop за %i АММО packs", iCost)
        g_hasBhop[id] = true
	return PLUGIN_HANDLED
	}
	else
	{
	client_print(id, print_chat, "У вас нехватает АММО packs! Стоимость %i A.P. !", iCost)
	}
	return PLUGIN_HANDLED
}

public forward_prethink( id )
{
	if(!is_user_alive(id) || zp_get_user_zombie(id) || !g_hasBhop[id])
 		return PLUGIN_CONTINUE


	if( get_pcvar_num( pcvar_enabled ) )
	{
	set_pev( id, pev_fuser2, 0.0 )
		
	if( get_pcvar_num( pcvar_autojump ) && pev( id, pev_button ) & IN_JUMP )
	{
	new szFlags = pev( id, pev_flags )
	if( !( szFlags & FL_WATERJUMP ) && pev( id, pev_waterlevel ) < 2 && szFlags & FL_ONGROUND )
	{
	new Float: szVelocity[ 3 ]
	pev( id, pev_velocity, szVelocity)
	szVelocity[ 2 ] += 250.0
	set_pev( id, pev_velocity, szVelocity )
	set_pev( id, pev_gaitsequence, 6 )
	}
	}
	}
        return FMRES_IGNORED
}

public fw_PlayerPreThink(id)
{	
	if ( !is_user_alive(id) || !is_user_bot(id) || zp_get_user_zombie(id) )
		return FMRES_IGNORED
	
	if (pev(id, pev_flags) & FL_ONGROUND)
	{
	pev(id, pev_velocity, g_velocity[id])
        
	g_restorevel[id] = true
	}
	return FMRES_IGNORED
}

public fw_PlayerPreThink_Post(id)
{		
	if (g_restorevel[id])
	{
	g_restorevel[id] = false

	if (!(pev(id, pev_flags) & FL_ONTRAIN))
	{
	new groundent = pev(id, pev_groundentity)
			
	if (pev_valid(groundent) && (pev(groundent, pev_flags) & FL_CONVEYOR))
	{	
	static Float:vecTemp[3]
                
	pev(id, pev_basevelocity, vecTemp)
                
	g_velocity[id][0] += vecTemp[0]
	g_velocity[id][1] += vecTemp[1]
	g_velocity[id][2] += vecTemp[2]
	}                

	set_pev(id, pev_velocity, g_velocity[id])
            
	return FMRES_HANDLED
	}
	}
	return FMRES_IGNORED
}

public event_round_start()
{
	for (new id; id <= 32; id++) g_hasBhop[id] = false;
}
