Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

192 lines
5.2 KiB

//======= Copyright (c) Valve Corporation, All rights reserved. ======
#ifndef HLTV_REPLAY_SYSTEM
#define HLTV_REPLAY_SYSTEM
// this struct is followed by matrix3x4a_t bones
struct ALIGN16 CachedRagdollBones_t
{
int nBones;
int nBodyParts;
bool bAllAsleep;
matrix3x4a_t *GetBones() { return ( matrix3x4a_t * )( this + 1 ); }
matrix3x4a_t *GetBodyParts() { return GetBones() + nBones; }
} ALIGN16_POST;
class CHltvReplaySystem: public CGameEventListener
{
public:
struct ReplayParams_t
{
int nRequest; // member of enum ReplayEventType_t
int nPrimaryTargetEntIndex;
float flEventTime;
float flTime; // when gpGlobal->curtime reaches this value, replay starts
int nPrimaryVictimEntIndex;
bool bPrimaryVictimIsLocalPlayer;
bool bFinalKillOfRound;
ReplayParams_t()
{
Reset();
}
void Stop()
{
nRequest = -1;
}
void Reset()
{
nRequest = -1;
flTime = -1000;
nPrimaryVictimEntIndex = nPrimaryVictimEntIndex = -1;
bPrimaryVictimIsLocalPlayer = false;
flEventTime = 0;
bFinalKillOfRound = false;
}
bool IsValid() { return nRequest >= 0; }
void Invalidate() { nRequest = -1; }
};
class CLocalPlayerProps
{
public:
bool m_bLastSeenAlive;
int m_nLastTickUpdated;
public:
CLocalPlayerProps();
bool Update();
};
public:
CHltvReplaySystem();
~CHltvReplaySystem();
void OnHltvReplay( const CSVCMsg_HltvReplay &msg );
void OnHltvReplayTick();
void EmitTimeJump();
int GetHltvReplayDelay() { return m_nHltvReplayDelay; }
void StopHltvReplay();
float GetReplayVideoFadeAmount()const { m_flDebugLastRequestedReplayVideoFadeAmount = m_flReplayVideoFadeAmount; return m_flReplayVideoFadeAmount; }
float GetHltvReplayDistortAmount()const;
bool IsHltvReplayButtonEnabled();
bool IsHltvReplayButtonTimedOut();
void RequestHltvReplayDeath();
void RequestHltvReplay( const ReplayParams_t &replay );
void RequestCancelHltvReplay( bool bSuppressFadeout = false );
bool IsHltvReplayFeatureEnabled();
bool IsFadeoutFinished();
bool IsFadeoutActive();
bool IsDelayedReplayRequestPending() { return m_DelayedReplay.IsValid(); }
bool PrepareHltvReplayCountdown( );
void CancelDelayedHltvReplay();
void OnLevelInit();
void OnPlayerDeath( IGameEvent *event );
bool WantsReplayEffect()const;
void OnDemoPlayback( bool bPlaying );
void SetDemoPlaybackHighlightXuid( uint64 xuid, bool bLowlights );
void SetDemoPlaybackFadeBrackets( int nCurrentPlaybackTick, int nStartAt, int nStopAt );
bool IsDemoPlayback() const { return m_bDemoPlayback; }
bool IsDemoPlaybackLowLights() const { return m_bDemoPlaybackLowLights; }
void FireGameEvent( IGameEvent *event );
void OnLevelShutdown();
void OnLocalPlayerRespawning();
int GetPrimaryVictimEntIndex()const { return m_DelayedReplay.nPrimaryVictimEntIndex; }
bool IsPrimaryVictimLocalPlayer()const { return m_DelayedReplay.bPrimaryVictimIsLocalPlayer; }
bool IsReplayingFinalKillOfRound()const { return m_nHltvReplayDelay && m_DelayedReplay.bFinalKillOfRound; }
void StopFades();
void StopFadeout();
void StartFadeout(float flEndTime, float flDuration );
void StartFadein( float flStartRealTime );
void SetReplaySoundMixLayer( float flFade );
C_BasePlayer *GetDemoPlaybackPlayer();
bool IsDemoPlaybackXuidOther()const;
void Update();
void PurgeRagdollBoneCache();
void CacheRagdollBones();
CachedRagdollBones_t *GetCachedRagdollBones( int nEntIndex, bool bTake );
void FreeCachedRagdollBones( CachedRagdollBones_t* );
enum ExperimentalEvents_t
{
EE_REPLAY_OFFERED = 1,
EE_REPLAY_REQUESTED = 2,
EE_REPLAY_STARTED = 4,
EE_REPLAY_CANCELLED = 8,
EE_REPLAY_AUTOMATIC = 16,
EE_REPLAY_STUCK = 32
//EE_REPLAY_VICTIM_POV = 64 // never shipped, removed after discussions with Vitaliy, BrianL, Gautam
};
uint GetExperimentalEvents() const { return m_nExperimentalEvents; }
bool UpdateHltvReplayButtonTimeOutState();
protected:
static float GetReplayMessageTime();
protected:
int m_nHltvReplayDelay;
int m_nHltvReplayStopAt;
int m_nHltvReplayStartAt;
int m_nHltvReplaySlowdownBegin;
int m_nHltvReplaySlowdownEnd;
float m_flHltvReplaySlowdownRate;
float m_flHltvLastRequestRealTime;
float m_flLastReplayStoppedRealTime;
float m_flLastPlayerDeath;
bool m_bHltvReplayButtonTimedOut;
int m_nHltvReplayPrimaryTarget;
CLocalPlayerProps m_LocalPlayer;
bool m_bWaitingForHltvReplayTick;
float m_flStartedWaitingForHltvReplayTickRealTime;
int m_nHltvReplayBeginTick;
ReplayParams_t m_DelayedReplay;
bool m_bDemoPlayback;
bool m_bListeningForGameEvents;
int m_nDemoPlaybackStartAt;
int m_nDemoPlaybackStopAt;
uint64 m_nDemoPlaybackXuid;
bool m_bDemoPlaybackLowLights;
CHandle< C_BasePlayer > m_DemoPlaybackPlayer;
int m_nCurrentPlaybackTick;
float m_flCurrentPlaybackTime;
float m_flReplayVideoFadeAmount;
float m_flReplaySoundFadeAmount;
float m_flFadeinStartRealTime;
float m_flFadeinDuration;
float m_flFadeoutEndTime;
float m_flFadeoutDuration;
mutable float m_flDebugLastRequestedReplayVideoFadeAmount;
uint32 m_nSteamSelfAccountId;
uint32 m_nExperimentalEvents;
float m_flFreeCachedRagdollBonesTime; // time (when not replaying) to destroy cached-off ragdoll bones
CUtlHashtable< int, CachedRagdollBones_t* > m_mapCachedRagdollBones;
};
extern CHltvReplaySystem g_HltvReplaySystem;
extern int CL_GetHltvReplayDelay();
#endif // HLTV_REPLAY_SYSTEM