engine: client: support parsing GoldSrc event messages

This commit is contained in:
Alibek Omarov 2024-10-07 21:16:00 +03:00
parent ccbe370c8e
commit 609680b328
5 changed files with 33 additions and 16 deletions

View file

@ -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 ))

View file

@ -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:

View file

@ -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:

View file

@ -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;

View file

@ -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 );