summaryrefslogtreecommitdiff
path: root/game/server/textstatsmgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/textstatsmgr.h')
-rw-r--r--game/server/textstatsmgr.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/game/server/textstatsmgr.h b/game/server/textstatsmgr.h
new file mode 100644
index 0000000..473e1a0
--- /dev/null
+++ b/game/server/textstatsmgr.h
@@ -0,0 +1,133 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef TEXTSTATSMGR_H
+#define TEXTSTATSMGR_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "filesystem.h"
+#include "utllinkedlist.h"
+
+
+// Text stats get to print their stuff by implementing this type of function.
+typedef void (*TextStatPrintFn)( IFileSystem *pFileSys, FileHandle_t hFile, void *pUserData );
+typedef void (*TextStatFileFn)();
+
+
+// The CTextStatsMgr is just a collection of CTextStat's that go into the same file.
+class CTextStatsMgr
+{
+public:
+ CTextStatsMgr( void );
+
+ // Write a file with all the registered stats.
+ bool WriteFile( IFileSystem *pFileSystem, const char *pFilename = NULL );
+
+ // Get the preset filename to write stats to, if none is specified when writing
+ char *GetStatsFilename( void );
+
+ // Set the filename to write stats to, if none is specified when writing
+ void SetStatsFilename( char *sFilename );
+
+private:
+ char m_szStatFilename[ MAX_PATH ];
+};
+
+
+// This is the default CTextStatsMgr, but there can be any number of them.
+extern CTextStatsMgr g_TextStatsMgr;
+
+
+
+// Make these to register text stat functions.
+class CTextStat
+{
+friend class CTextStatsMgr;
+
+public:
+ CTextStat();
+ CTextStat( TextStatPrintFn fn, void *pUserData, CTextStatsMgr *pMgr=&g_TextStatsMgr );
+ ~CTextStat();
+
+ // This can be called if you don't want to pass parameters into the constructor.
+ void Init( TextStatPrintFn printFn, void *pUserData, CTextStatsMgr *pMgr=&g_TextStatsMgr );
+ void Term();
+
+
+private:
+
+ // Special constructor to just tie off the linked list.
+ CTextStat( bool bGlobalListHead );
+
+ // The global list of CTextStats.
+ static CTextStat* GetTextStatsList();
+
+ static void RemoveFn( void *pUserData );
+
+ // Link it into the global list.
+ CTextStat *m_pPrev;
+ CTextStat *m_pNext;
+
+ CTextStatsMgr *m_pMgr;
+
+ TextStatPrintFn m_PrintFn;
+ void *m_pUserData;
+};
+
+
+// This class registers like a ConVar and acts like an int. When the game is shutdown,
+// its value will be saved in the stats file along with its name.s
+class CTextStatInt
+{
+public:
+ CTextStatInt( const char *pName, int initialValue=0, CTextStatsMgr *pMgr=&g_TextStatsMgr );
+
+ operator int() const { return m_Value; }
+ int operator=( int val ) { m_Value = val; return m_Value; }
+
+ int operator++() { m_Value++; return m_Value; }
+ int operator--() { m_Value--; return m_Value; }
+ int operator+=( int val ) { m_Value += val; return m_Value; }
+ int operator-=( int val ) { m_Value -= val; return m_Value; }
+ int operator*=( int val ) { m_Value *= val; return m_Value; }
+ int operator/=( int val ) { m_Value /= val; return m_Value; }
+
+
+private:
+
+ static void PrintFn( IFileSystem *pFileSys, FileHandle_t hFile, void *pUserData );
+
+
+private:
+
+ const char *m_pName;
+ int m_Value;
+
+ CTextStat m_Reg; // Use to register ourselves.
+};
+
+
+// This can be registered to get a callback when the text stats mgr is saving its files.
+// You can write data out to your own file in here.
+class CTextStatFile
+{
+public:
+ CTextStatFile( TextStatFileFn fn );
+
+private:
+ friend class CTextStatsMgr;
+
+ static CTextStatFile *s_pHead;
+ CTextStatFile *m_pNext;
+ TextStatFileFn m_pFn;
+};
+
+
+#endif // TEXTSTATSMGR_H