#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <engine>

new SPRITE_MODEL[] 	= "sprites/explode1.spr"
new JETPACK_PMODEL[] 	= "models/p_longjump.mdl"
new JETPACK_GOTSOUND[] 	= "items/ammopickup2.wav"

new cvar_cost
new cvar_thrust
new cvar_min_speed
new cvar_max_speed

new sprite_fire

new g_HasJetpack[33]
new g_JetpackEnt[33]

static const PLUGIN_NAME[] 	= "SyN Surf Jetpack"
static const PLUGIN_AUTHOR[] 	= "Cheap_Suit"
static const PLUGIN_VERSION[]	= "1.4"

public plugin_init()
{
	new mapName[33]
	get_mapname(mapName, 32)
	
	if(!equali(mapName, "surf_", 5))
	{
		new pluginName[33]
		format(pluginName, 32, "[Disabled] %s", PLUGIN_NAME)
		register_plugin(pluginName, PLUGIN_VERSION, PLUGIN_AUTHOR)
		pause("ade")
	}
	else
	{
		register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
		register_cvar(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER)
		
		register_clcmd("sjp_givesj" , 		"cmd_GiveSJ", 		ADMIN_IMMUNITY, "<userid> - Gives free surf jetpack")
		register_clcmd("sjp_stripsj" , 		"cmd_StripSJ", 		ADMIN_IMMUNITY, "<userid> - Strips users surf jetpack")
		
		register_clcmd("say /buyjetpack", 	"cmd_BuySurfJetpack", 0, "Buys surf jetpack")
		register_clcmd("say buy_jetpack", 	"cmd_BuySurfJetpack", 0, "Buys surf jetpack")
		register_concmd("buy_jetpack", 		"cmd_BuySurfJetpack", 0, "Buys surf jetpack")
		register_concmd("buyjetpack", 		"cmd_BuySurfJetpack", 0, "Buys surf jetpack")
		
		cvar_cost	= register_cvar("sjp_cost", "5000")
		cvar_thrust 	= register_cvar("sjp_thrust", "10")
		cvar_min_speed 	= register_cvar("sjp_min_speed", "400")
		cvar_max_speed 	= register_cvar("sjp_max_speed", "1200")
		
		register_event("DeathMsg", 		"Event_DeathMsg", "a")
	}
}

public plugin_precache()
{
	sprite_fire = precache_model(SPRITE_MODEL)
	precache_sound(JETPACK_GOTSOUND)
	precache_model(JETPACK_PMODEL)
}

public client_connect(id)
{
	g_HasJetpack[id] = 0
	_removeJetpackEnt(id)
}
	
public client_disconnect(id)
{
	g_HasJetpack[id] = 0
	_removeJetpackEnt(id)
}

public Event_DeathMsg()
{
	new id = read_data(2)

	g_HasJetpack[id] = 0
	_removeJetpackEnt(id)

	return PLUGIN_CONTINUE
}

public cmd_BuySurfJetpack(id)
{
	new iMoney = cs_get_user_money(id)
	new iCost = get_pcvar_num(cvar_cost)
	
	if(!is_user_alive(id)) 
		client_print(id, print_center, "You cant buy when your dead!")
	else if(g_HasJetpack[id])
		client_print(id, print_center, "You already own a surf jetpack.")
	else if(iMoney < iCost)
		client_print(id, print_center, "Insufficient funds! ($%d)", iCost)
	else
	{
		_give_Jetpack(id)
		cs_set_user_money(id, iMoney - iCost, 1)
  	}
	return PLUGIN_HANDLED
}

public cmd_GiveSJ(id , level , cid) 
{
	if(!cmd_access(id , level , cid , 2))
		return PLUGIN_HANDLED
		
	new arg1[33]
	read_argv(1 , arg1 , 32)

	new target = cmd_target(id , arg1 , 0)
	if(!is_user_connected(target))
	{
		console_print(id, "Player does not exist")
		return PLUGIN_HANDLED
	}

	if(g_HasJetpack[target])
	{
		console_print(id, "Player already has a surf jetpack")
		return PLUGIN_HANDLED
	}
	
	_give_Jetpack(target)

	new Name[33], Name2[33]
	get_user_name(id, Name, 32)
	get_user_name(target, Name2, 32)
	
	console_print(id, "You gave %s a surf jetpack", Name2)
	client_print(target, print_chat, "ADMIN: %s gave you a surf jetpack", Name)
	
	return PLUGIN_HANDLED
}

public cmd_StripSJ(id , level , cid) 
{
	if(!cmd_access(id , level , cid , 2))
		return PLUGIN_HANDLED
		
	new arg1[33]
	read_argv(1 , arg1 , 32)

	new target = cmd_target(id , arg1 , 0)
	if(!is_user_connected(target))
	{
		console_print(id, "Player does not exist")
		return PLUGIN_HANDLED
	}

	if(!g_HasJetpack[target])
	{
		console_print(id, "Player does not have a surf jetpack")
		return PLUGIN_HANDLED
	}
	
	g_HasJetpack[id] = 0
	_removeJetpackEnt(id)

	new Name[33], Name2[33]
	get_user_name(id, Name, 32)
	get_user_name(target, Name2, 32)
	
	console_print(id, "You stripped %s a surf jetpack", Name2)
	client_print(target, print_chat, "ADMIN: %s stripped your surf jetpack", Name)
	
	return PLUGIN_HANDLED
}

public _give_Jetpack(id)
{
	g_HasJetpack[id] = 1
	client_cmd(id, "spk %s", JETPACK_GOTSOUND)
	client_print(id, print_chat, "You've got a surf jetpack! :: HOW TO USE :: ~ Just Surf ~ ")
	
	if(g_JetpackEnt[id] < 1)
	{
		g_JetpackEnt[id] = create_entity("info_target")
		if(is_valid_ent(g_JetpackEnt[id]))
		{
			entity_set_model(g_JetpackEnt[id], JETPACK_PMODEL)
			entity_set_int(g_JetpackEnt[id], EV_INT_movetype, MOVETYPE_FOLLOW)
			entity_set_edict(g_JetpackEnt[id], EV_ENT_aiment, id)
		}
	}
}

public _removeJetpackEnt(id)
{
	if(g_JetpackEnt[id] > 0)
		remove_entity(g_JetpackEnt[id])
	g_JetpackEnt[id] = 0
}

public client_PreThink(id)
{
	if(!is_user_alive(id) || !g_HasJetpack[id])
		return PLUGIN_CONTINUE
		
	if(get_user_speed(id) < get_pcvar_num(cvar_min_speed))
		return PLUGIN_CONTINUE	
		
	new Button = get_user_button(id)
	if(Button & IN_MOVELEFT || Button & IN_MOVERIGHT)
	{		
		_jetEffect(id)	
		_jetThrust(id)
	}
	return PLUGIN_CONTINUE
}

public _jetThrust(id)
{	
	new Float:fVelocity[3]
	entity_get_vector(id, EV_VEC_velocity, fVelocity)

	new Float:fAngle[3]
	entity_get_vector(id, EV_VEC_angles, fAngle)
	engfunc(EngFunc_MakeVectors, fAngle)
				
	new Float:fForward[3]
	get_global_vector(GL_v_forward, fForward)
				
	fVelocity[0] += fForward[0] * get_pcvar_num(cvar_thrust)
	fVelocity[1] += fForward[1] * get_pcvar_num(cvar_thrust)
			
	if(get_user_speed(id) < get_pcvar_num(cvar_max_speed))
		entity_set_vector(id, EV_VEC_velocity, fVelocity)
		
	return PLUGIN_CONTINUE
}

public _jetEffect(id)
{	
	new iOrigin[3]
	get_user_origin(id, iOrigin, 0)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(17)
	write_coord(iOrigin[0])
	write_coord(iOrigin[1])
	write_coord(iOrigin[2])
	write_short(sprite_fire)
	write_byte(10)
	write_byte(115)
	message_end()
	
	entity_set_int(id , EV_INT_gaitsequence , 8)
}

stock get_user_speed(id)
{
	new Float:fVelocity[3]
	entity_get_vector(id, EV_VEC_velocity, fVelocity)
	
	new iVelocity[3]
	FVecIVec(fVelocity, iVelocity)
	
	new iVelocity0 = iVelocity[0] * iVelocity[0]
	new iVelocity1 = iVelocity[1] * iVelocity[1]
	
	return sqroot(iVelocity0 + iVelocity1)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
