View Single Post
Bugsy
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
Old 03-23-2021 , 20:49   Re: Help! Wrong stats in stats plugin
Reply With Quote #10

Added rank command and included updates since initial posting.

To-do:
1. Player data only updates when they disconnect, so the topten is not real time

You will need:
nVault Utility
nVault Array

PHP Code:

#include <amxmodx>
#include <amxmisc>
#include <nvault_util>
#include <nvault_array>
#include <colorchat> 

#if AMXX_VERSION_NUM >= 190
#define client_disconnect client_disconnected
#endif

new const Version[] = "0.2";

const 
MaxRanked 1000;

enum PlayerData
{
    
pd_Name33 ],
    
pd_AuthID34 ],
    
pd_Kills,
    
pd_Deaths,
    
pd_Headshots
}

new 
g_pdDataMAX_PLAYERS ][ PlayerData ];
new 
g_szTop101536 ];
new 
g_Vault;
new 
g_pEnabled;

public 
plugin_init() 
{
    
register_plugin"Knife Top" Version "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" );
    
    if ( ( 
g_Vault nvault_open"KnifeTop" ) ) == INVALID_HANDLE )
        
set_fail_state"Error opening vault." );
}

public 
plugin_end()
{
    
nvault_closeg_Vault );
}

public 
client_authorizedid 
{
    if ( 
get_pcvar_numg_pEnabled ) && !is_user_botid ) ) 
    {    
        
get_user_authidid g_pdDataid ][ pd_AuthID ] , charsmaxg_pdData[][ pd_AuthID ] ) );
        
nvault_get_arrayg_Vault g_pdDataid ][ pd_AuthID ] , g_pdDataid ][ PlayerData:] , sizeofg_pdData[] ) );
        
get_user_nameid g_pdDataid ][ pd_Name ] , charsmaxg_pdData[][ pd_Name ] ) );
    }
}

public 
client_disconnectid )
{
    if ( 
get_pcvar_numg_pEnabled ) && !is_user_botid ) ) 
    {
        
nvault_set_arrayg_Vault g_pdDataid ][ pd_AuthID ] , g_pdDataid ][ PlayerData:] , sizeofg_pdData[] ) );
    }
}

public 
ShowInfoid 
{
    if ( 
get_pcvar_numg_pEnabled ) ) 
    {
        
ColorChatid RED "[AMBA CS] Escribe fakatop y ve el top10 de Fakas, o fakarank para ver tu estadistica" ); 
    }
    
    return 
PLUGIN_HANDLED;
}

public 
DeathMsg() 
{
    if ( 
get_pcvar_numg_pEnabled ) ) 
    {    
        new 
iKiller read_data); 
        
        
g_pdDataiKiller ][ pd_Kills ]++;
        
g_pdDataread_data) ][ pd_Deaths ]++;
        
g_pdDataiKiller ][ pd_Headshots ] += read_data);
    }
}

public 
TopTenid )
{
    if ( 
get_pcvar_numg_pEnabled ) ) 
    {
        
UpdateTop10();
        
show_motdid g_szTop10  "TOP FAKA" );
    }
    
    return 
PLUGIN_HANDLED;
}

public 
UpdateTop10()
{
    
enum _:Top10Data
    
{
        
nVault_Offset,
        
Rank_Value
    
}
    
    static 
iRankDataMaxRanked ][ Top10Data ];
    new 
pdDataPlayerData ] , iCurrentOffset iNextOffset;
    new 
iVault iCount iPos iAvailablePlayers;
    
    
nvault_closeg_Vault );
    if ( ( 
g_Vault nvault_open"KnifeTop" ) ) == INVALID_HANDLE )
        
set_fail_state"Error opening vault." );
    
    
iVault nvault_util_open"KnifeTop" );
    
iCount nvault_util_countiVault );
    
    if ( !
iCount )
    {
        
copyg_szTop10 charsmaxg_szTop10 ) , "<html>No players are ranked yet</html>" );
        return;
    }
    
    for ( new 
iRow iRow iCount && iRow MaxRanked iRow++ )
    {
        
iNextOffset nvault_util_read_arrayiVault iNextOffset "" pdDataPlayerData:] , sizeofpdData ) );
        
        
iRankDataiRow ][ nVault_Offset ] = iCurrentOffset;
        
iRankDataiRow ][ Rank_Value ] = ( pdDatapd_Kills ] - pdDatapd_Deaths ] );

        
iCurrentOffset iNextOffset;
    }
    
    
SortCustom2DiRankData miniCount MaxRanked ) , "SortCompare" );
    
    
iPos += copyg_szTop10iPos ] , charsmaxg_szTop10 ) - iPos "<html><style>body { background-color:#000000; }.tabel { color:#FFB000; }.header { background-color:#3d3c23; color:#FFB000;}</style><body>");
    
iPos += copyg_szTop10iPos ] , charsmaxg_szTop10 ) - iPos "<br><br><table align=center border=1 width=90% class=tabel>");
    
iPos += copyg_szTop10iPos ] , charsmaxg_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 += copyg_szTop10iPos ] , charsmaxg_szTop10 ) - iPos "<td class=header width=24%>Fakas Recibidas</td><td class=header width=24%>Fakas HeadShots</td></tr>");
    
    
iAvailablePlayers miniCount 10 );
    
    for ( new 
iAvailablePlayers i++ ) 
    {
        
nvault_util_read_arrayiVault iRankData][ nVault_Offset ] , "" pdDataPlayerData:] , sizeofpdData ) );
        
iPos += formatexg_szTop10iPos ] , charsmaxg_szTop10 ) - iPos "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td></tr>" i+pdDatapd_Name ] , pdDatapd_Kills ] , pdDatapd_Deaths ] , pdDatapd_Headshots ] );
    }
    
    
iPos += copyg_szTop10iPos ] , charsmaxg_szTop10 ) - iPos "</table></body></html>" );
    
    
nvault_util_closeiVault );
}

public 
ShowRankid )
{
    if ( 
get_pcvar_numg_pEnabled ) ) 
    {
        
enum _:RankData
        
{
            
AuthID34 ],
            
Rank_Value
        
}
        
        static 
iRankDataMaxRanked ][ RankData ];
        new 
pdDataPlayerData ] , iOffset;
        new 
iVault iCount iRow iRank;
        
        
nvault_closeg_Vault );
        if ( ( 
g_Vault nvault_open"KnifeTop" ) ) == INVALID_HANDLE )
            
set_fail_state"Error opening vault." );
        
        
iVault nvault_util_open"KnifeTop" );
        
iCount nvault_util_countiVault );
        
        if ( !
iCount )
        {
            
client_printid print_chat "* No players are ranked yet." );
            return 
PLUGIN_HANDLED;
        }
        
        for ( 
iRow iRow iCount && iRow MaxRanked iRow++ )
        {
            
iOffset nvault_util_read_arrayiVault iOffset "" pdDataPlayerData:] , sizeofpdData ) );
            
            
copyiRankDataiRow ][ AuthID ] , charsmaxiRankData[][ AuthID ] ) , pdDatapd_AuthID ] );
            
iRankDataiRow ][ Rank_Value ] = ( pdDatapd_Kills ] - pdDatapd_Deaths ] );
        }
        
nvault_util_closeiVault );
        
        
SortCustom2D_:iRankData miniCount MaxRanked ) , "SortCompare" );
        
        for ( 
iRow iRow iCount && iRow MaxRanked iRow++ )
        {
            if ( 
equaliRankDataiRow ][ AuthID ] , g_pdDataid ][ pd_AuthID ] ) )
            {
                
iRank = ( iRow );
                break;
            }
        }
                
        if ( 
iRank == )
        {
            
client_printid print_chat "* You are not yet ranked." );    
        }
        else
        {
            
nvault_get_arrayg_Vault iRankDataiRow ][ AuthID ] , pdDataPlayerData:] , sizeofpdData ) );
            
client_printid print_chat "* %s, your rank is %d, with %d kills, %d deaths, and %d headshots" pdDatapd_Name ] , iRank pdDatapd_Kills ] , pdDatapd_Deaths ] , pdDatapd_Headshots ] );
            
//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 ] );
        
}
    }
    
    return 
PLUGIN_HANDLED;
}

public 
SortCompareelem1[] , elem2[] ) 

    if ( 
elem1] > elem2] ) 
        return -
1
    else if(
elem1] < elem2] ) 
        return 
1
    else
        return 
0


public 
ResetRanksid level cid 
{
    if ( 
cmd_accessid level cid ) ) 
    {
        
nvault_pruneg_Vault get_systime() );
        
ColorChatGREEN "[AMBA CS] EL ADMIN %s reseteo el Faka Top" g_pdDataid ][ pd_Name ] );
        
        for ( new 
<= MAX_PLAYERS i++ )
        {
            
g_pdData][ pd_Kills ] = 0;
            
g_pdData][ pd_Deaths ] = 0;
            
g_pdData][ pd_Headshots ] = 0;
        }
    }

__________________

Last edited by Bugsy; 03-24-2021 at 21:47.
Bugsy is offline