//========= 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