#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 //Changeable
#define BACKSTAB_MAX_DAMAGE 0.0 //Changeable
#define FFADE_IN 0x0000
#define FFADE_OUT 0x0001
new gmsgScreenFade;
new gMaxPlayers;
new bool:gBackStabing[33];
new cvar_slap;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_forward(FM_CmdStart, "Fwd_CmdStart");
cvar_slap = register_cvar("ab_slap", "1");
RegisterHam(Ham_TakeDamage, "player", "Event_TakeDamage");
gMaxPlayers = global_get(glb_maxClients);
gmsgScreenFade = get_user_msgid("ScreenFade");
}
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);
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);
set_task(0.1, "FadeScreenAttacker", attacker);
set_task(0.1, "FadeScreenVictim", this);
}
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;
}
public FadeScreenAttacker(idattacker)
{
if(!is_user_connected(idattacker))
{
return PLUGIN_HANDLED;
}
if(get_pcvar_num(cvar_slap))
{
user_slap(idattacker, 0);
user_slap(idattacker, 0);
user_slap(idattacker, 0);
}
message_begin(MSG_ONE, gmsgScreenFade, {0,0,0}, idattacker);
write_short(2000); // Timer ex: 1000 = 1 sec
write_short(2000); // Timer ex: 1000 = 1 sec
write_short(FFADE_IN);
write_byte(139); // Red
write_byte(26); // Green
write_byte(26); // Blue
write_byte(255); // Transperency
message_end();
return PLUGIN_HANDLED;
}
public FadeScreenVictim(id)
{
if(!is_user_connected(id))
{
return PLUGIN_HANDLED;
}
message_begin(MSG_ONE, gmsgScreenFade, {0,0,0}, id);
write_short(600); // Timer ex: 1000 = 1 sec
write_short(600); // Timer ex: 1000 = 1 sec
write_short(FFADE_IN);
write_byte(20); // Red
write_byte(20); // Green
write_byte(255); // Blue
write_byte(175); // Transperency
message_end();
return PLUGIN_HANDLED
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1030\\ f0\\ fs16 \n\\ par }
*/