summaryrefslogtreecommitdiff
path: root/game/server/tf/tf_gamestats.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf/tf_gamestats.h')
-rw-r--r--game/server/tf/tf_gamestats.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/game/server/tf/tf_gamestats.h b/game/server/tf/tf_gamestats.h
new file mode 100644
index 0000000..6f5b4f7
--- /dev/null
+++ b/game/server/tf/tf_gamestats.h
@@ -0,0 +1,172 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+#ifndef TF_GAMESTATS_H
+#define TF_GAMESTATS_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "gamestats.h"
+#include "tf_obj.h"
+#include "tf_gamestats_shared.h"
+#include "GameEventListener.h"
+
+class CTFPlayer;
+
+//=============================================================================
+//
+// TF Game Stats Class
+//
+class CTFGameStats : public CBaseGameStats, public CGameEventListener, public CAutoGameSystem
+{
+public:
+
+ // Constructor/Destructor.
+ CTFGameStats( void );
+ ~CTFGameStats( void );
+
+ virtual void Clear( void );
+
+ virtual bool UseOldFormat() { return false; }
+ virtual bool AddDataForSend( KeyValues *pKV, StatSendType_t sendType );
+
+ void AddMapData( KeyValues *pKV, TF_Gamestats_LevelStats_t *pCurrentMap );
+
+ virtual bool Init();
+ virtual void LevelInitPreEntity();
+ virtual void LevelShutdownPreClearSteamAPIContext();
+
+ // Events.
+ virtual void Event_LevelInit( void );
+ virtual void Event_LevelShutdown( float flElapsed );
+ virtual void Event_PlayerKilled( CBasePlayer *pPlayer, const CTakeDamageInfo &info );
+ void Event_RoundStart();
+ void Event_RoundEnd( int iWinningTeam, bool bFullRound, float flRoundTime, bool bWasSuddenDeathWin );
+ void Event_GameEnd();
+ void Event_PlayerConnected( CBasePlayer *pPlayer );
+ void Event_PlayerDisconnected( CTFPlayer *pPlayer ) {}
+ void Event_PlayerDisconnectedTF( CTFPlayer *pPlayer );
+ void Event_PlayerChangedClass( CTFPlayer *pPlayer, int iOldClass, int iNewClass );
+ void Event_PlayerSpawned( CTFPlayer *pPlayer );
+ void Event_PlayerForceRespawn( CTFPlayer *pPlayer );
+ void Event_PlayerLeachedHealth( CTFPlayer *pPlayer, bool bDispenserHeal, float amount );
+ void Event_PlayerHealedOther( CTFPlayer *pPlayer, float amount );
+ void Event_PlayerHealedOtherAssist( CTFPlayer *pPlayer, float amount );
+ void Event_PlayerBlockedDamage( CTFPlayer *pPlayer, int nAmount );
+ void Event_AssistKill( CTFPlayer *pPlayer, CBaseEntity *pVictim );
+ void Event_PlayerInvulnerable( CTFPlayer *pPlayer );
+ void Event_PlayerCreatedBuilding( CTFPlayer *pPlayer, CBaseObject *pBuilding );
+ void Event_PlayerDestroyedBuilding( CTFPlayer *pPlayer, CBaseObject *pBuilding );
+ void Event_AssistDestroyBuilding( CTFPlayer *pPlayer, CBaseObject *pBuilding );
+ void Event_Headshot( CTFPlayer *pKiller, bool bBowShot=false );
+ void Event_Backstab( CTFPlayer *pKiller );
+ void Event_PlayerUsedTeleport( CTFPlayer *pTeleportOwner, CTFPlayer *pTeleportingPlayer );
+ void Event_PlayerFiredWeapon( CTFPlayer *pPlayer, bool bCritical );
+ void Event_PlayerDamage( CBasePlayer *pPlayer, const CTakeDamageInfo &info, int iDamageTaken );
+ void Event_PlayerDamageAssist( CBasePlayer *pProvider, int iBonusDamage );
+ void Event_BossDamage( CBasePlayer *pAttacker, int iDamage );
+ void Event_PlayerKilledOther( CBasePlayer *pAttacker, CBaseEntity *pVictim, const CTakeDamageInfo &info );
+ void Event_PlayerCapturedPoint( CTFPlayer *pPlayer );
+ void Event_PlayerReturnedFlag( CTFPlayer *pPlayer );
+ void Event_PlayerScoresEscortPoints( CTFPlayer *pPlayer, int iPoints );
+ void Event_PlayerDefendedPoint( CTFPlayer *pPlayer );
+ void Event_PlayerDominatedOther( CTFPlayer *pAttacker );
+ void Event_PlayerRevenge( CTFPlayer *pAttacker );
+ void Event_PlayerStunBall( CTFPlayer *pAttacker, bool bSpecial );
+ void Event_PlayerAwardBonusPoints( CTFPlayer *pPlayer, CBaseEntity *pSource, int nCount );
+ void Event_PlayerHealthkitPickup( CTFPlayer *pTFPlayer );
+ void Event_PlayerAmmokitPickup( CTFPlayer *pTFPlayer );
+ void Event_PlayerSuicide( CBasePlayer *pPlayer );
+ void Event_KillDetail( CTFPlayer* pKiller, CTFPlayer* pVictim, CTFPlayer* pAssister, IGameEvent* event /*player_death*/, const CTakeDamageInfo &info );
+ void Event_TeamChange( CTFPlayer* pPlayer, int oldTeam, int newTeam );
+ void Event_PlayerCollectedCurrency( CBasePlayer *pPlayer, int nAmount );
+ void Event_PlayerLoadoutChanged( CTFPlayer *pPlayer, bool bForceReport );
+ void Event_PlayerRevived( CTFPlayer *pPlayer );
+ void Event_PlayerThrowableHit( CTFPlayer *pPlayer );
+ void Event_PlayerThrowableKill( CTFPlayer *pPlayer );
+ void Event_PlayerEarnedKillStreak( CTFPlayer *pPlayer );
+
+ void Event_HalloweenBossEvent( uint8 unBossType, uint16 unBossLevel, uint8 unEventType, uint8 unPlayersInvolved, float fElapsedTime );
+
+ virtual void FireGameEvent( IGameEvent * event );
+
+ bool IsRealGameplay( TF_Gamestats_LevelStats_t *game );
+
+ void AccumulateGameData();
+ void AccumulateVoteData( void );
+ bool GetVoteData( const char *szIssueName, int nNumOptions, CUtlVector <const char*> &vecNames );
+
+ void ClearCurrentGameData();
+
+ // SteamWorks GameStats
+ void SW_GameStats_WriteMap();
+ void SW_GameStats_WriteRound( int iWinningTeam, bool bFullRound, int iEndReason );
+ void SW_GameStats_WritePlayer( CTFPlayer *pPlayer, bool bDisconnected=false );
+ void SW_GameStats_WriteKill( CTFPlayer* pKiller, CTFPlayer* pVictim, CTFPlayer* pAssister, IGameEvent* event /*player_death*/, const CTakeDamageInfo &info );
+ void SW_ClassChange( CTFPlayer* pPlayer, int oldClass, int newClass );
+ void SW_GameEvent( CTFPlayer* pPlayer, const char* pszScoreType, int iPoints );
+ void SW_FlagEvent( int iPlayer, int iCarrier, int iEventType );
+ void SW_CapEvent( int iPoint, int iPlayer, const char* pszEventID, int iPoints );
+ void SW_WriteHostsRow();
+
+ // Passtime
+ void SW_PasstimeRoundEnded();
+
+ // PowerUp Mode
+ void Event_PowerUpModeDeath( CTFPlayer *pKiller, CTFPlayer *pVictim );
+ void Event_PowerUpRuneDuration( CTFPlayer *pKiller, int iDuration, int nRune );
+
+ // Utilities.
+ TF_Gamestats_LevelStats_t *GetCurrentMap( void ) { return m_reportedStats.m_pCurrentGame; }
+ TF_Gamestats_RoundStats_t* GetRoundStatsForTeam( int iTeamNumber );
+ void StoreGameEndReason( const char* reason );
+
+ struct PlayerStats_t * FindPlayerStats( CBasePlayer *pPlayer );
+ void ResetPlayerStats( CTFPlayer *pPlayer );
+ void ResetKillHistory( CTFPlayer *pPlayer );
+ void ResetRoundStats();
+protected:
+ void IncrementStat( CTFPlayer *pPlayer, TFStatType_t statType, int iValue );
+ void SendStatsToPlayer( CTFPlayer *pPlayer, bool bIsAlive );
+ void AccumulateAndResetPerLifeStats( CTFPlayer *pPlayer );
+ void TrackKillStats( CBasePlayer *pAttacker, CBasePlayer *pVictim );
+
+public:
+ TFReportedStats_t m_reportedStats; // Stats which are uploaded from TF server to Steam
+ PlayerStats_t m_aPlayerStats[MAX_PLAYERS+1]; // List of stats for each player for current life - reset after each death or class change
+
+ // Stats structs used for the new steamworks reporting.
+ TF_Gamestats_RoundStats_t m_currentRoundRed;
+ TF_Gamestats_RoundStats_t m_currentRoundBlue;
+ TF_Gamestats_KillStats_t m_currentKill;
+ TF_Gamestats_LevelStats_t m_currentMap;
+
+ bool m_bRoundActive;
+ int m_iRoundsPlayed;
+ bool m_bServerShutdown;
+ int m_iGameEndReason;
+
+ // Unique Column Keys
+ int m_iEvents;
+ int m_iKillCount;
+ int m_iPlayerUpdates;
+ int m_iLoadoutChangesCount;
+
+ // Robot Destruction Struct
+ RobotDestructionStats_t m_rdStats;
+
+ // Passtime
+ PasstimeStats_t m_passtimeStats;
+
+private:
+ CUtlMap< CUtlConstString, int > m_MapsPlaytime;
+ char m_szNextMap[32];
+};
+
+
+extern CTFGameStats CTF_GameStats;
+
+#endif // TF_GAMESTATS_H