From 3320f776ceba0961948a8104ccf842f31d7facf2 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 11 Oct 2024 00:06:41 +0300 Subject: [PATCH] engine: client: implement correct clc_fileconsistency response for GoldSrc --- engine/client/cl_parse.c | 57 ++++++++++++++++++++++++++++++++++++---- engine/eiface.h | 1 + 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 74acc4cd..b260cc0c 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -1587,7 +1587,7 @@ void CL_UpdateUserPings( sizebuf_t *msg ) } } -static void CL_SendConsistencyInfo( sizebuf_t *msg ) +static void CL_SendConsistencyInfo( sizebuf_t *msg, connprotocol_t proto ) { qboolean user_changed_diskfile; vec3_t mins, maxs; @@ -1595,16 +1595,24 @@ static void CL_SendConsistencyInfo( sizebuf_t *msg ) CRC32_t crcFile; byte md5[16]; consistency_t *pc; - int i; + int i, pos; if( !cl.need_force_consistency_response ) return; cl.need_force_consistency_response = false; MSG_BeginClientCmd( msg, clc_fileconsistency ); + pos = MSG_GetNumBytesWritten( msg ); + if( proto == PROTO_GOLDSRC ) + { + MSG_WriteShort( msg, 0 ); + MSG_StartBitWriting( msg ); + } for( i = 0; i < cl.num_consistency; i++ ) { + qboolean have_file = true; + pc = &cl.consistency_list[i]; user_changed_diskfile = false; @@ -1615,7 +1623,10 @@ static void CL_SendConsistencyInfo( sizebuf_t *msg ) Q_snprintf( filename, sizeof( filename ), DEFAULT_SOUNDPATH "%s", pc->filename ); else Q_strncpy( filename, pc->filename, sizeof( filename )); - if( Q_strstr( filename, "models/" )) + COM_FixSlashes( filename ); + have_file = FS_FileExists( filename, false ); + + if( Q_strstr( filename, "models/" ) && have_file ) { CRC32_Init( &crcFile ); CRC32_File( &crcFile, filename ); @@ -1634,12 +1645,37 @@ static void CL_SendConsistencyInfo( sizebuf_t *msg ) MSG_WriteUBitLong( msg, 0, 32 ); else MSG_WriteUBitLong( msg, pc->value, 32 ); break; + + case force_model_specifybounds_if_avail: + if( have_file ) + { + if( !Mod_GetStudioBounds( filename, mins, maxs )) + Host_Error( "unable to find %s\n", filename ); + + if( user_changed_diskfile ) + { + VectorSet( mins, -9999.9f, -9999.9f, -9999.9f ); + VectorSet( maxs, 9999.9f, 9999.9f, 9999.9f ); + } + } + else + { + VectorSet( mins, -1.0f, -1.0f, -1.0f ); + VectorCopy( mins, maxs ); + } + + MSG_WriteBytes( msg, mins, 12 ); + MSG_WriteBytes( msg, maxs, 12 ); + break; case force_model_samebounds: case force_model_specifybounds: if( !Mod_GetStudioBounds( filename, mins, maxs )) Host_Error( "unable to find %s\n", filename ); if( user_changed_diskfile ) - ClearBounds( maxs, mins ); // g-cont. especially swapped + { + VectorSet( mins, -9999.9f, -9999.9f, -9999.9f ); + VectorSet( maxs, 9999.9f, 9999.9f, 9999.9f ); + } MSG_WriteBytes( msg, mins, 12 ); MSG_WriteBytes( msg, maxs, 12 ); break; @@ -1650,6 +1686,17 @@ static void CL_SendConsistencyInfo( sizebuf_t *msg ) } MSG_WriteOneBit( msg, 0 ); + + if( proto == PROTO_GOLDSRC ) + { + int len; + MSG_EndBitWriting( msg ); + + len = MSG_GetNumBytesWritten( msg ) - pos - 2; + *(short *)&msg->pData[pos] = len; + + COM_Munge( &msg->pData[pos + 2], len, cl.servercount ); + } } /* @@ -1707,7 +1754,7 @@ void CL_RegisterResources( sizebuf_t *msg, connprotocol_t proto ) } if( !cls.demoplayback ) - CL_SendConsistencyInfo( msg ); + CL_SendConsistencyInfo( msg, proto ); // All done precaching. cl.worldmodel = CL_ModelHandle( 1 ); // get world pointer diff --git a/engine/eiface.h b/engine/eiface.h index e18cdedb..b0817de6 100644 --- a/engine/eiface.h +++ b/engine/eiface.h @@ -64,6 +64,7 @@ typedef enum force_exactfile, // File on client must exactly match server's file force_model_samebounds, // For model files only, the geometry must fit in the same bbox force_model_specifybounds, // For model files only, the geometry must fit in the specified bbox + force_model_specifybounds_if_avail, } FORCE_TYPE; // Returned by TraceLine