AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
|
03-13-2010
, 14:46
Re: Connections Counter
|
#13
|
Edit: New version posted. Please report any bugs\requests.
Changelog:
v0.5- Option to use nVault or SQL (#define USE_SQL)
v0.4- Now using SQL
- Fixed bug where numbers were wrong (connections,playtime) or 'invalid number' error.
v0.3- Fixed bug where if a user changed his name his chat msgs would show only his name when he first connected.
- Tested Say\TeamSay and both work correctly; if you are dead, only dead people see your messages. If alive, everyone can see your messages. TeamSay rules apply for if you are alive or dead.
- Added cvar for all chat (cat_allchat, default 0\disabled)
- Comment: Tested plugin with 8 connections including multiple mapchanges and each time the plugin reported correct number of connections and play-time.
Code:
* You currently have 8 connections. [Status: Newbie]
* You have played on this server for: 30 minutes, 42 seconds
v0.2- PlayTime and\or connections being lost when value reaches 256.
- Alive players now cannot see dead players chat.
- Removed get_user_time() in client_disconnect().
PHP Code:
#define USE_SQL
#include < amxmodx >
#include < cstrike >
#if defined USE_SQL
#include < sqlx >
#else
#include < nvault >
#endif
const MAX_PLAYERS = 32;
new const Version[] = "0.5";
new const DataFileName[] = "PlayerData";
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[ 33 ]
}
new g_PData[ MAX_PLAYERS + 1 ][ PlayerData ];
new g_iConnectTime[ MAX_PLAYERS + 1 ];
new bool:g_bIsBot[ MAX_PLAYERS + 1 ];
#if defined USE_SQL
#define CREATE_DB "CREATE TABLE IF NOT EXISTS database ( key VARCHAR(128) NOT NULL, data VARCHAR(255) NOT NULL, timestamp INT(11) NOT NULL, PRIMARY KEY (key))"
#define SEARCH_DB "SELECT data,timestamp FROM database WHERE key='%s' LIMIT 1"
#define INSERT_DB "REPLACE INTO database (key,data,timestamp) VALUES ('%s','%s',%d)"
new Handle:g_iSQLTuple;
new g_szDBQueryCache[ 1024 ];
#else
new g_iVault;
#endif
new g_iMsgSayText;
new g_iMaxPlayers;
new g_pAllChat;
public plugin_init( )
{
register_plugin( "Connections and Time" , Version , "bugsy" );
register_clcmd( "say" , "HookSay" );
register_clcmd( "say_team" , "HookSay_Team" );
g_pAllChat = register_cvar( "cat_allchat" , "0" );
g_iMsgSayText = get_user_msgid( "SayText" );
g_iMaxPlayers = get_maxplayers();
}
public plugin_cfg()
{
#if defined USE_SQL
new szHost[ 64 ], szUser[ 32 ], szPassword[ 32 ];
get_cvar_string( "amx_sql_host" , szHost , 64 );
get_cvar_string( "amx_sql_user" , szUser , 32 );
get_cvar_string( "amx_sql_pass" , szPassword , 32 );
SQL_SetAffinity( "mysql" );
g_iSQLTuple = SQL_MakeDbTuple( szHost , szUser , szPassword , DataFileName );
formatex( g_szDBQueryCache , 1023 , CREATE_DB );
SQL_ThreadQuery( g_iSQLTuple , "DefaultHandle" , g_szDBQueryCache );
#else
g_iVault = nvault_open( DataFileName );
#endif
}
public plugin_end()
{
#if defined USE_SQL
SQL_FreeHandle( g_iSQLTuple );
#else
nvault_close( g_iVault );
#endif
}
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[][ AuthID ] ) );
#if defined USE_SQL
new iData[ 1 ];
iData[ 0 ] = id;
formatex( g_szDBQueryCache , 255 , SEARCH_DB , g_PData[ id ][ AuthID ] );
SQL_ThreadQuery( g_iSQLTuple , "SearchHandle" , g_szDBQueryCache , iData , sizeof( iData ) );
#else
static szData[ 128 ] , szConnections[ 5 ] , szStatus[ 2 ] , szPlayTime[ 8 ];
if ( nvault_get( g_iVault , g_PData[ id ][ AuthID ] , szData , charsmax( szData ) ) )
{
parse( szData , g_PData[ id ][ Name ] , charsmax( g_PData[][ Name ] ) ,
g_PData[ id ][ AuthID ] , charsmax( g_PData[][ AuthID ] ) ,
szConnections , charsmax( szConnections ) ,
szStatus , charsmax( szStatus ) ,
szPlayTime , charsmax( szPlayTime ) ,
g_PData[ id ][ LeaveMsg ] , charsmax( g_PData[][ LeaveMsg ] ) );
g_PData[ id ][ Connections ] = str_to_num( szConnections );
g_PData[ id ][ PlayTime ] = str_to_num( szPlayTime );
}
g_PData[ id ][ Connections ]++;
g_iConnectTime[ id ] = get_systime();
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;
}
}
get_user_name( id , g_PData[ id ][ Name ] , charsmax( g_PData[][ Name ] ) );
set_task( 6.0 , "ShowJoinMsg" , id );
#endif
return PLUGIN_CONTINUE;
}
public client_infochanged(id)
{
static szNewName[ 33 ];
get_user_info( id , "name" , szNewName , 32 );
if ( !equal( g_PData[ id ][ Name ] , szNewName ) )
copy( g_PData[ id ][ Name ] , charsmax( g_PData[][ Name ] ) , szNewName );
}
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 , 1 , szMessage );
}
public client_disconnect( id )
{
static szMessage[ 128 ];
if ( g_bIsBot[ id ] )
return PLUGIN_CONTINUE;
remove_task( id );
g_PData[ id ][ PlayTime ] += ( get_systime() - g_iConnectTime[ id ] );
formatex( szMessage , charsmax( szMessage ) , "^"%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 ] );
#if defined USE_SQL
formatex( g_szDBQueryCache , 511 , INSERT_DB , g_PData[ id ][ AuthID ] , szMessage , get_systime() );
SQL_ThreadQuery( g_iSQLTuple , "DefaultHandle" , g_szDBQueryCache );
#else
nvault_set( g_iVault , g_PData[ id ][ AuthID ] , szMessage );
#endif
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;
g_iConnectTime[ id ] = 0;
return PLUGIN_CONTINUE;
}
public HookSay( id )
{
static szMessage[ 256 ] , szMsgSaid[ 256 ];
new bool:bIsAlive , bool:bAllChat;
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[][ LeaveMsg ] ) , 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_systime() - g_iConnectTime[ 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;
}
bIsAlive = bool:!!is_user_alive( id );
bAllChat = bool:!!get_pcvar_num( g_pAllChat );
if ( bIsAlive )
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 );
for ( new iPlayer = 1 ; iPlayer <= g_iMaxPlayers ; iPlayer++ )
if ( is_user_connected( iPlayer ) &&
( bAllChat || ( bIsAlive || ( !bIsAlive && !is_user_alive( iPlayer ) ) ) ) )
Print( iPlayer , id , szMessage );
return PLUGIN_HANDLED;
}
public HookSay_Team( id )
{
static szMessage[ 256 ] , szMsgSaid[ 256 ];
new CsTeams:iTeam , bool:bIsAlive , bool:bAllChat;
read_args( szMsgSaid , charsmax( szMsgSaid ) );
remove_quotes( szMsgSaid );
iTeam = cs_get_user_team( id );
bIsAlive = bool:!!is_user_alive( id );
bAllChat = bool:!!get_pcvar_num( g_pAllChat );
if ( bIsAlive || ( 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 );
for ( new iPlayer = 1 ; iPlayer <= g_iMaxPlayers ; iPlayer++ )
if ( ( is_user_connected( iPlayer ) && ( cs_get_user_team( iPlayer ) == iTeam ) ) &&
( bAllChat || ( bIsAlive || ( !bIsAlive && !is_user_alive( iPlayer ) ) ) ) )
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();
}
#if defined USE_SQL
public SearchHandle( FailState , Handle:Query , Error[] , Errcode , Data[] , DataSize )
{
if ( FailState == TQUERY_CONNECT_FAILED )
return set_fail_state( "Could not connect to SQL database." );
else if ( FailState == TQUERY_QUERY_FAILED )
return set_fail_state( "SQL Query failed." );
if ( Errcode )
return log_amx( "SQL Error on query: %s" , Error );
static szData[ 128 ] , szConnections[ 5 ] , szStatus[ 2 ] , szPlayTime[ 8 ];
new id = Data[ 0 ];
if ( SQL_MoreResults( Query ) )
{
SQL_ReadResult( Query , 0 , szData , charsmax( szData ) );
parse( szData , g_PData[ id ][ Name ] , charsmax( g_PData[][ Name ] ) ,
g_PData[ id ][ AuthID ] , charsmax( g_PData[][ AuthID ] ) ,
szConnections , charsmax( szConnections ) ,
szStatus , charsmax( szStatus ) ,
szPlayTime , charsmax( szPlayTime ) ,
g_PData[ id ][ LeaveMsg ] , charsmax( g_PData[][ LeaveMsg ] ) );
g_PData[ id ][ Connections ] = str_to_num( szConnections );
g_PData[ id ][ PlayTime ] = str_to_num( szPlayTime );
}
g_PData[ id ][ Connections ]++;
g_iConnectTime[ id ] = get_systime();
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;
}
}
get_user_name( id , g_PData[ id ][ Name ] , charsmax( g_PData[][ Name ] ) );
set_task( 6.0 , "ShowJoinMsg" , id );
return PLUGIN_CONTINUE;
}
public DefaultHandle( FailState , Handle:Query , Error[] , Errcode , Data[] , DataSize )
{
if ( FailState == TQUERY_CONNECT_FAILED )
return set_fail_state( "Could not connect to SQL database." );
else if ( FailState == TQUERY_QUERY_FAILED )
return set_fail_state( "SQL Query failed." );
if ( Errcode )
return log_amx( "SQL Error on query: %s" , Error );
return PLUGIN_CONTINUE;
}
#endif
__________________
Last edited by Bugsy; 03-21-2010 at 16:48.
|
|