diff options
Diffstat (limited to 'game/client/replay/cdll_replay.cpp')
| -rw-r--r-- | game/client/replay/cdll_replay.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/game/client/replay/cdll_replay.cpp b/game/client/replay/cdll_replay.cpp new file mode 100644 index 0000000..618edfa --- /dev/null +++ b/game/client/replay/cdll_replay.cpp @@ -0,0 +1,210 @@ +//========= 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 )
\ No newline at end of file |