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.
164 lines
2.8 KiB
164 lines
2.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef IPREDICTIONSYSTEM_H |
|
#define IPREDICTIONSYSTEM_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "predictable_entity.h" |
|
|
|
class CBaseEntity; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Interfaces derived from this are able to filter out the local player |
|
// when doing prediction on the client, this includes not sending network data to |
|
// the local player from the server if needed. |
|
//----------------------------------------------------------------------------- |
|
class IPredictionSystem |
|
{ |
|
public: |
|
IPredictionSystem() |
|
{ |
|
m_pNextSystem = g_pPredictionSystems; |
|
g_pPredictionSystems = this; |
|
|
|
m_bSuppressEvent = false; |
|
m_pSuppressHost = NULL; |
|
|
|
m_nStatusPushed = 0; |
|
}; |
|
|
|
virtual ~IPredictionSystem() {}; |
|
|
|
IPredictionSystem *GetNext() |
|
{ |
|
return m_pNextSystem; |
|
} |
|
|
|
void SetSuppressEvent( bool state ) |
|
{ |
|
m_bSuppressEvent = state; |
|
} |
|
|
|
void SetSuppressHost( CBaseEntity *host ) |
|
{ |
|
m_pSuppressHost = host; |
|
} |
|
|
|
CBaseEntity const *GetSuppressHost( void ) |
|
{ |
|
if ( DisableFiltering() ) |
|
{ |
|
return NULL; |
|
} |
|
|
|
return m_pSuppressHost; |
|
} |
|
|
|
bool CanPredict( void ) const |
|
{ |
|
if ( DisableFiltering() ) |
|
{ |
|
return false; |
|
} |
|
|
|
return !m_bSuppressEvent; |
|
} |
|
|
|
static IPredictionSystem *g_pPredictionSystems; |
|
|
|
static void SuppressEvents( bool state ) |
|
{ |
|
IPredictionSystem *sys = g_pPredictionSystems; |
|
while ( sys ) |
|
{ |
|
sys->SetSuppressEvent( state ); |
|
sys = sys->GetNext(); |
|
} |
|
} |
|
|
|
static void SuppressHostEvents( CBaseEntity *host ) |
|
{ |
|
IPredictionSystem *sys = g_pPredictionSystems; |
|
while ( sys ) |
|
{ |
|
sys->SetSuppressHost( host ); |
|
sys = sys->GetNext(); |
|
} |
|
} |
|
|
|
private: |
|
|
|
static void Push( void ) |
|
{ |
|
IPredictionSystem *sys = g_pPredictionSystems; |
|
while ( sys ) |
|
{ |
|
sys->_Push(); |
|
sys = sys->GetNext(); |
|
} |
|
} |
|
|
|
static void Pop( void ) |
|
{ |
|
IPredictionSystem *sys = g_pPredictionSystems; |
|
while ( sys ) |
|
{ |
|
sys->_Pop(); |
|
sys = sys->GetNext(); |
|
} |
|
} |
|
|
|
void _Push( void ) |
|
{ |
|
++m_nStatusPushed; |
|
} |
|
void _Pop( void ) |
|
{ |
|
--m_nStatusPushed; |
|
} |
|
|
|
bool DisableFiltering( void ) const |
|
{ |
|
return ( m_nStatusPushed > 0 ) ? true : false; |
|
} |
|
|
|
IPredictionSystem *m_pNextSystem; |
|
bool m_bSuppressEvent; |
|
CBaseEntity *m_pSuppressHost; |
|
|
|
int m_nStatusPushed; |
|
|
|
friend class CDisablePredictionFiltering; |
|
}; |
|
|
|
class CDisablePredictionFiltering |
|
{ |
|
public: |
|
CDisablePredictionFiltering( bool disable = true ) |
|
{ |
|
m_bDisabled = disable; |
|
if ( m_bDisabled ) |
|
{ |
|
IPredictionSystem::Push(); |
|
} |
|
} |
|
|
|
~CDisablePredictionFiltering( void ) |
|
{ |
|
if ( m_bDisabled ) |
|
{ |
|
IPredictionSystem::Pop(); |
|
} |
|
} |
|
private: |
|
bool m_bDisabled; |
|
}; |
|
|
|
#endif // IPREDICTIONSYSTEM_H
|
|
|