PHP Code:
#include < amxmodx >
#include < cstrike >
#include < nvault >
const MAX_PLAYERS = 32;
new const Version[] = "0.1";
new const VaultName[] = "ConnectData";
enum ConnectionStatus
{
Newbie,
SemiPro,
Pro,
Veteran
}
new const StatusDescription[ ConnectionStatus ][] =
{
"Newbie",
"Semi-Pro",
"Pro",
"Veteran"
};
enum StatusLevelRange
{
Floor,
Ceiling
}
new const StatusLevels[ ConnectionStatus ][ StatusLevelRange ] =
{
{ 0 , 100 },
{ 101 , 500 },
{ 501 , 750 },
{ 751 , 99999 }
};
new const Teams[ CsTeams ][] =
{
"(Unassigned)",
"(Terrorist)",
"(Counter-Terrorist)",
"(Spectator)"
};
enum PlayerData
{
Name[ 33 ],
AuthID[ 35 ],
Connections,
Status,
PlayTime,
LeaveMsg[ 128 ]
}
new g_PData[ MAX_PLAYERS + 1 ][ PlayerData ];
new bool:g_bIsBot[ MAX_PLAYERS + 1 ];
new g_iVault;
new g_iMsgSayText;
const g_MaxNumber = 0x7FFFFFF;
const g_DummyChar = '0';
new szLoadSaveBuffer[ (sizeof( g_PData[] ) * 4) + 1 ];
new pCvar_AllChat;
public plugin_init( )
{
register_plugin( "Connections and Time" , Version , "bugsy" );
register_clcmd( "say" , "HookSay" );
register_clcmd( "say_team" , "HookSay_Team" );
pCvar_AllChat = register_cvar( "amx_allchat", "0" );
g_iMsgSayText = get_user_msgid( "SayText" );
g_iVault = nvault_open( VaultName );
}
public plugin_end()
{
nvault_close( g_iVault );
}
public client_putinserver( id )
{
g_bIsBot[ id ] = bool:!!is_user_bot( id );
if ( g_bIsBot[ id ] )
return PLUGIN_CONTINUE;
get_user_authid( id , g_PData[ id ][ AuthID ] , charsmax( g_PData[] ) );
if ( nvault_get( g_iVault , g_PData[ id ][ AuthID ] , szLoadSaveBuffer , charsmax( szLoadSaveBuffer ) ) )
LoadArray( szLoadSaveBuffer , charsmax( szLoadSaveBuffer ) , g_PData[ id ][ PlayerData:0 ] );
/*server_print( "%s %s %d %d %d %s" , g_PData[ id ][ Name ] ,
g_PData[ id ][ AuthID ] ,
g_PData[ id ][ Connections ] ,
g_PData[ id ][ Status ] ,
g_PData[ id ][ PlayTime ] ,
g_PData[ id ][ LeaveMsg ] );*/
get_user_name( id , g_PData[ id ][ Name ] , charsmax( g_PData[] ) );
g_PData[ id ][ Connections ]++;
for ( new ConnectionStatus:i = Newbie ; i < Veteran ; i++ )
{
if ( StatusLevels[ i ][ Floor ] <= g_PData[ id ][ Connections ] <= StatusLevels[ i ][ Ceiling ] )
{
g_PData[ id ][ Status ] = _:i;
break;
}
}
set_task( 7.0 , "ShowJoinMsg" , id );
return PLUGIN_CONTINUE;
}
public ShowJoinMsg( id )
{
static szMessage[ 128 ];
formatex( szMessage , charsmax( szMessage) , "^x04* ^x03%s has joined with^x04 %d^x03 connections. [^x04Status: %s^x03]" , g_PData[ id ][ Name ] , g_PData[ id ][ Connections ], StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] );
Print( 0 , id , szMessage );
}
public client_disconnect( id )
{
if ( g_bIsBot[ id ] )
return PLUGIN_CONTINUE;
static szMessage[ 128 ];
remove_task( id );
g_PData[ id ][ PlayTime ] += get_user_time( id );
SaveArray( g_PData[ id ][ PlayerData:0 ] , sizeof( g_PData[] ) , szLoadSaveBuffer );
nvault_set( g_iVault , g_PData[ id ][ AuthID ] , szLoadSaveBuffer );
if( ConnectionStatus:g_PData[ id ][ Status ] == Veteran )
{
formatex( szMessage , charsmax( szMessage ) , "^x04* ^x03Veteran: %s has left the server. [^x04Message: %s^x03]" , g_PData[ id ][ Name ] , g_PData[ id ][ LeaveMsg ] );
Print( 0 , 1 , szMessage );
}
g_PData[ id ][ Name ][ 0 ] = EOS;
g_PData[ id ][ AuthID ][ 0 ] = EOS;
g_PData[ id ][ Connections ] = 0;
g_PData[ id ][ Status ] = 0;
g_PData[ id ][ PlayTime ] = 0;
g_PData[ id ][ LeaveMsg ][ 0 ] = EOS;
return PLUGIN_CONTINUE;
}
public HookSay( id )
{
static szMessage[ 256 ] , szMsgSaid[ 256 ];
read_args( szMsgSaid , charsmax( szMsgSaid ) );
remove_quotes( szMsgSaid );
// /leavemsg
if( ConnectionStatus:g_PData[ id ][ Status ] == Veteran )
{
if( szMsgSaid[ 0 ] == '/' && szMsgSaid[ 2 ] == 'e' && szMsgSaid[ 4 ] == 'v' && szMsgSaid[ 6 ] == 'm' )
{
new Arg[ 64 ];
strbreak( szMsgSaid , szMsgSaid , 95 , Arg , 63 );
remove_quotes( Arg );
if( !Arg[ 0 ] )
{
if( g_PData[ id ][ LeaveMsg ][ 0 ] )
{
client_print( id, print_chat, "* Your current leave message is ^"%s^"" , g_PData[ id ][ LeaveMsg ] );
}
else
{
client_print( id, print_chat, "* You haven't set a leave message yet. To do so, type /leavemsg ^"message^"." );
}
}
else if( equali( Arg , "remove" ) )
{
g_PData[ id ][ LeaveMsg ][ 0 ] = EOS;
client_print( id, print_chat, "* Your leave message was removed." );
}
else
{
copy( g_PData[ id ][ LeaveMsg ] , charsmax( g_PData[] ) , Arg );
client_print( id , print_chat , "* Your leave message has been set to ^"%s^"", Arg );
}
return PLUGIN_HANDLED;
}
}
// /playtime
if ( szMsgSaid[ 0 ] == '/' && szMsgSaid[ 1 ] == 'p' && szMsgSaid[ 4 ] == 'y' && szMsgSaid[ 7 ] == 'm' )
{
new iHours , iDays , iMinutes , iCurTime;
static szPlayTime[ 128 ] , iPos;
formatex( szMessage , charsmax( szMessage) , "^x04*^x03 You currently have^x04 %d^x03 connections. [^x04Status: %s^x03]" , g_PData[ id ][ Connections ] , StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] );
Print( id , id , szMessage );
iCurTime = g_PData[ id ][ PlayTime ] + get_user_time( id );
iPos = 0;
if ( iCurTime >= 86400 )
{
iDays = iCurTime / 86400;
iCurTime -= iDays * 86400;
iPos = formatex( szPlayTime , charsmax( szPlayTime ) , "%d days, " , iDays );
}
if ( iCurTime >= 3600 )
{
iHours = iCurTime / 3600;
iCurTime -= iHours * 3600;
iPos += formatex( szPlayTime[ iPos ] , charsmax( szPlayTime ) - iPos , "%d hour%s, " , iHours , iHours > 1 ? "s" : "" );
}
if ( iCurTime >= 60 )
{
iMinutes = iCurTime / 60;
iCurTime -= iMinutes * 60;
iPos += formatex( szPlayTime[ iPos ] , charsmax( szPlayTime ) - iPos , "%d minute%s, " , iMinutes , iMinutes > 1 ? "s" : "" );
}
if ( iCurTime )
{
iPos += formatex( szPlayTime[ iPos ] , charsmax( szPlayTime ) - iPos , "%d second%s, " , iCurTime , iCurTime > 1 ? "s" : "" );
}
szPlayTime[ iPos - 2 ] = EOS;
formatex( szMessage , charsmax( szMessage ) , "^x04*^x03 You have played on this server for:^x04 %s", szPlayTime );
Print( id , id , szMessage );
return PLUGIN_HANDLED;
}
if ( !szMsgSaid[ 0 ] || szMsgSaid[0] == '@' || szMsgSaid[0] == '/' || szMsgSaid[0] == '!' )
return PLUGIN_CONTINUE;
if ( is_user_alive( id ) )
formatex( szMessage , charsmax( szMessage ) , "^x04[%s]^x03 %s^x01 : %s", StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] , g_PData[ id ][ Name ] , szMsgSaid );
else
formatex( szMessage , charsmax( szMessage ) , "^x04[%s]^x01 %s^x03 %s^x01 : %s", StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] , ( cs_get_user_team( id ) != CS_TEAM_SPECTATOR ) ? "*DEAD*" : "*SPEC*" , g_PData[ id ][ Name ] , szMsgSaid );
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum, get_pcvar_num( pCvar_AllChat ) ? "" : ( is_user_alive( id ) ? "a" : "b" ) );
for( new i = 0, iPlayer; i < iNum; i++ )
Print( iPlayers[ i ], id, szMessage );
return PLUGIN_HANDLED;
}
public HookSay_Team( id )
{
static szMessage[ 256 ] , szMsgSaid[ 256 ];
new CsTeams:iTeam;
read_args( szMsgSaid , charsmax( szMsgSaid ) );
remove_quotes( szMsgSaid );
iTeam = cs_get_user_team( id );
if ( !szMsgSaid[ 0 ] || szMsgSaid[0] == '@' || szMsgSaid[0] == '/' || szMsgSaid[0] == '!' )
return PLUGIN_CONTINUE;
if ( is_user_alive( id ) || ( iTeam == CS_TEAM_SPECTATOR ) )
formatex( szMessage , charsmax( szMessage ) , "^x04[%s]^x01 %s^x03 %s^x01 : %s", StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] , Teams[ iTeam ] , g_PData[ id ][ Name ] , szMsgSaid );
else
formatex( szMessage , charsmax( szMessage ) , "^x04[%s]^x01 *DEAD* %s^x03 %s^x01 : %s", StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] , Teams[ iTeam ], g_PData[ id ][ Name ] , szMsgSaid );
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum, get_pcvar_num( pCvar_AllChat ) ? "" : ( is_user_alive( id ) ? "a" : "b" ) );
for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];
if( cs_get_user_team( iPlayer ) == iTeam )
Print( iPlayer, id, szMessage );
}
return PLUGIN_HANDLED;
}
Print( id , colorid , szMessage[] )
{
message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, g_iMsgSayText, {0,0,0} , id );
write_byte( colorid );
write_string( szMessage );
message_end();
}
SaveArray( const SourceArray[] , iSize , DestString[] )
{
new iPos = -1 , SourceTmp[ 1 ];
for ( new i = 0 ; i < iSize ; i++ )
{
if ( ( SourceArray[ i ] > g_MaxNumber ) || ( SourceArray[ i ] < -g_MaxNumber ) )
return 0;
SourceTmp[ 0 ] = SourceArray[ i ];
++iPos;
if ( SourceTmp[ 0 ] < 0 )
{
DestString[ iPos ] = ( 1 << 3 );
SourceTmp[ 0 ] *= -1;
}
DestString[ iPos ] |= SourceTmp{ 0 } ? 0 : ( 1 << 4 );
DestString[ iPos ] |= SourceTmp{ 1 } ? 0 : ( 1 << 5 );
DestString[ iPos ] |= SourceTmp{ 2 } ? 0 : ( 1 << 6 );
DestString[ iPos ] |= SourceTmp{ 3 } ? 0 : ( 1 << 7 );
DestString[ iPos ] |= SourceTmp{ 0 };
DestString[ ++iPos ] = SourceTmp{ 1 } ? SourceTmp{ 1 } : g_DummyChar;
DestString[ ++iPos ] = SourceTmp{ 2 } ? SourceTmp{ 2 } : g_DummyChar;
DestString[ ++iPos ] = SourceTmp{ 3 } ? SourceTmp{ 3 } : g_DummyChar;
}
return 1;
}
LoadArray( const SourceString[] , iLen , DestArray[] )
{
new iPos = -1;
for ( new i = 0 ; i < iLen ; i += 4 )
{
DestArray{ ++iPos } = ( SourceString[ i ] & ( 1 << 4 ) ) ? 0 : SourceString[ i ] & ~0xF8;
DestArray{ ++iPos } = ( SourceString[ i ] & ( 1 << 5 ) ) ? 0 : SourceString[ i + 1 ];
DestArray{ ++iPos } = ( SourceString[ i ] & ( 1 << 6 ) ) ? 0 : SourceString[ i + 2 ];
DestArray{ ++iPos } = ( SourceString[ i ] & ( 1 << 7 ) ) ? 0 : SourceString[ i + 3 ];
DestArray[ ( i / 4 ) ] *= ( SourceString[ i ] & ( 1 << 3 ) ) ? -1 : 1;
}
return 1;
}