/* 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
}