From 16b12b122ca5d84999e7db2d016db5d8032d7ab3 Mon Sep 17 00:00:00 2001 From: mittorn Date: Tue, 14 Aug 2018 20:46:18 +0700 Subject: [PATCH] Add hack to wrap save time --- dlls/gravgunmod.cpp | 1 + dlls/gravgunmod.h | 1 + dlls/util.cpp | 26 +++++++++++++++++++------- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dlls/gravgunmod.cpp b/dlls/gravgunmod.cpp index 6c52d65d..8a7c3747 100644 --- a/dlls/gravgunmod.cpp +++ b/dlls/gravgunmod.cpp @@ -19,6 +19,7 @@ cvar_t cvar_agibcount = { "mp_agibcount","8", FCVAR_SERVER }; cvar_t mp_gravgun_players = { "mp_gravgun_players", "0", FCVAR_SERVER }; cvar_t mp_fixhornetbug = { "mp_fixhornetbug", "0", FCVAR_SERVER }; +cvar_t mp_fixsavetime = { "mp_fixsavetime", "0", FCVAR_SERVER }; cvar_t mp_checkentities = { "mp_checkentities", "0", FCVAR_SERVER }; cvar_t mp_touchmenu = { "mp_touchmenu", "1", FCVAR_SERVER }; cvar_t mp_touchname = { "mp_touchname", "", FCVAR_SERVER }; diff --git a/dlls/gravgunmod.h b/dlls/gravgunmod.h index 8c15b6c0..af822914 100644 --- a/dlls/gravgunmod.h +++ b/dlls/gravgunmod.h @@ -18,6 +18,7 @@ extern cvar_t mp_spectator; extern cvar_t mp_fixhornetbug; extern cvar_t mp_checkentities; extern cvar_t mp_touchmenu; +extern cvar_t mp_fixsavetime; // distance clipping (client.cpp) // useful for open world diff --git a/dlls/util.cpp b/dlls/util.cpp index 60567a5d..5772d461 100644 --- a/dlls/util.cpp +++ b/dlls/util.cpp @@ -1829,6 +1829,9 @@ void UTIL_StripToken( const char *pKey, char *pDest ) pDest[i] = 0; } +bool g_isReadingHeader; +float g_SaveTime; + // -------------------------------------------------------------- // // CSave @@ -2420,17 +2423,24 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou switch( pTest->fieldType ) { case FIELD_TIME: - #ifdef __VFP_FP__ + memcpy( &timeData, pInputData, 4 ); // Re-base time variables timeData += time; + if( mp_fixsavetime.value ) + { + if( g_isReadingHeader ) + g_SaveTime = timeData; + + if( g_SaveTime > 10000 && timeData > 0.1 ) + { + timeData -= g_SaveTime - 500; + if( timeData && timeData < 0.1 ) + timeData = 0.1; + } + } memcpy( pOutputData, &timeData, 4 ); - #else - timeData = *(float *)pInputData; - // Re-base time variables - timeData += time; - *( (float *)pOutputData ) = timeData; - #endif + break; case FIELD_FLOAT: memcpy( pOutputData, pInputData, 4 ); @@ -2575,6 +2585,8 @@ int CRestore::ReadFields( const char *pname, void *pBaseData, TYPEDESCRIPTION *p int lastField, fileCount; HEADER header; + g_isReadingHeader = !strcmp( pname, "Save Header" ); + i = ReadShort(); ASSERT( i == sizeof(int) ); // First entry should be an int