Hardly tested. For now knife is not supported as I ran out of time, but I can add it if needed.
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <nvault>
new const Version[] = "0.1";
const m_LastHitGroup = 75;
const UnsupportedWeaponBits = ( ( 1 << CSW_GLOCK ) | ( 1 << CSW_HEGRENADE ) | ( 1 << CSW_C4 ) | ( 1 << CSW_SMOKEGRENADE ) | ( 1 << CSW_FLASHBANG ) | ( 1 << CSW_KNIFE ) );
new g_WeaponBits;
new g_Vault;
public plugin_init()
{
register_plugin( "Headshot Kill Weapons" , Version , "bugsy" );
RegisterHam( Ham_TakeDamage , "player" , "HamTakeDamage" );
register_clcmd( "say hsweapon" , "ManageWeaponsMenu" , ADMIN_KICK , "- Menu to manage Headshot Kill Weapons" );
if ( ( g_Vault = nvault_open( "hs_kill" ) ) == INVALID_HANDLE )
set_fail_state( "Error opening vault [hs_kill.vault]" );
else
g_WeaponBits = nvault_get( g_Vault , "WeaponBits" );
}
public plugin_end()
{
new szWeaponBits[ 13 ];
num_to_str( g_WeaponBits , szWeaponBits , charsmax( szWeaponBits ) );
nvault_set( g_Vault , "WeaponBits" , szWeaponBits );
nvault_close( g_Vault );
}
public HamTakeDamage( iVictim , iInflictor , iAttacker , Float:fDamage , bitDamage )
{
if ( ( get_pdata_int( iVictim , m_LastHitGroup ) == HIT_HEAD ) && ( bitDamage & DMG_BULLET ) )
{
if ( is_user_alive( iAttacker ) && ( g_WeaponBits & ( 1 << cs_get_user_weapon( iAttacker ) ) ) )
{
SetHamParamFloat( 4 , 999.0 );
return HAM_HANDLED;
}
}
return HAM_IGNORED;
}
public ManageWeaponsMenu( id , level , cid )
{
if( !cmd_access( id , level , cid , 1 ) )
return PLUGIN_HANDLED;
ManageWeapons( id , 0 );
return PLUGIN_HANDLED;
}
public ManageWeapons( id , iMenuPage )
{
new szWeapon[ 19 ] , szMenuItem[ 32 ] , iPos , szIndex[ 3 ] , iMenu = menu_create( "Manage Headshot Kill Weapons" , "WeaponHandler" );
for ( new iWeaponID = 1 ; iWeaponID < CSW_VEST ; iWeaponID++ )
{
if ( !( UnsupportedWeaponBits & ( 1 << iWeaponID ) ) )
{
iPos = get_weaponname( iWeaponID , szWeapon , charsmax( szWeapon ) );
formatex( szMenuItem , charsmax( szMenuItem ) - iPos , "%s - %s" , szWeapon[ 7 ] , g_WeaponBits & ( 1 << iWeaponID ) ? "On" : "Off" );
num_to_str( iWeaponID , szIndex , charsmax( szIndex ) );
menu_additem( iMenu , szMenuItem , szIndex );
}
}
menu_display( id , iMenu , iMenuPage );
}
public WeaponHandler( id , iMenu , iItem )
{
if ( iItem == MENU_EXIT )
{
menu_destroy( iMenu );
}
else
{
new iMenuPage , iNewMenu , szInfo[ 3 ] , iWeaponID;
player_menu_info( id , iMenu , iNewMenu , iMenuPage );
menu_item_getinfo( iMenu , iItem , _, szInfo , charsmax( szInfo ) );
iWeaponID = str_to_num( szInfo );
if ( g_WeaponBits & ( 1 << iWeaponID ) )
g_WeaponBits &= ~( 1 << iWeaponID );
else
g_WeaponBits |= ( 1 << iWeaponID );
ManageWeapons( id , iMenuPage );
}
}