I was feeling a bit bored; so I made your request. I did not make the cheat detection though. Feel free to change the code to match your request even more.
Code:
#include < amxmodx >
#include < hamsandwich >
#include < engine >
#include < nvault >
#pragma semicolon 1
const MAX_CLIENTS = 32;
enum _:CountTypes
{
JUMP,
DUCK,
DUCKJUMP
};
new g_iCounter[ MAX_CLIENTS + 1 ][ CountTypes ];
new g_szSteamID[ MAX_CLIENTS + 1 ][ 35 ];
new g_iVault;
new const g_szSayCommands[ ][ ] =
{
"/jumps",
"/jump",
"/ducks",
"/duck",
"/duckjumps",
"/duckjump"
};
public plugin_init( )
{
register_plugin( "Jump/Duck Counter", "0.1.0", "Xellath" );
new szCommand[ MAX_CLIENTS ];
for( new i; i < sizeof( g_szSayCommands ); i++ )
{
formatex( szCommand, MAX_CLIENTS - 1, "say %s", g_szSayCommands[ i ] );
register_clcmd( szCommand, "ClientCommand_Counter" );
}
RegisterHam( Ham_Player_Jump, "player", "Forward_HamPlayerJump" );
RegisterHam( Ham_Player_Duck, "player", "Forward_HamPlayerDuck" );
}
public plugin_precache( )
{
g_iVault = nvault_open( "jumpcounter" );
if( g_iVault == INVALID_HANDLE )
{
set_fail_state( "Error opening up the nVault" );
}
}
public plugin_end( )
{
nvault_close( g_iVault );
}
public client_authorized( iClient )
{
get_user_authid( iClient, g_szSteamID[ iClient ], 34 );
}
public client_putinserver( iClient )
{
loadData( iClient );
}
public client_disconnect( iClient )
{
saveData( iClient );
}
public ClientCommand_Counter( iClient )
{
set_hudmessage( 255, 255, 255, 0.57, 0.0, _, _, 10.0, _, _, -1 );
show_hudmessage( iClient, "Normal Jumps: %i^n Ducks: %i^n DuckJumps: %i",\
g_iCounter[ iClient ][ JUMP ],\
g_iCounter[ iClient ][ DUCK ],\
g_iCounter[ iClient ][ DUCKJUMP ]
);
}
public Forward_HamPlayerJump( iClient )
{
if( is_user_alive( iClient ) )
{
if( entity_get_int( iClient, EV_INT_flags ) & FL_DUCKING )
{
g_iCounter[ iClient ][ DUCKJUMP ]++;
}
else
{
g_iCounter[ iClient ][ JUMP ]++;
}
}
}
public Forward_HamPlayerDuck( iClient )
{
if( is_user_alive( iClient ) )
{
g_iCounter[ iClient ][ DUCK ]++;
}
}
saveData( iClient )
{
new szData[ MAX_CLIENTS ], szKey[ 35 ];
formatex( szData, MAX_CLIENTS - 1, "%i %i %i",\
g_iCounter[ iClient ][ JUMP ],\
g_iCounter[ iClient ][ DUCK ],\
g_iCounter[ iClient ][ DUCKJUMP ]
);
formatex( szKey, 34, "%s", g_szSteamID[ iClient ] );
nvault_set( g_iVault, szKey, szData );
}
loadData( iClient )
{
new szData[ MAX_CLIENTS ], szKey[ 35 ], szPlayerData[ 3 ][ 9 ];
formatex( szData, MAX_CLIENTS - 1, "%i %i %i",\
g_iCounter[ iClient ][ JUMP ],\
g_iCounter[ iClient ][ DUCK ],\
g_iCounter[ iClient ][ DUCKJUMP ]
);
formatex( szKey, 34, "%s", g_szSteamID[ iClient ] );
nvault_get( g_iVault, szKey, szData, MAX_CLIENTS - 1 );
parse( szData,\
szPlayerData[ 0 ], charsmax( szPlayerData ),\
szPlayerData[ 1 ], charsmax( szPlayerData ),\
szPlayerData[ 2 ], charsmax( szPlayerData )
);
for( new i; i < CountTypes; i++ )
{
g_iCounter[ iClient ][ i ] = str_to_num( szPlayerData[ i ] );
}
}