Raised This Month: $51 Target: $400
 12% 

Efficiency & Accuracy Modification


Post New Thread Reply   
 
Thread Tools Display Modes
feren02
Senior Member
Join Date: Mar 2012
Old 03-27-2021 , 23:36   Re: Efficiency & Accuracy Modification
Reply With Quote #11

Quote:
Originally Posted by Bugsy View Post
What I am trying to explain to you is /rank, /top15, and /rankstats will be using an entirely different set of stats data.

If I create this plugin, it will look at only, say "newstats.dat" for all stats, not "csstats.dat" that native stats uses. It will be entirely disconnected from AMX-X stats.

If you never reset/delete a players stats, then the numbers should be the same. But if you delete a players info from "newstats", native csstats.dat will still hold the players data since day one, and it would reflect this if they use rank, top15, etc.
I got it right, now there will be two stats plugin data:

1. csstats.dat (default statsx, command to reset : cssstats_reset 1)

2. YOUR EXPERTISE: newstats.dat
(this will be responsible for the tracking of 50% and up Eff | and 20% and below Acc percentages disconnection of players upon registering of stats of a certain player)

*** As long as the requested/dreamed purpose will happen:

**The Idea**
- The plugin disconnects a Player when there stats has the values above.
- The plugin disconnects Players with client echo message.
- When a player is disconnected, the Eff. & Acc. stats will be reset
- When the disconnected player connects again, his Eff. & Acc is ZERO

(So what will happen, when they login again, their EFF. and ACC. is back to zero. In the event when server computed AGAIN their EFF to be 50% or greater with corresponding 20% ACC. and lower, they will be disconnected again and EFF + ACC is reset once they connect to the server.)


Looking forward!
feren02 is offline
Bugsy
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
Old 03-27-2021 , 23:56   Re: Efficiency & Accuracy Modification
Reply With Quote #12

The functionality is not a problem, I was just trying to make you aware that these stats would be disconnected/separate from native stats.

Are you ok with using SQL?
__________________

Last edited by Bugsy; 03-27-2021 at 23:57.
Bugsy is offline
feren02
Senior Member
Join Date: Mar 2012
Old 03-28-2021 , 00:37   Re: Efficiency & Accuracy Modification
Reply With Quote #13

Quote:
Originally Posted by Bugsy View Post
The functionality is not a problem, I was just trying to make you aware that these stats would be disconnected/separate from native stats.

Are you ok with using SQL?
Well noted, I got you <3

Maybe in the future, not activating my SQL yet. But in future I will when I activate my Website so the rankings will also be reflected on the Webpage real-time. * Did I got it right?

Thank you!
feren02 is offline
Bugsy
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
Old 03-30-2021 , 21:52   Re: Efficiency & Accuracy Modification
Reply With Quote #14

This will disconnect players at round end when accuracy and/or efficiency is outside of the acceptable value. You may want to rethink this a bit and add more conditions. If a player decides to spray for the fun of it, there's a possibility he will be disconnected at round end due to his accuracy, depending on how much time he's spent on the server. You want to motivate people to play on your server, not punish them for choosing your server. What type of activity are you aiming to eliminate from your server?

cvars:
sm_maxefficiency - Max efficiency before getting kicked - default: 50
sm_minaccuracy - Min accuracy before getting kicked - default: 20
sm_minrounds - Minimum rounds before plugin may kick/reset you - default: 5
sm_minshots - Minimum shots fired before plugin may kick/reset you - default: 100
sm_minkillsdeaths = Minimum kills+deaths before plugin may kick/reset you - default: 5

PHP Code:

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <nvault_util>
#include <nvault_array>
#include <csx>

new const Version[] = "0.3";

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

//#define TESTING

#define MAX_PLAYERS 32

new const VaultName[] = "stats_moderator";
const 
MaxRanked 1000;

#if AMXX_VERSION_NUM <= 181
new g_fwid g_max_clients g_guns_eventids_bitsum;

new const 
g_guns_events[][] = 
{
        
"events/awp.sc",
        
"events/g3sg1.sc",
        
"events/ak47.sc",
        
"events/scout.sc",
        
"events/m249.sc",
        
"events/m4a1.sc",
        
"events/sg552.sc",
        
"events/aug.sc",
        
"events/sg550.sc",
        
"events/m3.sc",
        
"events/xm1014.sc",
        
"events/usp.sc",
        
"events/mac10.sc",
        
"events/ump45.sc",
        
"events/fiveseven.sc",
        
"events/p90.sc",
        
"events/deagle.sc",
        
"events/p228.sc",
        
"events/glock18.sc",
        
"events/mp5n.sc",
        
"events/tmp.sc",
        
"events/elite_left.sc",
        
"events/elite_right.sc",
        
"events/galil.sc",
        
"events/famas.sc"
};
#endif

enum PlayerStats
{
    
Stats_Kills 0,
    
Stats_Deaths,
    
Stats_Headshots,
    
Stats_TeamKills,
    
Stats_Shots,
    
Stats_Hits,
    
Stats_Damage,
    
Stats_RoundsPlayed
}

enum BodyHits
{
    
Hit_Generic 0,
    
Hit_Head,
    
Hit_Chest,
    
Hit_Stomach,
    
Hit_LeftArm,
    
Hit_RightArm,
    
Hit_LeftLeg,
    
Hit_RightLeg
}

enum StatsData
{
    
sdName33 ],
    
sdAuthID35 ],
    
sdStatsPlayerStats ],
    
sdHitsBodyHits ]
}

new 
g_sdDataMAX_PLAYERS ][ StatsData ];
new 
g_Vault
new g_pMaxEfficiency g_pMinAccuracy g_pMinRounds g_pMinShots g_pMinKillsDeaths;

public 
plugin_init() 
{
    
register_plugin"Stats Moderator" Version "bugsy" );
    
    
register_clcmd"say rank" "ShowRank" );
    
register_clcmd"say topten" "ShowTopTen" );
    
    
register_concmd"resetstats" "ResetStats" );
    
    
g_pMaxEfficiency register_cvar"sm_maxefficiency" "50" );
    
g_pMinAccuracy register_cvar"sm_minaccuracy" "20" );
    
g_pMinRounds register_cvar"sm_minrounds" "5" );
    
g_pMinShots register_cvar"sm_minshots" "100" );
    
g_pMinKillsDeaths register_cvar"sm_minkillsdeaths" "5" );
    
    
register_event"DeathMsg" "DeathMsg" "a" );
    
register_logevent"RoundEnd" "1=Round_End" );
        
    
RegisterHamHam_TakeDamage "player" "PlayerTakeDamage" );
    
    if ( ( 
g_Vault nvault_openVaultName ) ) == INVALID_HANDLE )
    {
        
set_fail_state"Failed to open vault" );
    }
    
    
#if AMXX_VERSION_NUM > 181
    
for ( new szWeapon20 ], iWeaponID CSW_P228 iWeaponID <= CSW_P90 iWeaponID++ )
    {
        if ( 
get_weaponnameiWeaponID szWeapon charsmaxszWeapon ) ) )
        {
            
RegisterHamHam_Weapon_PrimaryAttack szWeapon "WeaponPrimaryAttack" true );
        }
    }
    
#else
    
unregister_forward(FM_PrecacheEventg_fwid1);
    
register_forward(FM_PlaybackEvent"fwPlaybackEvent");
    
g_max_clients global_get(glb_maxClients);
    
#endif
}

#if AMXX_VERSION_NUM <= 181
public plugin_precache() 
{
        
g_fwid register_forward(FM_PrecacheEvent"fwPrecacheEvent"1)
}
#endif

public plugin_end()
{
    
nvault_closeg_Vault );
}

public 
client_authorizedid )
{
    if ( !
is_user_botid ) )
    {
        
get_user_authidid g_sdDataid ][ sdAuthID ] , charsmaxg_sdData[][ sdAuthID ] ) );
        
nvault_get_arrayg_Vault g_sdDataid ][ sdAuthID ] , g_sdDataid ][ StatsData:] , sizeofg_sdData[] ) );
        
        
get_user_nameid g_sdDataid ][ sdName ] , charsmaxg_sdData[][ sdName ] ) );
        
        if ( !
g_sdDataid ][ sdAuthID ][ ] )
            
get_user_authidid g_sdDataid ][ sdAuthID ] , charsmaxg_sdData[][ sdAuthID ] ) );
    }
}

public 
client_disconnectid )
{
    if ( !
is_user_botid ) )
    {
        
nvault_set_arrayg_Vault g_sdDataid ][ sdAuthID ] , g_sdDataid ][ StatsData:] , sizeofg_sdData[] ) );
    }
}

public 
DeathMsg()
{
    new 
iKiller read_data);
    new 
iVictim read_data);
    
    
g_sdDataiKiller ][ sdStats ][ Stats_Kills ]++;
    
g_sdDataiVictim ][ sdStats ][ Stats_Deaths ]++;
    
g_sdDataiKiller ][ sdStats ][ Stats_Headshots ] += read_data);
    
g_sdDataiKiller ][ sdStats ][ Stats_TeamKills ] += _:( cs_get_user_teamiKiller ) == cs_get_user_teamiVictim ) );
    
    
#if defined TESTING
    
server_print"Kills=%d Deaths=%d HS=%d TK=%d" g_sdDataiKiller ][ sdStats ][ Stats_Kills ] , g_sdDataiKiller ][ sdStats ][ Stats_Deaths ] ,
                             
g_sdDataiKiller ][ sdStats ][ Stats_Headshots ] , g_sdDataiKiller ][ sdStats ][ Stats_TeamKills ] );        
    
#endif
}

public 
RoundEnd()
{
    new 
iPlayers32 ] , iNum;
    
    
get_playersiPlayers iNum "ch" );
    
    for ( new 
id iNum i++ )
    {
        
id iPlayers];
        
g_sdDataid ][ sdStats ][ Stats_RoundsPlayed ]++;
        
CheckPlayerid );
    }
    
}

public 
WeaponPrimaryAttackiEntity )
{
    static const 
m_iClientClip 52;
    static const 
XO_WEAPON 4;
    
    if ( 
pev_validiEntity ) && ( cs_get_weapon_ammoiEntity ) != get_pdata_intiEntity m_iClientClip XO_WEAPON ) ) )
    {
        
g_sdDatapeviEntity pev_owner ) ][ sdStats ][ Stats_Shots ]++;
        
        
#if defined TESTING
        
server_print"Shots=%d" g_sdDatapeviEntity pev_owner ) ][ sdStats ][ Stats_Shots ] );
        
#endif
    
}
}

public 
PlayerTakeDamageiVictim iInflictor iAttacker Float:fDamage DamageBits )
{
    static const 
m_LastHitGroup 75;
    
    if ( 
iAttacker )
    {
        
g_sdDataiAttacker ][ sdStats ][ Stats_Hits ]++;
        
g_sdDataiAttacker ][ sdStats ][ Stats_Damage ] += floatroundfDamage );
        
g_sdDataiAttacker ][ sdHits ][ BodyHits:get_pdata_intiVictim m_LastHitGroup ) ]++;
        
        
#if defined TESTING
        
server_print"Hits=%d Damage=%d Hits=%d %d %d %d %d %d %d %d" g_sdDataiAttacker ][ sdStats ][ Stats_Hits ] ,
                                            
g_sdDataiAttacker ][ sdStats ][ Stats_Damage ] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] ,
                                            
g_sdDataiAttacker ][ sdHits ][ BodyHits:] );
        
#endif
    
}
}

#if AMXX_VERSION_NUM <= 181
public fwPrecacheEvent(type, const name[]) 
{
    for (new 
0sizeof g_guns_events; ++i
    {
        if (
equal(g_guns_events[i], name)) 
        {
            
g_guns_eventids_bitsum |= (1<<get_orig_retval())
            return 
FMRES_HANDLED
        
}
    }
    
    return 
FMRES_IGNORED
}

public 
fwPlaybackEventflags invoker eventid 
{
    if ( !( 
g_guns_eventids_bitsum & ( << eventid ) ) || !( <= invoker <= g_max_clients ) )
        return 
FMRES_IGNORED;
    
    
g_sdDatainvoker ][ sdStats ][ Stats_Shots ]++;
    
    
#if defined TESTING
    
server_print"Shots=%d" g_sdDatapeviEntity pev_owner ) ][ sdStats ][ Stats_Shots ] );
    
#endif
        
    
return FMRES_HANDLED
}
#endif

public ShowTopTenid )
{
    
enum _:Top10Data
    
{
        
nVault_Offset,
        
Rank_Value
    
}
    
    static 
szTop101536 ];
    static 
iRankDataMaxRanked ][ Top10Data ];
    new 
sdDataStatsData ] , iCurrentOffset iNextOffset;
    new 
iVault iCount iPos iAvailablePlayers;
    
    
SaveConnectedPlayerData();
    
    
nvault_closeg_Vault );
    if ( ( 
g_Vault nvault_openVaultName ) ) == INVALID_HANDLE )
        
set_fail_state"Error opening vault." );
    
    
iVault nvault_util_openVaultName );
    
iCount nvault_util_countiVault );
    
    if ( !
iCount )
    {
        
client_printid print_chat "* No players are ranked yet." );
        return 
PLUGIN_HANDLED;
    }
    
    for ( new 
iRow iRow iCount && iRow MaxRanked iRow++ )
    {
        
iNextOffset nvault_util_read_arrayiVault iNextOffset "" sdDataStatsData:] , sizeofsdData ) );
        
        
iRankDataiRow ][ nVault_Offset ] = iCurrentOffset;
        
iRankDataiRow ][ Rank_Value ] = ( sdDatasdStats ][ Stats_Kills ] - sdDatasdStats ][ Stats_Deaths ] );

        
iCurrentOffset iNextOffset;
    }
    
    
SortCustom2DiRankData miniCount MaxRanked ) , "SortCompare" );
    
    
iPos += copyszTop10iPos ] , charsmaxszTop10 ) - iPos "<html><style>body { background-color:#000000; }.tabel { color:#FFB000; }.header { background-color:#3d3c23; color:#FFB000;}</style><body>");
    
iPos += copyszTop10iPos ] , charsmaxszTop10 ) - iPos "<br><br><table align=center border=1 width=90% class=tabel>");
    
iPos += copyszTop10iPos ] , charsmaxszTop10 ) - iPos "<tr><td class=header width=5% align=center>#</td><td class=header width=20%>Name</td><td class=header width=10%>Kills</td>" );
    
iPos += copyszTop10iPos ] , charsmaxszTop10 ) - iPos "<td class=header width=10%>Deaths</td><td class=header width=10%>HeadShots</td><td class=header width=10%>Efficiency</td><td class=header width=10%>Accuracy</td></tr>");
    
    
iAvailablePlayers miniCount 10 );

    for ( new 
iAvailablePlayers i++ ) 
    {
        
nvault_util_read_arrayiVault iRankData][ nVault_Offset ] , "" sdDataStatsData:] , sizeofsdData ) );
        
iPos += formatexszTop10iPos ] , charsmaxszTop10 ) - iPos "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td><td>%0.2f</td><td>%0.2f</td></tr>" i+sdDatasdName ] , sdDatasdStats ][ Stats_Kills ] , sdDatasdStats ][ Stats_Deaths ] , sdDatasdStats ][ Stats_Headshots ] , GetEfficiencysdData ) , GetAccuracysdData ) );
    }
    
    
iPos += copyszTop10iPos ] , charsmaxszTop10 ) - iPos "</table></body></html>" );
    
    
nvault_util_closeiVault );

    
show_motdid szTop10  "Top Ten" );
    
    return 
PLUGIN_HANDLED;
}

public 
ShowRankid )
{
    
enum _:RankData
    
{
        
AuthID34 ],
        
Rank_Value
    
}
    
    static 
iRankDataMaxRanked ][ RankData ];
    new 
sdDataStatsData ] , iOffset;
    new 
iVault iCount iRow iRank;
    
    
SaveConnectedPlayerData();
    
    
nvault_closeg_Vault );
    if ( ( 
g_Vault nvault_openVaultName ) ) == INVALID_HANDLE )
        
set_fail_state"Error opening vault." );
    
    
iVault nvault_util_openVaultName );
    
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 "" sdDataStatsData:] , sizeofsdData ) );
        
        
copyiRankDataiRow ][ AuthID ] , charsmaxiRankData[][ sdAuthID ] ) , sdDatasdAuthID ] );
        
iRankDataiRow ][ Rank_Value ] = ( sdDatasdStats ][ Stats_Kills ] - sdDatasdStats ][ Stats_Deaths ] );
    }
    
nvault_util_closeiVault );
    
    
SortCustom2D_:iRankData miniCount MaxRanked ) , "SortCompare" );
    
    for ( 
iRow iRow iCount && iRow MaxRanked iRow++ )
    {
        if ( 
equaliRankDataiRow ][ AuthID ] , g_sdDataid ][ sdAuthID ] ) )
        {
            
iRank = ( iRow );
            break;
        }
    }
            
    if ( 
iRank == )
    {
        
client_printid print_chat "* You are not yet ranked." );    
    }
    else
    {
        
nvault_get_arrayg_Vault iRankDataiRow ][ AuthID ] , sdDataStatsData:] , sizeofsdData ) );
        
client_printid print_chat "* %s, your rank is %d, with %d kills, %d deaths, and %d headshots" sdDatasdName ] , iRank sdDatasdStats ][ Stats_Kills ] , sdDatasdStats ][ Stats_Deaths ] , sdDatasdStats ][ Stats_Headshots ] );
        
client_printid print_chat "* Efficiency: %0.2f - Accuracy: %0.2f - %d Shots - %d Hits" GetEfficiencysdData ) , GetAccuracysdData ) , sdDatasdStats ][ Stats_Shots ] , sdDatasdStats ][ Stats_Hits ] );
    }
    
    return 
PLUGIN_HANDLED;
}

public 
SortCompareelem1[] , elem2[] ) 

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


public 
ResetStatsid level cid 
{
    if ( 
cmd_accessid level cid ) ) 
    {
        
nvault_pruneg_Vault get_systime() );
        
        for ( new 
<= MAX_PLAYERS i++ )
        {
            
arraysetg_sdDataid ][ sdStats ] , sizeofg_sdData[][ sdStats ] ) );
            
arraysetg_sdDataid ][ sdHits ] , sizeofg_sdData[][ sdHits ] ) );
        }
    }
}

CheckPlayerid )
{    
    new 
Float:fMinAccuracy get_pcvar_floatg_pMinAccuracy );
    new 
Float:fMaxEfficiency get_pcvar_floatg_pMaxEfficiency );
    new 
szMsg128 ];
    
    if ( 
MeetsMinThresholdsid ) && ( ( GetEfficiencyg_sdDataid ] ) >= fMaxEfficiency ) || ( GetAccuracyg_sdDataid ] ) <= fMinAccuracy ) ) )
    {
        
nvault_removeg_Vault g_sdDataid ][ sdAuthID ] );
        
arraysetg_sdDataid ][ sdStats ] , sizeofg_sdData[][ sdStats ] ) );
        
arraysetg_sdDataid ][ sdHits ] , sizeofg_sdData[][ sdHits ] ) );
        
        
formatexszMsg charsmaxszMsg ) , "Stats are outside of thresholds:^n Accuracy must be higher than %0.2f^n Efficiency must be less than %0.2f" fMinAccuracy fMaxEfficiency );
        
message_beginMSG_ONE_UNRELIABLE SVC_DISCONNECT _id );
        
write_stringszMsg );
        
message_end();
    }
}

SaveConnectedPlayerData()
{
    new 
iPlayers32 ] , iNum;
    
    
get_playersiPlayers iNum "ch" );
    
    for ( new 
id iNum i++ )
    {
        
id iPlayers];
        
nvault_set_arrayg_Vault g_sdDataid ][ sdAuthID ] , g_sdDataid ][ StatsData:] , sizeofg_sdData[] ) );
    }
}

bool:MeetsMinThresholdsid )
{                             
    return 
bool:( ( g_sdDataid ][ sdStats ][ Stats_RoundsPlayed ] >= get_pcvar_numg_pMinRounds ) ) && 
         ( 
g_sdDataid ][ sdStats ][ Stats_Shots ] >= get_pcvar_numg_pMinShots ) ) && 
         ( ( 
g_sdDataid ][ sdStats ][ Stats_Kills ] + g_sdDataid ][ sdStats ][ Stats_Deaths ] ) >= get_pcvar_numg_pMinKillsDeaths ) ) );
}

Float:GetAccuracysdDataStatsData ] )
{
    return 
sdDatasdStats ][ Stats_Shots ] ? ( 100.0 floatsdDatasdStats ][ Stats_Hits ] ) / float(sdDatasdStats ][ Stats_Shots ] ) ) : ( 0.0 );
}

Float:GetEfficiencysdDataStatsData ] )
{
    return 
sdDatasdStats ][ Stats_Kills ] ? ( 100.0 floatsdDatasdStats ][ Stats_Kills ] ) / floatsdDatasdStats ][ Stats_Kills ] + sdDatasdStats ][ Stats_Deaths ] ) ) : ( 0.0 );

__________________

Last edited by Bugsy; 04-03-2021 at 10:39.
Bugsy is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 00:17.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode