120 lines
3.6 KiB
C++
120 lines
3.6 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef GLOBALVARS_BASE_H
|
|
#define GLOBALVARS_BASE_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
class CSaveRestoreData;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Global variables used by shared code
|
|
//-----------------------------------------------------------------------------
|
|
class CGlobalVarsBase
|
|
{
|
|
public:
|
|
|
|
CGlobalVarsBase( bool bIsClient );
|
|
|
|
// This can be used to filter debug output or to catch the client or server in the act.
|
|
bool IsClient() const;
|
|
inline bool IsRemoteClient() const;
|
|
|
|
// for encoding m_flSimulationTime, m_flAnimTime
|
|
int GetNetworkBase( int nTick, int nEntity );
|
|
|
|
public:
|
|
|
|
// Absolute time (per frame still - Use Plat_FloatTime() for a high precision real time
|
|
// perf clock, but not that it doesn't obey host_timescale/host_framerate)
|
|
float realtime;
|
|
// Absolute frame counter - continues to increase even if game is paused
|
|
int framecount;
|
|
// Non-paused frametime
|
|
float absoluteframetime;
|
|
float absoluteframestarttimestddev;
|
|
|
|
// Current time
|
|
//
|
|
// On the client, this (along with tickcount) takes a different meaning based on what
|
|
// piece of code you're in:
|
|
//
|
|
// - While receiving network packets (like in PreDataUpdate/PostDataUpdate and proxies),
|
|
// this is set to the SERVER TICKCOUNT for that packet. There is no interval between
|
|
// the server ticks.
|
|
// [server_current_Tick * tick_interval]
|
|
//
|
|
// - While rendering, this is the exact client clock
|
|
// [client_current_tick * tick_interval + interpolation_amount]
|
|
//
|
|
// - During prediction, this is based on the client's current tick:
|
|
// [client_current_tick * tick_interval]
|
|
float curtime;
|
|
|
|
// Time spent on last server or client frame (has nothing to do with think intervals)
|
|
float frametime;
|
|
// current maxplayers setting
|
|
int maxClients;
|
|
|
|
// Simulation ticks - does not increase when game is paused
|
|
int tickcount;
|
|
|
|
// Simulation tick interval
|
|
float interval_per_tick;
|
|
|
|
// interpolation amount ( client-only ) based on fraction of next tick which has elapsed
|
|
float interpolation_amount;
|
|
int simTicksThisFrame;
|
|
|
|
int network_protocol;
|
|
|
|
// current saverestore data
|
|
CSaveRestoreData *pSaveData;
|
|
|
|
private:
|
|
// Set to true in client code.
|
|
bool m_bClient;
|
|
public:
|
|
// true if we are a remote clinet (needs prediction & interpolation - server not on this machine) as opposed to split-screen or local
|
|
bool m_bRemoteClient;
|
|
private:
|
|
// 100 (i.e., tickcount is rounded down to this base and then the "delta" from this base is networked
|
|
int nTimestampNetworkingBase;
|
|
// 32 (entindex() % nTimestampRandomizeWindow ) is subtracted from gpGlobals->tickcount to set the networking basis, prevents
|
|
// all of the entities from forcing a new PackedEntity on the same tick (i.e., prevents them from getting lockstepped on this)
|
|
int nTimestampRandomizeWindow;
|
|
|
|
};
|
|
|
|
inline int CGlobalVarsBase::GetNetworkBase( int nTick, int nEntity )
|
|
{
|
|
int nEntityMod = nEntity % nTimestampRandomizeWindow;
|
|
int nBaseTick = nTimestampNetworkingBase * (int)( ( nTick - nEntityMod ) / nTimestampNetworkingBase );
|
|
return nBaseTick;
|
|
}
|
|
|
|
inline CGlobalVarsBase::CGlobalVarsBase( bool bIsClient ) :
|
|
m_bClient( bIsClient ),
|
|
nTimestampNetworkingBase( 100 ),
|
|
nTimestampRandomizeWindow( 32 )
|
|
{
|
|
}
|
|
|
|
inline bool CGlobalVarsBase::IsClient() const
|
|
{
|
|
return m_bClient;
|
|
}
|
|
|
|
inline bool CGlobalVarsBase::IsRemoteClient() const
|
|
{
|
|
return m_bRemoteClient;
|
|
}
|
|
|
|
#endif // GLOBALVARS_BASE_H
|