From 609680b328bb206b270b52c23f21bcf29da14b06 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Mon, 7 Oct 2024 21:16:00 +0300 Subject: [PATCH] engine: client: support parsing GoldSrc event messages --- engine/client/cl_events.c | 33 +++++++++++++++++++++++++-------- engine/client/cl_parse.c | 4 ++-- engine/client/cl_parse_48.c | 4 ++-- engine/client/cl_parse_gs.c | 4 ++-- engine/client/client.h | 4 ++-- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/engine/client/cl_events.c b/engine/client/cl_events.c index a041029e..15d524d9 100644 --- a/engine/client/cl_events.c +++ b/engine/client/cl_events.c @@ -380,7 +380,7 @@ CL_ParseReliableEvent ============= */ -void CL_ParseReliableEvent( sizebuf_t *msg ) +void CL_ParseReliableEvent( sizebuf_t *msg, connprotocol_t proto ) { int event_index; event_args_t nullargs, args; @@ -390,11 +390,19 @@ void CL_ParseReliableEvent( sizebuf_t *msg ) event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS ); - if( MSG_ReadOneBit( msg )) - delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f); - // reliable events not use delta-compression just null-compression - MSG_ReadDeltaEvent( msg, &nullargs, &args ); + if( proto == PROTO_GOLDSRC ) + { + Delta_ReadGSFields( msg, DT_EVENT_T, &nullargs, &args, 0.0f ); + if( MSG_ReadOneBit( msg )) + delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f); + } + else + { + if( MSG_ReadOneBit( msg )) + delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f); + MSG_ReadDeltaEvent( msg, &nullargs, &args ); + } if( args.entindex > 0 && args.entindex <= cl.maxclients ) args.angles[PITCH] *= -3.0f; @@ -409,7 +417,7 @@ CL_ParseEvent ============= */ -void CL_ParseEvent( sizebuf_t *msg ) +void CL_ParseEvent( sizebuf_t *msg, connprotocol_t proto ) { int event_index; int i, num_events; @@ -417,24 +425,33 @@ void CL_ParseEvent( sizebuf_t *msg ) event_args_t nullargs, args; entity_state_t *state; float delay; + int entity_bits; memset( &nullargs, 0, sizeof( nullargs )); memset( &args, 0, sizeof( args )); num_events = MSG_ReadUBitLong( msg, 5 ); + if( proto == PROTO_GOLDSRC ) + entity_bits = MAX_GOLDSRC_ENTITY_BITS; + else if( proto == PROTO_LEGACY ) + entity_bits = MAX_LEGACY_ENTITY_BITS; + else entity_bits = MAX_ENTITY_BITS; + // parse events queue for( i = 0 ; i < num_events; i++ ) { event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS ); if( MSG_ReadOneBit( msg )) - packet_index = MSG_ReadUBitLong( msg, cls.legacymode ? MAX_LEGACY_ENTITY_BITS : MAX_ENTITY_BITS ); + packet_index = MSG_ReadUBitLong( msg, entity_bits ); else packet_index = -1; if( MSG_ReadOneBit( msg )) { - MSG_ReadDeltaEvent( msg, &nullargs, &args ); + if( proto == PROTO_GOLDSRC ) + Delta_ReadGSFields( msg, DT_EVENT_T, &nullargs, &args, 0.0f ); + else MSG_ReadDeltaEvent( msg, &nullargs, &args ); } if( MSG_ReadOneBit( msg )) diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index c7f45d2f..563becfa 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -2359,7 +2359,7 @@ void CL_ParseServerMessage( sizebuf_t *msg ) Host_AbortCurrentFrame (); break; case svc_event: - CL_ParseEvent( msg ); + CL_ParseEvent( msg, PROTO_CURRENT ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; case svc_changing: @@ -2466,7 +2466,7 @@ void CL_ParseServerMessage( sizebuf_t *msg ) CL_ParseStaticEntity( msg ); break; case svc_event_reliable: - CL_ParseReliableEvent( msg ); + CL_ParseReliableEvent( msg, PROTO_CURRENT ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; case svc_spawnbaseline: diff --git a/engine/client/cl_parse_48.c b/engine/client/cl_parse_48.c index 16b5578e..f0815328 100644 --- a/engine/client/cl_parse_48.c +++ b/engine/client/cl_parse_48.c @@ -359,7 +359,7 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg ) Host_AbortCurrentFrame (); break; case svc_legacy_event: - CL_ParseEvent( msg ); + CL_ParseEvent( msg, PROTO_LEGACY ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; case svc_legacy_changing: @@ -478,7 +478,7 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg ) CL_LegacyParseStaticEntity( msg ); break; case svc_event_reliable: - CL_ParseReliableEvent( msg ); + CL_ParseReliableEvent( msg, PROTO_LEGACY ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; case svc_spawnbaseline: diff --git a/engine/client/cl_parse_gs.c b/engine/client/cl_parse_gs.c index 31063cf9..5581f862 100644 --- a/engine/client/cl_parse_gs.c +++ b/engine/client/cl_parse_gs.c @@ -575,7 +575,7 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg, qboolean normal_message ) break; case svc_event: MSG_StartBitWriting( msg ); - CL_ParseEvent( msg ); + CL_ParseEvent( msg, PROTO_GOLDSRC ); MSG_EndBitWriting( msg ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; @@ -643,7 +643,7 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg, qboolean normal_message ) break; case svc_event_reliable: MSG_StartBitWriting( msg ); - CL_ParseReliableEvent( msg ); + CL_ParseReliableEvent( msg, PROTO_GOLDSRC ); MSG_EndBitWriting( msg ); cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart; break; diff --git a/engine/client/client.h b/engine/client/client.h index a3f8423a..0ce21b95 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -784,8 +784,8 @@ int CL_GetDemoComment( const char *demoname, char *comment ); // // cl_events.c // -void CL_ParseEvent( sizebuf_t *msg ); -void CL_ParseReliableEvent( sizebuf_t *msg ); +void CL_ParseEvent( sizebuf_t *msg, connprotocol_t proto ); +void CL_ParseReliableEvent( sizebuf_t *msg, connprotocol_t proto ); void CL_SetEventIndex( const char *szEvName, int ev_index ); void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );