Code:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#define FBitSet(%0,%1) ( %0 |= ( 1 << ( %1 & 31 ) ) )
#define FBitClear(%0,%1) ( %0 &= ~( 1 << ( %1 & 31 ) ) )
#define FBitGet(%0,%1) ( %0 & ( 1 << ( %1 & 31 ) ) )
new IsArming;
#define ARM_TIMER 5
#define ARM_CHECK_INTERVAL 0.1
new HamHook:_CBasePlayer_ResetMaxSpeed, HamHook:_CBasePlayer_Killed;
new bool:g_bIsArmed, g_iMsgBarTime;
public plugin_init()
{
g_iMsgBarTime = get_user_msgid( "BarTime" );
DisableHamForward( _CBasePlayer_ResetMaxSpeed = RegisterHam( Ham_CS_Player_ResetMaxSpeed, "player", "CBasePlayer_ResetMaxSpeed" ) );
DisableHamForward( _CBasePlayer_Killed = RegisterHam( Ham_Killed, "player", "CBasePlayer_Killed" ) );
RegisterHam( Ham_Use, "func_button", "CButton_Use" );
}
public client_disconnect( id )
{
CheckArmingReset( id );
}
public CBasePlayer_ResetMaxSpeed( id )
{
CheckArmingReset( id );
}
public CBasePlayer_Killed( id )
{
CheckArmingReset( id );
}
public CButton_Use( iEnt, id )
{
static szName[ 32 ];
pev( iEnt, pev_targetname, szName, charsmax( szName ) );
if( equal( szName, "BombArm" ) )
{
if( !g_bIsArmed )
{
if( !IsArming )
{
FBitSet( IsArming, id );
set_pev( id, pev_fuser1, get_gametime() );
UTIL_BarTime( id, ARM_TIMER );
Task_CheckArming( id );
EnableHamForward( _CBasePlayer_ResetMaxSpeed );
EnableHamForward( _CBasePlayer_Killed );
}
else
{
client_print( id, print_chat, "Someone else is already arming the bomb!" );
return HAM_SUPERCEDE;
}
}
else return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public Task_CheckArming( id )
{
static Float:vVelocity[ 3 ];
pev( id, pev_velocity, vVelocity );
if( get_gametime() < pev( id, pev_fuser1 ) + ARM_TIMER + 0.5 )
{
if( FBitGet( IsArming, id ) && !vector_length( vVelocity ) && pev( id, pev_button ) & IN_USE )
set_task( ARM_CHECK_INTERVAL, "Task_CheckArming", id );
else CheckArmingReset( id );
}
else
{
CheckArmingReset( id );
g_bIsArmed = true;
client_print( 0, print_chat, "Device successfully armed!" );
}
}
CheckArmingReset( id )
{
if( FBitGet( IsArming, id ) )
{
FBitClear( IsArming, id );
DisableHamForward( _CBasePlayer_ResetMaxSpeed );
DisableHamForward( _CBasePlayer_Killed );
remove_task( id );
if( is_user_connected( id ) )
UTIL_BarTime( id, 0 );
}
}
UTIL_BarTime( id, iTime )
{
message_begin( MSG_ONE, g_iMsgBarTime, _, id );
write_short( iTime );
message_end();
}