//========= Copyright Valve Corporation, All rights reserved. ============// #include "cbase.h" #if defined( REPLAY_ENABLED ) #include "replay/cdll_replay.h" #include "replay/replaycamera.h" #include "replay/replay_ragdoll.h" #include "replay/iclientreplay.h" #include "replay/ireplayscreenshotsystem.h" #include "replay/ireplaysystem.h" #include "replay/ienginereplay.h" #include "replay/ireplaymoviemanager.h" #include "replay/vgui/replayconfirmquitdlg.h" #include "replay/vgui/replaybrowsermainpanel.h" #include "replay/vgui/replayinputpanel.h" #include "replay/vgui/replayperformanceeditor.h" #include "replayperformanceplaybackhandler.h" #include "vgui/ILocalize.h" #include "vgui/ISurface.h" #include "clientmode.h" #include "iviewrender.h" #include "igameevents.h" #include "replaycamera.h" #if defined( TF_CLIENT_DLL ) #include "c_tf_gamestats.h" #endif #include "steamworks_gamestats.h" #include "replay_gamestats_shared.h" //---------------------------------------------------------------------------------------- class IReplayScreenshotSystem; //---------------------------------------------------------------------------------------- extern void ReplayUI_OpenReplayRenderOverlay(); extern void ReplayUI_HideRenderOverlay(); //---------------------------------------------------------------------------------------- extern IReplayMovieManager *g_pReplayMovieManager; //---------------------------------------------------------------------------------------- class CClientReplayImp : public IClientReplay { public: virtual uint64 GetServerSessionId() { return GetSteamWorksSGameStatsUploader().GetServerSessionID(); } virtual IReplayScreenshotSystem *GetReplayScreenshotSystem() { if ( g_pEngineReplay->IsSupportedModAndPlatform() ) return view->GetReplayScreenshotSystem(); return NULL; } virtual IReplayPerformancePlaybackHandler *GetPerformancePlaybackHandler() { return g_pReplayPerformancePlaybackHandler; } virtual bool CacheReplayRagdolls( const char* pFilename, int nStartTick ) { return Replay_CacheRagdolls( pFilename, nStartTick ); } virtual void OnSaveReplay( ReplayHandle_t hNewReplay, bool bShowInputDlg ) { if ( bShowInputDlg ) { // Get a name for the replay, saves to disk, add thumbnail to replay browser ShowReplayInputPanel( hNewReplay ); } else { // Just add the thumbnail if the replay browser exists CReplayBrowserPanel* pReplayBrowser = ReplayUI_GetBrowserPanel(); if ( pReplayBrowser ) { pReplayBrowser->OnSaveReplay( hNewReplay ); } } // Fire a message the game DLL can intercept (for achievements, etc). IGameEvent *event = gameeventmanager->CreateEvent( "replay_saved" ); if ( event ) { gameeventmanager->FireEventClientSide( event ); } } virtual void OnDeleteReplay( ReplayHandle_t hReplay ) { CReplayBrowserPanel* pReplayBrowser = ReplayUI_GetBrowserPanel(); if ( pReplayBrowser ) { pReplayBrowser->OnDeleteReplay( hReplay ); } } virtual void DisplayReplayMessage( const char *pLocalizeStr, bool bUrgent, bool bDlg, const char *pSound ) { // Display a message? if ( !pLocalizeStr || !pLocalizeStr[0] ) return; g_pClientMode->DisplayReplayMessage( pLocalizeStr, -1.0f, bUrgent, pSound, bDlg ); } virtual void DisplayReplayMessage( const wchar_t *pText, bool bUrgent, bool bDlg, const char *pSound ) { if ( !pText || !pText[0] ) return; const int nLen = wcslen( pText ) + 1; char *pAnsi = new char[ nLen ]; g_pVGuiLocalize->ConvertUnicodeToANSI( pText, pAnsi, nLen ); g_pClientMode->DisplayReplayMessage( pAnsi, -1.0f, bUrgent, pSound, bDlg ); } virtual bool OnConfirmQuit() { return ReplayUI_ShowConfirmQuitDlg(); } virtual void OnRenderStart() { ReplayUI_OpenReplayRenderOverlay(); } virtual void OnRenderComplete( const RenderMovieParams_t &RenderParams, bool bCancelled, bool bSuccess, bool bShowBrowser ) { ReplayUI_HideRenderOverlay(); if ( bShowBrowser ) { ReplayUI_ReloadBrowser(); } // Upload a row to the OGS now that rendering has completed GetReplayGameStatsHelper().SW_ReplayStats_WriteRenderDataEnd( RenderParams, bCancelled ? "cancelled" : bSuccess ? "success" : "failed" ); } virtual void InitPerformanceEditor( ReplayHandle_t hReplay ) { ReplayUI_InitPerformanceEditor( hReplay ); } virtual void HidePerformanceEditor() { ReplayUI_ClosePerformanceEditor(); } virtual bool ShouldRender() { extern ConVar replay_enablerenderpreview; return !g_pReplayMovieManager->IsRendering() || replay_enablerenderpreview.GetBool(); } virtual void PlaySound( const char *pSound ) { if ( g_pVGuiSurface ) { g_pVGuiSurface->PlaySound( pSound ); } } virtual void UploadOgsData( KeyValues *pData, bool bIncludeTimeField ) { GetReplayGameStatsHelper().UploadError( pData, bIncludeTimeField ); } virtual bool ShouldCompletePendingReplay( IGameEvent *pEvent ) { #if defined( TF_CLIENT_DLL ) return !( pEvent->GetInt( "death_flags" ) & TF_DEATH_FEIGN_DEATH ); #else return true; #endif } virtual void OnPlaybackComplete( ReplayHandle_t hReplay, int iPerformance ) { ReplayUI_ReloadBrowser( hReplay, iPerformance ); } virtual IReplayCamera *GetReplayCamera() { return ReplayCamera(); } virtual bool OnEndOfReplayReached() { CReplayPerformanceEditorPanel *pEditor = ReplayUI_GetPerformanceEditor(); if ( !pEditor ) return false; return pEditor->OnEndOfReplayReached(); } }; static CClientReplayImp s_ClientReplayImp; EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CClientReplayImp, IClientReplay, CLIENT_REPLAY_INTERFACE_VERSION, s_ClientReplayImp ); #endif // #if defined( REPLAY_ENABLED )