This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/shared/ipredictionsystem.h
2020-08-04 13:13:01 -04:00

130 lines
3.1 KiB
C++

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