| joropito |
05-15-2010 11:35 |
Re: Moving func_wall
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) }
|