109 lines
3.4 KiB
C++
109 lines
3.4 KiB
C++
//========= Copyright 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;
|
|
|
|
// 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
|
|
int framecount;
|
|
// Non-paused frametime
|
|
float absoluteframetime;
|
|
|
|
// 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
|
|
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;
|
|
|
|
// 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; }
|
|
|
|
#endif // GLOBALVARS_BASE_H
|