/* Plugin generated by AMXX-Studio */
 
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
 
#define PLUGIN "Keek"
#define VERSION "0.1.1"
#define AUTHOR "PomanoB"
 
#define MODEL "models/rpgrocket.mdl"
 
new g_info_target_str
new g_lookEntity[33]
 
new const g_entity_class[] = "keek_entity"
 
new g_cvar_max_distance, g_cvar_max_offset, g_cvar_effects
 
public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
 
	register_forward(FM_PlayerPreThink, "fwdPreThink")
	register_forward(FM_Think, "fwdThink")
	register_forward(FM_AddToFullPack, "fwdAddToFullPack")
 
	RegisterHam(Ham_Killed, "player", "fwdKilled")
 
	g_info_target_str = engfunc(EngFunc_AllocString, "info_target")
 
	g_cvar_max_distance = register_cvar("keek_max_distance", "50.0")
	g_cvar_max_offset = register_cvar("keek_max_offset", "8")
	g_cvar_effects = register_cvar("keek_effects", "1")
}
 
public plugin_precache()
{
	precache_model(MODEL)
}
 
public fwdPreThink(id)
{
	static buttons, oldButtons
	if (is_user_alive(id))
	{
		buttons = pev(id, pev_button)
		oldButtons = pev(id, pev_oldbuttons)
 
		if ((buttons == IN_USE) && !(oldButtons&IN_USE))
		{
			if (!g_lookEntity[id])
			{
				static Float:origin[3], Float:viewOrigin[3], Float:temp[3], Float:angles[3], Float:startOrigin[3], Float:planeNormal[3]
				pev(id, pev_origin, origin)
				xs_vec_copy(origin, startOrigin)
 
				pev(id, pev_view_ofs, viewOrigin)
				xs_vec_add(origin, viewOrigin, viewOrigin)
 
				pev(id, pev_angles, origin)
				xs_vec_copy(origin, angles)
 
 
 
				engfunc(EngFunc_MakeVectors, origin)
				global_get(glb_v_forward, origin)
				xs_vec_mul_scalar(origin, get_pcvar_float(g_cvar_max_distance), origin)
				xs_vec_add(origin, viewOrigin, origin)
				origin[2] = viewOrigin[2]
 
				static tr, Float:fraction
 
				tr = 0
				engfunc(EngFunc_TraceLine, viewOrigin, origin, 0, id, tr)
				get_tr2(tr, TR_flFraction, fraction)
				if (fraction != 1.0)
				{
					get_tr2(tr, TR_vecEndPos, origin)
					get_tr2(tr, TR_vecPlaneNormal, viewOrigin)
 
					xs_vec_copy(viewOrigin, planeNormal)
					xs_vec_mul_scalar(planeNormal, 7.0, planeNormal)
 
				//	xs_vec_add(origin, viewOrigin, startOrigin)
					xs_vec_sub(origin, viewOrigin, origin)
 
					fraction = viewOrigin[0]
					viewOrigin[0] = viewOrigin[1]
					viewOrigin[1] = fraction
 
					xs_vec_mul_scalar(viewOrigin, 5.0, viewOrigin)
 
					xs_vec_copy(origin, temp)
					static content1, content2, offset
					offset = get_pcvar_num(g_cvar_max_offset)
					tr = 0
					do
					{
						xs_vec_add(temp, viewOrigin, temp)
						xs_vec_sub(origin, viewOrigin, origin)
 
						content1 = engfunc(EngFunc_PointContents, temp)
						content2 = engfunc(EngFunc_PointContents, origin)
					}
					while(tr++ < offset && content1 != CONTENTS_EMPTY && content2 != CONTENTS_EMPTY)
 
					if (content1 == CONTENTS_EMPTY)
					{
						xs_vec_add(temp, viewOrigin, temp)
						xs_vec_copy(temp, viewOrigin)
					}
					else
					if (content2 == CONTENTS_EMPTY)
					{
						xs_vec_sub(origin, viewOrigin, origin)
						xs_vec_copy(origin, viewOrigin)
					}
					else
						return
 
 
 
					xs_vec_add(viewOrigin, planeNormal, viewOrigin)
				//	xs_vec_add(startOrigin, planeNormal, startOrigin)
 
					tr = engfunc(EngFunc_CreateNamedEntity, g_info_target_str)
					dllfunc(DLLFunc_Spawn, tr)
					set_pev(tr, pev_classname, g_entity_class)
					engfunc(EngFunc_SetModel, tr, MODEL)
					set_pev(tr, pev_rendermode, kRenderTransAdd)
					set_pev(tr, pev_renderamt, 0.0)
 
					xs_vec_mul_scalar(planeNormal, -1.0, planeNormal)
					engfunc(EngFunc_VecToAngles, planeNormal, angles)
					set_pev(tr, pev_angles, angles)
 
					if (get_pcvar_num(g_cvar_effects))
					{
						set_pev(tr, pev_vuser1, viewOrigin)
 
						pev(id, pev_view_ofs, angles)
						xs_vec_add(startOrigin, angles, startOrigin)
 
 
						engfunc(EngFunc_SetOrigin, tr, startOrigin)
 
						set_pev(tr, pev_nextthink, get_gametime() + 0.01)
					}
					else
						engfunc(EngFunc_SetOrigin, tr, viewOrigin)
 
					set_pev(id, pev_velocity, Float:{0.0, 0.0, 0.0})
 
					engfunc(EngFunc_SetView, id, tr)
 
					g_lookEntity[id] = tr
 
				}
 
			}
			else
				deleteLook(id)
 
		}
		else
		if (g_lookEntity[id] && buttons && buttons != IN_USE)
			deleteLook(id)
 
	}
}
 
public fwdThink(ent)
{
	static classname[32]
	pev(ent, pev_classname, classname, charsmax(classname))
	if (equal(classname, g_entity_class))
	{
		static Float:origin[3], Float:endOrigin[3]
 
		pev(ent, pev_origin, origin)
		pev(ent, pev_vuser1, endOrigin)
 
		xs_vec_sub(endOrigin, origin, endOrigin)
		if (xs_vec_len(endOrigin) > 1.0)
		{
			xs_vec_normalize(endOrigin, endOrigin)
			xs_vec_add(origin, endOrigin, endOrigin)
 
			engfunc(EngFunc_SetOrigin, ent, endOrigin)
 
			set_pev(ent, pev_nextthink, get_gametime() + 0.01)
		}
	}
}
 
public fwdAddToFullPack(es, e, ent, host, flags, player, set)
{
	if (ent == host && g_lookEntity[host])
		return FMRES_SUPERCEDE
	return FMRES_IGNORED
}
 
public fwdKilled(id, idattacker, shouldgib)
{
	if (g_lookEntity[id])
		deleteLook(id)			
}
 
public client_disconnect(id)
{
	if (g_lookEntity[id])
		deleteLook(id)
}
 
public deleteLook(id)
{
	engfunc(EngFunc_SetView, id, id)
	engfunc(EngFunc_RemoveEntity, g_lookEntity[id])
	g_lookEntity[id] = 0
}