Here's an initial copy. The below still needs to be completed. Players are ranked based on kills-deaths.
1. Player data only updates when they disconnect, so the topten is not real time
2. /rank
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault_util>
#include <nvault_array>
#if AMXX_VERSION_NUM >= 190
#define client_disconnect client_disconnected
#endif
const MaxRanked = 1000;
enum PlayerData
{
pd_Name[ 33 ],
pd_AuthID[ 34 ],
pd_Kills,
pd_Deaths,
pd_Headshots
}
new g_pdData[ MAX_PLAYERS + 1 ][ PlayerData ];
new g_szTop10[ 1055 ];
new g_Vault;
new g_pEnabled;
public plugin_init()
{
register_plugin( "Knife Top" , "0.1" , "bugsy" );
register_event( "DeathMsg" , "DeathMsg" , "a" , "1>0" , "4=knife" );
g_pEnabled = register_cvar("kt_enabled" , "1" );
register_clcmd( "say reset" , "ResetRanks" , ADMIN_BAN );
register_clcmd( "say rank" , "ShowRank" );
register_clcmd( "say topten" , "TopTen" );
register_clcmd( "say /info" , "ShowInfo" );
g_Vault = nvault_open( "KnifeTop" );
}
public plugin_end()
{
nvault_close( g_Vault );
}
public client_authorized( id )
{
if ( get_pcvar_num( g_pEnabled ) && !is_user_bot( id ) )
{
get_user_authid( id , g_pdData[ id ][ pd_AuthID ] , charsmax( g_pdData[][ pd_AuthID ] ) );
nvault_get_array( g_Vault , g_pdData[ id ][ pd_AuthID ] , g_pdData[ id ][ PlayerData:0 ] , sizeof( g_pdData[] ) );
get_user_name( id , g_pdData[ id ][ pd_Name ] , charsmax( g_pdData[][ pd_Name ] ) );
}
}
public client_disconnect( id )
{
if ( get_pcvar_num( g_pEnabled ) && !is_user_bot( id ) )
{
nvault_set_array( g_Vault , g_pdData[ id ][ pd_AuthID ] , g_pdData[ id ][ PlayerData:0 ] , sizeof( g_pdData[] ) );
}
}
public ShowRank( id )
{
if ( get_pcvar_num( g_pEnabled ) )
{
ColorChat( id , RED, "[AMBA CS] Tu posicion es %s en el FakaTop, con %d cuchilladas" , g_pdData[ id ][ pd_Name ] , g_pdData[ id ][ pd_Kills ] );
}
}
public ShowInfo( id )
{
if ( get_pcvar_num( g_pEnabled ) )
{
ColorChat( id , RED , "[AMBA CS] Escribe fakatop y ve el top10 de Fakas, o fakarank para ver tu estadistica" );
}
}
public DeathMsg()
{
if ( get_pcvar_num( g_pEnabled ) )
{
new iKiller = read_data( 1 );
g_pdData[ iKiller ][ pd_Kills ]++;
g_pdData[ read_data( 2 ) ][ pd_Deaths ]++;
g_pdData[ iKiller ][ pd_Headshots ] += read_data( 3 );
}
}
public TopTen( id )
{
if ( get_pcvar_num( g_pEnabled ) )
{
UpdateTop10();
show_motd( id , g_szTop10 );
}
}
public UpdateTop10()
{
enum _:Top10Data
{
nVault_Offset,
Rank_Value
}
static iRankData[ MaxRanked ][ Top10Data ];
new pdData[ PlayerData ] , iCurrentOffset , iNextOffset;
new iVault , iCount , iPos , iAvailablePlayers;
nvault_close( g_Vault );
g_Vault = nvault_open( "KnifeTop" );
iVault = nvault_util_open( "KnifeTop" );
iCount = nvault_util_count( iVault );
if ( !iCount )
{
copy( g_szTop10 , charsmax( g_szTop10 ) , "<html>No players are ranked yet</html>" );
return;
}
for ( new iRow = 0 ; iRow < iCount && iRow < MaxRanked ; iRow++ )
{
iNextOffset = nvault_util_read_array( iVault , iNextOffset , "" , 0 , pdData[ PlayerData:0 ] , sizeof( pdData ) );
iRankData[ iRow ][ nVault_Offset ] = iCurrentOffset;
iRankData[ iRow ][ Rank_Value ] = ( pdData[ pd_Kills ] - pdData[ pd_Deaths ] );
iCurrentOffset = iNextOffset;
}
SortCustom2D( iRankData , min( iCount , MaxRanked ) , "SortCompare" );
iPos += copy( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "<html><style>body { background-color:#000000; }.tabel { color:#FFB000; }.header { background-color:#3d3c23; color:#FFB000;}</style><body>");
iPos += copy( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "<br><br><table align=center border=1 width=90% class=tabel>");
iPos += copy( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "<tr><td class=header width=5% align=center>#</td><td class=header width=24%>Nombre</td><td class=header width=24%>Fakas Dadas</td>" );
iPos += copy( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "<td class=header width=24%>Fakas Recibidas</td><td class=header width=24%>Fakas HeadShots</td></tr>");
iAvailablePlayers = min( iCount , 10 );
for ( new i = 0 ; i < iAvailablePlayers ; i++ )
{
nvault_util_read_array( iVault , iRankData[ i ][ nVault_Offset ] , "" , 0 , pdData[ PlayerData:0 ] , sizeof( pdData ) );
iPos += formatex( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td></tr>" , i+1 , pdData[ pd_Name ] , pdData[ pd_Kills ] , pdData[ pd_Deaths ] , pdData[ pd_Headshots ] );
}
iPos += copy( g_szTop10[ iPos ] , charsmax( g_szTop10 ) - iPos , "</table></body></html>" );
nvault_util_close( iVault );
}
public SortCompare( elem1[] , elem2[] )
{
if ( elem1[ 1 ] > elem2[ 1 ] )
return -1;
else if(elem1[ 1 ] < elem2[ 1 ] )
return 1;
else
return 0;
}
public ResetRanks( id , level , cid )
{
if ( cmd_access( id , level , cid , 0 ) )
{
nvault_prune( g_Vault , 0 , get_systime() );
ColorChat( 0 , GREEN , "[AMBA CS] EL ADMIN %s reseteo el Faka Top" , g_pdData[ id ][ pd_Name ] );
}
}