mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-12 19:18:20 +00:00
Merge pull request #7709 from furo321/server-demos-fixes
A few fixes and improvements to server-side auto demos.
This commit is contained in:
commit
f12f789c3a
|
@ -315,7 +315,8 @@ CServer::CServer()
|
||||||
m_pConfig = &g_Config;
|
m_pConfig = &g_Config;
|
||||||
for(int i = 0; i < MAX_CLIENTS; i++)
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||||
m_aDemoRecorder[i] = CDemoRecorder(&m_SnapshotDelta, true);
|
m_aDemoRecorder[i] = CDemoRecorder(&m_SnapshotDelta, true);
|
||||||
m_aDemoRecorder[MAX_CLIENTS] = CDemoRecorder(&m_SnapshotDelta, false);
|
m_aDemoRecorder[RECORDER_MANUAL] = CDemoRecorder(&m_SnapshotDelta, false);
|
||||||
|
m_aDemoRecorder[RECORDER_AUTO] = CDemoRecorder(&m_SnapshotDelta, false);
|
||||||
|
|
||||||
m_pGameServer = 0;
|
m_pGameServer = 0;
|
||||||
|
|
||||||
|
@ -928,8 +929,10 @@ int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID)
|
||||||
{
|
{
|
||||||
if(m_aDemoRecorder[ClientID].IsRecording())
|
if(m_aDemoRecorder[ClientID].IsRecording())
|
||||||
m_aDemoRecorder[ClientID].RecordMessage(Pack.Data(), Pack.Size());
|
m_aDemoRecorder[ClientID].RecordMessage(Pack.Data(), Pack.Size());
|
||||||
if(m_aDemoRecorder[MAX_CLIENTS].IsRecording())
|
if(m_aDemoRecorder[RECORDER_MANUAL].IsRecording())
|
||||||
m_aDemoRecorder[MAX_CLIENTS].RecordMessage(Pack.Data(), Pack.Size());
|
m_aDemoRecorder[RECORDER_MANUAL].RecordMessage(Pack.Data(), Pack.Size());
|
||||||
|
if(m_aDemoRecorder[RECORDER_AUTO].IsRecording())
|
||||||
|
m_aDemoRecorder[RECORDER_AUTO].RecordMessage(Pack.Data(), Pack.Size());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(Flags & MSGFLAG_NOSEND))
|
if(!(Flags & MSGFLAG_NOSEND))
|
||||||
|
@ -962,9 +965,9 @@ void CServer::DoSnapshot()
|
||||||
{
|
{
|
||||||
GameServer()->OnPreSnap();
|
GameServer()->OnPreSnap();
|
||||||
|
|
||||||
// create snapshot for demo recording
|
if(m_aDemoRecorder[RECORDER_MANUAL].IsRecording() || m_aDemoRecorder[RECORDER_AUTO].IsRecording())
|
||||||
if(m_aDemoRecorder[MAX_CLIENTS].IsRecording())
|
|
||||||
{
|
{
|
||||||
|
// create snapshot for demo recording
|
||||||
char aData[CSnapshot::MAX_SIZE];
|
char aData[CSnapshot::MAX_SIZE];
|
||||||
|
|
||||||
// build snap and possibly add some messages
|
// build snap and possibly add some messages
|
||||||
|
@ -973,7 +976,10 @@ void CServer::DoSnapshot()
|
||||||
int SnapshotSize = m_SnapshotBuilder.Finish(aData);
|
int SnapshotSize = m_SnapshotBuilder.Finish(aData);
|
||||||
|
|
||||||
// write snapshot
|
// write snapshot
|
||||||
m_aDemoRecorder[MAX_CLIENTS].RecordSnapshot(Tick(), aData, SnapshotSize);
|
if(m_aDemoRecorder[RECORDER_MANUAL].IsRecording())
|
||||||
|
m_aDemoRecorder[RECORDER_MANUAL].RecordSnapshot(Tick(), aData, SnapshotSize);
|
||||||
|
if(m_aDemoRecorder[RECORDER_AUTO].IsRecording())
|
||||||
|
m_aDemoRecorder[RECORDER_AUTO].RecordSnapshot(Tick(), aData, SnapshotSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create snapshots for all clients
|
// create snapshots for all clients
|
||||||
|
@ -3393,17 +3399,17 @@ void CServer::DemoRecorder_HandleAutoStart()
|
||||||
{
|
{
|
||||||
if(Config()->m_SvAutoDemoRecord)
|
if(Config()->m_SvAutoDemoRecord)
|
||||||
{
|
{
|
||||||
m_aDemoRecorder[MAX_CLIENTS].Stop();
|
m_aDemoRecorder[RECORDER_AUTO].Stop();
|
||||||
char aFilename[IO_MAX_PATH_LENGTH];
|
char aFilename[IO_MAX_PATH_LENGTH];
|
||||||
char aDate[20];
|
char aDate[20];
|
||||||
str_timestamp(aDate, sizeof(aDate));
|
str_timestamp(aDate, sizeof(aDate));
|
||||||
str_format(aFilename, sizeof(aFilename), "demos/%s_%s.demo", "auto/autorecord", aDate);
|
str_format(aFilename, sizeof(aFilename), "demos/auto/server/%s_%s.demo", m_aCurrentMap, aDate);
|
||||||
m_aDemoRecorder[MAX_CLIENTS].Start(Storage(), m_pConsole, aFilename, GameServer()->NetVersion(), m_aCurrentMap, m_aCurrentMapSha256[MAP_TYPE_SIX], m_aCurrentMapCrc[MAP_TYPE_SIX], "server", m_aCurrentMapSize[MAP_TYPE_SIX], m_apCurrentMapData[MAP_TYPE_SIX]);
|
m_aDemoRecorder[RECORDER_AUTO].Start(Storage(), m_pConsole, aFilename, GameServer()->NetVersion(), m_aCurrentMap, m_aCurrentMapSha256[MAP_TYPE_SIX], m_aCurrentMapCrc[MAP_TYPE_SIX], "server", m_aCurrentMapSize[MAP_TYPE_SIX], m_apCurrentMapData[MAP_TYPE_SIX]);
|
||||||
if(Config()->m_SvAutoDemoMax)
|
if(Config()->m_SvAutoDemoMax)
|
||||||
{
|
{
|
||||||
// clean up auto recorded demos
|
// clean up auto recorded demos
|
||||||
CFileCollection AutoDemos;
|
CFileCollection AutoDemos;
|
||||||
AutoDemos.Init(Storage(), "demos/server", "autorecord", ".demo", Config()->m_SvAutoDemoMax);
|
AutoDemos.Init(Storage(), "demos/auto/server", "", ".demo", Config()->m_SvAutoDemoMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3452,7 +3458,7 @@ bool CServer::IsRecording(int ClientID)
|
||||||
|
|
||||||
void CServer::StopDemos()
|
void CServer::StopDemos()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < MAX_CLIENTS + 1; i++)
|
for(int i = 0; i < NUM_RECORDERS; i++)
|
||||||
{
|
{
|
||||||
if(!m_aDemoRecorder[i].IsRecording())
|
if(!m_aDemoRecorder[i].IsRecording())
|
||||||
continue;
|
continue;
|
||||||
|
@ -3474,7 +3480,7 @@ void CServer::ConRecord(IConsole::IResult *pResult, void *pUser)
|
||||||
CServer *pServer = (CServer *)pUser;
|
CServer *pServer = (CServer *)pUser;
|
||||||
char aFilename[IO_MAX_PATH_LENGTH];
|
char aFilename[IO_MAX_PATH_LENGTH];
|
||||||
|
|
||||||
if(pServer->IsRecording(MAX_CLIENTS))
|
if(pServer->IsRecording(RECORDER_MANUAL))
|
||||||
{
|
{
|
||||||
pServer->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Demo recorder already recording");
|
pServer->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Demo recorder already recording");
|
||||||
return;
|
return;
|
||||||
|
@ -3488,12 +3494,12 @@ void CServer::ConRecord(IConsole::IResult *pResult, void *pUser)
|
||||||
str_timestamp(aDate, sizeof(aDate));
|
str_timestamp(aDate, sizeof(aDate));
|
||||||
str_format(aFilename, sizeof(aFilename), "demos/demo_%s.demo", aDate);
|
str_format(aFilename, sizeof(aFilename), "demos/demo_%s.demo", aDate);
|
||||||
}
|
}
|
||||||
pServer->m_aDemoRecorder[MAX_CLIENTS].Start(pServer->Storage(), pServer->Console(), aFilename, pServer->GameServer()->NetVersion(), pServer->m_aCurrentMap, pServer->m_aCurrentMapSha256[MAP_TYPE_SIX], pServer->m_aCurrentMapCrc[MAP_TYPE_SIX], "server", pServer->m_aCurrentMapSize[MAP_TYPE_SIX], pServer->m_apCurrentMapData[MAP_TYPE_SIX]);
|
pServer->m_aDemoRecorder[RECORDER_MANUAL].Start(pServer->Storage(), pServer->Console(), aFilename, pServer->GameServer()->NetVersion(), pServer->m_aCurrentMap, pServer->m_aCurrentMapSha256[MAP_TYPE_SIX], pServer->m_aCurrentMapCrc[MAP_TYPE_SIX], "server", pServer->m_aCurrentMapSize[MAP_TYPE_SIX], pServer->m_apCurrentMapData[MAP_TYPE_SIX]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CServer::ConStopRecord(IConsole::IResult *pResult, void *pUser)
|
void CServer::ConStopRecord(IConsole::IResult *pResult, void *pUser)
|
||||||
{
|
{
|
||||||
((CServer *)pUser)->m_aDemoRecorder[MAX_CLIENTS].Stop();
|
((CServer *)pUser)->m_aDemoRecorder[RECORDER_MANUAL].Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CServer::ConMapReload(IConsole::IResult *pResult, void *pUser)
|
void CServer::ConMapReload(IConsole::IResult *pResult, void *pUser)
|
||||||
|
|
|
@ -268,13 +268,20 @@ public:
|
||||||
NUM_MAP_TYPES
|
NUM_MAP_TYPES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
RECORDER_MANUAL = MAX_CLIENTS,
|
||||||
|
RECORDER_AUTO = MAX_CLIENTS + 1,
|
||||||
|
NUM_RECORDERS = MAX_CLIENTS + 2,
|
||||||
|
};
|
||||||
|
|
||||||
char m_aCurrentMap[IO_MAX_PATH_LENGTH];
|
char m_aCurrentMap[IO_MAX_PATH_LENGTH];
|
||||||
SHA256_DIGEST m_aCurrentMapSha256[NUM_MAP_TYPES];
|
SHA256_DIGEST m_aCurrentMapSha256[NUM_MAP_TYPES];
|
||||||
unsigned m_aCurrentMapCrc[NUM_MAP_TYPES];
|
unsigned m_aCurrentMapCrc[NUM_MAP_TYPES];
|
||||||
unsigned char *m_apCurrentMapData[NUM_MAP_TYPES];
|
unsigned char *m_apCurrentMapData[NUM_MAP_TYPES];
|
||||||
unsigned int m_aCurrentMapSize[NUM_MAP_TYPES];
|
unsigned int m_aCurrentMapSize[NUM_MAP_TYPES];
|
||||||
|
|
||||||
CDemoRecorder m_aDemoRecorder[MAX_CLIENTS + 1];
|
CDemoRecorder m_aDemoRecorder[NUM_RECORDERS];
|
||||||
CAuthManager m_AuthManager;
|
CAuthManager m_AuthManager;
|
||||||
|
|
||||||
int64_t m_ServerInfoFirstRequest;
|
int64_t m_ServerInfoFirstRequest;
|
||||||
|
|
|
@ -109,6 +109,7 @@ public:
|
||||||
CreateFolder("demos", TYPE_SAVE);
|
CreateFolder("demos", TYPE_SAVE);
|
||||||
CreateFolder("demos/auto", TYPE_SAVE);
|
CreateFolder("demos/auto", TYPE_SAVE);
|
||||||
CreateFolder("demos/auto/race", TYPE_SAVE);
|
CreateFolder("demos/auto/race", TYPE_SAVE);
|
||||||
|
CreateFolder("demos/auto/server", TYPE_SAVE);
|
||||||
CreateFolder("demos/replays", TYPE_SAVE);
|
CreateFolder("demos/replays", TYPE_SAVE);
|
||||||
CreateFolder("editor", TYPE_SAVE);
|
CreateFolder("editor", TYPE_SAVE);
|
||||||
CreateFolder("ghosts", TYPE_SAVE);
|
CreateFolder("ghosts", TYPE_SAVE);
|
||||||
|
|
|
@ -3734,6 +3734,8 @@ void CGameContext::OnInit(const void *pPersistentData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server()->DemoRecorder_HandleAutoStart();
|
||||||
|
|
||||||
if(!m_pScore)
|
if(!m_pScore)
|
||||||
{
|
{
|
||||||
m_pScore = new CScore(this, ((CServer *)Server())->DbPool());
|
m_pScore = new CScore(this, ((CServer *)Server())->DbPool());
|
||||||
|
|
Loading…
Reference in a new issue