[php]
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
new Float:_pg_ftmp
#define _Vec3ToAngles(%1,%2) _pg_ftmp = floatsqroot(%1[0]*%1[0] + %1[1]*%1[1]);\
%2[1] = floatacos(%1[0]/_pg_ftmp, 1)*(1-2*_

%1[1]<0));\
%2[0] =-floatatan(%1[2]/_pg_ftmp, 1);\
%2[2] = 0.0
#define _Vec3AddScalar(%1,%2) %1[0]+=%2;%1[1]+=%2;%1[2]+=%2
#define _Vec3Set(%1,%2) %1[0]=%2[0];%1[1]=%2[1];%1[2]=%2[2]
#define _Vec3Add(%1,%2) %1[0]+=%2[0];%1[1]+=%2[1];%1[2]+=%2[2]
public plugin_init() {
register_plugin("Teleport Behind Target", "1.0", "Sylwester");
register_clcmd("amx_stack", "cmd_stack", ADMIN_KICK, " <target> - teleports you behind target")
}
public cmd_stack(id, level, cid){
if(!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new args[32]
read_args(args, sizeof(args)-1)
trim(args)
remove_quotes(args)
new target = cmd_target(id, args, 4)
if(!target){
client_print(id, print_console, "Error: Could not find player %s", args)
return PLUGIN_HANDLED
}
teleport_behind(id, target)
return PLUGIN_HANDLED
}
public teleport_behind(id, target){
if(!is_user_alive(id) || !is_user_alive(target)){
client_print(id, print_console, "Error: you and your target must be alive")
return
}
new Float:vec[3], Float

rigin[3], Float:fraction, Float:ftmp[3], Float:ftmp2[3], Float:ftmp3[3], Float:ftmp4[3], Float:len2, tr, i, j
velocity_by_aim(target, 1, vec)
new Float:len = floatsqroot(vec[0]*vec[0]+vec[1]*vec[1])
pev(target, pev_origin, origin)
ftmp3[0] = origin[0]-vec[0]*50.0/len
ftmp3[1] = origin[1]-vec[1]*50.0/len
ftmp3[2] = origin[2]+5.0
ftmp4[0] = origin[0]-vec[0]*10.0/len
ftmp4[1] = origin[1]-vec[1]*10.0/len
ftmp4[2] = origin[2]+91.0
for(j=0; j<20; j++){
if(j<15){
_Vec3Set(ftmp, ftmp3)
}else{
_Vec3Set(ftmp, ftmp4)
}
for(i=0; i<100; i++){
engfunc(EngFunc_TraceHull, ftmp, ftmp, 0, HULL_HUMAN, 0, tr)
if(get_tr2(tr, TR_StartSolid) || get_tr2(tr, TR_AllSolid)){
_Vec3AddScalar(ftmp, random_float(-10.0, 10.0))
continue
}
engfunc(EngFunc_TraceLine, origin, ftmp, IGNORE_MONSTERS, 0, tr)
get_tr2(tr, TR_flFraction, fraction)
break
}
if(fraction == 1.0){
_Vec3Set(ftmp2, ftmp)
_Vec3Add(ftmp2, -origin)
len2 = len*floatsqroot(ftmp2[0]*ftmp2[0]+ftmp2[1]*ftmp2[1]+ftmp2[2]*ftmp2[2])
if(len2 > 100.0 || (ftmp2[0]*vec[0]+ftmp2[1]*vec[1])/len2 > 0.1){
fraction = 0.0
continue
}
break
}
}
if(fraction !=1.0){
//failed to find correct position behind target
return
}
set_pev(id, pev_origin, ftmp)
_Vec3Set(ftmp, -ftmp)
_Vec3Add(ftmp, origin)
_Vec3ToAngles(ftmp, ftmp)
set_pev(id, pev_angles, ftmp)
set_pev(id, pev_fixangle, 1)
}