PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <nvault_util>
#include <nvault_array>
new const Version[] = "0.8";
#define MAX_PLAYERS 32
new const VaultName[] = "PlayTimeVIP";
new const FortyEightHours = ( 86400 * 2 );
enum PlayerData
{
pdAuthID[ 34 ],
pdName[ 32 ],
pdConnectTime,
pdPlayTime,
bool:pdIgnorePlayer,
bool:pdIsVIP,
bool:pdIsBlackListed
}
new g_pdData[ MAX_PLAYERS + 1 ][ PlayerData ];
new g_Vault;
new g_AdminFlags;
public plugin_init()
{
register_plugin( "Play Time VIP" , Version , "bugsy" );
register_clcmd( "ptv_blacklist" , "Blacklist" );
register_clcmd( "ptv_removeblacklistmenu" , "RemoveBlacklistMenu" );
register_clcmd( "ptv_removevip" , "RemoveVIP" );
register_clcmd( "ptv_removevipmenu" , "RemoveVIPMenu" );
register_event( "HLTV" , "NewRound" , "a" , "1=0" , "2=0" );
g_AdminFlags = read_flags( "bcdefghijkmnopqrstu" );
g_Vault = nvault_open( VaultName );
}
public plugin_end()
{
nvault_close( g_Vault );
}
public client_authorized( id )
{
new iTS;
arrayset( g_pdData[ id ][ pdAuthID ][ 0 ] , 0 , sizeof( g_pdData[] ) );
if ( !( g_pdData[ id ][ pdIgnorePlayer ] = ( ( get_user_flags( id ) & g_AdminFlags ) || is_user_bot( id ) || is_user_hltv( id ) ) ) )
{
get_user_authid( id , g_pdData[ id ][ pdAuthID ] , charsmax( g_pdData[][ pdAuthID ] ) );
if ( nvault_get_array( g_Vault , g_pdData[ id ][ pdAuthID ] , g_pdData[ id ][ pdAuthID ][ 0 ] , sizeof( g_pdData[] ) , iTS ) )
{
if ( g_pdData[ id ][ pdPlayTime ] >= FortyEightHours )
{
remove_user_flags( id , ADMIN_USER );
set_user_flags( id , g_AdminFlags );
g_pdData[ id ][ pdIsVIP ] = true;
}
}
get_user_name( id , g_pdData[ id ][ pdName ] , charsmax( g_pdData[][ pdName ] ) );
g_pdData[ id ][ pdConnectTime ] = get_systime();
}
}
public client_disconnect( id )
{
if ( !g_pdData[ id ][ pdIgnorePlayer ] )
{
g_pdData[ id ][ pdPlayTime ] += ( get_systime() - g_pdData[ id ][ pdConnectTime ] );
nvault_set_array( g_Vault , g_pdData[ id ][ pdAuthID ] , g_pdData[ id ][ pdAuthID ][ 0 ] , sizeof( g_pdData[] ) );
}
}
public NewRound()
{
new iPlayers[ 32 ] , iNum , iPlayer , iSecondsNeededForVIP , szTime[ 64 ] , iSysTime;
get_players( iPlayers , iNum , "ch" );
for ( new i = 0 ; i < iNum ; i++ )
{
iPlayer = iPlayers[ i ];
if ( g_pdData[ iPlayer ][ pdIgnorePlayer ] == false )
{
iSysTime = get_systime();
if ( ( g_pdData[ iPlayer ][ pdIsVIP ] == false ) && ( ( g_pdData[ iPlayer ][ pdPlayTime ] + ( iSysTime - g_pdData[ iPlayer ][ pdConnectTime ] ) ) >= FortyEightHours ) )
{
remove_user_flags( iPlayer , ADMIN_USER );
set_user_flags( iPlayer , g_AdminFlags );
g_pdData[ iPlayer ][ pdIsVIP ] = true;
client_print( iPlayer , print_chat , "* You are now VIP!" , szTime );
continue;
}
if ( ( g_pdData[ iPlayer ][ pdIsVIP ] == false ) )
{
iSecondsNeededForVIP = FortyEightHours - ( g_pdData[ iPlayer ][ pdPlayTime ] + ( iSysTime - g_pdData[ iPlayer ][ pdConnectTime ] ) );
FormatTime( iSecondsNeededForVIP , szTime , charsmax( szTime ) );
client_print( iPlayer , print_chat , "* You must play an additional %s to get VIP." , szTime );
}
}
}
}
public Blacklist( id , level , cid )
{
if ( !cmd_access( id , level , cid , 1 ) )
return PLUGIN_HANDLED;
new szPlayer[ 32 ] , iPlayer;
read_argv( 1 , szPlayer , charsmax( szPlayer ) );
if ( ( iPlayer = cmd_target( id , szPlayer , ( CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS ) ) ) )
{
g_pdData[ iPlayer ][ pdIsBlackListed ] = true;
g_pdData[ iPlayer ][ pdPlayTime ] = 0;
remove_user_flags( iPlayer , g_AdminFlags );
set_user_flags( iPlayer , ADMIN_USER );
nvault_set_array( g_Vault , g_pdData[ iPlayer][ pdAuthID ] , g_pdData[ iPlayer ][ pdAuthID ][ 0 ] , sizeof( g_pdData[] ) );
client_print( iPlayer , print_chat , "* You have been blacklisted from getting VIP." );
}
return PLUGIN_HANDLED;
}
public RemoveVIP( id , level , cid )
{
if ( !cmd_access( id , level , cid , 1 ) )
return PLUGIN_HANDLED;
new szPlayer[ 32 ] , iPlayer;
read_argv( 1 , szPlayer , charsmax( szPlayer ) );
if ( ( iPlayer = cmd_target( id , szPlayer , ( CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS ) ) ) )
{
g_pdData[ iPlayer ][ pdIsVIP ] = false;
g_pdData[ iPlayer ][ pdPlayTime ] = 0;
remove_user_flags( iPlayer , g_AdminFlags );
set_user_flags( iPlayer , ADMIN_USER );
nvault_set_array( g_Vault , g_pdData[ iPlayer ][ pdAuthID ] , g_pdData[ iPlayer ][ pdAuthID ][ 0 ] , sizeof( g_pdData[] ) );
client_print( iPlayer , print_chat , "* Your VIP status has been removed." );
}
return PLUGIN_HANDLED;
}
public RemoveVIPMenu( id , level , cid )
{
if ( !cmd_access( id , level , cid , 0 ) )
return PLUGIN_HANDLED;
new iVault , iNum , iOffset , iMenu , szKey[ 34 ] , iTS;
new pdData[ PlayerData ] , bool:bAnyVIPs;
nvault_close( g_Vault );
g_Vault = nvault_open( VaultName );
iVault = nvault_util_open( VaultName );
iNum = nvault_util_count( iVault );
iMenu = menu_create( "Remove VIP" , "RemoveVIPMenuMenuHandler" );
for ( new i = 1 ; i <= iNum ; i++ )
{
iOffset = nvault_util_read_array( iVault , iOffset , szKey , charsmax( szKey ) , pdData[ pdAuthID ][ 0 ] , sizeof( pdData ) , iTS );
if ( pdData[ pdIsVIP ] == true )
{
menu_additem( iMenu , pdData[ pdName ] , _:pdData[ pdAuthID ][ 0 ] );
bAnyVIPs = true;
}
}
nvault_util_close( iVault );
if ( bAnyVIPs == true )
{
menu_display( id , iMenu );
}
else
{
client_print( id , print_chat , "* No players are VIP." );
}
return PLUGIN_HANDLED;
}
public RemoveVIPMenuMenuHandler( id , iMenu , iItem )
{
new iPlayers[ 32 ] , iNum , iPlayer , szName[ 32 ] , iAccess , iCB , pdData[ PlayerData ];
if ( iItem == MENU_EXIT )
{
menu_destroy( iMenu );
return;
}
menu_item_getinfo( iMenu , iItem , iAccess , pdData[ pdAuthID ][ 0 ] , sizeof( pdData ) , szName , charsmax( szName ) , iCB );
pdData[ pdIsVIP ] = false;
pdData[ pdPlayTime ] = 0;
nvault_set_array( g_Vault , pdData[ pdAuthID ] , pdData[ pdAuthID ][ 0 ] , sizeof( pdData[] ) );
get_players( iPlayers , iNum , "ch" );
for ( new i = 0 ; i < iNum ; i++ )
{
iPlayer = iPlayers[ i ];
if ( equal( pdData[ pdAuthID ] , g_pdData[ iPlayer ][ pdAuthID ] ) )
{
g_pdData[ iPlayer ][ pdIsVIP ] = false;
g_pdData[ iPlayer ][ pdPlayTime ] = 0;
remove_user_flags( iPlayer , g_AdminFlags );
set_user_flags( iPlayer , ADMIN_USER );
break;
}
}
client_print( id , print_chat , "* Removed %s from VIP list." , szName );
}
public RemoveBlacklistMenu( id , level , cid )
{
if ( !cmd_access( id , level , cid , 0 ) )
return PLUGIN_HANDLED;
new iVault , iNum , iOffset , iMenu , szKey[ 34 ] , iTS;
new pdData[ PlayerData ] , bool:bAnyBlacklisted;
nvault_close( g_Vault );
g_Vault = nvault_open( VaultName );
iVault = nvault_util_open( VaultName );
iNum = nvault_util_count( iVault );
iMenu = menu_create( "Remove Blacklist" , "RemoveBlacklistMenuMenuHandler" );
for ( new i = 1 ; i <= iNum ; i++ )
{
iOffset = nvault_util_read_array( iVault , iOffset , szKey , charsmax( szKey ) , pdData[ pdAuthID ][ 0 ] , sizeof( pdData ) , iTS );
if ( pdData[ pdIsBlackListed ] == true )
{
menu_additem( iMenu , pdData[ pdName ] , pdData[ pdAuthID ][ 0 ] );
bAnyBlacklisted = true;
}
}
nvault_util_close( iVault );
if ( bAnyBlacklisted == true )
{
menu_display( id , iMenu );
}
else
{
client_print( id , print_chat , "* No players are blacklisted." );
}
return PLUGIN_HANDLED;
}
public RemoveBlacklistMenuMenuHandler( id , iMenu , iItem )
{
new iPlayers[ 32 ] , iNum , iPlayer , szName[ 32 ] , iAccess , iCB , pdData[ PlayerData ];
if ( iItem == MENU_EXIT )
{
menu_destroy( iMenu );
return;
}
menu_item_getinfo( iMenu , iItem , iAccess , pdData[ pdAuthID ][ 0 ] , sizeof( pdData ) , szName , charsmax( szName ) , iCB );
pdData[ pdIsBlackListed ] = false;
pdData[ pdPlayTime ] = 0;
nvault_set_array( g_Vault , pdData[ pdAuthID ] , pdData[ pdAuthID ][ 0 ] , sizeof( pdData ) );
get_players( iPlayers , iNum , "ch" );
for ( new i = 0 ; i < iNum ; i++ )
{
iPlayer = iPlayers[ i ];
if ( equal( pdData[ pdAuthID ] , g_pdData[ iPlayer ][ pdAuthID ] ) )
{
g_pdData[ iPlayer ][ pdIsBlackListed ] = false;
g_pdData[ iPlayer ][ pdPlayTime ] = 0;
break;
}
}
client_print( id , print_chat , "* Removed %s from the blacklist." , szName );
}
FormatTime( iSeconds , szBuffer[] , iSize )
{
new iPos;
new iDays = iSeconds / 86400;
iSeconds -= iDays * 86400;
new iHours = iSeconds / 3600;
iSeconds -= iHours * 3600;
new iMinutes = iSeconds / 60;
iSeconds -= iMinutes * 60;
if ( iDays )
iPos = formatex( szBuffer , iSize , "%d day%s, " , iDays , iDays > 1 ? "s" : "" );
if ( iHours )
iPos += formatex( szBuffer[ iPos ] , iSize-iPos , "%d hour%s, " , iHours , iHours > 0 ? "s" : "" );
if ( iMinutes )
iPos += formatex( szBuffer[ iPos ] , iSize-iPos , "%d minute%s, " , iMinutes , iMinutes > 0 ? "s" : "" );
szBuffer[ iPos - 2 ] = EOS;
return iPos;
}