ddnet/src/game/server/teehistorian.h
heinrich5991 6ef9c8dbcd First working version of teehistorian
teehistorian records all inputs from the players as well as the player
positions in each tick. It stores this info in a highly compressible
output format (I've achived 5x compression using xz or bz2).
2017-09-20 02:16:11 +02:00

91 lines
1.7 KiB
C++

#include <engine/shared/packer.h>
#include <engine/shared/protocol.h>
#include <game/generated/protocol.h>
#include <time.h>
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;
};