By request, removed HUD and changed to chat prints for only the player getting moved to spec and/or slayed. Untested.
PHP Code:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
new const Version[] = "0.7";
#define MAX_PLAYERS 32
const ButtonBits = ( IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT | IN_JUMP | IN_DUCK | IN_USE | IN_ATTACK | IN_ATTACK2 | IN_SCORE );
enum PlayerData
{
Float:DistanceTraveled,
LastMoveTime,
LastPositionChange,
SlayCount
}
new g_pdData[ MAX_PLAYERS + 1 ][ PlayerData ] , Float:g_fLastOrigin[ MAX_PLAYERS + 1 ][ 3 ];
new g_iSysTime , bool:g_bInRound;
new g_pSlayTime , g_pSlayMode , g_pSpecSlays , g_pVerboseMode , g_pDistanceThreshold , g_pFreezeTime;
public plugin_init()
{
register_plugin( "AFK Slay" , Version , "bugsy" );
g_pSlayTime = register_cvar( "as_slaytime" , "30" );
g_pSlayMode = register_cvar( "as_slaymode" , "2" );
g_pSpecSlays = register_cvar( "as_spectatorslays" , "5" );
g_pVerboseMode = register_cvar( "as_verbosemode" , "1" );
g_pDistanceThreshold = register_cvar( "as_distancethreshold" , "100000" );
g_pFreezeTime = get_cvar_pointer( "mp_freezetime" );
RegisterHam( Ham_Spawn , "player" , "HamSpawn_Post" , true );
register_forward( FM_CmdStart , "CmdStart" );
register_logevent( "RoundStart" , 2 , "1=Round_Start" );
register_logevent( "RoundEnd" , 2 , "1=Round_End" );
set_task( 1.0 , "CheckAFK" , .flags="b" );
}
public client_connect( id )
{
g_pdData[ id ][ SlayCount ] = 0;
}
public HamSpawn_Post( iPlayer )
{
if ( is_user_alive( iPlayer ) )
{
pev( iPlayer , pev_origin , g_fLastOrigin[ iPlayer ] );
g_pdData[ iPlayer ][ DistanceTraveled ] = 0.0;
g_pdData[ iPlayer ][ LastMoveTime ] = g_iSysTime + ( g_bInRound ? 0 : get_pcvar_num( g_pFreezeTime ) );
g_pdData[ iPlayer ][ LastPositionChange ] = g_pdData[ iPlayer ][ LastMoveTime ];
}
}
public RoundStart()
{
g_bInRound = true;
}
public RoundEnd()
{
g_bInRound = false;
}
public CmdStart( id , handle , seed )
{
static Float:fOrigin[ 3 ];
if ( g_bInRound && ( get_uc( handle , UC_Buttons ) & ButtonBits ) )
{
if ( g_fLastOrigin[ id ][ 0 ] )
{
pev( id , pev_origin , fOrigin );
if ( ( g_fLastOrigin[ id ][ 0 ] != fOrigin[ 0 ] ) || ( g_fLastOrigin[ id ][ 1 ] != fOrigin[ 1 ] ) )
{
g_pdData[ id ][ LastPositionChange ] = get_systime();
}
g_pdData[ id ][ DistanceTraveled ] += get_distance_f( g_fLastOrigin[ id ] , fOrigin );
}
g_pdData[ id ][ LastMoveTime ] = g_iSysTime;
g_pdData[ id ][ SlayCount ] = 0;
}
}
public CheckAFK()
{
new iPlayers[ 32 ] , iNum , iPlayer , szName[32 ] , iVerbose , iSlayTime;
iVerbose = get_pcvar_num( g_pVerboseMode );
g_iSysTime = get_systime();
iSlayTime = get_pcvar_num( g_pSlayTime );
switch ( get_pcvar_num( g_pSlayMode ) )
{
case 1: get_players( iPlayers , iNum , "ae" , "TERRORIST" );
case 2: get_players( iPlayers , iNum , "ae" , "CT" );
default: get_players( iPlayers , iNum , "a" );
}
for ( new i = 0 ; i < iNum ; i++ )
{
iPlayer = iPlayers[ i ];
pev( iPlayer , pev_origin , g_fLastOrigin[ iPlayer ] );
if ( g_pdData[ iPlayer ][ LastMoveTime ] )
{
if (
( ( g_iSysTime - g_pdData[ iPlayer ][ LastMoveTime ] ) >= iSlayTime ) ||
( ( g_pdData[ iPlayer ][ DistanceTraveled ] < get_pcvar_num( g_pDistanceThreshold ) ) && ( g_iSysTime - g_pdData[ iPlayer ][ LastPositionChange ] ) >= iSlayTime ) )
{
user_kill( iPlayer );
if ( iVerbose )
get_user_name( iPlayer , szName , charsmax( szName ) );
if ( ++g_pdData[ iPlayer ][ SlayCount ] >= get_pcvar_num( g_pSpecSlays ) )
{
cs_set_user_team( iPlayer , CS_TEAM_SPECTATOR );
if ( iVerbose )
client_print_color( iPlayer , 0 , "^4[Fusion - Deathrun] ^1Moved to Spectator for being AFK." );
}
else
{
if ( iVerbose )
client_print_color( iPlayer , 0 , "^4[Fusion - Deathrun] ^1Slayed for being AFK." );
}
}
}
}
}