Kamay Xutax
cfa5b12eea
This check permits to fix interpolation problems on the local player that valve has been (fucking finally) caring about on counter-strike 2. To recall the original issue, the problem that Valve cared about is that interpolation had some problems with interpolating the local player because the screen would never in the first place match the tick "screen", because interpolation amount could never reach 0.0 or 1.0 Valve solution was to introduce bugs with lag compensating the local player and made the game worse, introducing a new way for cheaters to cheat even more on their games. I'm joking, but you can clearly see the outcome anyway. My solution is to simply set interpolation amount to 0.0 when a tick arrives. So when we shoot, we get the frame we shot with an interpolation amount at 0.0, perfectly aligned to user commands which is ideal for us. It might look a bit more unsmooth with lower fps but with high enough fps, the issue goes away anyway. It's not very noticeable which is very nice for us. No need to lag compensate the local player anymore !
111 lines
3.2 KiB
C++
111 lines
3.2 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;
|
|
bool client_taking_screenshot;
|
|
|
|
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 )
|
|
{
|
|
client_taking_screenshot = false;
|
|
}
|
|
|
|
inline bool CGlobalVarsBase::IsClient() const
|
|
{
|
|
return m_bClient;
|
|
}
|
|
|
|
#endif // GLOBALVARS_BASE_H
|