1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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
|