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.
189 lines
4.7 KiB
189 lines
4.7 KiB
// agmsgstat.cpp: implementation of the agmsgstat class. |
|
// |
|
////////////////////////////////////////////////////////////////////// |
|
#include "extdll.h" |
|
#include "util.h" |
|
#include "cbase.h" |
|
#include "gamerules.h" |
|
#include "player.h" |
|
#include "game.h" |
|
#include "agglobal.h" |
|
#include "agmsgstat.h" |
|
|
|
////////////////////////////////////////////////////////////////////// |
|
// Construction/Destruction |
|
////////////////////////////////////////////////////////////////////// |
|
#ifdef AGMSGSTAT |
|
|
|
|
|
DLL_GLOBAL AgMsgStat g_MsgStat; |
|
|
|
class AgMsgStats |
|
{ |
|
public: |
|
AgMsgStats(const AgString& sName, int iSize) |
|
{ |
|
m_iSize = iSize; |
|
m_sName = sName; |
|
m_iBytes = 0; |
|
memset(&m_iarrDest,0,sizeof(m_iarrDest)); |
|
} |
|
AgString m_sName; |
|
int m_iSize; |
|
int m_iarrDest[10]; |
|
int m_iBytes; |
|
/* |
|
#define MSG_BROADCAST 0 // unreliable to all |
|
#define MSG_ONE 1 // reliable to one (msg_entity) |
|
#define MSG_ALL 2 // reliable to all |
|
#define MSG_INIT 3 // write to the init string |
|
#define MSG_PVS 4 // Ents in PVS of org |
|
#define MSG_PAS 5 // Ents in PAS of org |
|
#define MSG_PVS_R 6 // Reliable to PVS |
|
#define MSG_PAS_R 7 // Reliable to PAS |
|
#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped ) |
|
#define MSG_SPEC 9 // Sends to all spectator proxies |
|
*/ |
|
}; |
|
typedef map<int, AgMsgStats*, less<int> > AgMsgMap; |
|
static AgMsgMap s_mapMsgs; |
|
static AgMsgStats* s_pCurrentMsg = NULL; |
|
static int s_iStartMsg; |
|
|
|
AgMsgStat::AgMsgStat() |
|
{ |
|
s_iStartMsg = 0; |
|
|
|
} |
|
|
|
AgMsgStat::~AgMsgStat() |
|
{ |
|
|
|
} |
|
|
|
int AgMsgStat::RegUserMsg(const char *pszName, int iSize) |
|
{ |
|
int iMsg = (*g_engfuncs.pfnRegUserMsg)(pszName, iSize); |
|
|
|
if (0 == strcmp("MsgInfo",pszName)) |
|
s_iStartMsg = iMsg; //I just wanna log AG's messages too see if I've done anything stupid |
|
|
|
if (iMsg >= s_iStartMsg) |
|
s_mapMsgs.insert(AgMsgMap::value_type(iMsg, new AgMsgStats(pszName, iSize))); |
|
return iMsg; |
|
} |
|
|
|
void AgMsgStat::MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed) |
|
{ |
|
//note what type was sent. |
|
AgMsgMap::iterator itrMsgs = s_mapMsgs.find(msg_type); |
|
if (itrMsgs != s_mapMsgs.end() /*&& msg_type != 77 && msg_type != 65*/ && msg_type != 105) |
|
{ |
|
(*itrMsgs).second->m_iarrDest[msg_dest]++; |
|
AgConsole((*itrMsgs).second->m_sName); |
|
s_pCurrentMsg = (*itrMsgs).second; |
|
} |
|
(*g_engfuncs.pfnMessageBegin)(msg_dest, msg_type, pOrigin, ed); |
|
} |
|
|
|
void AgMsgStat::WriteByte(int iValue) |
|
{ |
|
(*g_engfuncs.pfnWriteByte)(iValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(BYTE); |
|
} |
|
|
|
void AgMsgStat::WriteChar(int iValue) |
|
{ |
|
(*g_engfuncs.pfnWriteChar)(iValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(char); |
|
} |
|
|
|
void AgMsgStat::WriteShort(int iValue) |
|
{ |
|
(*g_engfuncs.pfnWriteShort)(iValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(short); |
|
} |
|
|
|
void AgMsgStat::WriteLong(int iValue) |
|
{ |
|
(*g_engfuncs.pfnWriteLong)(iValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(int); |
|
} |
|
|
|
void AgMsgStat::WriteAngle(float flValue) |
|
{ |
|
(*g_engfuncs.pfnWriteAngle)(flValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(float); |
|
} |
|
|
|
void AgMsgStat::WriteCoord(float flValue) |
|
{ |
|
(*g_engfuncs.pfnWriteCoord)(flValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(float); |
|
} |
|
|
|
|
|
void AgMsgStat::WriteString(const char *sz) |
|
{ |
|
(*g_engfuncs.pfnWriteString)(sz); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += strlen(sz); |
|
} |
|
|
|
void AgMsgStat::WriteEntity(int iValue) |
|
{ |
|
(*g_engfuncs.pfnWriteEntity)(iValue); |
|
if (s_pCurrentMsg) |
|
s_pCurrentMsg->m_iBytes += sizeof(int); |
|
} |
|
|
|
void AgMsgStat::MessageEnd(void) |
|
{ |
|
(*g_engfuncs.pfnMessageEnd)(); |
|
s_pCurrentMsg = NULL; |
|
} |
|
|
|
void AgMsgStat::DumpStats() |
|
{ |
|
char szFile[MAX_PATH]; |
|
sprintf(szFile,"%s/msgstat.txt",AgGetDirectory()); |
|
FILE* pFile = fopen(szFile,"wb"); |
|
if (!pFile) |
|
return; |
|
|
|
//Dump it. |
|
for (AgMsgMap::iterator itrMsgs = s_mapMsgs.begin() ;itrMsgs != s_mapMsgs.end(); ++itrMsgs) |
|
{ |
|
AgMsgStats* pMsg = (*itrMsgs).second; |
|
|
|
int iTotalSent = 0; //Total number of messages sent. |
|
char szDest[128]; |
|
int iPos = 0; |
|
|
|
for (int i = 0; i < (sizeof(pMsg->m_iarrDest) / sizeof(pMsg->m_iarrDest[0])); i++) |
|
{ |
|
iTotalSent += pMsg->m_iarrDest[i]; |
|
iPos += sprintf(&szDest[iPos], "%d\t", pMsg->m_iarrDest[i]); |
|
} |
|
szDest[iPos-1] = '\0'; |
|
|
|
//Msg - totalsent - totalsize - sizepermsg - per msgdest |
|
fprintf(pFile, "%s\t%d\t%d\t%d\t%d\t%s\n", pMsg->m_sName.c_str(), (*itrMsgs).first, iTotalSent, pMsg->m_iBytes, pMsg->m_iSize, szDest); |
|
AgConsole(UTIL_VarArgs("%s\t%d\t%d\t%d\t%d\t%s", pMsg->m_sName.c_str(), (*itrMsgs).first, iTotalSent, pMsg->m_iBytes, pMsg->m_iSize, szDest)); |
|
|
|
// delete (*itrMsgs).second; |
|
} |
|
|
|
fflush(pFile); |
|
fclose(pFile); |
|
|
|
// s_mapMsgs.clear(); |
|
} |
|
|
|
#endif |