PHP Code:
#include <amxmodx>
#include <fun>
#include <engine>
#include <fakemeta>
new grabbed[1024]
new grablength[1024]
new bool:grabmodeon[33]
new velocity_multiplier
public grabtask(parm[])
{
new id = parm[0]
new targetid, body
if (!grabbed[id])
{
get_user_aiming(id, targetid, body)
if (targetid)
{
set_grabbed(id, targetid)
}
}
if (grabbed[id])
{
new origin[3], look[3], direction[3], moveto[3], grabbedorigin[3], Float:f_grabbedorigin[3], velocity[3], length
if(is_user_connected(grabbed[id])) {
if (!is_user_alive(grabbed[id])) {
release(id)
return
}
}
get_user_origin(id, origin, 1)
get_user_origin(id, look, 3)
pev(id,pev_origin,f_grabbedorigin,2)
for (new i=0;i<3;i++){
grabbedorigin[i] = floatround(f_grabbedorigin[i])
}
//get_user_origin(grabbed[id], grabbedorigin)
direction[0]=look[0]-origin[0]
direction[1]=look[1]-origin[1]
direction[2]=look[2]-origin[2]
length = get_distance(look,origin)
if (!length) length=1 // avoid division by 0
moveto[0]=origin[0]+direction[0]*grablength[id]/length
moveto[1]=origin[1]+direction[1]*grablength[id]/length
moveto[2]=origin[2]+direction[2]*grablength[id]/length
velocity[0]=(moveto[0]-grabbedorigin[0])*velocity_multiplier
velocity[1]=(moveto[1]-grabbedorigin[1])*velocity_multiplier
velocity[2]=(moveto[2]-grabbedorigin[2])*velocity_multiplier
new Float:vector[3]
IVecFVec(velocity, vector)
entity_set_vector(grabbed[id], EV_VEC_velocity, vector)
}
}
public grab_toggle(id)
{
if (grabmodeon[id])
release(id)
else
grab(id)
return PLUGIN_HANDLED
}
public grab(id)
{
if ((get_user_flags(id)&ADMIN_SLAY)) {
if (!grabmodeon[id])
{
new targetid, body
new parm[1]
parm[0] = id
velocity_multiplier = get_cvar_num("sv_grabforce")
grabmodeon[id]=true
set_task(0.1, "grabtask", 100+id, parm, 1, "b")
get_user_aiming(id, targetid, body)
if (targetid)
{
set_grabbed(id, targetid)
}
else
{
}
}
}
else if ((get_cvar_num("sv_force") == 1)) {
if (!grabmodeon[id])
{
new targetid, body
new parm[1]
parm[0] = id
velocity_multiplier = get_cvar_num("sv_grabforce")
grabmodeon[id]=true
set_task(0.1, "grabtask", 100+id, parm, 1, "b")
get_user_aiming(id, targetid, body)
if (targetid)
{
set_grabbed(id, targetid)
}
else
{
}
}
}
return PLUGIN_HANDLED
}
public release(id)
{
if (grabmodeon[id])
{
grabmodeon[id]=false
if (grabbed[id])
{
pev(grabbed[id],pev_gravity,1)
}
else
{
}
grabbed[id]=0
remove_task(100+id)
}
return PLUGIN_HANDLED
}
public spec_event(id)
{
new targetid = read_data(2)
if (targetid < 1 || targetid > 32)
return PLUGIN_CONTINUE
if (grabmodeon[id] && !grabbed[id])
{
set_grabbed(id, targetid)
}
return PLUGIN_CONTINUE
}
public set_grabbed(id, targetid)
{
new origin1[3], origin2[3]
new Float:f_origin1[3], Float:f_origin2[3]
pev(id,pev_origin,f_origin1,2)
pev(targetid,pev_origin,f_origin2,2)
for (new i=0;i<3;i++){
origin1[i] = floatround(f_origin1[i])
origin2[i] = floatround(f_origin2[i])
}
//get_user_origin(id, origin1)
//get_user_origin(targetid, origin2)
grabbed[id]=targetid
grablength[id]=get_distance(origin1,origin2)
pev(targetid,pev_gravity,0.001)
//set_user_gravity(targetid,0.001)
}
public plugin_init()
{
register_plugin("Jedi Force Grab","2.1","SpaceDude")
register_cvar("sv_grabforce","8")
register_cvar("sv_force","0")
register_clcmd("+force","grab",ADMIN_SLAY,"bind a key to +grab")
register_clcmd("-force","release",ADMIN_SLAY)
register_event("StatusValue","spec_event","be","1=2")
}