source-engine/game/shared/ipredictionsystem.h

165 lines
2.8 KiB
C
Raw Normal View History

2023-10-03 14:23:56 +00:00
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
2020-04-22 16:56:21 +00:00
//
// 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