#include #include #include #include class CTeeHistorian { public: typedef void (*WRITE_CALLBACK)(const void *pData, int DataSize, void *pUser); struct CGameInfo { CUuid m_GameUuid; const char *m_pServerVersion; time_t m_StartTime; const char *m_pServerName; int m_ServerPort; const char *m_pGameType; const char *m_pMapName; int m_MapSize; int m_MapCrc; }; CTeeHistorian(); void Reset(const CGameInfo *pGameInfo, WRITE_CALLBACK pfnWriteCallback, void *pUser); void Finish(); bool Starting() const { return m_State == STATE_START; } void BeginTick(int Tick); void BeginPlayers(); void RecordPlayer(int ClientID, const CNetObj_CharacterCore *pChar); void RecordDeadPlayer(int ClientID); void EndPlayers(); void BeginInputs(); void RecordPlayerInput(int ClientID, const CNetObj_PlayerInput *pInput); void EndInputs(); void EndTick(); bool m_Debug; private: void WriteHeader(const CGameInfo *pGameInfo); void UpdateMinMaxClientID(int ClientID); void WriteTick(); void Write(const void *pData, int DataSize); enum { STATE_START, STATE_BEFORE_TICK, STATE_BEFORE_PLAYERS, STATE_PLAYERS, STATE_BEFORE_INPUTS, STATE_INPUTS, STATE_BEFORE_ENDTICK, NUM_STATES, }; struct CPlayer { bool m_Alive; int m_X; int m_Y; CNetObj_PlayerInput m_Input; bool m_InputExists; }; WRITE_CALLBACK m_pfnWriteCallback; void *m_pWriteCallbackUserdata; int m_State; int m_LastWrittenTick; bool m_TickWritten; int m_Tick; int m_PrevMaxClientID; int m_MaxClientID; int m_MinClientID; CPlayer m_aPrevPlayers[MAX_CLIENTS]; CPacker m_Buffer; };