Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 55 additions & 15 deletions src/game/server/tf/tf_gamestats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ extern ConVar tf_mm_trusted;
static ConVar tf_stats_nogameplaycheck( "tf_stats_nogameplaycheck", "0", FCVAR_NONE , "Disable normal check for valid gameplay, send stats regardless." );
//static ConVar tf_stats_track( "tf_stats_track", "1", FCVAR_NONE, "Turn on//off tf stats tracking." );
//static ConVar tf_stats_verbose( "tf_stats_verbose", "0", FCVAR_NONE, "Turn on//off verbose logging of stats." );
ConVar tf_stats_bogus_damage_max("tf_stats_bogus_damage_max", "1500", FCVAR_REPLICATED, "Maximum Damage before Bogus warning");
ConVar tf_stats_bogus_damage_mvm_max("tf_stats_bogus_damage_mvm_max", "5000", FCVAR_REPLICATED, "Maximum Damage in mvm before Bogus warning");
ConVar tf_stats_bogus_healing_max("tf_stats_bogus_healing_max", "1000", FCVAR_REPLICATED, "Maximum Healing before Bogus warning");
ConVar tf_stats_bogus_block_damage_max("tf_stats_bogus_block_damage_max", "3000", FCVAR_REPLICATED, "Maximum Damage Blocked before Bogus warning");
ConVar tf_stats_bogus_return("tf_stats_bogus_return", "1", FCVAR_REPLICATED, "Return without recording stats if bogus values are found");

CTFGameStats CTF_GameStats;

Expand Down Expand Up @@ -719,11 +724,18 @@ void CTFGameStats::Event_PlayerHealedOther( CTFPlayer *pPlayer, float amount )
// make sure value is sane
int iAmount = (int) amount;
Assert( iAmount >= 0 );
Assert( iAmount <= 1000 );
if ( iAmount < 0 || iAmount > 1000 )
Assert( iAmount <= tf_stats_bogus_healing_max.GetInt() );
if ( iAmount < 0 || iAmount > tf_stats_bogus_healing_max.GetInt() )
{
DevMsg( "CTFGameStats: bogus healing value of %d reported, ignoring\n", iAmount );
return;
if ( tf_stats_bogus_return.GetBool() )
{
DevMsg("CTFGameStats: Bogus Healing value found, %d, ignoring\n", iAmount);
return;
}
else
{
DevMsg("CTFGameStats: Bogus Healing value found, %d\n", iAmount);
}
}
IncrementStat( pPlayer, TFSTAT_HEALING, (int) amount );

Expand Down Expand Up @@ -755,12 +767,20 @@ void CTFGameStats::Event_PlayerHealedOtherAssist( CTFPlayer *pPlayer, float amou
// make sure value is sane
int iAmount = (int) amount;
Assert( iAmount >= 0 );
Assert( iAmount <= 1000 );
if ( iAmount < 0 || iAmount > 1000 )
Assert( iAmount <= tf_stats_bogus_healing_max.GetInt() );
if ( iAmount < 0 || iAmount > tf_stats_bogus_healing_max.GetInt() )
{
DevMsg( "CTFGameStats: bogus healing value of %d reported, ignoring\n", iAmount );
return;
if ( tf_stats_bogus_return.GetBool() )
{
DevMsg("CTFGameStats: Bogus Healing value found, %d, ignoring\n", iAmount);
return;
}
else
{
DevMsg("CTFGameStats: Bogus Healing value found, %d\n", iAmount);
}
}

IncrementStat( pPlayer, TFSTAT_HEALING_ASSIST, (int) amount );
}

Expand All @@ -769,11 +789,18 @@ void CTFGameStats::Event_PlayerHealedOtherAssist( CTFPlayer *pPlayer, float amou
//-----------------------------------------------------------------------------
void CTFGameStats::Event_PlayerBlockedDamage( CTFPlayer *pPlayer, int nAmount )
{
Assert( pPlayer && nAmount > 0 && nAmount < 3000 );
if ( nAmount < 0 || nAmount > 3000 )
Assert( pPlayer && nAmount > 0 && nAmount < tf_stats_bogus_block_damage_max.GetInt() );
if ( nAmount < 0 || nAmount > tf_stats_bogus_block_damage_max.GetInt() )
{
DevMsg( "CTFGameStats: bogus blocked damage value of %d reported, ignoring\n", nAmount );
return;
if ( tf_stats_bogus_return.GetBool() )
{
DevMsg("CTFGameStats: Bogus Blocked Damage value found, %d, ignoring\n", nAmount);
return;
}
else
{
DevMsg("CTFGameStats: Bogus Blocked Damage value found, %d\n", nAmount);
}
}
IncrementStat( pPlayer, TFSTAT_DAMAGE_BLOCKED, nAmount );
}
Expand Down Expand Up @@ -1033,14 +1060,27 @@ void CTFGameStats::Event_PlayerFiredWeapon( CTFPlayer *pPlayer, bool bCritical )
void CTFGameStats::Event_PlayerDamage( CBasePlayer *pBasePlayer, const CTakeDamageInfo &info, int iDamageTaken )
{
// defensive guard against insanely huge damage values that apparently get into the stats system once in a while -- ignore insane values
const int INSANE_PLAYER_DAMAGE = TFGameRules()->IsMannVsMachineMode() ? 5000 : 1500;

int INSANE_PLAYER_DAMAGE = TFGameRules()->IsMannVsMachineMode() ? tf_stats_bogus_damage_mvm_max.GetFloat() : tf_stats_bogus_damage_max.GetFloat();
if ( sv_cheats && !sv_cheats->GetBool() )
{
Assert( iDamageTaken >= 0 );
}
if ( ( iDamageTaken < 0 ) || ( iDamageTaken > INSANE_PLAYER_DAMAGE ) )
if ( ( iDamageTaken < 0 ) )
return;

if ( iDamageTaken > INSANE_PLAYER_DAMAGE )
{
if (tf_stats_bogus_return.GetBool())
{
DevMsg("CTFGameStats: Bogus Damage value found, %d, ignoring\n", iDamageTaken);
return;
}
else
{
DevMsg("CTFGameStats: Bogus Damage value found, %d\n", iDamageTaken);
}
}

CObjectSentrygun *pSentry = NULL;
CTFPlayer *pTarget = ToTFPlayer( pBasePlayer );
Expand Down