You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.2 KiB
172 lines
7.2 KiB
//========= 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
|
|
|