Code:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#define PLUGIN "Anti Behind"
#define VERSION "1.1"
#define AUTHOR "Bobs"
#define fm_get_user_team(%1) get_pdata_int(%1, FM_OFFSET_TEAM)
#define FM_OFFSET_TEAM 114
#define BACKSTAB_ANGLE 93.0
#define BACKSTAB_MAX_DAMAGE 0.0
new gMaxPlayers;
new bool:gBackStabing[33];
new cvar_respawn;
new pCvarAngleX;
new pCvarAngleY;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_forward(FM_CmdStart, "Fwd_CmdStart");
cvar_respawn = register_cvar("ab_respawn", "1");
pCvarAngleX = register_cvar("ab_angle_min", "93.0");
pCvarAngleY = register_cvar("ab_angle_max", "93.0");
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, iTemp;
get_uc(uc_handle, UC_ViewAngles, fViewAngles);
iButton = get_uc(uc_handle, UC_Buttons);
if(((iButton & IN_ATTACK) || (iButton & IN_ATTACK2)) && get_user_weapon(id, iTemp, iTemp) == CSW_KNIFE)
{
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);
new Float:fMinAngle, Float:fMaxAngle;
fMinAngle = get_pcvar_float(pCvarAngleX), fViewAngles[1] - BACKSTAB_ANGLE;
fMaxAngle = get_pcvar_float(pCvarAngleY), 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);
if(get_pcvar_num(cvar_respawn))
{
ExecuteHamB(Ham_CS_RoundRespawn, attacker)
}
}
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;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1030\\ f0\\ fs16 \n\\ par }
*/