From 34f23b1577fbc6d958e35d2fed298090cce64191 Mon Sep 17 00:00:00 2001 From: WPMGPRoSToTeMa Date: Sat, 10 Dec 2016 02:17:51 +0300 Subject: [PATCH] Added a feature of local gametime which decrease "lags" if you run same map for a long time (sv_rehlds_local_gametime cvar, related to #193) --- rehlds/engine/server.h | 1 + rehlds/engine/sv_main.cpp | 51 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/rehlds/engine/server.h b/rehlds/engine/server.h index b46e2f3..801dcf3 100644 --- a/rehlds/engine/server.h +++ b/rehlds/engine/server.h @@ -531,6 +531,7 @@ extern cvar_t sv_rehlds_hull_centering; extern cvar_t sv_rcon_condebug; extern cvar_t sv_rehlds_userinfo_transmitted_fields; extern cvar_t sv_rehlds_attachedentities_playeranimationspeed_fix; +extern cvar_t sv_rehlds_local_gametime; #endif extern int sv_playermodel; diff --git a/rehlds/engine/sv_main.cpp b/rehlds/engine/sv_main.cpp index 213f50c..991bf86 100644 --- a/rehlds/engine/sv_main.cpp +++ b/rehlds/engine/sv_main.cpp @@ -308,6 +308,7 @@ cvar_t sv_rehlds_hull_centering = { "sv_rehlds_hull_centering", "0", 0, 0.0f, nu cvar_t sv_rcon_condebug = { "sv_rcon_condebug", "1", 0, 1.0f, nullptr }; cvar_t sv_rehlds_userinfo_transmitted_fields = { "sv_rehlds_userinfo_transmitted_fields", "", 0, 0.0f, nullptr }; cvar_t sv_rehlds_attachedentities_playeranimationspeed_fix = {"sv_rehlds_attachedentities_playeranimationspeed_fix", "0", 0, 0.0f, nullptr}; +cvar_t sv_rehlds_local_gametime = {"sv_rehlds_local_gametime", "0", 0, 0.0f, nullptr}; #endif delta_t *SV_LookupDelta(char *name) @@ -1382,6 +1383,33 @@ void SV_WriteClientdataToMessage(client_t *client, sizebuf_t *msg) for (int i = 0; i < 64; i++, tdata++) { +#ifdef REHLDS_FIXES + // So, HL and CS games send absolute gametime in these vars, DMC and Ricochet games don't send absolute gametime + // TODO: idk about other games + // FIXME: there is a loss of precision, because gamedll has already written float gametime in them + if (sv_rehlds_local_gametime.value != 0.0f) + { + auto convertGameTimeToLocal = + [](float &gameTime) + { + if (gameTime > 0.0f) + { + auto currentLocalGameTime = realtime - host_client->connection_started; + auto currentGameTime = g_psv.time; + auto difference = gameTime - currentGameTime; + gameTime = (float)(currentLocalGameTime + difference); + } + }; + if (g_bIsCStrike || g_bIsCZero) + convertGameTimeToLocal(std::ref(tdata->m_fAimedDamage)); + if (g_bIsHL1 || g_bIsCStrike || g_bIsCZero) + { + convertGameTimeToLocal(std::ref(tdata->fuser2)); + convertGameTimeToLocal(std::ref(tdata->fuser3)); + } + } +#endif + if (host_client->delta_sequence == -1) fdata = &wbaseline; else @@ -1457,7 +1485,16 @@ void SV_WriteSpawn(sizebuf_t *msg) #endif // REHLDS_FIXES MSG_WriteByte(msg, svc_time); - MSG_WriteFloat(msg, g_psv.time); +#ifdef REHLDS_FIXES + if (sv_rehlds_local_gametime.value != 0.0f) + { + MSG_WriteFloat(msg, (float)(realtime - host_client->connection_started)); + } + else +#endif + { + MSG_WriteFloat(msg, g_psv.time); + } host_client->sendinfo = TRUE; @@ -4625,7 +4662,16 @@ qboolean SV_SendClientDatagram(client_t *client) msg.flags = SIZEBUF_ALLOW_OVERFLOW; MSG_WriteByte(&msg, svc_time); - MSG_WriteFloat(&msg, g_psv.time); +#ifdef REHLDS_FIXES + if (sv_rehlds_local_gametime.value != 0.0f) + { + MSG_WriteFloat(&msg, (float)(realtime - client->connection_started)); + } + else +#endif + { + MSG_WriteFloat(&msg, g_psv.time); + } SV_WriteClientdataToMessage(client, &msg); SV_WriteEntitiesToClient(client, &msg); @@ -7731,6 +7777,7 @@ void SV_Init(void) Cvar_RegisterVariable(&sv_rcon_condebug); Cvar_RegisterVariable(&sv_rehlds_userinfo_transmitted_fields); Cvar_RegisterVariable(&sv_rehlds_attachedentities_playeranimationspeed_fix); + Cvar_RegisterVariable(&sv_rehlds_local_gametime); #endif for (int i = 0; i < MAX_MODELS; i++)