You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
354 lines
7.3 KiB
354 lines
7.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
//---------------------------------------------------------------------------------------- |
|
|
|
#if defined( REPLAY_ENABLED ) |
|
|
|
#include "replay/ienginereplay.h" |
|
#include "replay/replayutils.h" |
|
#include "client.h" |
|
#include "server.h" |
|
#include "cl_demo.h" |
|
#include "ivideomode.h" |
|
#include "replayserver.h" |
|
#include "cl_steamauth.h" |
|
#include "host_state.h" |
|
#include "globalvars_base.h" |
|
#include "vgui_baseui_interface.h" |
|
#include "replay_internal.h" |
|
#include "sv_steamauth.h" |
|
#include "lzss.h" |
|
#include "checksum_engine.h" |
|
|
|
#if !defined( DEDICATED ) |
|
#include "con_nprint.h" |
|
#include "net_chan.h" |
|
#include "download.h" |
|
#include "audio/public/snd_device.h" |
|
#include "audio/private/snd_wave_temp.h" |
|
#endif |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
class CEngineReplay : public IEngineReplay |
|
{ |
|
public: |
|
virtual bool IsSupportedModAndPlatform() |
|
{ |
|
return Replay_IsSupportedModAndPlatform(); |
|
} |
|
|
|
virtual const char *GetGameDir() |
|
{ |
|
return com_gamedir; |
|
} |
|
|
|
virtual float GetHostTime() |
|
{ |
|
return host_time; |
|
} |
|
|
|
virtual int GetHostTickCount() |
|
{ |
|
return host_tickcount; |
|
} |
|
|
|
virtual int TimeToTicks( float flTime ) |
|
{ |
|
return TIME_TO_TICKS( flTime ); |
|
} |
|
|
|
virtual float TicksToTime( int nTick ) |
|
{ |
|
return TICKS_TO_TIME( nTick ); |
|
} |
|
|
|
virtual void Cbuf_AddText( const char *pCmd ) |
|
{ |
|
::Cbuf_AddText( pCmd ); |
|
} |
|
|
|
virtual void Cbuf_Execute() |
|
{ |
|
::Cbuf_Execute(); |
|
} |
|
|
|
virtual void Host_Disconnect( bool bShowMainMenu ) |
|
{ |
|
::Host_Disconnect( bShowMainMenu ); |
|
} |
|
|
|
virtual void HostState_Shutdown() |
|
{ |
|
::HostState_Shutdown(); |
|
} |
|
|
|
virtual const char *GetModDir() |
|
{ |
|
return COM_GetModDirectory(); |
|
} |
|
|
|
virtual bool CopyFile( const char *pSource, const char *pDest ) |
|
{ |
|
return COM_CopyFile( pSource, pDest ); |
|
} |
|
|
|
virtual bool LZSS_Compress( char *pDest, unsigned int *pDestLen, const char *pSource, unsigned int nSourceLen ) |
|
{ |
|
return COM_BufferToBufferCompress( pDest, pDestLen, pSource, nSourceLen ); |
|
} |
|
|
|
virtual bool LZSS_Decompress( char *pDest, unsigned int *pDestLen, const char *pSource, unsigned int nSourceLen ) |
|
{ |
|
return COM_BufferToBufferDecompress( pDest, pDestLen, pSource, nSourceLen ); |
|
} |
|
|
|
virtual bool MD5_HashBuffer( unsigned char pDigest[16], const unsigned char *pBuffer, int nSize, unsigned int pSeed[4] ) |
|
{ |
|
return ::MD5_Hash_Buffer( pDigest, pBuffer, nSize, pSeed != NULL, pSeed ); |
|
} |
|
|
|
virtual bool ReadDemoHeader( const char *pFilename, demoheader_t &header ) |
|
{ |
|
V_memset( &header, 0, sizeof( header ) ); |
|
|
|
CDemoFile demofile; |
|
if ( !demofile.Open( pFilename, true ) ) |
|
return false; |
|
|
|
demofile.ReadDemoHeader(); |
|
|
|
V_memcpy( &header, &demofile.m_DemoHeader, sizeof( header ) ); |
|
|
|
return true; |
|
} |
|
|
|
virtual IReplayServer *GetReplayServer() |
|
{ |
|
return replay; |
|
} |
|
|
|
virtual IServer *GetReplayServerAsIServer() |
|
{ |
|
return replay; |
|
} |
|
|
|
virtual IServer *GetGameServer() |
|
{ |
|
if ( sv.IsDedicated() ) |
|
{ |
|
return &sv; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
virtual bool GetSessionRecordBuffer( uint8 **ppSessionBuffer, int *pSize ) |
|
{ |
|
if ( !replay ) |
|
{ |
|
AssertMsg( 0, "Why is this being called when replay is inactive?" ); |
|
*ppSessionBuffer = NULL; |
|
*pSize = 0; |
|
return false; |
|
} |
|
|
|
*ppSessionBuffer = (uint8 *)replay->m_DemoRecorder.m_DemoFile.m_pBuffer->Base(); |
|
*pSize = replay->m_DemoRecorder.m_DemoFile.m_pBuffer->TellPut(); |
|
|
|
return true; |
|
} |
|
|
|
virtual void ResetReplayRecordBuffer() |
|
{ |
|
replay->m_DemoRecorder.m_DemoFile.m_pBuffer->SeekPut( CUtlBuffer::SEEK_HEAD, 0 ); |
|
} |
|
|
|
virtual bool IsDedicated() |
|
{ |
|
return sv.IsDedicated(); |
|
} |
|
|
|
virtual demoheader_t *GetReplayDemoHeader() |
|
{ |
|
return &replay->m_DemoRecorder.m_DemoFile.m_DemoHeader; |
|
} |
|
|
|
virtual void RecalculateTags() |
|
{ |
|
sv.RecalculateTags(); |
|
} |
|
|
|
virtual bool NET_GetHostnameAsIP( const char *pHostname, char *pOut, int nOutSize ) |
|
{ |
|
netadr_t adr; |
|
if ( !NET_StringToAdr( pHostname, &adr ) ) |
|
return false; |
|
|
|
V_strncpy( pOut, adr.ToString( true ), nOutSize ); |
|
|
|
return true; |
|
} |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#if !defined( DEDICATED ) |
|
|
|
class CEngineClientReplay : public IEngineClientReplay |
|
{ |
|
public: |
|
virtual float GetLastServerTickTime() |
|
{ |
|
return TIME_TO_TICKS( cl.m_flLastServerTickTime ); |
|
} |
|
|
|
virtual const char *GetLevelName() |
|
{ |
|
return cl.m_szLevelFileName; |
|
} |
|
|
|
virtual const char *GetLevelNameShort() |
|
{ |
|
return cl.m_szLevelBaseName; |
|
} |
|
|
|
virtual int GetPlayerSlot() |
|
{ |
|
return cl.m_nPlayerSlot; |
|
} |
|
|
|
virtual bool IsPlayingReplayDemo() |
|
{ |
|
extern IDemoPlayer *g_pReplayDemoPlayer; |
|
return demoplayer == g_pReplayDemoPlayer && |
|
demoplayer->IsPlayingBack(); |
|
} |
|
|
|
virtual INetChannel *GetNetChannel() |
|
{ |
|
return cl.m_NetChannel; |
|
} |
|
|
|
virtual bool IsConnected() |
|
{ |
|
return cl.IsConnected(); |
|
} |
|
|
|
virtual bool IsListenServer() |
|
{ |
|
return sv.IsActive(); |
|
} |
|
|
|
virtual IClientEntityList *GetClientEntityList() |
|
{ |
|
extern IClientEntityList *entitylist; |
|
return entitylist; |
|
} |
|
|
|
virtual IClientReplay *GetClientReplayInt() |
|
{ |
|
extern IClientReplay *g_pClientReplay; |
|
return g_pClientReplay; |
|
} |
|
|
|
virtual uint32 GetClientSteamID() |
|
{ |
|
CSteamID steamID = Steam3Client().SteamUser()->GetSteamID(); |
|
return steamID.GetAccountID(); |
|
} |
|
|
|
void Con_NPrintf( int nPos, const char *pFormat, ... ) |
|
{ |
|
va_list argptr; |
|
char szText[4096]; |
|
|
|
va_start ( argptr, pFormat ); |
|
Q_vsnprintf( szText, sizeof( szText ), pFormat, argptr ); |
|
va_end ( argptr ); |
|
|
|
::Con_NPrintf( nPos, "%s", szText ); |
|
} |
|
|
|
virtual CGlobalVarsBase *GetClientGlobalVars() |
|
{ |
|
return &g_ClientGlobalVariables; |
|
} |
|
|
|
virtual void VGui_PlaySound( const char *pSound ) |
|
{ |
|
::VGui_PlaySound( pSound ); |
|
} |
|
|
|
virtual void EngineVGui_ConfirmQuit() |
|
{ |
|
EngineVGui()->ConfirmQuit(); |
|
} |
|
|
|
virtual bool IsDemoPlayingBack() |
|
{ |
|
return demoplayer->IsPlayingBack(); |
|
} |
|
|
|
virtual int GetScreenWidth() |
|
{ |
|
return videomode->GetModeStereoWidth(); |
|
} |
|
|
|
virtual int GetScreenHeight() |
|
{ |
|
return videomode->GetModeStereoHeight(); |
|
} |
|
|
|
virtual bool IsGamePathValidAndSafeForDownload( const char *pGamePath ) |
|
{ |
|
return CL_IsGamePathValidAndSafeForDownload( pGamePath ); |
|
} |
|
|
|
virtual bool IsInGame() |
|
{ |
|
return cl.IsActive(); |
|
} |
|
|
|
virtual void InitSoundRecord() |
|
{ |
|
extern void SND_RecordInit(); |
|
SND_RecordInit(); |
|
} |
|
|
|
virtual void Wave_CreateTmpFile( const char *pFilename ) |
|
{ |
|
::WaveCreateTmpFile( pFilename, SOUND_DMA_SPEED, 16, 2 ); |
|
} |
|
|
|
virtual void Wave_AppendTmpFile( const char *pFilename, void *pBuffer, int nNumSamples ) |
|
{ |
|
::WaveAppendTmpFile( pFilename, pBuffer, 16, nNumSamples ); |
|
} |
|
|
|
virtual void Wave_FixupTmpFile( const char *pFilename ) |
|
{ |
|
::WaveFixupTmpFile( pFilename ); |
|
} |
|
}; |
|
|
|
#endif // !defined( DEDICATED ) |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
static CEngineReplay s_EngineReplay; |
|
IEngineReplay *g_pEngineReplay = &s_EngineReplay; |
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CEngineReplay, IEngineReplay, ENGINE_REPLAY_INTERFACE_VERSION, s_EngineReplay ); |
|
|
|
#if !defined( DEDICATED ) |
|
static CEngineClientReplay s_EngineClientReplay; |
|
IEngineClientReplay *g_pEngineClientReplay = &s_EngineClientReplay; |
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CEngineClientReplay, IEngineClientReplay, ENGINE_REPLAY_CLIENT_INTERFACE_VERSION, s_EngineClientReplay ); |
|
#endif |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#endif
|
|
|