From c67aae405d92e04027792de113dfdc28621c13a8 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 26 Mar 2026 22:03:57 +0200 Subject: [PATCH 1/2] Add variable for cl_interp_ratio default --- src/game/client/cdll_bounded_cvars.cpp | 7 +++++++ src/game/shared/neo/neo_player_shared.h | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/game/client/cdll_bounded_cvars.cpp b/src/game/client/cdll_bounded_cvars.cpp index 827c2bdf9..5f93c6f12 100644 --- a/src/game/client/cdll_bounded_cvars.cpp +++ b/src/game/client/cdll_bounded_cvars.cpp @@ -10,6 +10,9 @@ #include "convar_serverbounded.h" #include "tier0/icommandline.h" +#ifdef NEO +#include "neo_player_shared.h" +#endif bool g_bForceCLPredictOff = false; @@ -65,7 +68,11 @@ class CBoundedCvar_InterpRatio : public ConVar_ServerBounded public: CBoundedCvar_InterpRatio() : ConVar_ServerBounded( "cl_interp_ratio", +#ifdef NEO + NEO_CL_INTERP_RATIO_DEFAULT_STR, +#else "2.0", +#endif FCVAR_USERINFO | FCVAR_NOT_CONNECTED | FCVAR_ARCHIVE, "Sets the interpolation amount (final amount is cl_interp_ratio / cl_updaterate)." ) { diff --git a/src/game/shared/neo/neo_player_shared.h b/src/game/shared/neo/neo_player_shared.h index bed15cdf0..4a7ced36a 100644 --- a/src/game/shared/neo/neo_player_shared.h +++ b/src/game/shared/neo/neo_player_shared.h @@ -213,6 +213,15 @@ COMPILE_TIME_ASSERT(NEO_ASSAULT_CROUCH_SPEED == NEO_VIP_CROUCH_SPEED); #define NEO_ASSAULT_PLAYERMODEL_HEIGHT 67.0 #define NEO_ASSAULT_PLAYERMODEL_DUCK_HEIGHT 50.0 +#define NEO_CL_INTERP_RATIO_DEFAULT 2.0 +#ifndef xstr +#define xstr(a) str(a) +#endif +#ifndef str +#define str(a) #a +#endif +#define NEO_CL_INTERP_RATIO_DEFAULT_STR xstr(NEO_CL_INTERP_RATIO_DEFAULT) + static constexpr int MAX_HEALTH_FOR_CLASS[NEO_CLASS__ENUM_COUNT] = { 100, // RECON 120, // ASSAULT From 3f8be925793ef6669924ef2720a4f46388dbcc84 Mon Sep 17 00:00:00 2001 From: Rain Date: Thu, 26 Mar 2026 22:05:50 +0200 Subject: [PATCH 2/2] Fix attempting to read cl-only var defaults on srcds Also add assertions to sanity check bounds --- src/game/server/player.cpp | 55 +++++++++++++++---------- src/game/shared/neo/neo_player_shared.h | 1 + 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index fc641d5f2..49dff9b3e 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -565,23 +565,6 @@ CBasePlayer *CBasePlayer::CreatePlayer( const char *className, edict_t *ed ) return player; } -#ifdef NEO -template -T GetConVarDefault(const char* name) -{ - const auto* cvar = g_pCVar->FindVar(name); - if (!cvar) - { - Assert(false); - Warning( "%s failed to find var \"%s\"\n", __FUNCTION__, name); - return T{}; - } - const auto* castCvar = assert_cast(cvar); - const char* res = castCvar->GetDefault(); - return ConvertFunc(res); -} -#endif - //----------------------------------------------------------------------------- // Purpose: // Input : @@ -636,13 +619,43 @@ CBasePlayer::CBasePlayer( ) m_bPendingClientSettings = false; #ifdef NEO - m_nUpdateRate = GetConVarDefault("cl_updaterate"); - Assert(m_nUpdateRate != 0); - m_fLerpTime = GetConVarDefault("cl_interp_ratio") / m_nUpdateRate; + m_nUpdateRate = 0; + if (auto sv_maxupdaterate = g_pCVar->FindVar("sv_maxupdaterate")) + { + m_nUpdateRate = V_atoi(sv_maxupdaterate->GetDefault()); + } + if (m_nUpdateRate == 0) + { + m_nUpdateRate = 66; // as changed in #1657 + Assert(false); + } + m_fLerpTime = NEO_CL_INTERP_RATIO_DEFAULT / m_nUpdateRate; + +#ifdef DBGFLAG_ASSERT + if (auto sv_client_min_interp_ratio = g_pCVar->FindVar("sv_client_min_interp_ratio")) + { + const float defaultMin = V_atof(sv_client_min_interp_ratio->GetDefault()); + Assert(NEO_CL_INTERP_RATIO_DEFAULT >= defaultMin); + } + else + { + Assert(false); + } + + if (auto sv_client_max_interp_ratio = g_pCVar->FindVar("sv_client_max_interp_ratio")) + { + const float defaultMax = V_atof(sv_client_max_interp_ratio->GetDefault()); + Assert(NEO_CL_INTERP_RATIO_DEFAULT <= defaultMax); + } + else + { + Assert(false); + } +#endif // DBGFLAG_ASSERT #else m_nUpdateRate = 20; // cl_updaterate defualt m_fLerpTime = 0.1f; // cl_interp default -#endif +#endif // NEO m_bPredictWeapons = true; m_bRequestPredict = true; m_bLagCompensation = false; diff --git a/src/game/shared/neo/neo_player_shared.h b/src/game/shared/neo/neo_player_shared.h index 4a7ced36a..48aa6ac09 100644 --- a/src/game/shared/neo/neo_player_shared.h +++ b/src/game/shared/neo/neo_player_shared.h @@ -214,6 +214,7 @@ COMPILE_TIME_ASSERT(NEO_ASSAULT_CROUCH_SPEED == NEO_VIP_CROUCH_SPEED); #define NEO_ASSAULT_PLAYERMODEL_DUCK_HEIGHT 50.0 #define NEO_CL_INTERP_RATIO_DEFAULT 2.0 +static_assert(NEO_CL_INTERP_RATIO_DEFAULT > 0); #ifndef xstr #define xstr(a) str(a) #endif