#include < amxmodx >
#include < cstrike >
#include < nvault >
 
        const MAX_PLAYERS = 32;
 
        new const Plugin[] = "ConnectionsRanks";
        new const Version[] = "5.0";
        new const Authors[] = "Excolent,fLy JumpeR*";
        new const DataFileName[] = "ConStats";
 
        enum ConnectionStatus
        {
    Noob,
    Beginner,
    Learning,
    Knifer,
    Rambo,
    Butcher,
    Matrix,
    Probhop,
    Freak,
    Racer,
    Kill_Bill,
    Respected_Player 
 
        }
 
        new const StatusDescription[ ConnectionStatus ][] = 
        {
        "[Noob]",
        "[Halado]",
        "[Bot]",
        "[Sötét]",
        "[Rambo]",
        "[Kezdő]",
        };
 
        new const StatusLevels[ ConnectionStatus ] = 
        {
    25,
    50,
    100,
    200,
    300,
    500,
    650,
    850,
    1000,
    1200,
    1450,
    1700
 
        }
 
        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 ]; 
        new g_iVault;
 
        new g_iMsgSayText;
        new g_iMaxPlayers;
        new g_pAllChat;
 
        public plugin_init( )
        {
           register_plugin( Plugin , Version , Authors);
 
           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()
           g_iVault = nvault_open( DataFileName );
 
        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[][ AuthID ] ) );
 
           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();
 
              {
          }
       }
        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 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 ] );
 
           nvault_set( g_iVault , g_PData[ id ][ AuthID ] , szMessage );
 
           {
              formatex( szMessage , charsmax( szMessage ) , "^x04[Rank System] ^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 );
 
           {
              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 , "^x04[Rank System] ^x03Your current leave message is ^x04^"%s^"" , g_PData[ id ][ LeaveMsg ] );
                    }
                    else
                    {
                       client_print( id , print_chat , "^x04[Rank System] ^x03You 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 , "^x04[Rank System] ^x03 Your leave message was removed." );
                 }
                 else
                 {
                    copy( g_PData[ id ][ LeaveMsg ] , charsmax( g_PData[][ LeaveMsg ] ) , Arg );
                    client_print( id , print_chat , "^x04[Rank System] ^x03 Your leave message has been set to ^x04 ^"%s^"" , Arg );
                 }
                 return PLUGIN_HANDLED;
              }
           }
 
           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[Rank System] ^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[Rank System] ^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 ) , "^x01%s^x04[%s]^x03 %s^x01 :  %s", ( cs_get_user_team( id ) != CS_TEAM_SPECTATOR ) ? "*DEAD*" : "*SPEC*" , StatusDescription[ ConnectionStatus:g_PData[ id ][ Status ] ] , 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 ) , "*DEAD* ^x04[%s]^x01 %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();
        }