//==============================================================//
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define IsPlayer(%1) (1<= %1 <= g_iMaxPlayers)
new mode, hitchest, knife, bool:gBotsRegistered, g_iMaxPlayers;
public plugin_init()
{
register_plugin("Headshot Modes", "1.2", "=(GrG)= Doc Holiday");
RegisterHam(Ham_TraceAttack, "player", "HamTraceAttack");
mode = register_cvar("nhs_mode", "2");
hitchest = register_cvar("nhs_chest", "0");
knife = register_cvar("nhs_knife", "1");
g_iMaxPlayers = get_maxplayers();
}
public client_authorized( id )
{
if( !gBotsRegistered && is_user_bot( id ) )
{
set_task( 0.1, "register_bots", id );
}
}
public register_bots( id )
{
if( !gBotsRegistered && is_user_connected( id ) )
{
RegisterHamFromEntity( Ham_TraceAttack, id, "HamTraceAttack");
gBotsRegistered = true;
}
}
public HamTraceAttack(Vic, Att, Float:dmg, Float:dir[3], traceresult, dmgbits)
{
if(!IsPlayer(Att) || !IsPlayer(Vic) || Vic == Att)
return HAM_IGNORED;
if(get_pcvar_num(knife))
{
if( get_user_weapon( Att ) == CSW_KNIFE )
return HAM_IGNORED;
}
switch(get_pcvar_num(mode))
{
case 1: // Blocks bots from shooting humans in the head
{
if(!is_user_bot(Vic) && is_user_bot(Att))
{
if(get_pcvar_num(hitchest))
{
if(get_tr2(traceresult, TR_iHitgroup) == HIT_HEAD)
{
set_tr2(traceresult, TR_iHitgroup, HIT_CHEST)
return HAM_HANDLED
}
}
else
{
return HAM_SUPERCEDE
}
}
}
case 2: // Blocks all headshots (Humans and bots)
{
if(get_pcvar_num(hitchest))
{
if(get_tr2(traceresult, TR_iHitgroup) == HIT_HEAD)
{
set_tr2(traceresult, TR_iHitgroup, HIT_CHEST)
return HAM_HANDLED
}
}
else
{
return HAM_SUPERCEDE
}
}
case 3: // Headshots Only (blocks all other hitzones)
{
if(get_tr2(traceresult, TR_iHitgroup) != HIT_HEAD)
{
return HAM_SUPERCEDE
}
}
case 4:
{
if(get_tr2(traceresult, TR_iHitgroup) != HIT_HEAD)
{
set_tr2(traceresult, TR_iHitgroup, HIT_HEAD)
return HAM_HANDLED
}
}
}
return HAM_IGNORED;
}