//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef CS_STEAMSTATS_H #define CS_STEAMSTATS_H #ifdef _WIN32 #pragma once #endif #include "steam/steam_api.h" #include "GameEventListener.h" #include "../game/shared/cstrike/cs_gamestats_shared.h" struct SRoundData : public BaseStatData { SRoundData( const StatsCollection_t *pRoundData ) { nRoundTime = (*pRoundData)[CSSTAT_PLAYTIME]; nWasKilled = (*pRoundData)[CSSTAT_DEATHS]; nIsMVP = (*pRoundData)[CSSTAT_MVPS]; nMoneySpent = (*pRoundData)[CSSTAT_MONEY_SPENT]; nStartingMoney = -1;// We'll get this data separately nRoundEndReason = Invalid_Round_End_Reason;// We'll get this data separately nRevenges = (*pRoundData)[CSSTAT_REVENGES]; nDamageDealt = (*pRoundData)[CSSTAT_DAMAGE]; if ( (*pRoundData)[CSSTAT_T_ROUNDS_WON] ) { nWinningTeamID = TEAM_TERRORIST; if ( (*pRoundData)[CSSTAT_ROUNDS_WON] ) { nTeamID = TEAM_TERRORIST; } else { nTeamID = TEAM_CT; } } else { nWinningTeamID = TEAM_CT; if ( (*pRoundData)[CSSTAT_ROUNDS_WON] ) { nTeamID = TEAM_CT; } else { nTeamID = TEAM_TERRORIST; } } } uint32 nRoundTime; int nTeamID; int nWinningTeamID; int nWasKilled; int nIsMVP; int nDamageDealt; int nMoneySpent; int nStartingMoney; int nRevenges; int nRoundEndReason; BEGIN_STAT_TABLE( "CSSRoundData" ) REGISTER_STAT_NAMED( nRoundTime, "RoundTime" ) REGISTER_STAT_NAMED( nTeamID, "TeamID" ) REGISTER_STAT_NAMED( nWinningTeamID, "WinningTeamID" ) REGISTER_STAT_NAMED( nWasKilled, "WasKilled" ) REGISTER_STAT_NAMED( nIsMVP, "IsMvp" ) REGISTER_STAT_NAMED( nDamageDealt, "DamageDealt" ) REGISTER_STAT_NAMED( nMoneySpent, "MoneySpent" ) REGISTER_STAT_NAMED( nStartingMoney, "StartingMoney" ) REGISTER_STAT_NAMED( nRevenges, "Revenges" ) REGISTER_STAT_NAMED( nRoundEndReason, "RoundEndReason" ) END_STAT_TABLE() }; typedef CUtlVector< SRoundData* > VectorRoundData; struct PlayerStatData_t { wchar_t* pStatDisplayName; // Localized display name of the stat int iStatId; // CSStatType_t enum value of stat int32 iStatValue; // Value of the stat }; class CCSClientGameStats : public CAutoGameSystem, public CGameEventListener, public IGameStatTracker { public: CCSClientGameStats(); virtual void PostInit(); virtual void LevelShutdownPreEntity(); virtual void Shutdown(); virtual void LevelShutdownPreClearSteamAPIContext(); int GetStatCount(); PlayerStatData_t GetStatByIndex(int index); PlayerStatData_t GetStatById(int id); void ResetAllStats( void ); void ResetMatchStats(); void UploadRoundData( void ); const StatsCollection_t& GetLifetimeStats() { return m_lifetimeStats; } const StatsCollection_t& GetMatchStats() { return m_matchStats; } RoundStatsDirectAverage_t* GetDirectCTStatsAverages() { return &m_directCTStatAverages; } RoundStatsDirectAverage_t* GetDirectTStatsAverages() { return &m_directTStatAverages; } RoundStatsDirectAverage_t* GetDirectPlayerStatsAverages() { return &m_directPlayerStatAverages; } void MsgFunc_MatchStatsUpdate( bf_read &msg ); void MsgFunc_PlayerStatsUpdate( bf_read &msg ); // Steamworks Gamestats virtual void SubmitGameStats( KeyValues *pKV ) { int listCount = s_StatLists->Count(); for( int i=0; i < listCount; ++i ) { // Create a master key value that has stats everybody should share (map name, session ID, etc) (*s_StatLists)[i]->SendData(pKV); (*s_StatLists)[i]->Clear(); } } virtual StatContainerList_t* GetStatContainerList( void ) { return s_StatLists; } protected: void FireGameEvent( IGameEvent *event ); void UpdateSteamStats(); void RetrieveSteamStats(); void UpdateStats( const StatsCollection_t &stats ); void CalculateMatchFavoriteWeapons(); void UpdateLastMatchStats(); private: StatsCollection_t m_lifetimeStats; StatsCollection_t m_matchStats; StatsCollection_t m_roundStats; RoundStatsDirectAverage_t m_directCTStatAverages; RoundStatsDirectAverage_t m_directTStatAverages; RoundStatsDirectAverage_t m_directPlayerStatAverages; int m_matchMaxPlayerCount; bool m_bSteamStatsDownload; VectorRoundData m_RoundStatData; int m_RoundEndReason; // A static list of all the stat containers, one for each data structure being tracked static StatContainerList_t * s_StatLists; }; extern CCSClientGameStats g_CSClientGameStats; #endif //CS_STEAMSTATS_H