PHP Code:
#include <amxmisc>
#include <engine>
#define PLUGIN_NAME "JoRoGrab"
#define PLUGIN_AUTHOR "JoRoPiTo"
#define PLUGIN_VERSION "0.1"
#define PLUGIN_CVAR "jorograb"
#define MAX_PLAYERS 32
new g_PlayerGrab[MAX_PLAYERS+1]
new Float:g_PlayerGrabLen[MAX_PLAYERS+1]
new Float:g_PlayerGrabLook[MAX_PLAYERS+1][3]
new Float:g_PlayerGrabMins[MAX_PLAYERS+1][3]
new Float:g_PlayerGrabMaxs[MAX_PLAYERS+1][3]
new g_MaxClients
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
register_cvar(PLUGIN_CVAR, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY)
register_clcmd("+grab", "grab_hold")
register_clcmd("-grab", "grab_release")
g_MaxClients = get_global_int(GL_maxClients)
}
public client_putinserver(id)
{
g_PlayerGrab[id] = 0
}
////////////////////////////////////////////////////////////////////
public grab_release(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
g_PlayerGrab[id] = 0
return PLUGIN_HANDLED
}
public grab_hold(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
static ent, body
static Float:vorigin[3], Float:end[3], Float:mins[3]
get_user_aiming(id, ent, body)
if(_is_block(ent) && !_is_grabbed(ent))
{
entity_get_vector(id, EV_VEC_origin, vorigin)
entity_get_vector(ent, EV_VEC_absmin, mins)
entity_get_vector(ent, EV_VEC_absmax, end)
vector_sum(end, mins)
vector_mul(end, 0.5)
entity_get_vector(ent, EV_VEC_size, g_PlayerGrabMins[id])
entity_get_vector(ent, EV_VEC_size, g_PlayerGrabMaxs[id])
vector_mul(g_PlayerGrabMins[id], -0.5)
vector_mul(g_PlayerGrabMaxs[id], 0.5)
new Float:len = get_distance_f(vorigin, end)
g_PlayerGrab[id] = ent
g_PlayerGrabLen[id] = len
}
return PLUGIN_HANDLED
}
stock _is_grabbed(ent)
{
for(new i = 1; i <= g_MaxClients; i++)
{
if(g_PlayerGrab[i] == ent)
return true
}
return false
}
stock _is_block(ent)
{
if(is_valid_ent(ent) && (ent >= MAX_PLAYERS))
return true
return false
}
public client_PreThink(id)
{
if(g_PlayerGrab[id])
{
new iorigin[3], ilook[3]
new Float:vdest[3], Float:vorigin[3], Float:vlook[3], Float:vdir[3], Float:vlen
new buttons
get_user_origin(id, iorigin, 1)
get_user_origin(id, ilook, 3)
buttons = entity_get_int(id, EV_INT_button)
IVecFVec(iorigin, vorigin)
IVecFVec(ilook, vlook)
if(!vector_compare(vlook, g_PlayerGrabLook[id]) || (buttons & (IN_ATTACK|IN_ATTACK2)))
{
g_PlayerGrabLook[id] = vlook
vdir = vlook
vector_substract(vdir, vorigin)
vlen = get_distance_f(vlook, vorigin)
if(vlen == 0.0) vlen = 1.0
if(buttons & IN_ATTACK)
g_PlayerGrabLen[id] -= 0.5
else if(buttons & IN_ATTACK2)
g_PlayerGrabLen[id] += 0.5
vdest[0] = (vorigin[0] + vdir[0] * g_PlayerGrabLen[id] / vlen)
vdest[1] = (vorigin[1] + vdir[1] * g_PlayerGrabLen[id] / vlen)
vdest[2] = (vorigin[2] + vdir[2] * g_PlayerGrabLen[id] / vlen)
vdest[2] = float(floatround(vdest[2], floatround_floor))
set_brush_origin(g_PlayerGrab[id], vdest)
}
}
}
stock vector_substract(Float:vecDst[], const Float:vecSrc[])
{
vecDst[0] -= vecSrc[0]
vecDst[1] -= vecSrc[1]
vecDst[2] -= vecSrc[2]
}
stock vector_compare(const Float:vecA[], const Float:vecB[])
{
if((vecA[0] == vecB[0]) && (vecA[1] == vecB[1]) && (vecA[2] == vecB[2]))
return true
return false
}
stock vector_mul(Float:vec[], const Float:ammount)
{
vec[0] *= ammount
vec[1] *= ammount
vec[2] *= ammount
}
stock vector_sum(Float:vecDst[], const Float:vecSrc[])
{
vecDst[0] += vecSrc[0]
vecDst[1] += vecSrc[1]
vecDst[2] += vecSrc[2]
}
stock vector_copy(Float:vecDst[], const Float:vecSrc[])
{
vecDst[0] = vecSrc[0]
vecDst[1] = vecSrc[1]
vecDst[2] = vecSrc[2]
}
stock set_brush_origin(ent, Float:origin[3])
{
static Float:size[3], Float:mins[3], Float:absmin[3], Float:absmax[3]
entity_get_vector(ent, EV_VEC_mins, mins)
entity_get_vector(ent, EV_VEC_maxs, size)
vector_substract(size, mins)
absmin[0] = origin[0] - (size[0]/2.0)
absmin[1] = origin[1] - (size[1]/2.0)
absmin[2] = origin[2]
absmax[0] = origin[0] + (size[0]/2.0)
absmax[1] = origin[1] + (size[1]/2.0)
absmax[2] = origin[2] + size[2]
entity_set_vector(ent, EV_VEC_absmin, absmin)
entity_set_vector(ent, EV_VEC_absmax, absmax)
origin[0] = absmin[0] - mins[0]
origin[1] = absmin[1] - mins[1]
origin[2] = absmin[2] - mins[2]
entity_set_origin(ent, origin)
}