Merge pull request #8016 from dobrykafe/pr-save-replay-improve

Improvements regarding `save_replay`
This commit is contained in:
Robert Müller 2024-02-26 18:39:20 +00:00 committed by GitHub
commit 7c4d51f111
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 35 additions and 14 deletions

View file

@ -2612,11 +2612,20 @@ void CClient::Update()
if(pJob->State() == IJob::STATE_DONE)
{
char aBuf[IO_MAX_PATH_LENGTH + 64];
str_format(aBuf, sizeof(aBuf), "Successfully saved the replay to %s!", pJob->Destination());
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", aBuf);
if(pJob->Success())
{
str_format(aBuf, sizeof(aBuf), "Successfully saved the replay to '%s'!", pJob->Destination());
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", aBuf);
GameClient()->Echo(Localize("Successfully saved the replay!"));
GameClient()->Echo(Localize("Successfully saved the replay!"));
}
else
{
str_format(aBuf, sizeof(aBuf), "Failed saving the replay to '%s'...", pJob->Destination());
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", aBuf);
GameClient()->Echo(Localize("Failed saving the replay!"));
}
m_EditJobs.pop_front();
}
}
@ -3482,9 +3491,6 @@ void CClient::SaveReplay(const int Length, const char *pFilename)
}
else
{
// First we stop the recorder to slice correctly the demo after
DemoRecorder(RECORDER_REPLAYS)->Stop(IDemoRecorder::EStopMode::KEEP_FILE);
char aFilename[IO_MAX_PATH_LENGTH];
if(pFilename[0] == '\0')
{
@ -3495,8 +3501,19 @@ void CClient::SaveReplay(const int Length, const char *pFilename)
else
{
str_format(aFilename, sizeof(aFilename), "demos/replays/%s.demo", pFilename);
IOHANDLE Handle = m_pStorage->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
if(!Handle)
{
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "replay", "ERROR: invalid filename. Try a different one!");
return;
}
io_close(Handle);
m_pStorage->RemoveFile(aFilename, IStorage::TYPE_SAVE);
}
// Stop the recorder to correctly slice the demo after
DemoRecorder(RECORDER_REPLAYS)->Stop(IDemoRecorder::EStopMode::KEEP_FILE);
// Slice the demo to get only the last cl_replay_length seconds
const char *pSrc = m_aDemoRecorder[RECORDER_REPLAYS].CurrentFilename();
const int EndTick = GameTick(g_Config.m_ClDummy);

View file

@ -20,7 +20,8 @@ CDemoEdit::CDemoEdit(const char *pNetVersion, class CSnapshotDelta *pSnapshotDel
void CDemoEdit::Run()
{
// Slice the current demo
m_DemoEditor.Slice(m_aDemo, m_aDst, m_StartTick, m_EndTick, NULL, 0);
// We remove the temporary demo file
m_pStorage->RemoveFile(m_aDemo, IStorage::TYPE_SAVE);
m_Success = m_DemoEditor.Slice(m_aDemo, m_aDst, m_StartTick, m_EndTick, NULL, 0);
// We remove the temporary demo file if slicing is successful
if(m_Success)
m_pStorage->RemoveFile(m_aDemo, IStorage::TYPE_SAVE);
}

View file

@ -18,10 +18,12 @@ class CDemoEdit : public IJob
char m_aDst[256];
int m_StartTick;
int m_EndTick;
bool m_Success;
public:
CDemoEdit(const char *pNetVersion, CSnapshotDelta *pSnapshotDelta, IStorage *pStorage, const char *pDemo, const char *pDst, int StartTick, int EndTick);
void Run() override;
char *Destination() { return m_aDst; }
bool Success() { return m_Success; }
};
#endif

View file

@ -118,7 +118,7 @@ class IDemoEditor : public IInterface
{
MACRO_INTERFACE("demoeditor")
public:
virtual void Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) = 0;
virtual bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) = 0;
};
#endif

View file

@ -1225,11 +1225,11 @@ void CDemoEditor::Init(const char *pNetVersion, class CSnapshotDelta *pSnapshotD
m_pStorage = pStorage;
}
void CDemoEditor::Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser)
bool CDemoEditor::Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser)
{
CDemoPlayer DemoPlayer(m_pSnapshotDelta, false);
if(DemoPlayer.Load(m_pStorage, m_pConsole, pDemo, IStorage::TYPE_ALL_OR_ABSOLUTE) == -1)
return;
return false;
const CMapInfo *pMapInfo = DemoPlayer.GetMapInfo();
const CDemoPlayer::CPlaybackInfo *pInfo = DemoPlayer.Info();
@ -1248,7 +1248,7 @@ void CDemoEditor::Slice(const char *pDemo, const char *pDst, int StartTick, int
if(Result != 0)
{
DemoPlayer.Stop();
return;
return false;
}
CDemoRecordingListener Listener;
@ -1280,4 +1280,5 @@ void CDemoEditor::Slice(const char *pDemo, const char *pDst, int StartTick, int
DemoPlayer.Stop();
DemoRecorder.Stop(IDemoRecorder::EStopMode::KEEP_FILE);
return true;
}

View file

@ -186,7 +186,7 @@ class CDemoEditor : public IDemoEditor
public:
virtual void Init(const char *pNetVersion, class CSnapshotDelta *pSnapshotDelta, class IConsole *pConsole, class IStorage *pStorage);
void Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override;
bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override;
};
#endif