already exists
Code:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#define fm_get_user_team(%1) get_pdata_int(%1, FM_OFFSET_TEAM)
#define FM_OFFSET_TEAM 114
#define BACKSTAB_ANGLE 93.0 //Changeable
#define BACKSTAB_MAX_DAMAGE 10.0 //Changeable
new gMaxPlayers;
new bool:gBackStabing[33];
public plugin_init()
{
register_forward(FM_CmdStart, "Fwd_CmdStart");
RegisterHam(Ham_TakeDamage, "player", "Event_TakeDamage");
gMaxPlayers = global_get(glb_maxClients);
}
public Fwd_CmdStart(id, uc_handle, uc_seed)
{
if(!is_user_alive(id))
return FMRES_IGNORED;
static Float:fViewAngles[3], iButton;
get_uc(uc_handle, UC_ViewAngles, fViewAngles);
iButton = get_uc(uc_handle, UC_Buttons);
if(((iButton & IN_ATTACK) || (iButton & IN_ATTACK2)))
{
static iEnt, Float:fOrigin[3];
pev(id, pev_origin, fOrigin);
iEnt = fm_trace_target(id, fOrigin, 100);
if(!(1 <= iEnt <= gMaxPlayers))
return FMRES_IGNORED;
static Float:fTViewAngles[3];
pev(iEnt, pev_v_angle, fTViewAngles);
static Float:fMinAngle, Float:fMaxAngle;
fMinAngle = fViewAngles[1] - BACKSTAB_ANGLE;
fMaxAngle = fViewAngles[1] + BACKSTAB_ANGLE;
if(fMinAngle <= fTViewAngles[1] <= fMaxAngle)
{
gBackStabing[id] = true;
}
else
{
gBackStabing[id] = false;
}
}
return FMRES_IGNORED;
}
public Event_TakeDamage(this, inflictor, attacker, Float:damage, dmgbits)
{
if(inflictor == 0)
return HAM_IGNORED;
if(!is_user_alive(attacker) || !gBackStabing[attacker] || (fm_get_user_team(this) == fm_get_user_team(attacker)))
return HAM_IGNORED;
if(damage > BACKSTAB_MAX_DAMAGE)
{
SetHamParamFloat(4, BACKSTAB_MAX_DAMAGE);
}
return HAM_HANDLED;
}
stock fm_trace_target(ignoreent, const Float:start[3], distance)
{
new Float:fAim[3], Float:end[3];
velocity_by_aim(ignoreent, distance, fAim);
end[0] = start[0] + fAim[0];
end[1] = start[1] + fAim[1];
end[2] = start[2] + fAim[2];
engfunc(EngFunc_TraceLine, start, end, ignoreent == -1 ? 1 : 0, ignoreent, 0);
new ent = get_tr2(0, TR_pHit);
return pev_valid(ent) ? ent : 0;
}