css_enhanced_waf/public/globalvars_base.h
Kamay Xutax cfa5b12eea Fixed local player interpolation and added debug_screenshot_bullet_position
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 !
2024-07-14 00:54:57 +02:00

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