PHP Code:
#include <amxmodx>
#include <nvault>
#include <nvault_util>
#include <nvault_array>
#include <hamsandwich>
#include <zombieplague>
#pragma dynamic 16384
#define MAX_PLAYERS 32
enum PlayerData
{
PlayerName[32],
kills,
deaths,
damage,
hits
}
const MaxPlayerSupport = 3000
new pdData[MAX_PLAYERS + 1][ PlayerData ]
new g_AuthID[MAX_PLAYERS + 1][34]
new bool:g_BotOrHLTV[MAX_PLAYERS + 1]
new g_Vault
new const VaultName[] = "stats_113"
public plugin_init()
{
register_plugin("stats", "1.0", "")
RegisterHam(Ham_TakeDamage, "player", "fw_HamTakeDamage");
register_clcmd("say /test", "ShowTop")
register_clcmd("say /testinfo", "ShowStats")
if ( ( g_Vault = nvault_open( VaultName ) ) == INVALID_HANDLE )
{
set_fail_state( "Failed to open vault" );
}
}
public plugin_end()
nvault_close(g_Vault)
public client_authorized(id)
{
if ( !( g_BotOrHLTV[ id ] = bool:( is_user_bot( id ) || is_user_hltv( id ) ) ) )
{
get_user_authid( id, g_AuthID[ id ], charsmax( g_AuthID[] ) )
nvault_get_array( g_Vault , g_AuthID[ id ] , pdData[ id ][ PlayerData:0 ] , sizeof( pdData[] ) );
}
}
public client_disconnect(id)
{
if( !g_BotOrHLTV[ id ])
{
get_user_name( id , pdData[ id ][ PlayerName ], charsmax( pdData[][ PlayerName ] ) )
nvault_set_array( g_Vault , g_AuthID[ id ] , pdData[ id ][ PlayerData:0 ] , sizeof( pdData[] ) );
}
}
public zp_user_infected(id, attacker)
{
if(zp_get_user_first_zombie(id))
return;
pdData[id][deaths]++
if(is_user_alive(attacker) && attacker != id)
pdData[attacker][kills]++
}
public fw_HamTakeDamage(victim, inflictor, attacker, Float:fDamage, m_Damagebits )
{
if(is_user_alive(attacker) && attacker != victim)
{
pdData[attacker][damage] += floatround(fDamage)
pdData[attacker][hits]++
}
}
public ShowStats(id)
{
if(!is_user_connected(id))
return;
client_print(id, print_chat, "You have %i Kills, %i Deaths, %d Damage, %i Hits", pdData[id][kills], pdData[id][deaths], pdData[id][damage], pdData[id][hits])
}
public ShowTop(id)
{
enum _:Info
{
nVaultOffset,
iKills,
iDeaths,
iDamage,
iHits
}
static iSortData[MaxPlayerSupport][Info]
new iVault , iRow , iCount , iNextOffset , iCurrentOffset , szKey[ 45 ] , iAvailablePlayers , pdVal[ PlayerData ];
new szMOTD[ 2128 ] , iPos
nvault_close( g_Vault );
g_Vault = nvault_open( VaultName );
iVault = nvault_util_open(VaultName)
iCount = nvault_util_count(iVault)
for ( iRow = 0 ; iRow < iCount && iRow < MaxPlayerSupport ; iRow++ )
{
iNextOffset = nvault_util_read_array( iVault , iNextOffset , szKey , charsmax( szKey ) , pdVal[ PlayerData:0 ] , sizeof( pdVal ) );
iSortData[ iRow ][ nVaultOffset ] = iCurrentOffset;
iSortData[ iRow ][ iKills ] = pdVal[ kills ];
iSortData[ iRow ][ iDeaths ] = pdVal[ deaths ];
iSortData[ iRow ][ iDamage ] = pdVal[ damage ];
iSortData[ iRow ][ iHits ] = pdVal[ hits ];
iCurrentOffset = iNextOffset;
}
SortCustom2D( iSortData , min( iCount , MaxPlayerSupport ) , "CompareStats" );
iPos = formatex( szMOTD , charsmax( szMOTD ) , "<body bgcolor=#000000><font color=#98f5ff><pre>" );
iPos += formatex( szMOTD[ iPos ] , charsmax( szMOTD ) - iPos , "%2s %-22.22s %3s %3s %3s %3s^n" , "#" , " Name " , " Kills ", " Deaths ", " Damage ", " Hits ")
iAvailablePlayers = min( iCount , 15 );
for ( iRow = 0 ; iRow < iAvailablePlayers ; iRow++ )
{
iCurrentOffset = iSortData[ iRow ][ nVaultOffset ];
nvault_util_read_array( iVault , iCurrentOffset , szKey , charsmax( szKey ) , pdVal[ PlayerData:0 ] , sizeof( pdVal ) );
iPos += formatex( szMOTD[ iPos ] , charsmax( szMOTD ) - iPos ,"%2d %-22.22s %3d %3d %3d %3d^n", ( iRow + 1 ) , pdVal[ PlayerName ] , pdVal[ kills ], pdVal[deaths], pdVal[damage], pdVal[hits] );
}
nvault_util_close( iVault );
formatex( szMOTD[ iPos ], charsmax( szMOTD ) - iPos , "</body></font></pre>" );
show_motd( id , szMOTD , "ZP Stats" );
return PLUGIN_HANDLED;
}
public CompareStats( elem1[] , elem2[] )
{
if ( elem1[ 1 ] > elem2[ 1 ] )
return -1;
else if(elem1[ 1 ] < elem2[ 1 ] )
return 1;
return 0;
}